diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..4eb4ffac5 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +Issue Number (if Applicable): Fixes # + +# Description + +Please include a summary of the changes and which issue is fixed / feature is added. + +# Pull Request - Checklist + +- [ ] Initial Manual Tests Passed +- [ ] Double check modified code and verify it with the feature/task requirements +- [ ] Formate code +- [ ] Look for code duplication +- [ ] Clear naming for variables and methods diff --git a/.github/workflows/cache_dependencies.yml b/.github/workflows/cache_dependencies.yml index 9d49ed3d8..4d2dc136c 100644 --- a/.github/workflows/cache_dependencies.yml +++ b/.github/workflows/cache_dependencies.yml @@ -7,7 +7,7 @@ on: jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml index 3a439c556..53008ed52 100644 --- a/.github/workflows/pr_test_build.yml +++ b/.github/workflows/pr_test_build.yml @@ -5,9 +5,9 @@ on: branches: [ main ] jobs: - test: + PR_test_build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 env: STORE_PASS: test@cake_wallet KEY_PASS: test@cake_wallet @@ -21,7 +21,7 @@ jobs: - name: Flutter action uses: subosito/flutter-action@v1 with: - flutter-version: '3.3.x' + flutter-version: '3.7.x' channel: stable - name: Install package dependencies @@ -110,9 +110,12 @@ jobs: echo "const onramperApiKey = '${{ secrets.ONRAMPER_API_KEY }}';" >> lib/.secrets.g.dart echo "const anypayToken = '${{ secrets.ANY_PAY_TOKEN }}';" >> lib/.secrets.g.dart echo "const ioniaClientId = '${{ secrets.IONIA_CLIENT_ID }}';" >> lib/.secrets.g.dart + echo "const twitterBearerToken = '${{ secrets.TWITTER_BEARER_TOKEN }}';" >> lib/.secrets.g.dart + echo "const trocadorApiKey = '${{ secrets.TROCADOR_API_KEY }}';" >> lib/.secrets.g.dart + echo "const trocadorExchangeMarkup = '${{ secrets.TROCADOR_EXCHANGE_MARKUP }}';" >> lib/.secrets.g.dart - name: Rename app - run: sed -i -e "s/\${APP_NAME}/$GITHUB_HEAD_REF/g" /opt/android/cake_wallet/android/app/src/main/AndroidManifest.xml + run: echo -e "id=com.cakewallet.test\nname=$GITHUB_HEAD_REF" > /opt/android/cake_wallet/android/app.properties - name: Build run: | diff --git a/README.md b/README.md index 14cb5e2ee..3077366ac 100644 --- a/README.md +++ b/README.md @@ -90,17 +90,24 @@ Edit the applicable `strings_XX.arb` file in `res/values/` and open a pull reque - French - German - Italian -- Portugese +- Portuguese - Dutch - Polish - Croatian - Russian -- Ukranian +- Ukrainian - Hindi - Japanese - Chinese - Korean +- Thai - Arabic +- Turkish +- Burmese +- Urdu +- Bulgarian +- Czech +- Indonesian ## Add a new language @@ -118,7 +125,7 @@ The only parts to be translated, if needed, are the values m and s after the var 4. Add the language to `lib/entities/language_service.dart` under both `supportedLocales` and `localeCountryCode`. Use the name of the language in the local language and in English in parentheses after for `supportedLocales`. Use the [ISO 3166-1 alpha-3 code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) for `localeCountryCode`. You must choose one country, so choose the country with the most native speakers of this language or is otherwise best associated with this language. -5. Add a relevant flag to `assets/images/flags/XXXX.png`, replacing XXXX with the 3 digit localeCountryCode. The image must be 42x36 pixels with a 3 pixels of transparent margin on all 4 sides. +5. Add a relevant flag to `assets/images/flags/XXXX.png`, replacing XXXX with the 3 digit localeCountryCode. The image must be 42x26 pixels with a 3 pixels of transparent margin on all 4 sides. You can resize the flag with [paint.net](https://www.getpaint.net/) to 36x20 pixels, expand the canvas to 42x26 pixels with the flag anchored in the middle, and then manually delete the 3 pixels on each side to make transparent. Or you can use another program like Photoshop. ## Add a new fiat currency @@ -128,4 +135,4 @@ The only parts to be translated, if needed, are the values m and s after the var 3. Add the raw mapping underneath in `lib/entities/fiat_currency.dart` following the same format as the others. -4. Add a flag of the issuing country or organization to `assets/images/flags/XXXX.png`, replacing XXXX with the ISO 3166-1 alpha-3 code used above (eg: `usa.png`, `eur.png`). Do not add this if the flag with the same name already exists. The image must be 42x36 pixels with a 3 pixels of transparent margin on all 4 sides. +4. Add a flag of the issuing country or organization to `assets/images/flags/XXXX.png`, replacing XXXX with the ISO 3166-1 alpha-3 code used above (eg: `usa.png`, `eur.png`). Do not add this if the flag with the same name already exists. The image must be 42x26 pixels with a 3 pixels of transparent margin on all 4 sides. diff --git a/Refund Pollicy.md b/Refund Pollicy.md deleted file mode 100644 index d2e13f5ef..000000000 --- a/Refund Pollicy.md +++ /dev/null @@ -1,27 +0,0 @@ -# Refund Policy - -This Refund Policy covers returns, refunds, and cancellations for your purchases from Cake Technologies, LLC (“Company,” “we,” or “us”). - -### Returns - -We do not accept returns of cryptocurrencies. Once cryptocurrencies are delivered to the provided wallet address, we cannot accept a return. If we allow you to sell cryptocurrencies to us, you may optionally engage in another trade to convert the cryptocurrency to another asset at the price at that point in time. - -### Refunds - -We do not issue refunds except in the case of an error resulting in a non-delivery of cryptocurrencies. In this case, we will decide whether to complete the trade or refund the account. We endeavor to complete an investigation to determine whether an error occurred and to make this decision within ten (10) days of receipt of your error report, and we will do so in any case within ninety (90) days. We reserve the right to issue a refund for the equivalent amount in another asset at the exchange rate then offered by us should we determine an error occurred. - -### Cancellations - -Once you make a payment to us, trades cannot be cancelled. In nearly all cases, we deliver cryptocurrency to your address in a matter of seconds or minutes. If you have not received your purchased cryptocurrency within six (6) hours of completing payment and have confirmed that your wallet is connected to a reliable node and fully synchronized with the network, please contact us. - -### Network Fees - -We may charge a network fee for the delivery of cryptocurrencies. This will be clearly shown in the checkout page. If we issue a refund, we may choose to deduct any network fees from the refund, including any network fees incurred in processing the refund. - -### Fraud - -If you believe a cryptocurrency purchase was conducted fraudulently, please alert your bank or card issuer, as applicable, and follow their instructions. Please be aware that fraudulent transactions may result in the loss of your money with no recourse. - -### Contact Us - -If you believe that there has been an error in processing your payment, please contact us at support@cakewallet.com. \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml index 524f70011..396904041 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -18,6 +18,8 @@ analyzer: linter: rules: - cancel_subscriptions + - always_declare_return_types + - prefer_final_fields # analyzer: diff --git a/android/app/src/main/AndroidManifestBase.xml b/android/app/src/main/AndroidManifestBase.xml index 9f6b65785..2dbedcba9 100644 --- a/android/app/src/main/AndroidManifestBase.xml +++ b/android/app/src/main/AndroidManifestBase.xml @@ -6,6 +6,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle index 04c2af566..692e8dfb1 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.5.10' + ext.kotlin_version = '1.6.21' repositories { google() jcenter() diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index b7ca2e6de..733c691d3 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/assets/images/flags/are.png b/assets/images/flags/are.png new file mode 100644 index 000000000..ae68c4ff2 Binary files /dev/null and b/assets/images/flags/are.png differ diff --git a/assets/images/flags/arg.png b/assets/images/flags/arg.png new file mode 100644 index 000000000..c5bd233d2 Binary files /dev/null and b/assets/images/flags/arg.png differ diff --git a/assets/images/flags/bgd.png b/assets/images/flags/bgd.png new file mode 100644 index 000000000..0f8c5cfe5 Binary files /dev/null and b/assets/images/flags/bgd.png differ diff --git a/assets/images/flags/chl.png b/assets/images/flags/chl.png new file mode 100644 index 000000000..73a38f406 Binary files /dev/null and b/assets/images/flags/chl.png differ diff --git a/assets/images/flags/col.png b/assets/images/flags/col.png new file mode 100644 index 000000000..9a0fc6ac1 Binary files /dev/null and b/assets/images/flags/col.png differ diff --git a/assets/images/flags/egy.png b/assets/images/flags/egy.png new file mode 100644 index 000000000..062ee21cf Binary files /dev/null and b/assets/images/flags/egy.png differ diff --git a/assets/images/flags/gha.png b/assets/images/flags/gha.png new file mode 100644 index 000000000..8d6801e81 Binary files /dev/null and b/assets/images/flags/gha.png differ diff --git a/assets/images/flags/gtm.png b/assets/images/flags/gtm.png new file mode 100644 index 000000000..2083ad806 Binary files /dev/null and b/assets/images/flags/gtm.png differ diff --git a/assets/images/flags/irn.png b/assets/images/flags/irn.png new file mode 100644 index 000000000..151a03919 Binary files /dev/null and b/assets/images/flags/irn.png differ diff --git a/assets/images/flags/mar.png b/assets/images/flags/mar.png new file mode 100644 index 000000000..65b31c892 Binary files /dev/null and b/assets/images/flags/mar.png differ diff --git a/assets/images/flags/mmr.png b/assets/images/flags/mmr.png new file mode 100644 index 000000000..7fc6e1661 Binary files /dev/null and b/assets/images/flags/mmr.png differ diff --git a/assets/images/flags/nga.png b/assets/images/flags/nga.png new file mode 100644 index 000000000..ebfd82449 Binary files /dev/null and b/assets/images/flags/nga.png differ diff --git a/assets/images/flags/pak.png b/assets/images/flags/pak.png new file mode 100644 index 000000000..1462650e4 Binary files /dev/null and b/assets/images/flags/pak.png differ diff --git a/assets/images/flags/tur.png b/assets/images/flags/tur.png new file mode 100644 index 000000000..166c6313a Binary files /dev/null and b/assets/images/flags/tur.png differ diff --git a/assets/images/flags/twn.png b/assets/images/flags/twn.png new file mode 100644 index 000000000..4af8ba78d Binary files /dev/null and b/assets/images/flags/twn.png differ diff --git a/assets/images/flags/vnm.png b/assets/images/flags/vnm.png new file mode 100644 index 000000000..3cbbf878f Binary files /dev/null and b/assets/images/flags/vnm.png differ diff --git a/assets/images/trocador.png b/assets/images/trocador.png new file mode 100644 index 000000000..67c9f221c Binary files /dev/null and b/assets/images/trocador.png differ diff --git a/cw_bitcoin/lib/bitcoin_amount_format.dart b/cw_bitcoin/lib/bitcoin_amount_format.dart index c72d21960..d5a42d984 100644 --- a/cw_bitcoin/lib/bitcoin_amount_format.dart +++ b/cw_bitcoin/lib/bitcoin_amount_format.dart @@ -17,7 +17,7 @@ int stringDoubleToBitcoinAmount(String amount) { int result = 0; try { - result = (double.parse(amount) * bitcoinAmountDivider).toInt(); + result = (double.parse(amount) * bitcoinAmountDivider).round(); } catch (e) { result = 0; } diff --git a/cw_bitcoin/pubspec.lock b/cw_bitcoin/pubspec.lock index 9207fc209..bfcd9e5a6 100644 --- a/cw_bitcoin/pubspec.lock +++ b/cw_bitcoin/pubspec.lock @@ -5,37 +5,42 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "4897882604d919befd350648c7f91926a9d5de99e67b455bf0917cc2362f4bb8" + url: "https://pub.dev" source: hosted version: "47.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "690e335554a8385bc9d787117d9eb52c0c03ee207a607e593de3c9d71b1cfe80" + url: "https://pub.dev" source: hosted version: "4.7.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" asn1lib: dependency: transitive description: name: asn1lib - url: "https://pub.dartlang.org" + sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039 + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" bech32: dependency: transitive description: @@ -49,14 +54,16 @@ packages: dependency: transitive description: name: bip32 - url: "https://pub.dartlang.org" + sha256: "54787cd7a111e9d37394aabbf53d1fc5e2e0e0af2cd01c459147a97c0e3f8a97" + url: "https://pub.dev" source: hosted version: "2.0.0" bip39: dependency: transitive description: name: bip39 - url: "https://pub.dartlang.org" + sha256: de1ee27ebe7d96b84bb3a04a4132a0a3007dcdd5ad27dd14aa87a29d97c45edc + url: "https://pub.dev" source: hosted version: "1.0.6" bitcoin_flutter: @@ -72,126 +79,144 @@ packages: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" bs58check: dependency: transitive description: name: bs58check - url: "https://pub.dartlang.org" + sha256: c4a164d42b25c2f6bc88a8beccb9fc7d01440f3c60ba23663a20a70faf484ea9 + url: "https://pub.dev" source: hosted version: "1.0.2" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + url: "https://pub.dev" source: hosted version: "3.1.0" build_resolvers: dependency: "direct dev" description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6" + url: "https://pub.dev" source: hosted version: "2.0.10" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + url: "https://pub.dev" source: hosted - version: "7.2.4" + version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + url: "https://pub.dev" source: hosted - version: "8.4.1" + version: "8.4.3" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "196284f26f69444b7f5c50692b55ec25da86d9e500451dc09333bf2e3ad69259" + url: "https://pub.dev" source: hosted version: "3.0.2" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" cryptography: dependency: "direct main" description: name: cryptography - url: "https://pub.dartlang.org" + sha256: e0e37f79665cd5c86e8897f9abe1accfe813c0cc5299dab22256e22fddc1fef8 + url: "https://pub.dev" source: hosted version: "2.0.5" cw_core: @@ -205,44 +230,50 @@ packages: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + url: "https://pub.dev" source: hosted version: "2.2.4" encrypt: dependency: "direct main" description: name: encrypt - url: "https://pub.dartlang.org" + sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb" + url: "https://pub.dev" source: hosted version: "5.0.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -252,9 +283,10 @@ packages: dependency: "direct main" description: name: flutter_mobx - url: "https://pub.dartlang.org" + sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e" + url: "https://pub.dev" source: hosted - version: "2.0.6+4" + version: "2.0.6+5" flutter_test: dependency: "direct dev" description: flutter @@ -264,282 +296,306 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" hex: dependency: transitive description: name: hex - url: "https://pub.dartlang.org" + sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a" + url: "https://pub.dev" source: hosted version: "0.2.0" hive: dependency: transitive description: name: hive - url: "https://pub.dartlang.org" + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" source: hosted version: "2.2.3" hive_generator: dependency: "direct dev" description: name: hive_generator - url: "https://pub.dartlang.org" + sha256: "81fd20125cb2ce8fd23623d7744ffbaf653aae93706c9bd3bf7019ea0ace3938" + url: "https://pub.dev" source: hosted version: "1.1.3" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "4.8.0" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" mobx: dependency: "direct main" description: name: mobx - url: "https://pub.dartlang.org" + sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3+1" mobx_codegen: dependency: "direct dev" description: name: mobx_codegen - url: "https://pub.dartlang.org" + sha256: "86122e410d8ea24dda0c69adb5c2a6ccadd5ce02ad46e144764e0d0184a06181" + url: "https://pub.dev" source: hosted - version: "2.0.7+3" + version: "2.1.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.12" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + url: "https://pub.dev" source: hosted - version: "2.0.20" - path_provider_ios: + version: "2.0.22" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.1.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" source: hosted version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + url: "https://pub.dev" source: hosted version: "2.1.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle - url: "https://pub.dartlang.org" + sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + url: "https://pub.dev" source: hosted version: "3.6.2" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + url: "https://pub.dev" source: hosted version: "1.2.1" rxdart: dependency: "direct main" description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" source: hosted - version: "0.27.5" + version: "0.27.7" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + url: "https://pub.dev" source: hosted version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -549,128 +605,146 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d" + url: "https://pub.dev" source: hosted - version: "1.2.5" + version: "1.2.6" source_helper: dependency: transitive description: name: source_helper - url: "https://pub.dartlang.org" + sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" + url: "https://pub.dev" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" unorm_dart: dependency: "direct main" description: name: unorm_dart - url: "https://pub.dartlang.org" + sha256: "5b35bff83fce4d76467641438f9e867dc9bcfdb8c1694854f230579d68cd8f4b" + url: "https://pub.dev" source: hosted version: "0.2.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.3" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + url: "https://pub.dev" source: hosted - version: "0.2.0+2" + version: "0.2.0+3" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.17.5 <3.0.0" + dart: ">=2.19.0 <3.0.0" flutter: ">=3.0.0" diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index 3ee2b5e15..925f39de0 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -83,23 +83,24 @@ class CryptoCurrency extends EnumerableItem with Serializable { xusd, ]; - static const xmr = CryptoCurrency(title: 'XMR', iconPath: 'assets/images/monero_icon.png', fullName: 'Monero', raw: 0, name: 'xmr'); - static const ada = CryptoCurrency(title: 'ADA', iconPath: 'assets/images/ada_icon.png', fullName: 'Cardano', raw: 1, name: 'ada'); - static const bch = CryptoCurrency(title: 'BCH', iconPath: 'assets/images/bch_icon.png',fullName: 'Bitcoin Cash', raw: 2, name: 'bch'); - static const bnb = CryptoCurrency(title: 'BNB', iconPath: 'assets/images/bnb_icon.png', tag: 'BSC', fullName: 'Binance Coin', raw: 3, name: 'bnb'); - static const btc = CryptoCurrency(title: 'BTC', iconPath: 'assets/images/btc.png', fullName: 'Bitcoin', raw: 4, name: 'btc'); - static const dai = CryptoCurrency(title: 'DAI', iconPath: 'assets/images/dai_icon.png', tag: 'ETH', fullName: 'Dai', raw: 5, name: 'dai'); - static const dash = CryptoCurrency(title: 'DASH', iconPath: 'assets/images/dash_icon.png', fullName: 'Dash', raw: 6, name: 'dash'); - static const eos = CryptoCurrency(title: 'EOS', iconPath: 'assets/images/eos_icon.png', fullName: 'EOS', raw: 7, name: 'eos'); - static const eth = CryptoCurrency(title: 'ETH', iconPath: 'assets/images/eth_icon.png', fullName: 'Ethereum', raw: 8, name: 'eth'); - static const ltc = CryptoCurrency(title: 'LTC', iconPath: 'assets/images/litecoin-ltc_icon.png', fullName: 'Litecoin', raw: 9, name: 'ltc'); - static const nano = CryptoCurrency(title: 'NANO', raw: 10, name: 'nano'); - static const trx = CryptoCurrency(title: 'TRX', iconPath: 'assets/images/trx_icon.png', fullName: 'TRON', raw: 11, name: 'trx'); - static const usdt = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdt_icon.png', tag: 'OMNI', fullName: 'USDT', raw: 12, name: 'usdt'); - static const usdterc20 = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdterc20_icon.png', tag: 'ETH', fullName: 'USDT', raw: 13, name: 'usdterc20'); - static const xlm = CryptoCurrency(title: 'XLM', iconPath: 'assets/images/xlm_icon.png', fullName: 'Stellar', raw: 14, name: 'xlm'); - static const xrp = CryptoCurrency(title: 'XRP', iconPath: 'assets/images/xrp_icon.png', fullName: 'Ripple', raw: 15, name: 'xrp'); - static const xhv = CryptoCurrency(title: 'XHV', iconPath: 'assets/images/xhv_logo.png', fullName: 'Haven Protocol', raw: 16, name: 'xhv'); + // title, tag (if applicable), fullName (if unique), raw, name, iconPath + static const xmr = CryptoCurrency(title: 'XMR', fullName: 'Monero', raw: 0, name: 'xmr', iconPath: 'assets/images/monero_icon.png'); + static const ada = CryptoCurrency(title: 'ADA', fullName: 'Cardano', raw: 1, name: 'ada', iconPath: 'assets/images/ada_icon.png'); + static const bch = CryptoCurrency(title: 'BCH', fullName: 'Bitcoin Cash', raw: 2, name: 'bch', iconPath: 'assets/images/bch_icon.png'); + static const bnb = CryptoCurrency(title: 'BNB', tag: 'BSC', fullName: 'Binance Coin', raw: 3, name: 'bnb', iconPath: 'assets/images/bnb_icon.png'); + static const btc = CryptoCurrency(title: 'BTC', fullName: 'Bitcoin', raw: 4, name: 'btc', iconPath: 'assets/images/btc.png'); + static const dai = CryptoCurrency(title: 'DAI', tag: 'ETH', fullName: 'Dai', raw: 5, name: 'dai', iconPath: 'assets/images/dai_icon.png'); + static const dash = CryptoCurrency(title: 'DASH', fullName: 'Dash', raw: 6, name: 'dash', iconPath: 'assets/images/dash_icon.png'); + static const eos = CryptoCurrency(title: 'EOS', fullName: 'EOS', raw: 7, name: 'eos', iconPath: 'assets/images/eos_icon.png'); + static const eth = CryptoCurrency(title: 'ETH', fullName: 'Ethereum', raw: 8, name: 'eth', iconPath: 'assets/images/eth_icon.png'); + static const ltc = CryptoCurrency(title: 'LTC', fullName: 'Litecoin', raw: 9, name: 'ltc', iconPath: 'assets/images/litecoin-ltc_icon.png'); + static const nano = CryptoCurrency(title: 'NANO', raw: 10, name: 'nano', iconPath: 'assets/images/nano.png'); + static const trx = CryptoCurrency(title: 'TRX', fullName: 'TRON', raw: 11, name: 'trx', iconPath: 'assets/images/trx_icon.png'); + static const usdt = CryptoCurrency(title: 'USDT', tag: 'OMNI', fullName: 'USDT Tether', raw: 12, name: 'usdt', iconPath: 'assets/images/usdt_icon.png'); + static const usdterc20 = CryptoCurrency(title: 'USDT', tag: 'ETH', fullName: 'USDT Tether', raw: 13, name: 'usdterc20', iconPath: 'assets/images/usdterc20_icon.png'); + static const xlm = CryptoCurrency(title: 'XLM', fullName: 'Stellar', raw: 14, name: 'xlm', iconPath: 'assets/images/xlm_icon.png'); + static const xrp = CryptoCurrency(title: 'XRP', fullName: 'Ripple', raw: 15, name: 'xrp', iconPath: 'assets/images/xrp_icon.png'); + static const xhv = CryptoCurrency(title: 'XHV', fullName: 'Haven Protocol', raw: 16, name: 'xhv', iconPath: 'assets/images/xhv_logo.png'); static const xag = CryptoCurrency(title: 'XAG', tag: 'XHV', raw: 17, name: 'xag'); static const xau = CryptoCurrency(title: 'XAU', tag: 'XHV', raw: 18, name: 'xau'); @@ -115,39 +116,39 @@ class CryptoCurrency extends EnumerableItem with Serializable { static const xnzd = CryptoCurrency(title: 'XNZD', tag: 'XHV', raw: 28, name: 'xnzd'); static const xusd = CryptoCurrency(title: 'XUSD', tag: 'XHV', raw: 29, name: 'xusd'); - static const ape = CryptoCurrency(title: 'APE', iconPath: 'assets/images/ape_icon.png', tag: 'ETH', raw: 30, name: 'ape'); - static const avaxc = CryptoCurrency(title: 'AVAX', iconPath: 'assets/images/avaxc_icon.png', tag: 'C-CHAIN', raw: 31, name: 'avaxc'); - static const btt = CryptoCurrency(title: 'BTT', iconPath: 'assets/images/btt_icon.png', raw: 32, name: 'btt'); - static const bttc = CryptoCurrency(title: 'BTTC', iconPath: 'assets/images/bttbsc_icon.png',fullName: 'BitTorrent-NEW (Binance Smart Chain)', tag: 'BSC', raw: 33, name: 'bttc'); - static const doge = CryptoCurrency(title: 'DOGE', iconPath: 'assets/images/doge_icon.png', raw: 34, name: 'doge'); - static const firo = CryptoCurrency(title: 'FIRO', iconPath: 'assets/images/firo_icon.png', raw: 35, name: 'firo'); - static const usdttrc20 = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdttrc20_icon.png', tag: 'TRX', raw: 36, name: 'usdttrc20'); - static const hbar = CryptoCurrency(title: 'HBAR', iconPath: 'assets/images/hbar_icon.png', raw: 37, name: 'hbar'); - static const sc = CryptoCurrency(title: 'SC', iconPath: 'assets/images/sc_icon.png', raw: 38, name: 'sc'); - static const sol = CryptoCurrency(title: 'SOL', iconPath: 'assets/images/sol_icon.png', raw: 39, name: 'sol'); - static const usdc = CryptoCurrency(title: 'USDC', iconPath: 'assets/images/usdc_icon.png', tag: 'ETH', raw: 40, name: 'usdc'); - static const usdcsol = CryptoCurrency(title: 'USDC', iconPath: 'assets/images/usdcsol_icon.png', tag: 'SOL', raw: 41, name: 'usdcsol'); + static const ape = CryptoCurrency(title: 'APE', tag: 'ETH', fullName: 'ApeCoin', raw: 30, name: 'ape', iconPath: 'assets/images/ape_icon.png'); + static const avaxc = CryptoCurrency(title: 'AVAX', tag: 'AVAXC', raw: 31, name: 'avaxc', iconPath: 'assets/images/avaxc_icon.png'); + static const btt = CryptoCurrency(title: 'BTT', tag: 'ETH', fullName: 'BitTorrent', raw: 32, name: 'btt', iconPath: 'assets/images/btt_icon.png'); + static const bttc = CryptoCurrency(title: 'BTTC', tag: 'TRX', fullName: 'BitTorrent-NEW', raw: 33, name: 'bttc', iconPath: 'assets/images/bttbsc_icon.png'); + static const doge = CryptoCurrency(title: 'DOGE', fullName: 'Dogecoin', raw: 34, name: 'doge', iconPath: 'assets/images/doge_icon.png'); + static const firo = CryptoCurrency(title: 'FIRO', raw: 35, name: 'firo', iconPath: 'assets/images/firo_icon.png'); + static const usdttrc20 = CryptoCurrency(title: 'USDT', tag: 'TRX', fullName: 'USDT Tether', raw: 36, name: 'usdttrc20', iconPath: 'assets/images/usdttrc20_icon.png'); + static const hbar = CryptoCurrency(title: 'HBAR', fullName: 'Hedera', raw: 37, name: 'hbar', iconPath: 'assets/images/hbar_icon.png', ); + static const sc = CryptoCurrency(title: 'SC', fullName: 'Siacoin', raw: 38, name: 'sc', iconPath: 'assets/images/sc_icon.png'); + static const sol = CryptoCurrency(title: 'SOL', fullName: 'Solana', raw: 39, name: 'sol', iconPath: 'assets/images/sol_icon.png'); + static const usdc = CryptoCurrency(title: 'USDC', tag: 'ETH', fullName: 'USD Coin', raw: 40, name: 'usdc', iconPath: 'assets/images/usdc_icon.png'); + static const usdcsol = CryptoCurrency(title: 'USDC', tag: 'SOL', fullName: 'USDC Coin', raw: 41, name: 'usdcsol', iconPath: 'assets/images/usdcsol_icon.png'); static const zaddr = CryptoCurrency(title: 'ZZEC', tag: 'ZEC', fullName: 'Shielded Zcash', iconPath: 'assets/images/zaddr_icon.png', raw: 42, name: 'zaddr'); static const zec = CryptoCurrency(title: 'TZEC', tag: 'ZEC', fullName: 'Transparent Zcash', iconPath: 'assets/images/zec_icon.png', raw: 43, name: 'zec'); - static const zen = CryptoCurrency(title: 'ZEN', iconPath: 'assets/images/zen_icon.png', raw: 44, name: 'zen'); - static const xvg = CryptoCurrency(title: 'XVG', fullName: 'Verge', iconPath: 'assets/images/xvg_icon.png', raw: 45, name: 'xvg'); + static const zen = CryptoCurrency(title: 'ZEN', fullName: 'Horizen', raw: 44, name: 'zen', iconPath: 'assets/images/zen_icon.png'); + static const xvg = CryptoCurrency(title: 'XVG', fullName: 'Verge', raw: 45, name: 'xvg', iconPath: 'assets/images/xvg_icon.png'); - static const usdcpoly = CryptoCurrency(title: 'USDC', iconPath: 'assets/images/usdc_icon.png', tag: 'POLY', raw: 46, name: 'usdcpoly'); - static const dcr = CryptoCurrency(title: 'DCR', iconPath: 'assets/images/dcr_icon.png', raw: 47, name: 'dcr'); - static const kmd = CryptoCurrency(title: 'KMD', iconPath: 'assets/images/kmd_icon.png', raw: 48, name: 'kmd'); - static const mana = CryptoCurrency(title: 'MANA', iconPath: 'assets/images/mana_icon.png', tag: 'ETH', raw: 49, name: 'mana'); - static const maticpoly = CryptoCurrency(title: 'MATIC', iconPath: 'assets/images/matic_icon.png', tag: 'POLY', raw: 50, name: 'maticpoly'); - static const matic = CryptoCurrency(title: 'MATIC', iconPath: 'assets/images/matic_icon.png', tag: 'ETH', raw: 51, name: 'matic'); - static const mkr = CryptoCurrency(title: 'MKR', iconPath: 'assets/images/mkr_icon.png', tag: 'ETH', raw: 52, name: 'mkr'); - static const near = CryptoCurrency(title: 'NEAR', iconPath: 'assets/images/near_icon.png', raw: 53, name: 'near'); - static const oxt = CryptoCurrency(title: 'OXT', iconPath: 'assets/images/oxt_icon.png', tag: 'ETH', raw: 54, name: 'oxt'); - static const paxg = CryptoCurrency(title: 'PAXG', iconPath: 'assets/images/paxg_icon.png', tag: 'ETH', raw: 55, name: 'paxg'); - static const pivx = CryptoCurrency(title: 'PIVX', iconPath: 'assets/images/pivx_icon.png', raw: 56, name: 'pivx'); - static const rune = CryptoCurrency(title: 'RUNE', iconPath: 'assets/images/rune_icon.png', raw: 57, name: 'rune'); - static const rvn = CryptoCurrency(title: 'RVN', iconPath: 'assets/images/rvn_icon.png', raw: 58, name: 'rvn'); - static const scrt = CryptoCurrency(title: 'SCRT', iconPath: 'assets/images/scrt_icon.png', raw: 59, name: 'scrt'); - static const uni = CryptoCurrency(title: 'UNI', iconPath: 'assets/images/uni_icon.png', tag: 'ETH', raw: 60, name: 'uni'); - static const stx = CryptoCurrency(title: 'STX', iconPath: 'assets/images/stx_icon.png', raw: 61, name: 'stx'); + static const usdcpoly = CryptoCurrency(title: 'USDC', tag: 'POLY', fullName: 'USD Coin', raw: 46, name: 'usdcpoly', iconPath: 'assets/images/usdc_icon.png'); + static const dcr = CryptoCurrency(title: 'DCR', fullName: 'Decred', raw: 47, name: 'dcr', iconPath: 'assets/images/dcr_icon.png'); + static const kmd = CryptoCurrency(title: 'KMD', fullName: 'Komodo', raw: 48, name: 'kmd', iconPath: 'assets/images/kmd_icon.png'); + static const mana = CryptoCurrency(title: 'MANA', tag: 'ETH', fullName: 'Decentraland', raw: 49, name: 'mana', iconPath: 'assets/images/mana_icon.png'); + static const maticpoly = CryptoCurrency(title: 'MATIC', tag: 'POLY', fullName: 'Polygon', raw: 50, name: 'maticpoly', iconPath: 'assets/images/matic_icon.png'); + static const matic = CryptoCurrency(title: 'MATIC', tag: 'ETH', fullName: 'Polygon', raw: 51, name: 'matic', iconPath: 'assets/images/matic_icon.png'); + static const mkr = CryptoCurrency(title: 'MKR', tag: 'ETH', fullName: 'Maker', raw: 52, name: 'mkr', iconPath: 'assets/images/mkr_icon.png'); + static const near = CryptoCurrency(title: 'NEAR', fullName: 'NEAR Protocol', raw: 53, name: 'near', iconPath: 'assets/images/near_icon.png'); + static const oxt = CryptoCurrency(title: 'OXT', tag: 'ETH', fullName: 'Orchid', raw: 54, name: 'oxt', iconPath: 'assets/images/oxt_icon.png'); + static const paxg = CryptoCurrency(title: 'PAXG', tag: 'ETH', fullName: 'Pax Gold', raw: 55, name: 'paxg', iconPath: 'assets/images/paxg_icon.png'); + static const pivx = CryptoCurrency(title: 'PIVX', raw: 56, name: 'pivx', iconPath: 'assets/images/pivx_icon.png'); + static const rune = CryptoCurrency(title: 'RUNE', fullName: 'Thorchain', raw: 57, name: 'rune', iconPath: 'assets/images/rune_icon.png'); + static const rvn = CryptoCurrency(title: 'RVN', fullName: 'Ravencoin', raw: 58, name: 'rvn', iconPath: 'assets/images/rvn_icon.png'); + static const scrt = CryptoCurrency(title: 'SCRT', fullName: 'Secret Network', raw: 59, name: 'scrt', iconPath: 'assets/images/scrt_icon.png'); + static const uni = CryptoCurrency(title: 'UNI', tag: 'ETH', fullName: 'Uniswap', raw: 60, name: 'uni', iconPath: 'assets/images/uni_icon.png'); + static const stx = CryptoCurrency(title: 'STX', fullName: 'Stacks', raw: 61, name: 'stx', iconPath: 'assets/images/stx_icon.png'); static final Map _rawCurrencyMap = [...all, ...havenCurrencies].fold>({}, (acc, item) { diff --git a/cw_core/lib/monero_amount_format.dart b/cw_core/lib/monero_amount_format.dart index 912527b4e..0bf0031c9 100644 --- a/cw_core/lib/monero_amount_format.dart +++ b/cw_core/lib/monero_amount_format.dart @@ -15,4 +15,4 @@ double moneroAmountToDouble({required int amount}) => cryptoAmountToDouble(amount: amount, divider: moneroAmountDivider); int moneroParseAmount({required String amount}) => - (double.parse(amount) * moneroAmountDivider).toInt(); + (double.parse(amount) * moneroAmountDivider).round(); diff --git a/cw_core/pubspec.lock b/cw_core/pubspec.lock index 951a97ffb..06997e8f1 100644 --- a/cw_core/pubspec.lock +++ b/cw_core/pubspec.lock @@ -5,191 +5,218 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "4897882604d919befd350648c7f91926a9d5de99e67b455bf0917cc2362f4bb8" + url: "https://pub.dev" source: hosted version: "47.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "690e335554a8385bc9d787117d9eb52c0c03ee207a607e593de3c9d71b1cfe80" + url: "https://pub.dev" source: hosted version: "4.7.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" asn1lib: dependency: transitive description: name: asn1lib - url: "https://pub.dartlang.org" + sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039 + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + url: "https://pub.dev" source: hosted version: "3.1.0" build_resolvers: dependency: "direct dev" description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6" + url: "https://pub.dev" source: hosted version: "2.0.10" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + url: "https://pub.dev" source: hosted - version: "7.2.4" + version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.4.3" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" dart_style: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + url: "https://pub.dev" source: hosted version: "2.2.4" encrypt: dependency: "direct main" description: name: encrypt - url: "https://pub.dartlang.org" + sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb" + url: "https://pub.dev" source: hosted version: "5.0.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -199,9 +226,10 @@ packages: dependency: "direct main" description: name: flutter_mobx - url: "https://pub.dartlang.org" + sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e" + url: "https://pub.dev" source: hosted - version: "2.0.6+4" + version: "2.0.6+5" flutter_test: dependency: "direct dev" description: flutter @@ -211,268 +239,290 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" hive: dependency: transitive description: name: hive - url: "https://pub.dartlang.org" + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" source: hosted version: "2.2.3" hive_generator: dependency: "direct dev" description: name: hive_generator - url: "https://pub.dartlang.org" + sha256: "81fd20125cb2ce8fd23623d7744ffbaf653aae93706c9bd3bf7019ea0ace3938" + url: "https://pub.dev" source: hosted version: "1.1.3" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.8.0" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" mobx: dependency: "direct main" description: name: mobx - url: "https://pub.dartlang.org" + sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3+1" mobx_codegen: dependency: "direct dev" description: name: mobx_codegen - url: "https://pub.dartlang.org" + sha256: "86122e410d8ea24dda0c69adb5c2a6ccadd5ce02ad46e144764e0d0184a06181" + url: "https://pub.dev" source: hosted - version: "2.0.7+3" + version: "2.1.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.12" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + url: "https://pub.dev" source: hosted - version: "2.0.20" - path_provider_ios: + version: "2.0.22" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.1.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + url: "https://pub.dev" source: hosted version: "2.1.3" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle - url: "https://pub.dartlang.org" + sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + url: "https://pub.dev" source: hosted version: "3.6.2" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + url: "https://pub.dev" source: hosted version: "1.2.1" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -482,121 +532,138 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d" + url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.2.6" source_helper: dependency: transitive description: name: source_helper - url: "https://pub.dartlang.org" + sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" + url: "https://pub.dev" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.3" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + url: "https://pub.dev" source: hosted - version: "0.2.0+2" + version: "0.2.0+3" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.17.5 <3.0.0" + dart: ">=2.19.0 <3.0.0" flutter: ">=3.0.0" diff --git a/cw_core/pubspec.yaml b/cw_core/pubspec.yaml index 50503361c..e33aeb803 100644 --- a/cw_core/pubspec.yaml +++ b/cw_core/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: flutter: sdk: flutter http: ^0.13.4 + file: ^6.1.4 path_provider: ^2.0.11 mobx: ^2.0.7+4 flutter_mobx: ^2.0.6+1 diff --git a/cw_haven/lib/haven_transaction_info.dart b/cw_haven/lib/haven_transaction_info.dart index 277370467..6ffb60e6b 100644 --- a/cw_haven/lib/haven_transaction_info.dart +++ b/cw_haven/lib/haven_transaction_info.dart @@ -8,7 +8,8 @@ import 'package:cw_haven/api/transaction_history.dart'; class HavenTransactionInfo extends TransactionInfo { HavenTransactionInfo(this.id, this.height, this.direction, this.date, - this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee); + this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee, + this.confirmations); HavenTransactionInfo.fromMap(Map map) : id = (map['hash'] ?? '') as String, @@ -22,6 +23,7 @@ class HavenTransactionInfo extends TransactionInfo { amount = map['amount'] as int, accountIndex = int.parse(map['accountIndex'] as String), addressIndex = map['addressIndex'] as int, + confirmations = map['confirmations'] as int, key = getTxKey((map['hash'] ?? '') as String), fee = map['fee'] as int? ?? 0; @@ -35,6 +37,7 @@ class HavenTransactionInfo extends TransactionInfo { amount = row.getAmount(), accountIndex = row.subaddrAccount, addressIndex = row.subaddrIndex, + confirmations = row.confirmations, key = null, //getTxKey(row.getHash()), fee = row.fee, assetType = row.getAssetType(); @@ -48,6 +51,7 @@ class HavenTransactionInfo extends TransactionInfo { final int amount; final int fee; final int addressIndex; + final int confirmations; late String recipientAddress; late String assetType; String? _fiatAmount; diff --git a/cw_haven/pubspec.lock b/cw_haven/pubspec.lock index 6d741c268..84a4fe16a 100644 --- a/cw_haven/pubspec.lock +++ b/cw_haven/pubspec.lock @@ -5,147 +5,168 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "4897882604d919befd350648c7f91926a9d5de99e67b455bf0917cc2362f4bb8" + url: "https://pub.dev" source: hosted version: "47.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "690e335554a8385bc9d787117d9eb52c0c03ee207a607e593de3c9d71b1cfe80" + url: "https://pub.dev" source: hosted version: "4.7.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" asn1lib: dependency: transitive description: name: asn1lib - url: "https://pub.dartlang.org" + sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039 + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + url: "https://pub.dev" source: hosted version: "3.1.0" build_resolvers: dependency: "direct dev" description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6" + url: "https://pub.dev" source: hosted version: "2.0.10" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + url: "https://pub.dev" source: hosted - version: "7.2.4" + version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "8.4.3" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" cw_core: @@ -159,44 +180,50 @@ packages: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + url: "https://pub.dev" source: hosted version: "2.2.4" encrypt: dependency: transitive description: name: encrypt - url: "https://pub.dartlang.org" + sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb" + url: "https://pub.dev" source: hosted version: "5.0.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: "direct main" description: name: ffi - url: "https://pub.dartlang.org" + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.dev" source: hosted version: "1.2.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -206,9 +233,10 @@ packages: dependency: "direct main" description: name: flutter_mobx - url: "https://pub.dartlang.org" + sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e" + url: "https://pub.dev" source: hosted - version: "2.0.6+4" + version: "2.0.6+5" flutter_test: dependency: "direct dev" description: flutter @@ -218,268 +246,290 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" hive: dependency: transitive description: name: hive - url: "https://pub.dartlang.org" + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" source: hosted version: "2.2.3" hive_generator: dependency: "direct dev" description: name: hive_generator - url: "https://pub.dartlang.org" + sha256: "81fd20125cb2ce8fd23623d7744ffbaf653aae93706c9bd3bf7019ea0ace3938" + url: "https://pub.dev" source: hosted version: "1.1.3" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.8.0" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" mobx: dependency: "direct main" description: name: mobx - url: "https://pub.dartlang.org" + sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3+1" mobx_codegen: dependency: "direct dev" description: name: mobx_codegen - url: "https://pub.dartlang.org" + sha256: "86122e410d8ea24dda0c69adb5c2a6ccadd5ce02ad46e144764e0d0184a06181" + url: "https://pub.dev" source: hosted - version: "2.0.7+3" + version: "2.1.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.12" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + url: "https://pub.dev" source: hosted - version: "2.0.20" - path_provider_ios: + version: "2.0.22" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.1.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: a34ecd7fb548f8e57321fd8e50d865d266941b54e6c3b7758cf8f37c24116905 + url: "https://pub.dev" source: hosted version: "2.0.7" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle - url: "https://pub.dartlang.org" + sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + url: "https://pub.dev" source: hosted version: "3.6.2" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + url: "https://pub.dev" source: hosted version: "1.2.1" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -489,121 +539,138 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d" + url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.2.6" source_helper: dependency: transitive description: name: source_helper - url: "https://pub.dartlang.org" + sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" + url: "https://pub.dev" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c0e3a4f7be7dae51d8f152230b86627e3397c1ba8c3fa58e63d44a9f3edc9cef + url: "https://pub.dev" source: hosted version: "2.6.1" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + url: "https://pub.dev" source: hosted - version: "0.2.0+2" + version: "0.2.0+3" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.17.5 <3.0.0" - flutter: ">=2.8.1" + dart: ">=2.19.0 <3.0.0" + flutter: ">=3.0.0" diff --git a/cw_haven/pubspec.yaml b/cw_haven/pubspec.yaml index 28f2c315e..7a5ac6aa4 100644 --- a/cw_haven/pubspec.yaml +++ b/cw_haven/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - ffi: ^1.1.2 + ffi: ^2.0.1 http: ^0.13.4 path_provider: ^2.0.11 mobx: ^2.0.7+4 diff --git a/cw_monero/lib/monero_transaction_info.dart b/cw_monero/lib/monero_transaction_info.dart index 83c783e11..748b65329 100644 --- a/cw_monero/lib/monero_transaction_info.dart +++ b/cw_monero/lib/monero_transaction_info.dart @@ -8,7 +8,8 @@ import 'package:cw_monero/api/transaction_history.dart'; class MoneroTransactionInfo extends TransactionInfo { MoneroTransactionInfo(this.id, this.height, this.direction, this.date, - this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee); + this.isPending, this.amount, this.accountIndex, this.addressIndex, this.fee, + this.confirmations); MoneroTransactionInfo.fromMap(Map map) : id = (map['hash'] ?? '') as String, @@ -22,6 +23,7 @@ class MoneroTransactionInfo extends TransactionInfo { amount = map['amount'] as int, accountIndex = int.parse(map['accountIndex'] as String), addressIndex = map['addressIndex'] as int, + confirmations = map['confirmations'] as int, key = getTxKey((map['hash'] ?? '') as String), fee = map['fee'] as int? ?? 0 { additionalInfo = { @@ -40,6 +42,7 @@ class MoneroTransactionInfo extends TransactionInfo { amount = row.getAmount(), accountIndex = row.subaddrAccount, addressIndex = row.subaddrIndex, + confirmations = row.confirmations, key = getTxKey(row.getHash()), fee = row.fee { additionalInfo = { @@ -58,6 +61,7 @@ class MoneroTransactionInfo extends TransactionInfo { final int amount; final int fee; final int addressIndex; + final int confirmations; String? recipientAddress; String? key; String? _fiatAmount; diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index 557550754..d75ee0928 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -5,147 +5,168 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: "4897882604d919befd350648c7f91926a9d5de99e67b455bf0917cc2362f4bb8" + url: "https://pub.dev" source: hosted version: "47.0.0" analyzer: dependency: transitive description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "690e335554a8385bc9d787117d9eb52c0c03ee207a607e593de3c9d71b1cfe80" + url: "https://pub.dev" source: hosted version: "4.7.0" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" asn1lib: dependency: transitive description: name: asn1lib - url: "https://pub.dartlang.org" + sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039 + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.0" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + url: "https://pub.dev" source: hosted version: "3.1.0" build_resolvers: dependency: "direct dev" description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6" + url: "https://pub.dev" source: hosted version: "2.0.10" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + url: "https://pub.dev" source: hosted - version: "7.2.4" + version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.4.3" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" cw_core: @@ -159,44 +180,50 @@ packages: dependency: transitive description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + url: "https://pub.dev" source: hosted version: "2.2.4" encrypt: dependency: "direct main" description: name: encrypt - url: "https://pub.dartlang.org" + sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb" + url: "https://pub.dev" source: hosted version: "5.0.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: "direct main" description: name: ffi - url: "https://pub.dartlang.org" + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.dev" source: hosted version: "1.2.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -206,9 +233,10 @@ packages: dependency: "direct main" description: name: flutter_mobx - url: "https://pub.dartlang.org" + sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e" + url: "https://pub.dev" source: hosted - version: "2.0.6+4" + version: "2.0.6+5" flutter_test: dependency: "direct dev" description: flutter @@ -218,268 +246,290 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.1" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" hive: dependency: transitive description: name: hive - url: "https://pub.dartlang.org" + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" source: hosted version: "2.2.3" hive_generator: dependency: "direct dev" description: name: hive_generator - url: "https://pub.dartlang.org" + sha256: "81fd20125cb2ce8fd23623d7744ffbaf653aae93706c9bd3bf7019ea0ace3938" + url: "https://pub.dev" source: hosted version: "1.1.3" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted - version: "4.0.1" + version: "4.0.2" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.3" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.6.0" + version: "4.8.0" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.4" mobx: dependency: "direct main" description: name: mobx - url: "https://pub.dartlang.org" + sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3+1" mobx_codegen: dependency: "direct dev" description: name: mobx_codegen - url: "https://pub.dartlang.org" + sha256: "86122e410d8ea24dda0c69adb5c2a6ccadd5ce02ad46e144764e0d0184a06181" + url: "https://pub.dev" source: hosted - version: "2.0.7+3" + version: "2.1.1" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.12" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + url: "https://pub.dev" source: hosted - version: "2.0.20" - path_provider_ios: + version: "2.0.22" + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.1.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: a34ecd7fb548f8e57321fd8e50d865d266941b54e6c3b7758cf8f37c24116905 + url: "https://pub.dev" source: hosted version: "2.0.7" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle - url: "https://pub.dartlang.org" + sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + url: "https://pub.dev" source: hosted version: "3.6.2" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + url: "https://pub.dev" source: hosted version: "1.2.1" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.0.3" sky_engine: dependency: transitive description: flutter @@ -489,121 +539,138 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d" + url: "https://pub.dev" source: hosted - version: "1.2.3" + version: "1.2.6" source_helper: dependency: transitive description: name: source_helper - url: "https://pub.dartlang.org" + sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" + url: "https://pub.dev" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: dependency: transitive description: name: watcher - url: "https://pub.dartlang.org" + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c0e3a4f7be7dae51d8f152230b86627e3397c1ba8c3fa58e63d44a9f3edc9cef + url: "https://pub.dev" source: hosted version: "2.6.1" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + url: "https://pub.dev" source: hosted - version: "0.2.0+2" + version: "0.2.0+3" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" sdks: - dart: ">=2.17.5 <3.0.0" - flutter: ">=2.8.1" + dart: ">=2.19.0 <3.0.0" + flutter: ">=3.0.0" diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml index 23e8782cb..6d5041dfa 100644 --- a/cw_monero/pubspec.yaml +++ b/cw_monero/pubspec.yaml @@ -12,7 +12,7 @@ environment: dependencies: flutter: sdk: flutter - ffi: ^1.1.2 + ffi: ^2.0.1 http: ^0.13.4 path_provider: ^2.0.11 mobx: ^2.0.7+4 diff --git a/lib/anypay/any_pay_payment.dart b/lib/anypay/any_pay_payment.dart index 37bf7949e..0657b0526 100644 --- a/lib/anypay/any_pay_payment.dart +++ b/lib/anypay/any_pay_payment.dart @@ -57,7 +57,7 @@ class AnyPayPayment { List get outAddresses { return instructions - .map((instuction) => instuction.outputs.map((out) => out.address)) + .map((instruction) => instruction.outputs.map((out) => out.address)) .expand((e) => e) .toList(); } diff --git a/lib/anypay/anypay_api.dart b/lib/anypay/anypay_api.dart index 5eb9e460b..679d0eabf 100644 --- a/lib/anypay/anypay_api.dart +++ b/lib/anypay/anypay_api.dart @@ -80,7 +80,7 @@ class AnyPayApi { final response = await post(Uri.parse(uri), headers: headers, body: utf8.encode(json.encode(body))); if (response.statusCode == 400) { final decodedBody = json.decode(response.body) as Map; - throw Exception(decodedBody['message'] as String); + throw Exception(decodedBody['message'] as String? ?? 'Unexpected response\nError code: 400'); } if (response.statusCode != 200) { diff --git a/lib/core/address_validator.dart b/lib/core/address_validator.dart index 519cd92a3..22ad6a9d8 100644 --- a/lib/core/address_validator.dart +++ b/lib/core/address_validator.dart @@ -198,4 +198,26 @@ class AddressValidator extends TextValidator { return []; } } + + static String? getAddressFromStringPattern(CryptoCurrency type) { + switch (type) { + case CryptoCurrency.xmr: + return '([^0-9a-zA-Z]|^)4[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)8[0-9a-zA-Z]{94}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)[0-9a-zA-Z]{106}([^0-9a-zA-Z]|\$)'; + case CryptoCurrency.btc: + return '([^0-9a-zA-Z]|^)1[0-9a-zA-Z]{32}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)1[0-9a-zA-Z]{33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)3[0-9a-zA-Z]{32}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)3[0-9a-zA-Z]{33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)bc1[0-9a-zA-Z]{39}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)bc1[0-9a-zA-Z]{59}([^0-9a-zA-Z]|\$)'; + case CryptoCurrency.ltc: + return '([^0-9a-zA-Z]|^)^L[a-zA-Z0-9]{26,33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)[LM][a-km-zA-HJ-NP-Z1-9]{26,33}([^0-9a-zA-Z]|\$)' + '|([^0-9a-zA-Z]|^)ltc[a-zA-Z0-9]{26,45}([^0-9a-zA-Z]|\$)'; + default: + return null; + } + } } diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index ffcb9eb4c..3cb434efe 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -217,7 +217,7 @@ class BackupService { final fiatApiMode = data[PreferencesKey.currentFiatApiModeKey] as int?; final currentPinLength = data[PreferencesKey.currentPinLength] as int?; final currentTheme = data[PreferencesKey.currentTheme] as int?; - final disableExchange = data[PreferencesKey.disableExchangeKey] as bool?; + final exchangeStatus = data[PreferencesKey.exchangeStatusKey] as int?; final currentDefaultSettingsMigrationVersion = data[PreferencesKey.currentDefaultSettingsMigrationVersion] as int?; final moneroTransactionPriority = data[PreferencesKey.moneroTransactionPriority] as int?; final bitcoinTransactionPriority = data[PreferencesKey.bitcoinTransactionPriority] as int?; @@ -280,9 +280,9 @@ class BackupService { await _sharedPreferences.setInt( PreferencesKey.currentTheme, currentTheme); - if (disableExchange != null) - await _sharedPreferences.setBool( - PreferencesKey.disableExchangeKey, disableExchange); + if (exchangeStatus != null) + await _sharedPreferences.setInt( + PreferencesKey.exchangeStatusKey, exchangeStatus); if (currentDefaultSettingsMigrationVersion != null) await _sharedPreferences.setInt( @@ -431,8 +431,8 @@ class BackupService { _sharedPreferences.getInt(PreferencesKey.displayActionListModeKey), PreferencesKey.currentTheme: _sharedPreferences.getInt(PreferencesKey.currentTheme), - PreferencesKey.disableExchangeKey: - _sharedPreferences.getBool(PreferencesKey.disableExchangeKey), + PreferencesKey.exchangeStatusKey: + _sharedPreferences.getInt(PreferencesKey.exchangeStatusKey), PreferencesKey.currentDefaultSettingsMigrationVersion: _sharedPreferences .getInt(PreferencesKey.currentDefaultSettingsMigrationVersion), PreferencesKey.bitcoinTransactionPriority: diff --git a/lib/core/fiat_conversion_service.dart b/lib/core/fiat_conversion_service.dart index f4ec3775b..66997675d 100644 --- a/lib/core/fiat_conversion_service.dart +++ b/lib/core/fiat_conversion_service.dart @@ -4,18 +4,31 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart'; -const fiatApiAuthority = 'fiat-api.cakewallet.com'; -const fiatApiPath = '/v1/rates'; +const _fiatApiClearNetAuthority = 'fiat-api.cakewallet.com'; +const _fiatApiOnionAuthority = 'n4z7bdcmwk2oyddxvzaap3x2peqcplh3pzdy7tpkk5ejz5n4mhfvoxqd.onion'; +const _fiatApiPath = '/v2/rates'; Future _fetchPrice(Map args) async { final crypto = args['crypto'] as CryptoCurrency; final fiat = args['fiat'] as FiatCurrency; + final torOnly = args['torOnly'] as bool; + + final Map queryParams = { + 'interval_count': '1', + 'base': crypto.toString(), + 'quote': fiat.toString(), + }; + double price = 0.0; try { - final fiatStringified = fiat.toString(); - final uri = Uri.https(fiatApiAuthority, fiatApiPath, - {'convert': fiatStringified}); + late final Uri uri; + if (torOnly) { + uri = Uri.http(_fiatApiOnionAuthority, _fiatApiPath, queryParams); + } else { + uri = Uri.https(_fiatApiClearNetAuthority, _fiatApiPath, queryParams); + } + final response = await get(uri); if (response.statusCode != 200) { @@ -23,13 +36,10 @@ Future _fetchPrice(Map args) async { } final responseJSON = json.decode(response.body) as Map; - final data = responseJSON['data'] as List; + final results = responseJSON['results'] as Map; - for (final item in data) { - if (item['symbol'] == crypto.title) { - price = item['quote'][fiatStringified]['price'] as double; - break; - } + if (results.isNotEmpty) { + price = results.values.first as double; } return price; @@ -38,12 +48,14 @@ Future _fetchPrice(Map args) async { } } -Future _fetchPriceAsync( - CryptoCurrency crypto, FiatCurrency fiat) async => - compute(_fetchPrice, {'fiat': fiat, 'crypto': crypto}); +Future _fetchPriceAsync(CryptoCurrency crypto, FiatCurrency fiat, bool torOnly) async => + compute(_fetchPrice, {'fiat': fiat, 'crypto': crypto, 'torOnly': torOnly}); class FiatConversionService { - static Future fetchPrice( - CryptoCurrency crypto, FiatCurrency fiat) async => - await _fetchPriceAsync(crypto, fiat); + static Future fetchPrice({ + required CryptoCurrency crypto, + required FiatCurrency fiat, + required bool torOnly, + }) async => + await _fetchPriceAsync(crypto, fiat, torOnly); } diff --git a/lib/core/wallet_loading_service.dart b/lib/core/wallet_loading_service.dart index 5bae5b346..761c6acce 100644 --- a/lib/core/wallet_loading_service.dart +++ b/lib/core/wallet_loading_service.dart @@ -22,13 +22,13 @@ class WalletLoadingService { final wallet = await walletService.openWallet(name, password); if (type == WalletType.monero) { - await upateMoneroWalletPassword(wallet); + await updateMoneroWalletPassword(wallet); } return wallet; } - Future upateMoneroWalletPassword(WalletBase wallet) async { + Future updateMoneroWalletPassword(WalletBase wallet) async { final key = PreferencesKey.moneroWalletUpdateV1Key(wallet.name); var isPasswordUpdated = sharedPreferences.getBool(key) ?? false; @@ -37,8 +37,8 @@ class WalletLoadingService { } final password = generateWalletPassword(); - // Save new generated password with backup key for case - // if wallet will change password, but it will faild to updated in secure storage + // Save new generated password with backup key for case where + // wallet will change password, but it will fail to update in secure storage final bakWalletName = '#__${wallet.name}_bak__#'; await keyService.saveWalletPassword(walletName: bakWalletName, password: password); await wallet.changePassword(password); diff --git a/lib/di.dart b/lib/di.dart index a7d48b1f8..3d83f1bb9 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -38,6 +38,7 @@ import 'package:cake_wallet/view_model/settings/other_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart'; import 'package:cake_wallet/view_model/settings/security_settings_view_model.dart'; import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart'; +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cake_wallet/core/backup_service.dart'; import 'package:cw_core/wallet_service.dart'; @@ -366,8 +367,8 @@ Future setup( addressListViewModel: getIt.get(), walletViewModel: getIt.get())); - getIt.registerFactoryParam( - (dynamic item, _) => WalletAddressEditOrCreateViewModel( + getIt.registerFactoryParam( + (WalletAddressListItem? item, _) => WalletAddressEditOrCreateViewModel( wallet: getIt.get().wallet!, item: item)); getIt.registerFactoryParam( diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart index 17f1d518e..3a0fec276 100644 --- a/lib/entities/default_settings_migration.dart +++ b/lib/entities/default_settings_migration.dart @@ -1,10 +1,12 @@ import 'dart:io' show File, Platform; import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cw_core/pathForWallet.dart'; import 'package:cake_wallet/entities/secret_store_key.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:hive/hive.dart'; +import 'package:share_plus/share_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cw_core/wallet_type.dart'; @@ -143,8 +145,10 @@ Future defaultSettingsMigration( case 19: await validateBitcoinSavedTransactionPriority(sharedPreferences); break; - case 20: + await migrateExchangeStatus(sharedPreferences); + break; + case 21: await addEthereumNodeList(nodes: nodes); await changeEthereumCurrentNodeToDefault( sharedPreferences: sharedPreferences, nodes: nodes); @@ -526,6 +530,18 @@ Future changeDefaultHavenNode( }); } +Future migrateExchangeStatus(SharedPreferences sharedPreferences) async { + final isExchangeDisabled = sharedPreferences.getBool(PreferencesKey.disableExchangeKey); + if (isExchangeDisabled == null) { + return; + } + + await sharedPreferences.setInt(PreferencesKey.exchangeStatusKey, isExchangeDisabled + ? ExchangeApiMode.disabled.raw : ExchangeApiMode.enabled.raw); + + await sharedPreferences.remove(PreferencesKey.disableExchangeKey); +} + Future addEthereumNodeList({required Box nodes}) async { final nodeList = await loadDefaultEthereumNodes(); for (var node in nodeList) { diff --git a/lib/entities/exchange_api_mode.dart b/lib/entities/exchange_api_mode.dart new file mode 100644 index 000000000..0b8b575a5 --- /dev/null +++ b/lib/entities/exchange_api_mode.dart @@ -0,0 +1,39 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cw_core/enumerable_item.dart'; + +class ExchangeApiMode extends EnumerableItem with Serializable { + const ExchangeApiMode({required String title, required int raw}) : super(title: title, raw: raw); + + static const all = [ExchangeApiMode.enabled, ExchangeApiMode.torOnly, ExchangeApiMode.disabled]; + + static const enabled = ExchangeApiMode(raw: 0, title: 'Enabled'); + static const torOnly = ExchangeApiMode(raw: 1, title: 'Tor only'); + static const disabled = ExchangeApiMode(raw: 2, title: 'Disabled'); + + static ExchangeApiMode deserialize({required int raw}) { + switch (raw) { + case 0: + return enabled; + case 1: + return torOnly; + case 2: + return disabled; + default: + throw Exception('Unexpected token: $raw for ExchangeApiMode deserialize'); + } + } + + @override + String toString() { + switch (this) { + case ExchangeApiMode.enabled: + return S.current.enabled; + case ExchangeApiMode.torOnly: + return S.current.tor_only; + case ExchangeApiMode.disabled: + return S.current.disabled; + default: + return ''; + } + } +} \ No newline at end of file diff --git a/lib/entities/fiat_currency.dart b/lib/entities/fiat_currency.dart index 9cad6f468..12ceff92a 100644 --- a/lib/entities/fiat_currency.dart +++ b/lib/entities/fiat_currency.dart @@ -9,76 +9,106 @@ class FiatCurrency extends EnumerableItem with Serializable { static List get all => _all.values.toList(); static List get currenciesAvailableToBuyWith => - [aud, brl, cad, chf, czk, eur, dkk, gbp, hkd, ils, jpy, krw, mxn, myr, nok, nzd, pln, sek, sgd, thb, usd, zar]; + [aud, bgn, brl, cad, chf, clp, cop, czk, dkk, egp, eur, gbp, gtq, hkd, hrk, huf, idr, ils, inr, isk, jpy, krw, mad, mxn, myr, ngn, nok, nzd, php, pkr, pln, ron, sek, sgd, thb, twd, usd, vnd, zar]; + static const ars = FiatCurrency(symbol: 'ARS', countryCode: "arg", fullName: "Argentine Peso"); static const aud = FiatCurrency(symbol: 'AUD', countryCode: "aus", fullName: "Australian Dollar"); + static const bdt = FiatCurrency(symbol: 'BDT', countryCode: "bgd", fullName: "Bangladeshi Taka"); static const bgn = FiatCurrency(symbol: 'BGN', countryCode: "bgr", fullName: "Bulgarian Lev"); static const brl = FiatCurrency(symbol: 'BRL', countryCode: "bra", fullName: "Brazilian Real"); static const cad = FiatCurrency(symbol: 'CAD', countryCode: "cad", fullName: "Canadian Dollar"); static const chf = FiatCurrency(symbol: 'CHF', countryCode: "che", fullName: "Swiss Franc"); + static const clp = FiatCurrency(symbol: 'CLP', countryCode: "chl", fullName: "Chilean Peso"); static const cny = FiatCurrency(symbol: 'CNY', countryCode: "chn", fullName: "Chinese Yuan"); + static const cop = FiatCurrency(symbol: 'COP', countryCode: "col", fullName: "Colombian Peso"); static const czk = FiatCurrency(symbol: 'CZK', countryCode: "czk", fullName: "Czech Koruna"); - static const eur = FiatCurrency(symbol: 'EUR', countryCode: "eur", fullName: "Euro"); static const dkk = FiatCurrency(symbol: 'DKK', countryCode: "dnk", fullName: "Danish Krone"); - static const gbp = FiatCurrency(symbol: 'GBP', countryCode: "gbr", fullName: "Pound sterling"); + static const egp = FiatCurrency(symbol: 'EGP', countryCode: "egy", fullName: "Egyptian Pound"); + static const eur = FiatCurrency(symbol: 'EUR', countryCode: "eur", fullName: "Euro"); + static const gbp = FiatCurrency(symbol: 'GBP', countryCode: "gbr", fullName: "Pound Sterling"); + static const ghs = FiatCurrency(symbol: 'GHS', countryCode: "gha", fullName: "Ghanaian Cedi"); + static const gtq = FiatCurrency(symbol: 'GTQ', countryCode: "gtm", fullName: "Guatemalan Quetzal"); static const hkd = FiatCurrency(symbol: 'HKD', countryCode: "hkg", fullName: "Hong Kong Dollar"); static const hrk = FiatCurrency(symbol: 'HRK', countryCode: "hrv", fullName: "Croatian Kuna"); static const huf = FiatCurrency(symbol: 'HUF', countryCode: "hun", fullName: "Hungarian Forint"); static const idr = FiatCurrency(symbol: 'IDR', countryCode: "idn", fullName: "Indonesian Rupiah"); static const ils = FiatCurrency(symbol: 'ILS', countryCode: "isr", fullName: "Israeli New Shekel"); static const inr = FiatCurrency(symbol: 'INR', countryCode: "ind", fullName: "Indian Rupee"); - static const isk = FiatCurrency(symbol: 'ISK', countryCode: "isl", fullName: "Icelandic Króna"); - static const jpy = FiatCurrency(symbol: 'JPY', countryCode: "jpn", fullName: "Japanese Yen equals"); - static const krw = FiatCurrency(symbol: 'KRW', countryCode: "kor", fullName: "South Korean won"); + static const irr = FiatCurrency(symbol: 'IRR', countryCode: "irn", fullName: "Iranian Rial"); + static const isk = FiatCurrency(symbol: 'ISK', countryCode: "isl", fullName: "Icelandic Krona Króna"); + static const jpy = FiatCurrency(symbol: 'JPY', countryCode: "jpn", fullName: "Japanese Yen"); + static const krw = FiatCurrency(symbol: 'KRW', countryCode: "kor", fullName: "South Korean Won"); + static const mad = FiatCurrency(symbol: 'MAD', countryCode: "mar", fullName: "Moroccan Dirham"); static const mxn = FiatCurrency(symbol: 'MXN', countryCode: "mex", fullName: "Mexican Peso"); static const myr = FiatCurrency(symbol: 'MYR', countryCode: "mys", fullName: "Malaysian Ringgit"); + static const ngn = FiatCurrency(symbol: 'NGN', countryCode: "nga", fullName: "Nigerian Naira"); static const nok = FiatCurrency(symbol: 'NOK', countryCode: "nor", fullName: "Norwegian Krone"); static const nzd = FiatCurrency(symbol: 'NZD', countryCode: "nzl", fullName: "New Zealand Dollar"); - static const php = FiatCurrency(symbol: 'PHP', countryCode: "phl", fullName: "Philippine peso"); - static const pln = FiatCurrency(symbol: 'PLN', countryCode: "pol", fullName: "Poland złoty"); + static const php = FiatCurrency(symbol: 'PHP', countryCode: "phl", fullName: "Philippine Peso"); + static const pkr = FiatCurrency(symbol: 'PKR', countryCode: "pak", fullName: "Pakistani Rupee"); + static const pln = FiatCurrency(symbol: 'PLN', countryCode: "pol", fullName: "Poland Zloty złoty"); static const ron = FiatCurrency(symbol: 'RON', countryCode: "rou", fullName: "Romanian Leu"); static const rub = FiatCurrency(symbol: 'RUB', countryCode: "rus", fullName: "Russian Ruble"); + static const sar = FiatCurrency(symbol: 'SAR', countryCode: "sau", fullName: "Saudi Riyal"); static const sek = FiatCurrency(symbol: 'SEK', countryCode: "swe", fullName: "Swedish Krona"); static const sgd = FiatCurrency(symbol: 'SGD', countryCode: "sgp", fullName: "Singapore Dollar"); - static const thb = FiatCurrency(symbol: 'THB', countryCode: "tha", fullName: "Thai Baht"); + static const thb = FiatCurrency(symbol: 'THB', countryCode: "tha", fullName: "New Thaiwan Dollar"); + static const twd = FiatCurrency(symbol: 'TWD', countryCode: "twn", fullName: "Thai Baht"); + static const uah = FiatCurrency(symbol: 'UAH', countryCode: "ukr", fullName: "Ukrainian Hryvnia"); static const usd = FiatCurrency(symbol: 'USD', countryCode: "usa", fullName: "United States Dollar"); + static const vef = FiatCurrency(symbol: 'VEF', countryCode: "ven", fullName: "Venezuelan Bolivar Bolívar"); + static const vnd = FiatCurrency(symbol: 'VND', countryCode: "vnm", fullName: "Vietnamese Dong đồng"); static const zar = FiatCurrency(symbol: 'ZAR', countryCode: "saf", fullName: "South African Rand"); - static const vef = FiatCurrency(symbol: 'VEF', countryCode: "ven", fullName: "Venezuelan Bolívar"); static final _all = { + FiatCurrency.ars.raw: FiatCurrency.ars, FiatCurrency.aud.raw: FiatCurrency.aud, + FiatCurrency.bdt.raw: FiatCurrency.bdt, FiatCurrency.bgn.raw: FiatCurrency.bgn, FiatCurrency.brl.raw: FiatCurrency.brl, FiatCurrency.cad.raw: FiatCurrency.cad, FiatCurrency.chf.raw: FiatCurrency.chf, + FiatCurrency.clp.raw: FiatCurrency.clp, FiatCurrency.cny.raw: FiatCurrency.cny, + FiatCurrency.cop.raw: FiatCurrency.cop, FiatCurrency.czk.raw: FiatCurrency.czk, - FiatCurrency.eur.raw: FiatCurrency.eur, FiatCurrency.dkk.raw: FiatCurrency.dkk, + FiatCurrency.egp.raw: FiatCurrency.egp, + FiatCurrency.eur.raw: FiatCurrency.eur, FiatCurrency.gbp.raw: FiatCurrency.gbp, + FiatCurrency.ghs.raw: FiatCurrency.ghs, + FiatCurrency.gtq.raw: FiatCurrency.gtq, FiatCurrency.hkd.raw: FiatCurrency.hkd, FiatCurrency.hrk.raw: FiatCurrency.hrk, FiatCurrency.huf.raw: FiatCurrency.huf, FiatCurrency.idr.raw: FiatCurrency.idr, FiatCurrency.ils.raw: FiatCurrency.ils, FiatCurrency.inr.raw: FiatCurrency.inr, + FiatCurrency.irr.raw: FiatCurrency.irr, FiatCurrency.isk.raw: FiatCurrency.isk, FiatCurrency.jpy.raw: FiatCurrency.jpy, FiatCurrency.krw.raw: FiatCurrency.krw, + FiatCurrency.mad.raw: FiatCurrency.mad, FiatCurrency.mxn.raw: FiatCurrency.mxn, FiatCurrency.myr.raw: FiatCurrency.myr, + FiatCurrency.ngn.raw: FiatCurrency.ngn, FiatCurrency.nok.raw: FiatCurrency.nok, FiatCurrency.nzd.raw: FiatCurrency.nzd, FiatCurrency.php.raw: FiatCurrency.php, + FiatCurrency.pkr.raw: FiatCurrency.pkr, FiatCurrency.pln.raw: FiatCurrency.pln, FiatCurrency.ron.raw: FiatCurrency.ron, FiatCurrency.rub.raw: FiatCurrency.rub, + FiatCurrency.sar.raw: FiatCurrency.sar, FiatCurrency.sek.raw: FiatCurrency.sek, FiatCurrency.sgd.raw: FiatCurrency.sgd, FiatCurrency.thb.raw: FiatCurrency.thb, + FiatCurrency.twd.raw: FiatCurrency.twd, + FiatCurrency.uah.raw: FiatCurrency.uah, FiatCurrency.usd.raw: FiatCurrency.usd, - FiatCurrency.zar.raw: FiatCurrency.zar, - FiatCurrency.vef.raw: FiatCurrency.vef + FiatCurrency.vef.raw: FiatCurrency.vef, + FiatCurrency.vnd.raw: FiatCurrency.vnd, + FiatCurrency.zar.raw: FiatCurrency.zar }; static FiatCurrency deserialize({required String raw}) => _all[raw]!; diff --git a/lib/entities/language_service.dart b/lib/entities/language_service.dart index 6ef876abd..968c3e843 100644 --- a/lib/entities/language_service.dart +++ b/lib/entities/language_service.dart @@ -20,7 +20,13 @@ class LanguageService { 'hr': 'Hrvatski (Croatian)', 'it': 'Italiano (Italian)', 'th': 'ภาษาไทย (Thai)', - 'ar': 'العربية (Arabic)' + 'ar': 'العربية (Arabic)', + 'tr': 'Türkçe (Turkish)', + 'my': 'မြန်မာ (Burmese)', + 'bg': 'Български (Bulgarian)', + 'cs': 'čeština (Czech)', + 'ur': 'اردو (Urdu)', + 'id': 'Bahasa Indonesia (Indonesian)' }; static const Map localeCountryCode = { @@ -40,7 +46,13 @@ class LanguageService { 'hr': 'hrv', 'it': 'ita', 'th': 'tha', - 'ar': 'sau' + 'ar': 'sau', + 'tr': 'tur', + 'my': 'mmr', + 'bg': 'bgr', + 'cs': 'czk', + 'ur': 'pak', + 'id': 'idn' }; static final list = {}; diff --git a/lib/entities/openalias_record.dart b/lib/entities/openalias_record.dart index 9e2b3f680..842a711fe 100644 --- a/lib/entities/openalias_record.dart +++ b/lib/entities/openalias_record.dart @@ -1,5 +1,4 @@ import 'package:basic_utils/basic_utils.dart'; -import 'package:cw_core/wallet_type.dart'; class OpenaliasRecord { OpenaliasRecord({ @@ -22,69 +21,68 @@ class OpenaliasRecord { return formattedName; } - static Future fetchAddressAndName({ + static Future?> lookupOpenAliasRecord(String name) async { + try { + final txtRecord = await DnsUtils.lookupRecord(name, RRecordType.TXT, dnssec: true); + + return txtRecord; + } catch (e) { + print("${e.toString()}"); + return null; + } + } + + static OpenaliasRecord fetchAddressAndName({ required String formattedName, required String ticker, - }) async { + required List txtRecord, + }) { String address = formattedName; String name = formattedName; String note = ''; - if (formattedName.contains(".")) { - try { - final txtRecord = await DnsUtils.lookupRecord( - formattedName, RRecordType.TXT, - dnssec: true); + for (RRecord element in txtRecord) { + String record = element.data; - if (txtRecord != null) { - for (RRecord element in txtRecord) { - String record = element.data; + if (record.contains("oa1:$ticker") && record.contains("recipient_address")) { + record = record.replaceAll('\"', ""); - if (record.contains("oa1:$ticker") && - record.contains("recipient_address")) { - record = record.replaceAll('\"', ""); + final dataList = record.split(";"); - final dataList = record.split(";"); + address = dataList + .where((item) => (item.contains("recipient_address"))) + .toString() + .replaceAll("oa1:$ticker recipient_address=", "") + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); - address = dataList - .where((item) => (item.contains("recipient_address"))) - .toString() - .replaceAll("oa1:$ticker recipient_address=", "") - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); + final recipientName = dataList + .where((item) => (item.contains("recipient_name"))) + .toString() + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); - final recipientName = dataList - .where((item) => (item.contains("recipient_name"))) - .toString() - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); - - if (recipientName.isNotEmpty) { - name = recipientName.replaceAll("recipient_name=", ""); - } - - final description = dataList - .where((item) => (item.contains("tx_description"))) - .toString() - .replaceAll("(", "") - .replaceAll(")", "") - .trim(); - - if (description.isNotEmpty) { - note = description.replaceAll("tx_description=", ""); - } - - break; - } - } + if (recipientName.isNotEmpty) { + name = recipientName.replaceAll("recipient_name=", ""); } - } catch (e) { - print("${e.toString()}"); - } - } - return OpenaliasRecord(address: address, name: name, description: note); + final description = dataList + .where((item) => (item.contains("tx_description"))) + .toString() + .replaceAll("(", "") + .replaceAll(")", "") + .trim(); + + if (description.isNotEmpty) { + note = description.replaceAll("tx_description=", ""); + } + + break; + } + } + return OpenaliasRecord(address: address, name: name, description: note); +} } diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 775f6e229..fce9d9a56 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -1,40 +1,75 @@ +import 'package:cake_wallet/core/address_validator.dart'; import 'package:cake_wallet/core/yat_service.dart'; import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/unstoppable_domain_address.dart'; import 'package:cake_wallet/entities/emoji_string_extension.dart'; +import 'package:cake_wallet/twitter/twitter_api.dart'; +import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:cake_wallet/entities/fio_address_provider.dart'; class AddressResolver { - AddressResolver({required this.yatService, required this.walletType}); - + final YatService yatService; final WalletType walletType; - + static const unstoppableDomains = [ - 'crypto', - 'zil', - 'x', - 'coin', - 'wallet', - 'bitcoin', - '888', - 'nft', - 'dao', - 'blockchain' -]; + 'crypto', + 'zil', + 'x', + 'coin', + 'wallet', + 'bitcoin', + '888', + 'nft', + 'dao', + 'blockchain' + ]; + + static String? extractAddressByType({required String raw, required CryptoCurrency type}) { + final addressPattern = AddressValidator.getAddressFromStringPattern(type); + + if (addressPattern == null) { + throw 'Unexpected token: $type for getAddressFromStringPattern'; + } + + final match = RegExp(addressPattern).firstMatch(raw); + return match?.group(0)?.replaceAll(RegExp('[^0-9a-zA-Z]'), ''); + } Future resolve(String text, String ticker) async { try { - if (text.contains('@') && !text.contains('.')) { + if (text.startsWith('@') && !text.substring(1).contains('@')) { + final formattedName = text.substring(1); + final twitterUser = await TwitterApi.lookupUserByName(userName: formattedName); + final addressFromBio = extractAddressByType( + raw: twitterUser.description, type: CryptoCurrency.fromString(ticker)); + if (addressFromBio != null) { + return ParsedAddress.fetchTwitterAddress(address: addressFromBio, name: text); + } + final tweets = twitterUser.tweets; + if (tweets != null) { + var subString = StringBuffer(); + tweets.forEach((item) { + subString.writeln(item.text); + }); + final userTweetsText = subString.toString(); + final addressFromPinnedTweet = + extractAddressByType(raw: userTweetsText, type: CryptoCurrency.fromString(ticker)); + + if (addressFromPinnedTweet != null) { + return ParsedAddress.fetchTwitterAddress(address: addressFromPinnedTweet, name: text); + } + } + } + if (!text.startsWith('@') && text.contains('@') && !text.contains('.')) { final bool isFioRegistered = await FioAddressProvider.checkAvail(text); if (isFioRegistered) { final address = await FioAddressProvider.getPubAddress(text, ticker); return ParsedAddress.fetchFioAddress(address: address, name: text); - } - + } } if (text.hasOnlyEmojis) { if (walletType != WalletType.haven) { @@ -55,10 +90,14 @@ class AddressResolver { return ParsedAddress.fetchUnstoppableDomainAddress(address: address, name: text); } - final record = await OpenaliasRecord.fetchAddressAndName( - formattedName: formattedName, ticker: ticker); - return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); - + if (formattedName.contains(".")) { + final txtRecord = await OpenaliasRecord.lookupOpenAliasRecord(formattedName); + if (txtRecord != null) { + final record = await OpenaliasRecord.fetchAddressAndName( + formattedName: formattedName, ticker: ticker, txtRecord: txtRecord); + return ParsedAddress.fetchOpenAliasAddress(record: record, name: text); + } + } } catch (e) { print(e.toString()); } diff --git a/lib/entities/parsed_address.dart b/lib/entities/parsed_address.dart index 09cecbf04..a73b44e33 100644 --- a/lib/entities/parsed_address.dart +++ b/lib/entities/parsed_address.dart @@ -1,8 +1,7 @@ import 'package:cake_wallet/entities/openalias_record.dart'; import 'package:cake_wallet/entities/yat_record.dart'; -import 'package:flutter/material.dart'; -enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed } +enum ParseFrom { unstoppableDomains, openAlias, yatRecord, fio, notParsed, twitter } class ParsedAddress { ParsedAddress({ @@ -41,11 +40,7 @@ class ParsedAddress { ); } - factory ParsedAddress.fetchOpenAliasAddress({OpenaliasRecord? record, required String name}){ - final formattedName = OpenaliasRecord.formatDomainName(name); - if (record == null || record.address.contains(formattedName)) { - return ParsedAddress(addresses: [name]); - } + factory ParsedAddress.fetchOpenAliasAddress({required OpenaliasRecord record, required String name}){ return ParsedAddress( addresses: [record.address], name: record.name, @@ -62,6 +57,14 @@ class ParsedAddress { ); } + factory ParsedAddress.fetchTwitterAddress({required String address, required String name}){ + return ParsedAddress( + addresses: [address], + name: name, + parseFrom: ParseFrom.twitter, + ); + } + final List addresses; final String name; final String description; diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 042531e30..8187dcf80 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -14,6 +14,7 @@ class PreferencesKey { static const allowBiometricalAuthenticationKey = 'allow_biometrical_authentication'; static const disableExchangeKey = 'disable_exchange'; + static const exchangeStatusKey = 'exchange_status'; static const currentTheme = 'current_theme'; static const isDarkThemeLegacy = 'dark_theme'; static const displayActionListModeKey = 'display_list_mode'; @@ -31,6 +32,7 @@ class PreferencesKey { static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1'; static const pinTimeOutDuration = 'pin_timeout_duration'; static const lastAuthTimeMilliseconds = 'last_auth_time_milliseconds'; + static const lastPopupDate = 'last_popup_date'; static String moneroWalletUpdateV1Key(String name) diff --git a/lib/entities/qr_scanner.dart b/lib/entities/qr_scanner.dart index 8c23f6ea1..c6873a5bc 100644 --- a/lib/entities/qr_scanner.dart +++ b/lib/entities/qr_scanner.dart @@ -7,7 +7,7 @@ Future presentQRScanner() async { try { final result = await BarcodeScanner.scan(); isQrScannerShown = false; - return result.rawContent; + return result.rawContent.trim(); } catch (e) { isQrScannerShown = false; rethrow; diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index a9fb7c9ca..e173dbdf6 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -143,6 +143,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final inputAddress = responseJSON['payinAddress'] as String; final refundAddress = responseJSON['refundAddress'] as String; final extraId = responseJSON['payinExtraId'] as String?; + final payoutAddress = responseJSON['payoutAddress'] as String; return Trade( id: id, @@ -154,7 +155,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { extraId: extraId, createdAt: DateTime.now(), amount: responseJSON['fromAmount']?.toString() ?? _request.fromAmount, - state: TradeState.created); + state: TradeState.created, + payoutAddress: payoutAddress); } @override @@ -192,6 +194,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final extraId = responseJSON['payinExtraId'] as String; final outputTransaction = responseJSON['payoutHash'] as String; final expiredAtRaw = responseJSON['validUntil'] as String; + final payoutAddress = responseJSON['payoutAddress'] as String; final expiredAt = DateTime.tryParse(expiredAtRaw)?.toLocal(); return Trade( @@ -204,7 +207,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { state: state, extraId: extraId, expiredAt: expiredAt, - outputTransaction: outputTransaction); + outputTransaction: outputTransaction, + payoutAddress: payoutAddress); } @override @@ -265,12 +269,17 @@ class ChangeNowExchangeProvider extends ExchangeProvider { : currency.title.toLowerCase(); } } + } String normalizeCryptoCurrency(CryptoCurrency currency) { switch(currency) { case CryptoCurrency.zec: return 'zec'; + case CryptoCurrency.usdcpoly: + return 'usdcmatic'; + case CryptoCurrency.maticpoly: + return 'maticmainnet'; default: return currency.title.toLowerCase(); } diff --git a/lib/exchange/exchange_provider.dart b/lib/exchange/exchange_provider.dart index 763350c94..cc81a21f6 100644 --- a/lib/exchange/exchange_provider.dart +++ b/lib/exchange/exchange_provider.dart @@ -14,6 +14,7 @@ abstract class ExchangeProvider { bool get isAvailable; bool get isEnabled; bool get supportsFixedRate; + bool get supportsOnionAddress => false; @override String toString() => title; diff --git a/lib/exchange/exchange_provider_description.dart b/lib/exchange/exchange_provider_description.dart index 2fd231085..e545f69ce 100644 --- a/lib/exchange/exchange_provider_description.dart +++ b/lib/exchange/exchange_provider_description.dart @@ -1,31 +1,30 @@ import 'package:cw_core/enumerable_item.dart'; -class ExchangeProviderDescription extends EnumerableItem - with Serializable { - const ExchangeProviderDescription({ - required String title, - required int raw, - required this.image, - this.horizontalLogo = false}) +class ExchangeProviderDescription extends EnumerableItem with Serializable { + const ExchangeProviderDescription( + {required String title, required int raw, required this.image, this.horizontalLogo = false}) : super(title: title, raw: raw); final bool horizontalLogo; final String image; - static const xmrto = ExchangeProviderDescription(title: 'XMR.TO', raw: 0, image: 'assets/images/xmrto.png'); + static const xmrto = + ExchangeProviderDescription(title: 'XMR.TO', raw: 0, image: 'assets/images/xmrto.png'); static const changeNow = ExchangeProviderDescription(title: 'ChangeNOW', raw: 1, image: 'assets/images/changenow.png'); static const morphToken = ExchangeProviderDescription(title: 'MorphToken', raw: 2, image: 'assets/images/morph.png'); - static const sideShift = + static const sideShift = ExchangeProviderDescription(title: 'SideShift', raw: 3, image: 'assets/images/sideshift.png'); - static const simpleSwap = - ExchangeProviderDescription(title: 'SimpleSwap', raw: 4, image: 'assets/images/simpleSwap.png'); + static const simpleSwap = ExchangeProviderDescription( + title: 'SimpleSwap', raw: 4, image: 'assets/images/simpleSwap.png'); - static const all = - ExchangeProviderDescription(title: 'All trades', raw: 5, image:''); + static const trocador = + ExchangeProviderDescription(title: 'Trocador', raw: 5, image: 'assets/images/trocador.png'); + + static const all = ExchangeProviderDescription(title: 'All trades', raw: 6, image: ''); static ExchangeProviderDescription deserialize({required int raw}) { switch (raw) { @@ -40,6 +39,8 @@ class ExchangeProviderDescription extends EnumerableItem case 4: return simpleSwap; case 5: + return trocador; + case 6: return all; default: throw Exception('Unexpected token: $raw for ExchangeProviderDescription deserialize'); diff --git a/lib/exchange/sideshift/sideshift_exchange_provider.dart b/lib/exchange/sideshift/sideshift_exchange_provider.dart index 59d7964cb..2fc593988 100644 --- a/lib/exchange/sideshift/sideshift_exchange_provider.dart +++ b/lib/exchange/sideshift/sideshift_exchange_provider.dart @@ -150,6 +150,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { refundAddress: settleAddress, state: TradeState.created, amount: _request.depositAmount, + payoutAddress: settleAddress, createdAt: DateTime.now(), ); } @@ -244,6 +245,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { final inputAddress = responseJSON['depositAddress']['address'] as String; final expectedSendAmount = responseJSON['depositAmount'].toString(); final deposits = responseJSON['deposits'] as List?; + final settleAddress = responseJSON['settleAddress']['address'] as String; TradeState? state; String? status; @@ -264,6 +266,7 @@ class SideShiftExchangeProvider extends ExchangeProvider { amount: expectedSendAmount, state: state, expiredAt: expiredAt, + payoutAddress: settleAddress ); } diff --git a/lib/exchange/simpleswap/simpleswap_exchange_provider.dart b/lib/exchange/simpleswap/simpleswap_exchange_provider.dart index 2521c1486..6c5c23460 100644 --- a/lib/exchange/simpleswap/simpleswap_exchange_provider.dart +++ b/lib/exchange/simpleswap/simpleswap_exchange_provider.dart @@ -108,6 +108,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { final responseJSON = json.decode(response.body) as Map; final id = responseJSON['id'] as String; final inputAddress = responseJSON['address_from'] as String; + final payoutAddress = responseJSON['address_to'] as String; final settleAddress = responseJSON['user_refund_address'] as String; final extraId = responseJSON['extra_id_from'] as String?; return Trade( @@ -120,6 +121,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { extraId: extraId, state: TradeState.created, amount: _request.amount, + payoutAddress: payoutAddress, createdAt: DateTime.now(), ); } @@ -189,6 +191,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { final expectedSendAmount = responseJSON['expected_amount'].toString(); final extraId = responseJSON['extra_id_from'] as String?; final status = responseJSON['status'] as String; + final payoutAddress = responseJSON['address_to'] as String; final state = TradeState.deserialize(raw: status); return Trade( @@ -200,6 +203,7 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { inputAddress: inputAddress, amount: expectedSendAmount, state: state, + payoutAddress: payoutAddress, ); } @@ -231,6 +235,10 @@ class SimpleSwapExchangeProvider extends ExchangeProvider { return 'usdcpoly'; case CryptoCurrency.usdcsol: return 'usdcspl'; + case CryptoCurrency.matic: + return 'maticerc20'; + case CryptoCurrency.maticpoly: + return 'matic'; default: return currency.title.toLowerCase(); } diff --git a/lib/exchange/trade.dart b/lib/exchange/trade.dart index 99b73e789..70dfa5713 100644 --- a/lib/exchange/trade.dart +++ b/lib/exchange/trade.dart @@ -8,20 +8,25 @@ part 'trade.g.dart'; @HiveType(typeId: Trade.typeId) class Trade extends HiveObject { - Trade( - {required this.id, - required this.amount, - ExchangeProviderDescription? provider, - CryptoCurrency? from, - CryptoCurrency? to, - TradeState? state, - this.createdAt, - this.expiredAt, - this.inputAddress, - this.extraId, - this.outputTransaction, - this.refundAddress, - this.walletId}) { + Trade({ + required this.id, + required this.amount, + ExchangeProviderDescription? provider, + CryptoCurrency? from, + CryptoCurrency? to, + TradeState? state, + this.createdAt, + this.expiredAt, + this.inputAddress, + this.extraId, + this.outputTransaction, + this.refundAddress, + this.walletId, + this.payoutAddress, + this.password, + this.providerId, + this.providerName, + }) { if (provider != null) { providerRaw = provider.raw; } @@ -88,16 +93,26 @@ class Trade extends HiveObject { @HiveField(12) String? walletId; + @HiveField(13) + String? payoutAddress; + + @HiveField(14) + String? password; + + @HiveField(15) + String? providerId; + + @HiveField(16) + String? providerName; + static Trade fromMap(Map map) { return Trade( id: map['id'] as String, - provider: ExchangeProviderDescription.deserialize( - raw: map['provider'] as int), + provider: ExchangeProviderDescription.deserialize(raw: map['provider'] as int), from: CryptoCurrency.deserialize(raw: map['input'] as int), to: CryptoCurrency.deserialize(raw: map['output'] as int), - createdAt: map['date'] != null - ? DateTime.fromMillisecondsSinceEpoch(map['date'] as int) - : null, + createdAt: + map['date'] != null ? DateTime.fromMillisecondsSinceEpoch(map['date'] as int) : null, amount: map['amount'] as String, walletId: map['wallet_id'] as String); } diff --git a/lib/exchange/trocador/trocador_exchange_provider.dart b/lib/exchange/trocador/trocador_exchange_provider.dart new file mode 100644 index 000000000..98726a265 --- /dev/null +++ b/lib/exchange/trocador/trocador_exchange_provider.dart @@ -0,0 +1,312 @@ +import 'dart:convert'; + +import 'package:cake_wallet/exchange/exchange_pair.dart'; +import 'package:cake_wallet/exchange/exchange_provider.dart'; +import 'package:cake_wallet/exchange/trade_state.dart'; +import 'package:cake_wallet/exchange/trocador/trocador_request.dart'; +import 'package:cw_core/crypto_currency.dart'; +import 'package:cake_wallet/exchange/trade_request.dart'; +import 'package:cake_wallet/exchange/trade.dart'; +import 'package:cake_wallet/exchange/limits.dart'; +import 'package:cake_wallet/exchange/exchange_provider_description.dart'; +import 'package:cake_wallet/.secrets.g.dart' as secrets; +import 'package:http/http.dart'; + +class TrocadorExchangeProvider extends ExchangeProvider { + TrocadorExchangeProvider({this.useTorOnly = false}) + : _lastUsedRateId = '', + super(pairList: _supportedPairs()); + + bool useTorOnly; + + static const List _notSupported = [ + CryptoCurrency.scrt, + CryptoCurrency.stx, + CryptoCurrency.zaddr, + ]; + + static List _supportedPairs() { + final supportedCurrencies = + CryptoCurrency.all.where((element) => !_notSupported.contains(element)).toList(); + + return supportedCurrencies + .map((i) => supportedCurrencies.map((k) => ExchangePair(from: i, to: k, reverse: true))) + .expand((i) => i) + .toList(); + } + + static const onionApiAuthority = 'trocadorfyhlu27aefre5u7zri66gudtzdyelymftvr4yjwcxhfaqsid.onion'; + static const clearNetAuthority = 'trocador.app'; + static const apiKey = secrets.trocadorApiKey; + static const markup = secrets.trocadorExchangeMarkup; + static const newRatePath = '/api/new_rate'; + static const createTradePath = 'api/new_trade'; + static const tradePath = 'api/trade'; + static const coinPath = 'api/coin'; + String _lastUsedRateId; + + @override + Future checkIsAvailable() async => true; + + @override + Future createTrade({required TradeRequest request, required bool isFixedRateMode}) { + final _request = request as TrocadorRequest; + return _createTrade(request: _request, isFixedRateMode: isFixedRateMode); + } + + Future _createTrade({ + required TrocadorRequest request, + required bool isFixedRateMode, + }) async { + final params = { + 'api_key': apiKey, + 'ticker_from': request.from.title.toLowerCase(), + 'ticker_to': request.to.title.toLowerCase(), + 'network_from': _networkFor(request.from), + 'network_to': _networkFor(request.to), + 'payment': isFixedRateMode ? 'True' : 'False', + 'min_kycrating': 'C', + 'markup': markup, + 'best_only': 'True', + if (!isFixedRateMode) 'amount_from': request.fromAmount, + if (isFixedRateMode) 'amount_to': request.toAmount, + 'address': request.address, + 'refund': request.refundAddress + }; + + if (isFixedRateMode) { + await fetchRate( + from: request.from, + to: request.to, + amount: double.tryParse(request.toAmount) ?? 0, + isFixedRateMode: true, + isReceiveAmount: true, + ); + params['id'] = _lastUsedRateId; + } + + final uri = await _getUri(createTradePath, params); + final response = await get(uri); + + if (response.statusCode == 400) { + final responseJSON = json.decode(response.body) as Map; + final error = responseJSON['error'] as String; + final message = responseJSON['message'] as String; + throw Exception('${error}\n$message'); + } + + if (response.statusCode != 200) { + throw Exception('Unexpected http status: ${response.statusCode}'); + } + + final responseJSON = json.decode(response.body) as Map; + final id = responseJSON['trade_id'] as String; + final inputAddress = responseJSON['address_provider'] as String; + final refundAddress = responseJSON['refund_address'] as String; + final status = responseJSON['status'] as String; + final state = TradeState.deserialize(raw: status); + final payoutAddress = responseJSON['address_user'] as String; + final date = responseJSON['date'] as String; + final password = responseJSON['password'] as String; + final providerId = responseJSON['id_provider'] as String; + final providerName = responseJSON['provider'] as String; + + return Trade( + id: id, + from: request.from, + to: request.to, + provider: description, + inputAddress: inputAddress, + refundAddress: refundAddress, + state: state, + password: password, + providerId: providerId, + providerName: providerName, + createdAt: DateTime.tryParse(date)?.toLocal(), + amount: responseJSON['amount_from']?.toString() ?? request.fromAmount, + payoutAddress: payoutAddress); + } + + @override + ExchangeProviderDescription get description => ExchangeProviderDescription.trocador; + + @override + Future fetchLimits( + {required CryptoCurrency from, + required CryptoCurrency to, + required bool isFixedRateMode}) async { + final params = { + 'api_key': apiKey, + 'ticker': from.title.toLowerCase(), + 'name': from.name, + }; + + final uri = await _getUri(coinPath, params); + + final response = await get(uri); + + if (response.statusCode != 200) { + throw Exception('Unexpected http status: ${response.statusCode}'); + } + + final responseJSON = json.decode(response.body) as List; + + if (responseJSON.isEmpty) { + throw Exception('No data'); + } + + final coinJson = responseJSON.first as Map; + + return Limits( + min: coinJson['minimum'] as double, + max: coinJson['maximum'] as double, + ); + } + + @override + Future fetchRate( + {required CryptoCurrency from, + required CryptoCurrency to, + required double amount, + required bool isFixedRateMode, + required bool isReceiveAmount}) async { + try { + if (amount == 0) { + return 0.0; + } + + final params = { + 'api_key': apiKey, + 'ticker_from': from.title.toLowerCase(), + 'ticker_to': to.title.toLowerCase(), + 'network_from': _networkFor(from), + 'network_to': _networkFor(to), + if (!isFixedRateMode) 'amount_from': amount.toString(), + if (isFixedRateMode) 'amount_to': amount.toString(), + 'payment': isFixedRateMode ? 'True' : 'False', + 'min_kycrating': 'C', + 'markup': markup, + 'best_only': 'True', + }; + + final uri = await _getUri(newRatePath, params); + final response = await get(uri); + final responseJSON = json.decode(response.body) as Map; + final fromAmount = double.parse(responseJSON['amount_from'].toString()); + final toAmount = double.parse(responseJSON['amount_to'].toString()); + final rateId = responseJSON['trade_id'] as String? ?? ''; + + if (rateId.isNotEmpty) { + _lastUsedRateId = rateId; + } + + return isReceiveAmount ? (amount / fromAmount) : (toAmount / amount); + } catch (e) { + print(e.toString()); + return 0.0; + } + } + + @override + Future findTradeById({required String id}) async { + final uri = await _getUri(tradePath, {'api_key': apiKey, 'id': id}); + return get(uri).then((response) { + if (response.statusCode != 200) { + throw Exception('Unexpected http status: ${response.statusCode}'); + } + + final responseListJson = json.decode(response.body) as List; + + final responseJSON = responseListJson.first; + final id = responseJSON['trade_id'] as String; + final inputAddress = responseJSON['address_user'] as String; + final refundAddress = responseJSON['refund_address'] as String; + final payoutAddress = responseJSON['address_provider'] as String; + final fromAmount = responseJSON['amount_from']?.toString() ?? '0'; + final from = CryptoCurrency.fromString(responseJSON['ticker_from'] as String); + final to = CryptoCurrency.fromString(responseJSON['ticker_to'] as String); + final state = TradeState.deserialize(raw: responseJSON['status'] as String); + final date = DateTime.parse(responseJSON['date'] as String); + final password = responseJSON['password'] as String; + final providerId = responseJSON['id_provider'] as String; + final providerName = responseJSON['provider'] as String; + + return Trade( + id: id, + from: from, + to: to, + provider: description, + inputAddress: inputAddress, + refundAddress: refundAddress, + createdAt: date, + amount: fromAmount, + state: state, + payoutAddress: payoutAddress, + password: password, + providerId: providerId, + providerName: providerName, + ); + }); + } + + @override + bool get isAvailable => true; + + @override + bool get isEnabled => true; + + @override + bool get supportsFixedRate => true; + + @override + bool get supportsOnionAddress => true; + + @override + String get title => 'Trocador'; + + String _networkFor(CryptoCurrency currency) { + switch (currency) { + case CryptoCurrency.eth: + return 'ERC20'; + case CryptoCurrency.maticpoly: + return 'Mainnet'; + case CryptoCurrency.usdcpoly: + return 'MATIC'; + case CryptoCurrency.zec: + return 'Mainnet'; + default: + return currency.tag != null ? _normalizeTag(currency.tag!) : 'Mainnet'; + } + } + + String _normalizeTag(String tag) { + switch (tag) { + case 'ETH': + return 'ERC20'; + case 'TRX': + return 'TRC20'; + default: + return tag.toLowerCase(); + } + } + + Future _getUri(String path, Map queryParams) async { + if (!supportsOnionAddress) { + return Uri.https(clearNetAuthority, path, queryParams); + } + + final uri = Uri.http(onionApiAuthority, path, queryParams); + + if (useTorOnly) { + return uri; + } + + try { + await get(uri); + + return uri; + } catch (e) { + return Uri.https(clearNetAuthority, path, queryParams); + } + } +} diff --git a/lib/exchange/trocador/trocador_request.dart b/lib/exchange/trocador/trocador_request.dart new file mode 100644 index 000000000..fbb8fdc84 --- /dev/null +++ b/lib/exchange/trocador/trocador_request.dart @@ -0,0 +1,21 @@ +import 'package:cake_wallet/exchange/trade_request.dart'; +import 'package:cw_core/crypto_currency.dart'; + +class TrocadorRequest extends TradeRequest { + TrocadorRequest( + {required this.from, + required this.to, + required this.address, + required this.fromAmount, + required this.toAmount, + required this.refundAddress, + required this.isReverse}); + + CryptoCurrency from; + CryptoCurrency to; + String address; + String fromAmount; + String toAmount; + String refundAddress; + bool isReverse; +} diff --git a/lib/main.dart b/lib/main.dart index f3fb3acdd..7ba1f204a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,9 @@ import 'dart:async'; -import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/core/auth_service.dart'; import 'package:cake_wallet/entities/language_service.dart'; import 'package:cake_wallet/buy/order.dart'; -import 'package:cake_wallet/ionia/ionia_category.dart'; -import 'package:cake_wallet/ionia/ionia_merchant.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; +import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -44,9 +42,20 @@ final rootKey = GlobalKey(); final RouteObserver routeObserver = RouteObserver(); Future main() async { - try { + + await runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); + FlutterError.onError = ExceptionHandler.onError; + + /// A callback that is invoked when an unhandled error occurs in the root + /// isolate. + PlatformDispatcher.instance.onError = (error, stack) { + ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); + + return true; + }; + final appDir = await getApplicationDocumentsDirectory(); await Hive.close(); Hive.init(appDir.path); @@ -132,18 +141,9 @@ Future main() async { secureStorage: secureStorage, initialMigrationVersion: 19); runApp(App()); - } catch (e, stacktrace) { - runApp(MaterialApp( - debugShowCheckedModeBanner: true, - home: Scaffold( - body: Container( - margin: - EdgeInsets.only(top: 50, left: 20, right: 20, bottom: 20), - child: Text( - 'Error:\n${e.toString()}\nStacktrace: $stacktrace', - style: TextStyle(fontSize: 22), - ))))); - } + }, (error, stackTrace) async { + ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stackTrace)); + }); } Future initialSetup( diff --git a/lib/reactions/bootstrap.dart b/lib/reactions/bootstrap.dart index 4b65ed9d2..6451c92c5 100644 --- a/lib/reactions/bootstrap.dart +++ b/lib/reactions/bootstrap.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:cake_wallet/reactions/fiat_rate_update.dart'; +import 'package:cake_wallet/reactions/on_current_fiat_api_mode_change.dart'; import 'package:cake_wallet/reactions/on_current_node_change.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; @@ -31,6 +32,7 @@ Future bootstrap(GlobalKey navigatorKey) async { startCurrentWalletChangeReaction( appStore, settingsStore, fiatConversionStore); startCurrentFiatChangeReaction(appStore, settingsStore, fiatConversionStore); + startCurrentFiatApiModeChangeReaction(appStore, settingsStore, fiatConversionStore); startOnCurrentNodeChangeReaction(appStore); startFiatRateUpdate(appStore, settingsStore, fiatConversionStore); } diff --git a/lib/reactions/fiat_rate_update.dart b/lib/reactions/fiat_rate_update.dart index 48c61d8ca..f9ddbef52 100644 --- a/lib/reactions/fiat_rate_update.dart +++ b/lib/reactions/fiat_rate_update.dart @@ -26,7 +26,9 @@ Future startFiatRateUpdate( } else { fiatConversionStore.prices[appStore.wallet!.currency] = await FiatConversionService.fetchPrice( - appStore.wallet!.currency, settingsStore.fiatCurrency); + crypto: appStore.wallet!.currency, + fiat: settingsStore.fiatCurrency, + torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); } } catch (e) { print(e); diff --git a/lib/reactions/on_authentication_state_change.dart b/lib/reactions/on_authentication_state_change.dart index edadf33b0..7521170e6 100644 --- a/lib/reactions/on_authentication_state_change.dart +++ b/lib/reactions/on_authentication_state_change.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:flutter/widgets.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/entities/load_current_wallet.dart'; @@ -16,8 +17,9 @@ void startAuthenticationStateChange(AuthenticationStore authenticationStore, if (state == AuthenticationState.installed) { try { await loadCurrentWallet(); - } catch (e) { - loginError = e; + } catch (error, stack) { + loginError = error; + ExceptionHandler.onError(FlutterErrorDetails(exception: error, stack: stack)); } return; } diff --git a/lib/reactions/on_current_fiat_api_mode_change.dart b/lib/reactions/on_current_fiat_api_mode_change.dart new file mode 100644 index 000000000..5bcaeef4c --- /dev/null +++ b/lib/reactions/on_current_fiat_api_mode_change.dart @@ -0,0 +1,25 @@ +import 'package:cake_wallet/entities/fiat_api_mode.dart'; +import 'package:mobx/mobx.dart'; +import 'package:cake_wallet/core/fiat_conversion_service.dart'; +import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart'; +import 'package:cake_wallet/store/settings_store.dart'; +import 'package:cake_wallet/store/app_store.dart'; + +ReactionDisposer? _onCurrentFiatCurrencyChangeDisposer; + +void startCurrentFiatApiModeChangeReaction(AppStore appStore, + SettingsStore settingsStore, FiatConversionStore fiatConversionStore) { + _onCurrentFiatCurrencyChangeDisposer?.reaction.dispose(); + _onCurrentFiatCurrencyChangeDisposer = reaction( + (_) => settingsStore.fiatApiMode, (FiatApiMode fiatApiMode) async { + if (appStore.wallet == null || fiatApiMode == FiatApiMode.disabled) { + return; + } + + fiatConversionStore.prices[appStore.wallet!.currency] = + await FiatConversionService.fetchPrice( + crypto: appStore.wallet!.currency, + fiat: settingsStore.fiatCurrency, + torOnly: fiatApiMode == FiatApiMode.torOnly); + }); +} diff --git a/lib/reactions/on_current_fiat_change.dart b/lib/reactions/on_current_fiat_change.dart index 5170c4576..873984940 100644 --- a/lib/reactions/on_current_fiat_change.dart +++ b/lib/reactions/on_current_fiat_change.dart @@ -18,7 +18,10 @@ void startCurrentFiatChangeReaction(AppStore appStore, } final cryptoCurrency = appStore.wallet!.currency; - fiatConversionStore.prices[appStore.wallet!.currency] = - await FiatConversionService.fetchPrice(cryptoCurrency, fiatCurrency); + fiatConversionStore.prices[cryptoCurrency] = + await FiatConversionService.fetchPrice( + crypto: cryptoCurrency, + fiat: fiatCurrency, + torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); }); } diff --git a/lib/reactions/on_current_wallet_change.dart b/lib/reactions/on_current_wallet_change.dart index 270415820..7fdb6b84f 100644 --- a/lib/reactions/on_current_wallet_change.dart +++ b/lib/reactions/on_current_wallet_change.dart @@ -67,11 +67,10 @@ void startCurrentWalletChangeReaction(AppStore appStore, await wallet.connectToNode(node: node); if (wallet.type == WalletType.haven) { - settingsStore.fiatCurrency = FiatCurrency.usd; await updateHavenRate(fiatConversionStore); } - if (wallet.walletInfo.address?.isEmpty ?? true) { + if (wallet.walletInfo.address.isEmpty) { wallet.walletInfo.address = wallet.walletAddresses.address; if (wallet.walletInfo.isInBox) { @@ -95,7 +94,9 @@ void startCurrentWalletChangeReaction(AppStore appStore, fiatConversionStore.prices[wallet.currency] = 0; fiatConversionStore.prices[wallet.currency] = await FiatConversionService.fetchPrice( - wallet.currency, settingsStore.fiatCurrency); + crypto: wallet.currency, + fiat: settingsStore.fiatCurrency, + torOnly: settingsStore.fiatApiMode == FiatApiMode.torOnly); } catch (e) { print(e.toString()); } diff --git a/lib/router.dart b/lib/router.dart index 896ddd99b..cb4952d0f 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -330,7 +330,7 @@ Route createRoute(RouteSettings settings) { getIt.get()); case Routes.pickerAddressBook: - final selectedCurrency = settings.arguments as CryptoCurrency; + final selectedCurrency = settings.arguments as CryptoCurrency?; return MaterialPageRoute( builder: (_) => getIt.get(param1: selectedCurrency)); diff --git a/lib/src/screens/backup/backup_page.dart b/lib/src/screens/backup/backup_page.dart index a055066c0..f819e88e5 100644 --- a/lib/src/screens/backup/backup_page.dart +++ b/lib/src/screens/backup/backup_page.dart @@ -1,10 +1,9 @@ import 'dart:io'; import 'package:cake_wallet/palette.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:cross_file/cross_file.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; @@ -110,7 +109,7 @@ class BackupPage extends BasePage { if (Platform.isAndroid) { onExportAndroid(context, backup); } else { - await share(backup); + await share(backup, context); } }, actionLeftButton: () => Navigator.of(dialogContext).pop()); @@ -140,18 +139,14 @@ class BackupPage extends BasePage { }, actionLeftButton: () async { Navigator.of(dialogContext).pop(); - await share(backup); + await share(backup, context); }); }); } - Future share(BackupExportFile backup) async { - const mimeType = 'application/*'; + Future share(BackupExportFile backup, BuildContext context) async { final path = await backupViewModelBase.saveBackupFileLocally(backup); - await Share.shareXFiles([XFile( - path, - name: backup.name, - mimeType: mimeType)]); + await ShareUtil.shareFile(filePath: path, fileName: backup.name, context: context); await backupViewModelBase.removeBackupFileLocally(backup); } } diff --git a/lib/src/screens/buy/buy_webview_page.dart b/lib/src/screens/buy/buy_webview_page.dart index 7c0ca903f..b19a112fc 100644 --- a/lib/src/screens/buy/buy_webview_page.dart +++ b/lib/src/screens/buy/buy_webview_page.dart @@ -9,11 +9,10 @@ import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/store/dashboard/orders_store.dart'; import 'package:cake_wallet/view_model/buy/buy_view_model.dart'; import 'package:flutter/material.dart'; -import 'package:webview_flutter/webview_flutter.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class BuyWebViewPage extends BasePage { - BuyWebViewPage({required this.buyViewModel, - required this.ordersStore, required this.url}); + BuyWebViewPage({required this.buyViewModel, required this.ordersStore, required this.url}); final OrdersStore ordersStore; final String url; @@ -46,12 +45,12 @@ class BuyWebViewPageBody extends StatefulWidget { class BuyWebViewPageBodyState extends State { BuyWebViewPageBodyState() - : _webViewkey = GlobalKey(), - _isSaving = false, - orderId = ''; + : _webViewkey = GlobalKey(), + _isSaving = false, + orderId = ''; String orderId; - WebViewController? _webViewController; + InAppWebViewController? _webViewController; GlobalKey _webViewkey; Timer? _timer; bool _isSaving; @@ -63,8 +62,6 @@ class BuyWebViewPageBodyState extends State { _isSaving = false; widget.ordersStore.orderId = ''; - if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); - if (widget.buyViewModel.selectedProvider is WyreBuyProvider) { _saveOrder(keyword: 'completed', splitSymbol: '/'); } @@ -76,31 +73,31 @@ class BuyWebViewPageBodyState extends State { @override Widget build(BuildContext context) { - return WebView( + return InAppWebView( key: _webViewkey, - initialUrl: widget.url, - javascriptMode: JavascriptMode.unrestricted, - onWebViewCreated: (WebViewController controller) => + initialOptions: InAppWebViewGroupOptions( + crossPlatform: InAppWebViewOptions(transparentBackground: true), + ), + initialUrlRequest: URLRequest(url: Uri.tryParse(widget.url ?? '')), + onWebViewCreated: (InAppWebViewController controller) => setState(() => _webViewController = controller)); } void _saveOrder({required String keyword, required String splitSymbol}) { _timer?.cancel(); _timer = Timer.periodic(Duration(seconds: 1), (timer) async { - try { if (_webViewController == null || _isSaving) { return; } - final url = await _webViewController!.currentUrl(); - + final url = (await _webViewController!.getUrl())?.toString(); if (url == null) { throw Exception('_saveOrder: Url is null'); } - if (url!.contains(keyword)) { - final urlParts = url!.split(splitSymbol); + if (url.contains(keyword)) { + final urlParts = url.split(splitSymbol); orderId = urlParts.last; widget.ordersStore.orderId = orderId; diff --git a/lib/src/screens/buy/onramper_page.dart b/lib/src/screens/buy/onramper_page.dart index b766fd388..4973cef0b 100644 --- a/lib/src/screens/buy/onramper_page.dart +++ b/lib/src/screens/buy/onramper_page.dart @@ -1,16 +1,14 @@ -import 'dart:io'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:flutter/material.dart'; -import 'package:webview_flutter/webview_flutter.dart'; import 'package:cake_wallet/.secrets.g.dart' as secrets; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:permission_handler/permission_handler.dart'; class OnRamperPage extends BasePage { - OnRamperPage({ - required this.settingsStore, - required this.wallet}); + OnRamperPage({required this.settingsStore, required this.wallet}); final SettingsStore settingsStore; final WalletBase wallet; @@ -25,22 +23,20 @@ class OnRamperPage extends BasePage { settingsStore: settingsStore, wallet: wallet, darkMode: darkMode, - backgroundColor: darkMode - ? backgroundDarkColor - : backgroundLightColor, + backgroundColor: darkMode ? backgroundDarkColor : backgroundLightColor, supportSell: false, supportSwap: false); } } class OnRamperPageBody extends StatefulWidget { - OnRamperPageBody({ - required this.settingsStore, - required this.wallet, - required this.darkMode, - required this.supportSell, - required this.supportSwap, - required this.backgroundColor}); + OnRamperPageBody( + {required this.settingsStore, + required this.wallet, + required this.darkMode, + required this.supportSell, + required this.supportSwap, + required this.backgroundColor}); static const baseUrl = 'widget.onramper.com'; final SettingsStore settingsStore; @@ -50,18 +46,15 @@ class OnRamperPageBody extends StatefulWidget { final bool supportSell; final bool supportSwap; - Uri get uri - => Uri.https( - baseUrl, - '', - { + Uri get uri => Uri.https(baseUrl, '', { 'apiKey': secrets.onramperApiKey, 'defaultCrypto': wallet.currency.title, 'defaultFiat': settingsStore.fiatCurrency.title, 'wallets': '${wallet.currency.title}:${wallet.walletAddresses.address}', 'darkMode': darkMode.toString(), 'supportSell': supportSell.toString(), - 'supportSwap': supportSwap.toString()}); + 'supportSwap': supportSwap.toString() + }); @override OnRamperPageBodyState createState() => OnRamperPageBodyState(); @@ -70,17 +63,26 @@ class OnRamperPageBody extends StatefulWidget { class OnRamperPageBodyState extends State { OnRamperPageBodyState(); - @override - void initState() { - super.initState(); - if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); - } - @override Widget build(BuildContext context) { - return WebView( - initialUrl: widget.uri.toString(), - backgroundColor: widget.backgroundColor, - javascriptMode: JavascriptMode.unrestricted); + return InAppWebView( + initialOptions: InAppWebViewGroupOptions( + crossPlatform: InAppWebViewOptions(transparentBackground: true), + ), + initialUrlRequest: URLRequest(url: widget.uri), + androidOnPermissionRequest: (_, __, resources) async { + bool permissionGranted = await Permission.camera.status == PermissionStatus.granted; + if (!permissionGranted) { + permissionGranted = await Permission.camera.request().isGranted; + } + + return PermissionRequestResponse( + resources: resources, + action: permissionGranted + ? PermissionRequestResponseAction.GRANT + : PermissionRequestResponseAction.DENY, + ); + }, + ); } } diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index c21365aa4..699e887ac 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -8,7 +8,6 @@ import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/menu_widget.dart'; @@ -229,7 +228,8 @@ class DashboardPage extends BasePage { } await Future.delayed(Duration(seconds: 1)); - await showPopUp( + if (context.mounted) { + await showPopUp( context: context, builder: (BuildContext context) { return AlertWithOneAction( @@ -239,6 +239,7 @@ class DashboardPage extends BasePage { buttonText: S.of(context).understand, buttonAction: () => Navigator.of(context).pop()); }); + } }); var needToPresentYat = false; diff --git a/lib/src/screens/dashboard/widgets/address_page.dart b/lib/src/screens/dashboard/widgets/address_page.dart index 9a06dc39d..a09eb2ba8 100644 --- a/lib/src/screens/dashboard/widgets/address_page.dart +++ b/lib/src/screens/dashboard/widgets/address_page.dart @@ -1,10 +1,8 @@ import 'package:cake_wallet/src/screens/base_page.dart'; -import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; -import 'package:cake_wallet/src/widgets/primary_button.dart'; -import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/themes/theme_base.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:flutter/material.dart'; @@ -15,7 +13,6 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:keyboard_actions/keyboard_actions.dart'; import 'package:mobx/mobx.dart'; -import 'package:share_plus/share_plus.dart'; class AddressPage extends BasePage { AddressPage({ @@ -100,7 +97,12 @@ class AddressPage extends BasePage { highlightColor: Colors.transparent, splashColor: Colors.transparent, iconSize: 25, - onPressed: () => Share.share(addressListViewModel.address.address), + onPressed: () { + ShareUtil.share( + text: addressListViewModel.address.address, + context: context, + ); + }, icon: shareImage, ), ) : null; @@ -115,7 +117,8 @@ class AddressPage extends BasePage { } await Future.delayed(Duration(seconds: 1)); - await showPopUp( + if (context.mounted) { + await showPopUp( context: context, builder: (BuildContext context) { return AlertWithTwoActions( @@ -129,6 +132,7 @@ class AddressPage extends BasePage { Navigator.of(context).pop(); }); }); + } }); return KeyboardActions( diff --git a/lib/src/screens/dashboard/widgets/trade_row.dart b/lib/src/screens/dashboard/widgets/trade_row.dart index 21952140e..3b613b0e2 100644 --- a/lib/src/screens/dashboard/widgets/trade_row.dart +++ b/lib/src/screens/dashboard/widgets/trade_row.dart @@ -9,7 +9,8 @@ class TradeRow extends StatelessWidget { required this.to, required this.createdAtFormattedDate, this.onTap, - this.formattedAmount,}); + this.formattedAmount, + }); final VoidCallback? onTap; final ExchangeProviderDescription provider; @@ -35,47 +36,40 @@ class TradeRow extends StatelessWidget { SizedBox(width: 12), Expanded( child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('${from.toString()} → ${to.toString()}', - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor! - )), - formattedAmount != null - ? Text(formattedAmount! + ' ' + amountCrypto, - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w500, - color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor! - )) - : Container() - ]), - SizedBox(height: 5), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - if (createdAtFormattedDate != null) - Text(createdAtFormattedDate!, - style: TextStyle( - fontSize: 14, - color: Theme.of(context).textTheme! - .overline!.backgroundColor!)) - ]) - ], - ) - ) + mainAxisSize: MainAxisSize.min, + children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text('${from.toString()} → ${to.toString()}', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!)), + formattedAmount != null + ? Text(formattedAmount! + ' ' + amountCrypto, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: + Theme.of(context).accentTextTheme!.headline2!.backgroundColor!)) + : Container() + ]), + SizedBox(height: 5), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + if (createdAtFormattedDate != null) + Text(createdAtFormattedDate!, + style: TextStyle( + fontSize: 14, + color: Theme.of(context).textTheme!.overline!.backgroundColor!)) + ]) + ], + )) ], ), )); } - Image? _getPoweredImage(ExchangeProviderDescription provider) { - Image? image; + Widget? _getPoweredImage(ExchangeProviderDescription provider) { + Widget? image; switch (provider) { case ExchangeProviderDescription.xmrto: @@ -93,10 +87,15 @@ class TradeRow extends StatelessWidget { case ExchangeProviderDescription.simpleSwap: image = Image.asset('assets/images/simpleSwap.png', width: 36, height: 36); break; + case ExchangeProviderDescription.trocador: + image = ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.asset('assets/images/trocador.png', width: 36, height: 36)); + break; default: image = null; } return image; } -} \ No newline at end of file +} diff --git a/lib/src/screens/dashboard/widgets/transaction_raw.dart b/lib/src/screens/dashboard/widgets/transaction_raw.dart index 7ba6cbf0e..b7d8cef93 100644 --- a/lib/src/screens/dashboard/widgets/transaction_raw.dart +++ b/lib/src/screens/dashboard/widgets/transaction_raw.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:cw_core/transaction_direction.dart'; -import 'package:cake_wallet/generated/i18n.dart'; class TransactionRow extends StatelessWidget { TransactionRow( @@ -9,6 +8,7 @@ class TransactionRow extends StatelessWidget { required this.formattedAmount, required this.formattedFiatAmount, required this.isPending, + required this.title, required this.onTap}); final VoidCallback onTap; @@ -17,6 +17,7 @@ class TransactionRow extends StatelessWidget { final String formattedAmount; final String formattedFiatAmount; final bool isPending; + final String title; @override Widget build(BuildContext context) { @@ -49,11 +50,7 @@ class TransactionRow extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - (direction == TransactionDirection.incoming - ? S.of(context).received - : S.of(context).sent) + - (isPending ? S.of(context).pending : ''), + Text(title, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, diff --git a/lib/src/screens/dashboard/widgets/transactions_page.dart b/lib/src/screens/dashboard/widgets/transactions_page.dart index 64f02c73c..cda23b8c9 100644 --- a/lib/src/screens/dashboard/widgets/transactions_page.dart +++ b/lib/src/screens/dashboard/widgets/transactions_page.dart @@ -60,7 +60,8 @@ class TransactionsPage extends StatelessWidget { formattedFiatAmount: dashboardViewModel.balanceViewModel.isFiatDisabled ? '' : item.formattedFiatAmount, - isPending: transaction.isPending)); + isPending: transaction.isPending, + title: item.formattedTitle + item.formattedStatus)); } if (item is TradeListItem) { diff --git a/lib/src/screens/exchange_trade/exchange_trade_page.dart b/lib/src/screens/exchange_trade/exchange_trade_page.dart index 5aacf3f1f..9eb17c762 100644 --- a/lib/src/screens/exchange_trade/exchange_trade_page.dart +++ b/lib/src/screens/exchange_trade/exchange_trade_page.dart @@ -112,7 +112,7 @@ class ExchangeTradeState extends State { width: 16, color: Theme.of(context).primaryTextTheme!.overline!.color!); - _setEffects(context); + _setEffects(); return Container( child: ScrollableWithBottomSection( @@ -165,14 +165,7 @@ class ExchangeTradeState extends State { .color! ) ), - child: QrImage( - data: trade.inputAddress ?? fetchingLabel, - backgroundColor: Colors.transparent, - foregroundColor: Theme.of(context) - .accentTextTheme! - .subtitle2! - .color!, - ), + child: QrImage(data: trade.inputAddress ?? fetchingLabel), )))), Spacer(flex: 3) ]), @@ -241,7 +234,7 @@ class ExchangeTradeState extends State { ); } - void _setEffects(BuildContext context) { + void _setEffects() { if (_effectsInstalled) { return; } @@ -252,12 +245,12 @@ class ExchangeTradeState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( context: context, - builder: (BuildContext context) { + builder: (BuildContext popupContext) { return AlertWithOneAction( - alertTitle: S.of(context).error, + alertTitle: S.of(popupContext).error, alertContent: state.error, - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop()); + buttonText: S.of(popupContext).ok, + buttonAction: () => Navigator.of(popupContext).pop()); }); }); } @@ -266,118 +259,24 @@ class ExchangeTradeState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( context: context, - builder: (BuildContext context) { + builder: (BuildContext popupContext) { return ConfirmSendingAlert( - alertTitle: S.of(context).confirm_sending, - amount: S.of(context).send_amount, + alertTitle: S.of(popupContext).confirm_sending, + amount: S.of(popupContext).send_amount, amountValue: widget.exchangeTradeViewModel.sendViewModel .pendingTransaction!.amountFormatted, - fee: S.of(context).send_fee, + fee: S.of(popupContext).send_fee, feeValue: widget.exchangeTradeViewModel.sendViewModel .pendingTransaction!.feeFormatted, - rightButtonText: S.of(context).ok, - leftButtonText: S.of(context).cancel, + rightButtonText: S.of(popupContext).ok, + leftButtonText: S.of(popupContext).cancel, actionRightButton: () async { - Navigator.of(context).pop(); + Navigator.of(popupContext).pop(); await widget.exchangeTradeViewModel.sendViewModel .commitTransaction(); - await showPopUp( - context: context, - builder: (BuildContext context) { - return Observer(builder: (_) { - final state = widget - .exchangeTradeViewModel.sendViewModel.state; - - if (state is TransactionCommitted) { - return Stack( - children: [ - Container( - color: Theme.of(context).backgroundColor, - child: Center( - child: Image.asset( - 'assets/images/birthday_cake.png'), - ), - ), - Center( - child: Padding( - padding: EdgeInsets.only( - top: 220, left: 24, right: 24), - child: Text( - S.of(context).send_success(widget - .exchangeTradeViewModel - .wallet - .currency - .toString()), - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.bold, - color: Theme.of(context) - .primaryTextTheme! - .headline6! - .color, - decoration: TextDecoration.none, - ), - ), - ), - ), - Positioned( - left: 24, - right: 24, - bottom: 24, - child: PrimaryButton( - onPressed: () => - Navigator.of(context).pop(), - text: S.of(context).send_got_it, - color: Theme.of(context) - .accentTextTheme! - .bodyText1! - .color!, - textColor: Colors.white)) - ], - ); - } - - return Stack( - children: [ - Container( - color: Theme.of(context).backgroundColor, - child: Center( - child: Image.asset( - 'assets/images/birthday_cake.png'), - ), - ), - BackdropFilter( - filter: ImageFilter.blur( - sigmaX: 3.0, sigmaY: 3.0), - child: Container( - decoration: BoxDecoration( - color: Theme.of(context) - .backgroundColor - .withOpacity(0.25)), - child: Center( - child: Padding( - padding: EdgeInsets.only(top: 220), - child: Text( - S.of(context).send_sending, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.bold, - color: Theme.of(context).primaryTextTheme!.headline6!.color!, - decoration: TextDecoration.none, - ), - ), - ), - ), - ), - ) - ], - ); - }); - }); + transactionStatePopup(); }, - actionLeftButton: () => Navigator.of(context).pop(), + actionLeftButton: () => Navigator.of(popupContext).pop(), feeFiatAmount: widget.exchangeTradeViewModel .pendingTransactionFeeFiatAmountFormatted, fiatAmountValue: widget.exchangeTradeViewModel @@ -392,12 +291,12 @@ class ExchangeTradeState extends State { WidgetsBinding.instance.addPostFrameCallback((_) { showPopUp( context: context, - builder: (BuildContext context) { + builder: (BuildContext popupContext) { return AlertWithOneAction( - alertTitle: S.of(context).sending, - alertContent: S.of(context).transaction_sent, - buttonText: S.of(context).ok, - buttonAction: () => Navigator.of(context).pop()); + alertTitle: S.of(popupContext).sending, + alertContent: S.of(popupContext).transaction_sent, + buttonText: S.of(popupContext).ok, + buttonAction: () => Navigator.of(popupContext).pop()); }); }); } @@ -405,4 +304,102 @@ class ExchangeTradeState extends State { _effectsInstalled = true; } + + void transactionStatePopup() { + showPopUp( + context: context, + builder: (BuildContext popupContext) { + return Observer(builder: (_) { + final state = widget + .exchangeTradeViewModel.sendViewModel.state; + + if (state is TransactionCommitted) { + return Stack( + children: [ + Container( + color: Theme.of(popupContext).backgroundColor, + child: Center( + child: Image.asset( + 'assets/images/birthday_cake.png'), + ), + ), + Center( + child: Padding( + padding: EdgeInsets.only( + top: 220, left: 24, right: 24), + child: Text( + S.of(popupContext).send_success(widget + .exchangeTradeViewModel + .wallet + .currency + .toString()), + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Theme.of(popupContext) + .primaryTextTheme! + .headline6! + .color, + decoration: TextDecoration.none, + ), + ), + ), + ), + Positioned( + left: 24, + right: 24, + bottom: 24, + child: PrimaryButton( + onPressed: () => + Navigator.of(popupContext).pop(), + text: S.of(popupContext).send_got_it, + color: Theme.of(popupContext) + .accentTextTheme! + .bodyText1! + .color!, + textColor: Colors.white)) + ], + ); + } + + return Stack( + children: [ + Container( + color: Theme.of(popupContext).backgroundColor, + child: Center( + child: Image.asset( + 'assets/images/birthday_cake.png'), + ), + ), + BackdropFilter( + filter: ImageFilter.blur( + sigmaX: 3.0, sigmaY: 3.0), + child: Container( + decoration: BoxDecoration( + color: Theme.of(popupContext) + .backgroundColor + .withOpacity(0.25)), + child: Center( + child: Padding( + padding: EdgeInsets.only(top: 220), + child: Text( + S.of(popupContext).send_sending, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Theme.of(popupContext).primaryTextTheme!.headline6!.color!, + decoration: TextDecoration.none, + ), + ), + ), + ), + ), + ) + ], + ); + }); + }); + } } diff --git a/lib/src/screens/ionia/auth/ionia_create_account_page.dart b/lib/src/screens/ionia/auth/ionia_create_account_page.dart index 30a58850e..d2ced5dae 100644 --- a/lib/src/screens/ionia/auth/ionia_create_account_page.dart +++ b/lib/src/screens/ionia/auth/ionia_create_account_page.dart @@ -32,8 +32,8 @@ class IoniaCreateAccountPage extends BasePage { final FocusNode _emailFocus; final TextEditingController _emailController; - static const privacyPolicyUrl = 'https://ionia.docsend.com/view/jaqsmbq9w7dzvnqf'; - static const termsAndConditionsUrl = 'https://ionia.docsend.com/view/hi9awnwxr6mqgiqj'; + static const privacyPolicyUrl = 'https://ionia.docsend.com/view/jhjvdn7qq7k3ukwt'; + static const termsAndConditionsUrl = 'https://ionia.docsend.com/view/uceirymz2ijacq5g'; @override Widget middle(BuildContext context) { diff --git a/lib/src/screens/ionia/cards/ionia_payment_status_page.dart b/lib/src/screens/ionia/cards/ionia_payment_status_page.dart index e02a3cee8..4096560db 100644 --- a/lib/src/screens/ionia/cards/ionia_payment_status_page.dart +++ b/lib/src/screens/ionia/cards/ionia_payment_status_page.dart @@ -157,7 +157,8 @@ class _IoniaPaymentStatusPageBodyBodyState extends State<_IoniaPaymentStatusPage Container( padding: EdgeInsets.only(left: 40, right: 40, bottom: 20), child: Text( - S.of(context).proceed_after_one_minute, + widget.viewModel.payingByBitcoin ? S.of(context).bitcoin_payments_require_1_confirmation + : S.of(context).proceed_after_one_minute, style: textMedium( color: Theme.of(context).primaryTextTheme!.headline6!.color!, ).copyWith(fontWeight: FontWeight.w500), diff --git a/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart b/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart index 6c2f996df..05ff65889 100644 --- a/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart +++ b/lib/src/screens/new_wallet/advanced_privacy_settings_page.dart @@ -1,7 +1,11 @@ +import 'package:cake_wallet/entities/exchange_api_mode.dart'; +import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart'; import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart'; +import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/generated/i18n.dart'; @@ -48,29 +52,47 @@ class _AdvancedPrivacySettingsBodyState extends State Observer( - builder: (_) => SettingsSwitcherCell( - title: item.title, - value: item.value(), - onValueChange: item.onValueChange, + Observer(builder: (_) { + return SettingsChoicesCell( + ChoicesListItem( + title: S.current.disable_fiat, + items: FiatApiMode.all, + selectedItem: widget.privacySettingsViewModel.fiatApiMode, + onItemSelected: (FiatApiMode mode) => + widget.privacySettingsViewModel.setFiatApiMode(mode), ), - ), - ), - Observer( - builder: (_) { - if (widget.privacySettingsViewModel.addCustomNode) { - return Padding( - padding: EdgeInsets.only(left: 24, right: 24, top: 24), - child: NodeForm( - formKey: _formKey, - nodeViewModel: widget.nodeViewModel, - ), - ); - } - return const SizedBox(); - }, - ), + ); + }), + Observer(builder: (_) { + return SettingsChoicesCell( + ChoicesListItem( + title: S.current.exchange, + items: ExchangeApiMode.all, + selectedItem: widget.privacySettingsViewModel.exchangeStatus, + onItemSelected: (ExchangeApiMode mode) => + widget.privacySettingsViewModel.setExchangeApiMode(mode), + ), + ); + }), + Observer(builder: (_) { + return Column( + children: [ + SettingsSwitcherCell( + title: S.current.add_custom_node, + value: widget.privacySettingsViewModel.addCustomNode, + onValueChange: (_, __) => widget.privacySettingsViewModel.toggleAddCustomNode(), + ), + if (widget.privacySettingsViewModel.addCustomNode) + Padding( + padding: EdgeInsets.only(left: 24, right: 24, top: 24), + child: NodeForm( + formKey: _formKey, + nodeViewModel: widget.nodeViewModel, + ), + ) + ], + ); + }), ], ), bottomSectionPadding: EdgeInsets.all(24), diff --git a/lib/src/screens/nodes/widgets/node_list_row.dart b/lib/src/screens/nodes/widgets/node_list_row.dart index 580aba170..90bb3eba1 100644 --- a/lib/src/screens/nodes/widgets/node_list_row.dart +++ b/lib/src/screens/nodes/widgets/node_list_row.dart @@ -1,9 +1,5 @@ -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/src/screens/nodes/widgets/node_indicator.dart'; -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class NodeListRow extends StandardListRow { @@ -23,7 +19,7 @@ class NodeListRow extends StandardListRow { builder: (context, snapshot) { switch (snapshot.connectionState) { case ConnectionState.done: - return NodeIndicator(isLive: (snapshot.data as bool)??false); + return NodeIndicator(isLive: (snapshot.data as bool?) ?? false); default: return NodeIndicator(isLive: false); } @@ -40,7 +36,7 @@ class NodeHeaderListRow extends StandardListRow { return SizedBox( width: 20, child: Icon(Icons.add, - color: Theme.of(context).accentTextTheme!.subtitle1!.color!, size: 24.0), + color: Theme.of(context).accentTextTheme.subtitle1?.color, size: 24.0), ); } } diff --git a/lib/src/screens/receive/fullscreen_qr_page.dart b/lib/src/screens/receive/fullscreen_qr_page.dart index 165adff12..0966c8ac8 100644 --- a/lib/src/screens/receive/fullscreen_qr_page.dart +++ b/lib/src/screens/receive/fullscreen_qr_page.dart @@ -1,7 +1,6 @@ import 'package:cake_wallet/src/screens/receive/widgets/qr_image.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; class FullscreenQRPage extends BasePage { @@ -69,14 +68,10 @@ class FullscreenQRPage extends BasePage { child: AspectRatio( aspectRatio: 1.0, child: Container( - padding: EdgeInsets.all(5), + padding: EdgeInsets.all(10), decoration: BoxDecoration( border: Border.all(width: 3, color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!)), - child: QrImage( - data: qrData, - backgroundColor: isLight ? Colors.transparent : Colors.black, - foregroundColor: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!, - ), + child: QrImage(data: qrData), ), ), ), diff --git a/lib/src/screens/receive/receive_page.dart b/lib/src/screens/receive/receive_page.dart index 71ee578a0..4a573b2e1 100644 --- a/lib/src/screens/receive/receive_page.dart +++ b/lib/src/screens/receive/receive_page.dart @@ -1,13 +1,11 @@ import 'package:cake_wallet/src/widgets/keyboard_done_button.dart'; import 'package:cake_wallet/src/widgets/section_divider.dart'; import 'package:cake_wallet/themes/theme_base.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:share_plus/share_plus.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/di.dart'; @@ -101,7 +99,12 @@ class ReceivePage extends BasePage { highlightColor: Colors.transparent, splashColor: Colors.transparent, iconSize: 25, - onPressed: () => Share.share(addressListViewModel.address.address), + onPressed: () { + ShareUtil.share( + text: addressListViewModel.address.address, + context: context, + ); + }, icon: shareImage ) ); diff --git a/lib/src/screens/receive/widgets/qr_image.dart b/lib/src/screens/receive/widgets/qr_image.dart index c0c1b0666..6e17dbcfc 100644 --- a/lib/src/screens/receive/widgets/qr_image.dart +++ b/lib/src/screens/receive/widgets/qr_image.dart @@ -1,30 +1,29 @@ import 'package:flutter/material.dart'; -import 'package:qr/qr.dart'; -import 'package:cake_wallet/src/screens/receive/widgets/qr_painter.dart'; +import 'package:qr_flutter/qr_flutter.dart' as qr; class QrImage extends StatelessWidget { QrImage({ - required String data, + required this.data, this.size = 100.0, - this.backgroundColor, - Color foregroundColor = Colors.black, - int version = 9, // Previous value: 7 something happened after flutter upgrade monero wallets addresses are longer than ver. 7 ??? - int errorCorrectionLevel = QrErrorCorrectLevel.L, - }) : _painter = QrPainter(data, foregroundColor, version, errorCorrectionLevel); + this.version = 9, // Previous value: 7 something happened after flutter upgrade monero wallets addresses are longer than ver. 7 ??? + this.errorCorrectionLevel = qr.QrErrorCorrectLevel.L, + }); - final QrPainter _painter; - final Color? backgroundColor; final double size; + final String data; + final int version; + final int errorCorrectionLevel; @override Widget build(BuildContext context) { - return Container( - width: size, - height: size, - color: backgroundColor, - child: CustomPaint( - painter: _painter, - ), + return qr.QrImage( + data: data, + errorCorrectionLevel: errorCorrectionLevel, + version: version, + size: size, + foregroundColor: Colors.black, + backgroundColor: Colors.white, + padding: EdgeInsets.zero, ); } -} \ No newline at end of file +} diff --git a/lib/src/screens/receive/widgets/qr_painter.dart b/lib/src/screens/receive/widgets/qr_painter.dart deleted file mode 100644 index e4af59f1a..000000000 --- a/lib/src/screens/receive/widgets/qr_painter.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:qr/qr.dart'; - -class QrPainter extends CustomPainter { - QrPainter( - String data, - this.color, - this.version, - this.errorCorrectionLevel, - ) : this._qr = QrCode(version, errorCorrectionLevel)..addData(data) { - _p.color = this.color; - _qrImage = QrImage(_qr); - } - - final int version; - final int errorCorrectionLevel; - final Color color; - - final QrCode _qr; - final _p = Paint()..style = PaintingStyle.fill; - late QrImage _qrImage; - - @override - void paint(Canvas canvas, Size size) { - final squareSize = size.shortestSide / _qr.moduleCount; - for (int x = 0; x < _qr.moduleCount; x++) { - for (int y = 0; y < _qr.moduleCount; y++) { - if (_qrImage.isDark(y, x)) { - final squareRect = Rect.fromLTWH( - x * squareSize, y * squareSize, squareSize, squareSize); - canvas.drawRect(squareRect, _p); - } - } - } - } - - @override - bool shouldRepaint(CustomPainter oldDelegate) { - if (oldDelegate is QrPainter) { - return this.color != oldDelegate.color || - this.errorCorrectionLevel != oldDelegate.errorCorrectionLevel || - this.version != oldDelegate.version; - } - - return false; - } -} diff --git a/lib/src/screens/receive/widgets/qr_widget.dart b/lib/src/screens/receive/widgets/qr_widget.dart index 99bea1adc..a590293a6 100644 --- a/lib/src/screens/receive/widgets/qr_widget.dart +++ b/lib/src/screens/receive/widgets/qr_widget.dart @@ -89,11 +89,7 @@ class QRWidget extends StatelessWidget { color: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!, ), ), - child: QrImage( - data: addressListViewModel.uri.toString(), - backgroundColor: isLight ? Colors.transparent : Colors.black, - foregroundColor: Theme.of(context).accentTextTheme!.headline2!.backgroundColor!, - ), + child: QrImage(data: addressListViewModel.uri.toString()), ), ), ), diff --git a/lib/src/screens/seed/wallet_seed_page.dart b/lib/src/screens/seed/wallet_seed_page.dart index 8de1526e8..64895db36 100644 --- a/lib/src/screens/seed/wallet_seed_page.dart +++ b/lib/src/screens/seed/wallet_seed_page.dart @@ -1,12 +1,11 @@ import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/utils/share_util.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:share_plus/share_plus.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; @@ -159,8 +158,12 @@ class WalletSeedPage extends BasePage { child: Container( padding: EdgeInsets.only(right: 8.0), child: PrimaryButton( - onPressed: () => - Share.share(walletSeedViewModel.seed), + onPressed: () { + ShareUtil.share( + text: walletSeedViewModel.seed, + context: context, + ); + }, text: S.of(context).save, color: Colors.green, textColor: Colors.white), diff --git a/lib/src/screens/send/send_page.dart b/lib/src/screens/send/send_page.dart index 2cd849f34..881536944 100644 --- a/lib/src/screens/send/send_page.dart +++ b/lib/src/screens/send/send_page.dart @@ -339,7 +339,7 @@ class SendPage extends BasePage { showErrorValidationAlert(context); return; } - + await sendViewModel.createTransaction(); }, @@ -379,7 +379,8 @@ class SendPage extends BasePage { if (state is ExecutedSuccessfullyState) { WidgetsBinding.instance.addPostFrameCallback((_) { - showPopUp( + if (context.mounted) { + showPopUp( context: context, builder: (BuildContext context) { return ConfirmSendingAlert( @@ -423,6 +424,7 @@ class SendPage extends BasePage { }, actionLeftButton: () => Navigator.of(context).pop()); }); + } }); } diff --git a/lib/src/screens/send/widgets/extract_address_from_parsed.dart b/lib/src/screens/send/widgets/extract_address_from_parsed.dart index 4ddd6ada0..a293835a3 100644 --- a/lib/src/screens/send/widgets/extract_address_from_parsed.dart +++ b/lib/src/screens/send/widgets/extract_address_from_parsed.dart @@ -19,13 +19,18 @@ Future extractAddressFromParsed( address = parsedAddress.addresses.first; break; case ParseFrom.openAlias: - title = S.of(context).openalias_alert_title; - content = S.of(context).openalias_alert_content(parsedAddress.name); + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (OpenAlias)'); address = parsedAddress.addresses.first; break; case ParseFrom.fio: title = S.of(context).address_detected; - content = S.of(context).openalias_alert_content(parsedAddress.name); + content = S.of(context).extracted_address_content('${parsedAddress.name} (FIO)'); + address = parsedAddress.addresses.first; + break; + case ParseFrom.twitter: + title = S.of(context).address_detected; + content = S.of(context).extracted_address_content('${parsedAddress.name} (Twitter)'); address = parsedAddress.addresses.first; break; case ParseFrom.yatRecord: diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index 0e56d6e58..9d2ce3cda 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -2,6 +2,7 @@ import 'package:cake_wallet/src/screens/settings/widgets/settings_cell_with_arro import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cw_core/node.dart'; +import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -35,10 +36,11 @@ class ConnectionSyncPage extends BasePage { handler: (context) => _presentReconnectAlert(context), ), StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)), - SettingsCellWithArrow( - title: S.current.rescan, - handler: (context) => Navigator.of(context).pushNamed(Routes.rescan), - ), + if (dashboardViewModel.hasRescan) + SettingsCellWithArrow( + title: S.current.rescan, + handler: (context) => Navigator.of(context).pushNamed(Routes.rescan), + ), StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)), NodeHeaderListRow( title: S.of(context).add_new_node, @@ -73,7 +75,7 @@ class ConnectionSyncPage extends BasePage { builder: (BuildContext context) { return AlertWithTwoActions( alertTitle: S.of(context).change_current_node_title, - alertContent: S.of(context).change_current_node(node.uriRaw), + alertContent: nodeListViewModel.getAlertContent(node.uriRaw), leftButtonText: S.of(context).cancel, rightButtonText: S.of(context).change, actionLeftButton: () => Navigator.of(context).pop(), diff --git a/lib/src/screens/settings/privacy_page.dart b/lib/src/screens/settings/privacy_page.dart index 2f15cc225..b11b41199 100644 --- a/lib/src/screens/settings/privacy_page.dart +++ b/lib/src/screens/settings/privacy_page.dart @@ -1,6 +1,10 @@ +import 'package:cake_wallet/entities/exchange_api_mode.dart'; +import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart'; +import 'package:cake_wallet/view_model/settings/choices_list_item.dart'; import 'package:cake_wallet/view_model/settings/privacy_settings_view_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -18,29 +22,34 @@ class PrivacyPage extends BasePage { return Container( padding: EdgeInsets.only(top: 10), child: Observer(builder: (_) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - SettingsSwitcherCell( - title: S.current.disable_fiat, - value: _privacySettingsViewModel.isFiatDisabled, - onValueChange: (BuildContext context, bool value) { - _privacySettingsViewModel.setFiatMode(value); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + SettingsChoicesCell( + ChoicesListItem( + title: S.current.fiat_api, + items: FiatApiMode.all, + selectedItem: _privacySettingsViewModel.fiatApiMode, + onItemSelected: (FiatApiMode fiatApiMode) => + _privacySettingsViewModel.setFiatMode(fiatApiMode), + ), + ), + SettingsChoicesCell( + ChoicesListItem( + title: S.current.exchange, + items: ExchangeApiMode.all, + selectedItem: _privacySettingsViewModel.exchangeStatus, + onItemSelected: (ExchangeApiMode mode) => _privacySettingsViewModel.setExchangeApiMode(mode), + ), + ), + SettingsSwitcherCell( + title: S.current.settings_save_recipient_address, + value: _privacySettingsViewModel.shouldSaveRecipientAddress, + onValueChange: (BuildContext _, bool value) { + _privacySettingsViewModel.setShouldSaveRecipientAddress(value); }), - SettingsSwitcherCell( - title: S.current.disable_exchange, - value: _privacySettingsViewModel.disableExchange, - onValueChange: (BuildContext context, bool value) { - _privacySettingsViewModel.setEnableExchange(value); - }), - SettingsSwitcherCell( - title: S.current.settings_save_recipient_address, - value: _privacySettingsViewModel.shouldSaveRecipientAddress, - onValueChange: (BuildContext _, bool value) { - _privacySettingsViewModel.setShouldSaveRecipientAddress(value); - }) - ], - ); + ], + ); }), ); } diff --git a/lib/src/screens/settings/widgets/settings_link_provider_cell.dart b/lib/src/screens/settings/widgets/settings_link_provider_cell.dart index 51fcc16d5..e64d6543b 100644 --- a/lib/src/screens/settings/widgets/settings_link_provider_cell.dart +++ b/lib/src/screens/settings/widgets/settings_link_provider_cell.dart @@ -30,6 +30,8 @@ class SettingsLinkProviderCell extends StandardListRow { color: Palette.blueCraiola)); static void _launchUrl(String url) async { - if (await canLaunch(url)) await launch(url, forceSafariVC: false); + try { + await launch(url, forceSafariVC: false); + } catch (e) {} } -} \ No newline at end of file +} diff --git a/lib/src/screens/subaddress/address_edit_or_create_page.dart b/lib/src/screens/subaddress/address_edit_or_create_page.dart index dac9e3881..b7394182c 100644 --- a/lib/src/screens/subaddress/address_edit_or_create_page.dart +++ b/lib/src/screens/subaddress/address_edit_or_create_page.dart @@ -17,8 +17,6 @@ class AddressEditOrCreatePage extends BasePage { _labelController.addListener( () => addressEditOrCreateViewModel.label = _labelController.text); _labelController.text = addressEditOrCreateViewModel.label; - print(_labelController.text); - print(addressEditOrCreateViewModel.label); } final WalletAddressEditOrCreateViewModel addressEditOrCreateViewModel; diff --git a/lib/src/screens/wallet_list/wallet_menu.dart b/lib/src/screens/wallet_list/wallet_menu.dart deleted file mode 100644 index c354881a3..000000000 --- a/lib/src/screens/wallet_list/wallet_menu.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:cake_wallet/src/screens/wallet_list/wallet_menu_item.dart'; -import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; -import 'package:cake_wallet/utils/show_pop_up.dart'; -import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart'; -import 'package:flutter/material.dart'; -import 'package:cake_wallet/routes.dart'; -import 'package:cake_wallet/generated/i18n.dart'; -import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; -import 'package:cake_wallet/src/screens/auth/auth_page.dart'; -import 'package:cake_wallet/palette.dart'; - -class WalletMenu { - WalletMenu(this.context, this.walletListViewModel); - - final WalletListViewModel walletListViewModel; - final BuildContext context; - - final List menuItems = [ - WalletMenuItem( - title: S.current.wallet_list_load_wallet, - firstGradientColor: Palette.cornflower, - secondGradientColor: Palette.royalBlue, - image: Image.asset('assets/images/load.png', - height: 24, width: 24, color: Colors.white)), - WalletMenuItem( - title: S.current.show_seed, - firstGradientColor: Palette.moderateOrangeYellow, - secondGradientColor: Palette.moderateOrange, - image: Image.asset('assets/images/eye_action.png', - height: 24, width: 24, color: Colors.white)), - WalletMenuItem( - title: S.current.remove, - firstGradientColor: Palette.lightRed, - secondGradientColor: Palette.persianRed, - image: Image.asset('assets/images/trash.png', - height: 24, width: 24, color: Colors.white)), - WalletMenuItem( - title: S.current.rescan, - firstGradientColor: Palette.shineGreen, - secondGradientColor: Palette.moderateGreen, - image: Image.asset('assets/images/scanner.png', - height: 24, width: 24, color: Colors.white)) - ]; - - List generateItemsForWalletMenu(bool isCurrentWallet) { - final items = []; - - if (!isCurrentWallet) items.add(menuItems[0]); - if (isCurrentWallet) items.add(menuItems[1]); - if (!isCurrentWallet) items.add(menuItems[2]); - if (isCurrentWallet) items.add(menuItems[3]); - - return items; - } - - Future action( - int index, WalletListItem wallet) async { - switch (index) { - case 0: - await Navigator.of(context).pushNamed(Routes.auth, arguments: - (bool isAuthenticatedSuccessfully, AuthPageState auth) async { - if (!isAuthenticatedSuccessfully) { - return; - } - - try { - auth.changeProcessText( - S.of(context).wallet_list_loading_wallet(wallet.name)); - await walletListViewModel.loadWallet(wallet); - auth.close(); - Navigator.of(context).pop(); - } catch (e) { - auth.changeProcessText(S - .of(context) - .wallet_list_failed_to_load(wallet.name, e.toString())); - } - }); - break; - case 1: - await Navigator.of(context).pushNamed(Routes.auth, arguments: - (bool isAuthenticatedSuccessfully, AuthPageState auth) async { - if (!isAuthenticatedSuccessfully) { - return; - } - auth.close(); - await Navigator.of(context).pushNamed(Routes.seed, arguments: false); - }); - break; - case 2: - final isComfirmed = await showPopUp( - context: context, - builder: (BuildContext context) { - return AlertWithTwoActions( - alertTitle: 'Remove wallet', - alertContent: S.of(context).confirm_delete_wallet, - leftButtonText: S.of(context).cancel, - rightButtonText: S.of(context).remove, - actionLeftButton: () => Navigator.of(context).pop(false), - actionRightButton: () => Navigator.of(context).pop(true)); - }); - - if (isComfirmed == null || !isComfirmed) { - return; - } - - await Navigator.of(context).pushNamed(Routes.auth, arguments: - (bool isAuthenticatedSuccessfully, AuthPageState auth) async { - if (!isAuthenticatedSuccessfully) { - return; - } - - try { - auth.changeProcessText( - S.of(context).wallet_list_removing_wallet(wallet.name)); - await walletListViewModel.remove(wallet); - auth.close(); - } catch (e) { - auth.changeProcessText(S - .of(context) - .wallet_list_failed_to_remove(wallet.name, e.toString())); - } - }); - break; - case 3: - await Navigator.of(context).pushNamed(Routes.rescan); - break; - default: - break; - } - } -} diff --git a/lib/src/screens/wallet_list/wallet_menu_item.dart b/lib/src/screens/wallet_list/wallet_menu_item.dart deleted file mode 100644 index 6d66a5f8d..000000000 --- a/lib/src/screens/wallet_list/wallet_menu_item.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'dart:ui'; -import 'package:flutter/cupertino.dart'; - -class WalletMenuItem { - WalletMenuItem({ - required this.title, - required this.firstGradientColor, - required this.secondGradientColor, - required this.image - }); - - final String title; - final Color firstGradientColor; - final Color secondGradientColor; - final Image image; -} \ No newline at end of file diff --git a/lib/src/screens/wallet_list/widgets/wallet_menu_alert.dart b/lib/src/screens/wallet_list/widgets/wallet_menu_alert.dart deleted file mode 100644 index 00dd3a2f5..000000000 --- a/lib/src/screens/wallet_list/widgets/wallet_menu_alert.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'dart:ui'; -import 'package:cake_wallet/palette.dart'; -import 'package:cake_wallet/src/screens/wallet_list/wallet_menu.dart'; -import 'package:cake_wallet/src/screens/wallet_list/wallet_menu_item.dart'; -import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:cake_wallet/src/widgets/alert_background.dart'; -import 'package:cake_wallet/src/widgets/alert_close_button.dart'; - -class WalletMenuAlert extends StatelessWidget { - WalletMenuAlert({ - required this.wallet, - required this.walletMenu, - required this.items - }); - - final WalletListItem wallet; - final WalletMenu walletMenu; - final List items; - final closeButton = Image.asset('assets/images/close.png', - color: Palette.darkBlueCraiola, - ); - - @override - Widget build(BuildContext context) { - return AlertBackground( - child: Stack( - alignment: Alignment.center, - children: [ - Padding( - padding: EdgeInsets.only( - left: 24, - right: 24, - ), - child: ClipRRect( - borderRadius: BorderRadius.all(Radius.circular(14)), - child: Container( - color: Theme.of(context).textTheme!.bodyText1!.decorationColor!, - padding: EdgeInsets.only(left: 24), - child: ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemCount: items.length, - separatorBuilder: (context, _) => Container( - height: 1, - color: Theme.of(context).accentTextTheme!.subtitle1!.backgroundColor!, - ), - itemBuilder: (_, index) { - final item = items[index]; - - return GestureDetector( - onTap: () { - Navigator.of(context).pop(); - walletMenu.action( - walletMenu.menuItems.indexOf(item), - wallet); - }, - child: Container( - height: 60, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - height: 32, - width: 32, - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(4)), - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - item.firstGradientColor, - item.secondGradientColor - ] - ) - ), - child: Center( - child: item.image, - ), - ), - SizedBox(width: 12), - Expanded( - child: Text( - item.title, - style: TextStyle( - color: Theme.of(context).primaryTextTheme!.headline6!.color!, - fontSize: 18, - fontFamily: 'Lato', - fontWeight: FontWeight.w500, - decoration: TextDecoration.none - ), - ) - ) - ], - ), - ), - ); - }, - ), - ), - ), - ), - AlertCloseButton(image: closeButton) - ], - ), - ); - } -} \ No newline at end of file diff --git a/lib/src/widgets/check_box_picker.dart b/lib/src/widgets/check_box_picker.dart index e2f817fc4..80461e26d 100644 --- a/lib/src/widgets/check_box_picker.dart +++ b/lib/src/widgets/check_box_picker.dart @@ -38,7 +38,7 @@ class CheckBoxPickerState extends State { Column( mainAxisSize: MainAxisSize.min, children: [ - if (widget.title?.isNotEmpty ?? false) + if (widget.title.isNotEmpty) Container( padding: EdgeInsets.symmetric(horizontal: 24), child: Text( @@ -58,7 +58,7 @@ class CheckBoxPickerState extends State { child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(30)), child: Container( - color: Theme.of(context).accentTextTheme!.headline6!.color!, + color: Theme.of(context).accentTextTheme.headline6!.color!, child: ConstrainedBox( constraints: BoxConstraints( maxHeight: MediaQuery.of(context).size.height * 0.65, @@ -70,7 +70,7 @@ class CheckBoxPickerState extends State { child: Stack( alignment: Alignment.center, children: [ - (items?.length ?? 0) > 3 + (items.length) > 3 ? Scrollbar( controller: controller, child: itemsList(), @@ -95,14 +95,14 @@ class CheckBoxPickerState extends State { Widget itemsList() { return Container( - color: Theme.of(context).accentTextTheme!.headline6!.backgroundColor!, + color: Theme.of(context).accentTextTheme.headline6!.backgroundColor!, child: ListView.separated( padding: EdgeInsets.zero, controller: controller, shrinkWrap: true, separatorBuilder: (context, index) => widget.isSeparated ? Divider( - color: Theme.of(context).accentTextTheme!.headline6!.backgroundColor!, + color: Theme.of(context).accentTextTheme.headline6!.backgroundColor!, height: 1, ) : const SizedBox(), @@ -121,13 +121,13 @@ class CheckBoxPickerState extends State { }, child: Container( height: 55, - color: Theme.of(context).accentTextTheme!.headline6!.color!, + color: Theme.of(context).accentTextTheme.headline6!.color!, padding: EdgeInsets.only(left: 24, right: 24), child: CheckboxListTile( value: item.value, activeColor: item.value ? Palette.blueCraiola - : Theme.of(context).accentTextTheme!.subtitle1!.decorationColor!, + : Theme.of(context).accentTextTheme.subtitle1!.decorationColor!, checkColor: Colors.white, title: widget.displayItem?.call(item) ?? Text( @@ -138,7 +138,7 @@ class CheckBoxPickerState extends State { fontWeight: FontWeight.w600, color: item.isDisabled ? Colors.grey.withOpacity(0.5) - : Theme.of(context).primaryTextTheme!.headline6!.color!, + : Theme.of(context).primaryTextTheme.headline6!.color!, decoration: TextDecoration.none, ), ), diff --git a/lib/src/widgets/collapsible_standart_list.dart b/lib/src/widgets/collapsible_standart_list.dart index 1a4aef2bc..514308b45 100644 --- a/lib/src/widgets/collapsible_standart_list.dart +++ b/lib/src/widgets/collapsible_standart_list.dart @@ -48,6 +48,8 @@ class CollapsibleSectionList extends SectionStandardList { child: ListTileTheme( contentPadding: EdgeInsets.only(right: 16,top:sectionIndex>0?26:0), child: ExpansionTile( + textColor: themeColor, + iconColor: themeColor, title: sectionTitleBuilder == null ? Container() : Container(child: buildTitle(items, sectionIndex, context)), diff --git a/lib/store/authentication_store.dart b/lib/store/authentication_store.dart index b734d7acb..815b1ed60 100644 --- a/lib/store/authentication_store.dart +++ b/lib/store/authentication_store.dart @@ -4,7 +4,7 @@ part 'authentication_store.g.dart'; class AuthenticationStore = AuthenticationStoreBase with _$AuthenticationStore; -enum AuthenticationState { uninitialized, installed, allowed } +enum AuthenticationState { uninitialized, installed, allowed, _reset } abstract class AuthenticationStoreBase with Store { AuthenticationStoreBase() : state = AuthenticationState.uninitialized; @@ -13,8 +13,14 @@ abstract class AuthenticationStoreBase with Store { AuthenticationState state; @action - void installed() => state = AuthenticationState.installed; + void installed() { + state = AuthenticationState._reset; + state = AuthenticationState.installed; + } @action - void allowed() => state = AuthenticationState.allowed; + void allowed() { + state = AuthenticationState._reset; + state = AuthenticationState.allowed; + } } diff --git a/lib/store/dashboard/trade_filter_store.dart b/lib/store/dashboard/trade_filter_store.dart index 87fa749a9..c772a35d6 100644 --- a/lib/store/dashboard/trade_filter_store.dart +++ b/lib/store/dashboard/trade_filter_store.dart @@ -12,7 +12,8 @@ abstract class TradeFilterStoreBase with Store { displayChangeNow = true, displaySideShift = true, displayMorphToken = true, - displaySimpleSwap = true; + displaySimpleSwap = true, + displayTrocador = true; @observable bool displayXMRTO; @@ -29,8 +30,11 @@ abstract class TradeFilterStoreBase with Store { @observable bool displaySimpleSwap; + @observable + bool displayTrocador; + @computed - bool get displayAllTrades => displayChangeNow && displaySideShift && displaySimpleSwap; + bool get displayAllTrades => displayChangeNow && displaySideShift && displaySimpleSwap && displayTrocador; @action void toggleDisplayExchange(ExchangeProviderDescription provider) { @@ -50,6 +54,9 @@ abstract class TradeFilterStoreBase with Store { case ExchangeProviderDescription.morphToken: displayMorphToken = !displayMorphToken; break; + case ExchangeProviderDescription.trocador: + displayTrocador = !displayTrocador; + break; case ExchangeProviderDescription.all: if (displayAllTrades) { displayChangeNow = false; @@ -57,12 +64,14 @@ abstract class TradeFilterStoreBase with Store { displayXMRTO = false; displayMorphToken = false; displaySimpleSwap = false; + displayTrocador = false; } else { displayChangeNow = true; displaySideShift = true; displayXMRTO = true; displayMorphToken = true; displaySimpleSwap = true; + displayTrocador = true; } break; } @@ -88,7 +97,8 @@ abstract class TradeFilterStoreBase with Store { ExchangeProviderDescription.morphToken) ||(displaySimpleSwap && item.trade.provider == - ExchangeProviderDescription.simpleSwap)) + ExchangeProviderDescription.simpleSwap) + ||(displayTrocador && item.trade.provider == ExchangeProviderDescription.trocador)) .toList() : _trades; } diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index ba9ca146e..0b5bd9b74 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; +import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/pin_code_required_duration.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/ethereum/ethereum.dart'; @@ -32,7 +33,7 @@ abstract class SettingsStoreBase with Store { required bool initialSaveRecipientAddress, required FiatApiMode initialFiatMode, required bool initialAllowBiometricalAuthentication, - required bool initialExchangeEnabled, + required ExchangeApiMode initialExchangeStatus, required ThemeBase initialTheme, required int initialPinLength, required String initialLanguageCode, @@ -55,7 +56,7 @@ abstract class SettingsStoreBase with Store { shouldSaveRecipientAddress = initialSaveRecipientAddress, fiatApiMode = initialFiatMode, allowBiometricalAuthentication = initialAllowBiometricalAuthentication, - disableExchange = initialExchangeEnabled, + exchangeStatus = initialExchangeStatus, currentTheme = initialTheme, pinCodeLength = initialPinLength, languageCode = initialLanguageCode, @@ -162,9 +163,9 @@ abstract class SettingsStoreBase with Store { PreferencesKey.currentBalanceDisplayModeKey, mode.serialize())); reaction( - (_) => disableExchange, - (bool disableExchange) => sharedPreferences.setBool( - PreferencesKey.disableExchangeKey, disableExchange)); + (_) => exchangeStatus, + (ExchangeApiMode mode) => sharedPreferences.setInt( + PreferencesKey.exchangeStatusKey, mode.serialize())); this .nodes @@ -201,7 +202,7 @@ abstract class SettingsStoreBase with Store { bool allowBiometricalAuthentication; @observable - bool disableExchange; + ExchangeApiMode exchangeStatus; @observable ThemeBase currentTheme; @@ -299,8 +300,9 @@ abstract class SettingsStoreBase with Store { final allowBiometricalAuthentication = sharedPreferences .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ?? false; - final disableExchange = sharedPreferences - .getBool(PreferencesKey.disableExchangeKey) ?? false; + final exchangeStatus = ExchangeApiMode.deserialize( + raw: sharedPreferences + .getInt(PreferencesKey.exchangeStatusKey) ?? ExchangeApiMode.enabled.raw); final legacyTheme = (sharedPreferences.getBool(PreferencesKey.isDarkThemeLegacy) ?? false) ? ThemeType.dark.index @@ -376,7 +378,7 @@ abstract class SettingsStoreBase with Store { initialSaveRecipientAddress: shouldSaveRecipientAddress, initialFiatMode: currentFiatApiMode, initialAllowBiometricalAuthentication: allowBiometricalAuthentication, - initialExchangeEnabled: disableExchange, + initialExchangeStatus: exchangeStatus, initialTheme: savedTheme, actionlistDisplayMode: actionListDisplayMode, initialPinLength: pinLength, @@ -428,7 +430,9 @@ abstract class SettingsStoreBase with Store { allowBiometricalAuthentication = sharedPreferences .getBool(PreferencesKey.allowBiometricalAuthenticationKey) ?? allowBiometricalAuthentication; - disableExchange = sharedPreferences.getBool(PreferencesKey.disableExchangeKey) ?? disableExchange; + exchangeStatus = ExchangeApiMode.deserialize( + raw: sharedPreferences + .getInt(PreferencesKey.exchangeStatusKey) ?? ExchangeApiMode.enabled.raw); final legacyTheme = (sharedPreferences.getBool(PreferencesKey.isDarkThemeLegacy) ?? false) ? ThemeType.dark.index diff --git a/lib/twitter/twitter_api.dart b/lib/twitter/twitter_api.dart new file mode 100644 index 000000000..41f5df61d --- /dev/null +++ b/lib/twitter/twitter_api.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; +import 'package:cake_wallet/twitter/twitter_user.dart'; +import 'package:http/http.dart' as http; +import 'package:cake_wallet/.secrets.g.dart' as secrets; + +class TwitterApi { + static const twitterBearerToken = secrets.twitterBearerToken; + static const httpsScheme = 'https'; + static const apiHost = 'api.twitter.com'; + static const userPath = '/2/users/by/username/'; + + static Future lookupUserByName({required String userName}) async { + final queryParams = {'user.fields': 'description', 'expansions': 'pinned_tweet_id'}; + + final headers = {'authorization': 'Bearer $twitterBearerToken'}; + + final uri = Uri( + scheme: httpsScheme, + host: apiHost, + path: userPath + userName, + queryParameters: queryParams, + ); + + var response = await http.get(uri, headers: headers); + + if (response.statusCode != 200) { + throw Exception('Unexpected http status: ${response.statusCode}'); + } + final responseJSON = json.decode(response.body) as Map; + + if (responseJSON['errors'] != null) { + throw Exception(responseJSON['errors'][0]['detail']); + } + + return TwitterUser.fromJson(responseJSON); + } +} diff --git a/lib/twitter/twitter_user.dart b/lib/twitter/twitter_user.dart new file mode 100644 index 000000000..ac373fd62 --- /dev/null +++ b/lib/twitter/twitter_user.dart @@ -0,0 +1,45 @@ +class TwitterUser { + TwitterUser( + {required this.id, + required this.username, + required this.name, + required this.description, + this.tweets}); + + final String id; + final String username; + final String name; + final String description; + final List? tweets; + + factory TwitterUser.fromJson(Map json) { + return TwitterUser( + id: json['data']['id'] as String, + username: json['data']['username'] as String, + name: json['data']['name'] as String, + description: json['data']['description'] as String? ?? '', + tweets: json['includes'] != null + ? List.from(json['includes']['tweets'] as List) + .map((e) => Tweet.fromJson(e as Map)) + .toList() + : null, + ); + } +} + +class Tweet { + Tweet({ + required this.id, + required this.text, + }); + + final String id; + final String text; + + factory Tweet.fromJson(Map json) { + return Tweet( + id: json['id'] as String, + text: json['text'] as String, + ); + } +} diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart new file mode 100644 index 000000000..51a525394 --- /dev/null +++ b/lib/utils/exception_handler.dart @@ -0,0 +1,220 @@ +import 'dart:io'; + +import 'package:cake_wallet/entities/preferences_key.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/main.dart'; +import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; +import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_mailer/flutter_mailer.dart'; +import 'package:package_info/package_info.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ExceptionHandler { + static bool _hasError = false; + static const _coolDownDurationInDays = 7; + + static void _saveException(String? error, StackTrace? stackTrace) async { + final appDocDir = await getApplicationDocumentsDirectory(); + + final file = File('${appDocDir.path}/error.txt'); + final exception = { + "${DateTime.now()}": { + "Error": error, + "StackTrace": stackTrace.toString(), + } + }; + + const String separator = '''\n\n========================================================== + ==========================================================\n\n'''; + + await file.writeAsString( + "$exception $separator", + mode: FileMode.append, + ); + } + + static void _sendExceptionFile() async { + try { + final appDocDir = await getApplicationDocumentsDirectory(); + + final file = File('${appDocDir.path}/error.txt'); + + await _addDeviceInfo(file); + + final MailOptions mailOptions = MailOptions( + subject: 'Mobile App Issue', + recipients: ['support@cakewallet.com'], + attachments: [file.path], + ); + + final result = await FlutterMailer.send(mailOptions); + + // Clear file content if the error was sent or saved. + // On android we can't know if it was sent or saved + if (result.name == MailerResponse.sent.name || + result.name == MailerResponse.saved.name || + result.name == MailerResponse.android.name) { + file.writeAsString("", mode: FileMode.write); + } + } catch (e, s) { + _saveException(e.toString(), s); + } + } + + static void onError(FlutterErrorDetails errorDetails) async { + if (kDebugMode) { + FlutterError.presentError(errorDetails); + return; + } + + if (_ignoreError(errorDetails.exception.toString())) { + return; + } + + _saveException(errorDetails.exception.toString(), errorDetails.stack); + + final sharedPrefs = await SharedPreferences.getInstance(); + + final lastPopupDate = + DateTime.tryParse(sharedPrefs.getString(PreferencesKey.lastPopupDate) ?? '') ?? + DateTime.now().subtract(Duration(days: _coolDownDurationInDays + 1)); + + final durationSinceLastReport = DateTime.now().difference(lastPopupDate).inDays; + + if (_hasError || durationSinceLastReport < _coolDownDurationInDays) { + return; + } + _hasError = true; + + sharedPrefs.setString(PreferencesKey.lastPopupDate, DateTime.now().toString()); + + WidgetsBinding.instance.addPostFrameCallback( + (timeStamp) async { + await showPopUp( + context: navigatorKey.currentContext!, + builder: (context) { + return AlertWithTwoActions( + isDividerExist: true, + alertTitle: S.of(context).error, + alertContent: S.of(context).error_dialog_content, + rightButtonText: S.of(context).send, + leftButtonText: S.of(context).do_not_send, + actionRightButton: () { + Navigator.of(context).pop(); + _sendExceptionFile(); + }, + actionLeftButton: () { + Navigator.of(context).pop(); + }, + ); + }, + ); + + _hasError = false; + }, + ); + } + + /// Ignore User related errors or system errors + static bool _ignoreError(String error) => + _ignoredErrors.any((element) => error.contains(element)); + + static const List _ignoredErrors = const [ + "errno = 9", // SocketException: Bad file descriptor + "errno = 28", // OS Error: No space left on device + "errno = 32", // SocketException: Write failed (OS Error: Broken pipe) + "errno = 49", // SocketException: Can't assign requested address + "errno = 54", // SocketException: Connection reset by peer + "errno = 57", // SocketException: Read failed (OS Error: Socket is not connected) + "errno = 60", // SocketException: Operation timed out + "errno = 103", // SocketException: Software caused connection abort + "errno = 104", // SocketException: Connection reset by peer + "errno = 110", // SocketException: Connection timed out + "PERMISSION_NOT_GRANTED", + ]; + + static Future _addDeviceInfo(File file) async { + final packageInfo = await PackageInfo.fromPlatform(); + final currentVersion = packageInfo.version; + + final deviceInfoPlugin = DeviceInfoPlugin(); + Map deviceInfo = {}; + + if (Platform.isAndroid) { + deviceInfo = _readAndroidBuildData(await deviceInfoPlugin.androidInfo); + deviceInfo["Platform"] = "Android"; + } else if (Platform.isIOS) { + deviceInfo = _readIosDeviceInfo(await deviceInfoPlugin.iosInfo); + deviceInfo["Platform"] = "iOS"; + } else if (Platform.isLinux) { + deviceInfo = _readLinuxDeviceInfo(await deviceInfoPlugin.linuxInfo); + deviceInfo["Platform"] = "Linux"; + } else if (Platform.isMacOS) { + deviceInfo = _readMacOsDeviceInfo(await deviceInfoPlugin.macOsInfo); + deviceInfo["Platform"] = "MacOS"; + } else if (Platform.isWindows) { + deviceInfo = _readWindowsDeviceInfo(await deviceInfoPlugin.windowsInfo); + deviceInfo["Platform"] = "Windows"; + } + + await file.writeAsString( + "App Version: $currentVersion\n\nDevice Info $deviceInfo", + mode: FileMode.append, + ); + } + + static Map _readAndroidBuildData(AndroidDeviceInfo build) { + return { + 'brand': build.brand, + 'device': build.device, + 'manufacturer': build.manufacturer, + 'model': build.model, + 'product': build.product, + }; + } + + static Map _readIosDeviceInfo(IosDeviceInfo data) { + return { + 'systemName': data.systemName, + 'systemVersion': data.systemVersion, + 'model': data.model, + 'localizedModel': data.localizedModel, + }; + } + + static Map _readLinuxDeviceInfo(LinuxDeviceInfo data) { + return { + 'name': data.name, + 'version': data.version, + 'versionCodename': data.versionCodename, + 'versionId': data.versionId, + 'prettyName': data.prettyName, + 'buildId': data.buildId, + 'variant': data.variant, + 'variantId': data.variantId, + }; + } + + static Map _readMacOsDeviceInfo(MacOsDeviceInfo data) { + return { + 'arch': data.arch, + 'model': data.model, + 'kernelVersion': data.kernelVersion, + 'osRelease': data.osRelease, + }; + } + + static Map _readWindowsDeviceInfo(WindowsDeviceInfo data) { + return { + 'majorVersion': data.majorVersion, + 'minorVersion': data.minorVersion, + 'buildNumber': data.buildNumber, + 'productType': data.productType, + 'productName': data.productName, + }; + } +} diff --git a/lib/utils/share_util.dart b/lib/utils/share_util.dart new file mode 100644 index 000000000..518590fdd --- /dev/null +++ b/lib/utils/share_util.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:cross_file/cross_file.dart'; + +class ShareUtil { + static const _mimeType = 'application/*'; + + static void share({required String text, required BuildContext context}) { + Share.share( + text, + sharePositionOrigin: _sharePosition(context), + ); + } + + static Future shareFile({ + required String filePath, + required String fileName, + required BuildContext context, + }) async { + Share.shareXFiles( + [ + XFile( + filePath, + name: fileName, + mimeType: _mimeType, + ) + ], + sharePositionOrigin: _sharePosition(context), + ); + } + + static Rect? _sharePosition(BuildContext context) { + final box = context.findRenderObject() as RenderBox?; + + return box!.localToGlobal(Offset.zero) & box.size; + } +} diff --git a/lib/view_model/advanced_privacy_settings_view_model.dart b/lib/view_model/advanced_privacy_settings_view_model.dart index f800e3418..380937212 100644 --- a/lib/view_model/advanced_privacy_settings_view_model.dart +++ b/lib/view_model/advanced_privacy_settings_view_model.dart @@ -1,9 +1,8 @@ +import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/view_model/settings/switcher_list_item.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:mobx/mobx.dart'; -import 'package:cake_wallet/generated/i18n.dart'; part 'advanced_privacy_settings_view_model.g.dart'; @@ -11,46 +10,30 @@ class AdvancedPrivacySettingsViewModel = AdvancedPrivacySettingsViewModelBase with _$AdvancedPrivacySettingsViewModel; abstract class AdvancedPrivacySettingsViewModelBase with Store { - AdvancedPrivacySettingsViewModelBase(this.type, this._settingsStore) - : _addCustomNode = false { - settings = [ - SwitcherListItem( - title: S.current.disable_fiat, - value: () => _settingsStore.fiatApiMode == FiatApiMode.disabled, - onValueChange: (_, bool value) => setFiatMode(value), - ), - SwitcherListItem( - title: S.current.disable_exchange, - value: () => _settingsStore.disableExchange, - onValueChange: (_, bool value) { - _settingsStore.disableExchange = value; - }, - ), - SwitcherListItem( - title: S.current.add_custom_node, - value: () => _addCustomNode, - onValueChange: (_, bool value) => _addCustomNode = value, - ), - ]; - } + AdvancedPrivacySettingsViewModelBase(this.type, this._settingsStore) : _addCustomNode = false; - late List settings; + @computed + ExchangeApiMode get exchangeStatus => _settingsStore.exchangeStatus; + + @computed + FiatApiMode get fiatApiMode => _settingsStore.fiatApiMode; @observable bool _addCustomNode = false; final WalletType type; + final SettingsStore _settingsStore; @computed bool get addCustomNode => _addCustomNode; @action - void setFiatMode(bool value) { - if (value) { - _settingsStore.fiatApiMode = FiatApiMode.disabled; - return; - } - _settingsStore.fiatApiMode = FiatApiMode.enabled; - } + void setFiatApiMode(FiatApiMode fiatApiMode) => _settingsStore.fiatApiMode = fiatApiMode; + + @action + void setExchangeApiMode(ExchangeApiMode value) => _settingsStore.exchangeStatus = value; + + @action + void toggleAddCustomNode() => _addCustomNode = !_addCustomNode; } diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 57720d92f..d41e51411 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -1,3 +1,5 @@ +import 'package:cake_wallet/entities/exchange_api_mode.dart'; +import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/balance.dart'; @@ -96,6 +98,11 @@ abstract class DashboardViewModelBase with Store { caption: ExchangeProviderDescription.simpleSwap.title, onChanged: () => tradeFilterStore .toggleDisplayExchange(ExchangeProviderDescription.simpleSwap)), + FilterItem( + value: () => tradeFilterStore.displayTrocador, + caption: ExchangeProviderDescription.trocador.title, + onChanged: () => tradeFilterStore + .toggleDisplayExchange(ExchangeProviderDescription.trocador)), ] }, subname = '', @@ -239,7 +246,7 @@ abstract class DashboardViewModelBase with Store { WalletBase, TransactionInfo> wallet; - bool get hasRescan => wallet.type == WalletType.monero; + bool get hasRescan => wallet.type == WalletType.monero || wallet.type == WalletType.haven; BalanceViewModel balanceViewModel; @@ -268,7 +275,7 @@ abstract class DashboardViewModelBase with Store { settingsStore.shouldShowYatPopup = shouldShow; @computed - bool get isEnabledExchangeAction => !settingsStore.disableExchange; + bool get isEnabledExchangeAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled; @observable bool hasExchangeAction; diff --git a/lib/view_model/dashboard/transaction_list_item.dart b/lib/view_model/dashboard/transaction_list_item.dart index 35f30a937..0f16bdfe8 100644 --- a/lib/view_model/dashboard/transaction_list_item.dart +++ b/lib/view_model/dashboard/transaction_list_item.dart @@ -1,5 +1,7 @@ import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:cake_wallet/entities/fiat_currency.dart'; +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cw_core/transaction_direction.dart'; import 'package:cw_core/transaction_info.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/view_model/dashboard/action_list_item.dart'; @@ -11,6 +13,7 @@ import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart'; import 'package:cw_core/keyable.dart'; import 'package:cw_core/wallet_type.dart'; + class TransactionListItem extends ActionListItem with Keyable { TransactionListItem( {required this.transaction, @@ -35,6 +38,30 @@ class TransactionListItem extends ActionListItem with Keyable { ? '---' : transaction.amountFormatted(); } + String get formattedTitle { + if (transaction.direction == TransactionDirection.incoming) { + return S.current.received; + } + + return S.current.sent; + } + + String get formattedPendingStatus { + if (transaction.confirmations >= 0 && transaction.confirmations < 10) { + return ' (${transaction.confirmations}/10)'; + } + return ''; + } + + String get formattedStatus { + if (transaction.direction == TransactionDirection.incoming) { + if (balanceViewModel.wallet.type == WalletType.monero || + balanceViewModel.wallet.type == WalletType.haven) { + return formattedPendingStatus; + } + } + return transaction.isPending ? S.current.pending : ''; + } String get formattedFiatAmount { var amount = ''; diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index 10ddf25e4..94c874979 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:cake_wallet/exchange/sideshift/sideshift_exchange_provider.dart'; import 'package:cake_wallet/exchange/simpleswap/simpleswap_exchange_provider.dart'; +import 'package:cake_wallet/exchange/trocador/trocador_exchange_provider.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cake_wallet/exchange/changenow/changenow_exchange_provider.dart'; @@ -18,19 +19,18 @@ import 'package:cake_wallet/generated/i18n.dart'; part 'exchange_trade_view_model.g.dart'; -class ExchangeTradeViewModel = ExchangeTradeViewModelBase - with _$ExchangeTradeViewModel; +class ExchangeTradeViewModel = ExchangeTradeViewModelBase with _$ExchangeTradeViewModel; abstract class ExchangeTradeViewModelBase with Store { ExchangeTradeViewModelBase( {required this.wallet, - required this.trades, - required this.tradesStore, - required this.sendViewModel}) - : trade = tradesStore.trade!, - isSendable = tradesStore.trade!.from == wallet.currency || - tradesStore.trade!.provider == ExchangeProviderDescription.xmrto, - items = ObservableList() { + required this.trades, + required this.tradesStore, + required this.sendViewModel}) + : trade = tradesStore.trade!, + isSendable = tradesStore.trade!.from == wallet.currency || + tradesStore.trade!.provider == ExchangeProviderDescription.xmrto, + items = ObservableList() { switch (trade.provider) { case ExchangeProviderDescription.xmrto: _provider = XMRTOExchangeProvider(); @@ -47,6 +47,9 @@ abstract class ExchangeTradeViewModelBase with Store { case ExchangeProviderDescription.simpleSwap: _provider = SimpleSwapExchangeProvider(); break; + case ExchangeProviderDescription.trocador: + _provider = TrocadorExchangeProvider(); + break; } _updateItems(); @@ -67,22 +70,20 @@ abstract class ExchangeTradeViewModelBase with Store { @computed String get extraInfo => trade.from == CryptoCurrency.xlm - ? '\n\n' + S.current.xlm_extra_info - : trade.from == CryptoCurrency.xrp - ? '\n\n' + S.current.xrp_extra_info - : ''; + ? '\n\n' + S.current.xlm_extra_info + : trade.from == CryptoCurrency.xrp + ? '\n\n' + S.current.xrp_extra_info + : ''; @computed - String get pendingTransactionFiatAmountValueFormatted => - sendViewModel.isFiatDisabled - ? '' : sendViewModel.pendingTransactionFiatAmount - + ' ' + sendViewModel.fiat.title; + String get pendingTransactionFiatAmountValueFormatted => sendViewModel.isFiatDisabled + ? '' + : sendViewModel.pendingTransactionFiatAmount + ' ' + sendViewModel.fiat.title; @computed - String get pendingTransactionFeeFiatAmountFormatted => - sendViewModel.isFiatDisabled - ? '' : sendViewModel.pendingTransactionFeeFiatAmount - + ' ' + sendViewModel.fiat.title; + String get pendingTransactionFeeFiatAmountFormatted => sendViewModel.isFiatDisabled + ? '' + : sendViewModel.pendingTransactionFeeFiatAmount + ' ' + sendViewModel.fiat.title; @observable ObservableList items; @@ -122,6 +123,8 @@ abstract class ExchangeTradeViewModelBase with Store { } void _updateItems() { + final tagFrom = trade.from.tag != null ? '${trade.from.tag}' + ' ' : ''; + final tagTo = trade.to.tag != null ? '${trade.to.tag}' + ' ' : ''; items.clear(); items.add(ExchangeTradeItem( title: "${trade.provider.title} ${S.current.id}", data: '${trade.id}', isCopied: true)); @@ -130,22 +133,22 @@ abstract class ExchangeTradeViewModelBase with Store { final title = trade.from == CryptoCurrency.xrp ? S.current.destination_tag : trade.from == CryptoCurrency.xlm - ? S.current.memo - : S.current.extra_id; + ? S.current.memo + : S.current.extra_id; - items.add(ExchangeTradeItem( - title: title, data: '${trade.extraId}', isCopied: false)); + items.add(ExchangeTradeItem(title: title, data: '${trade.extraId}', isCopied: false)); } items.addAll([ + ExchangeTradeItem(title: S.current.amount, data: '${trade.amount}', isCopied: false), ExchangeTradeItem( - title: S.current.amount, data: '${trade.amount}', isCopied: false), - ExchangeTradeItem( - title: S.current.status, data: '${trade.state}', isCopied: false), - ExchangeTradeItem( - title: S.current.widgets_address + ':', + title: S.current.send_to_this_address('${trade.from}', tagFrom) + ':', data: trade.inputAddress ?? '', isCopied: true), + ExchangeTradeItem( + title: S.current.arrive_in_this_address('${trade.to}', tagTo) + ':', + data: trade.payoutAddress ?? '', + isCopied: true), ]); } } diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index 5c1f696b8..2dd67cab7 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -2,11 +2,15 @@ import 'dart:async'; import 'dart:collection'; import 'dart:convert'; +import 'package:cake_wallet/entities/exchange_api_mode.dart'; +import 'package:cake_wallet/entities/fiat_api_mode.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/exchange/sideshift/sideshift_exchange_provider.dart'; import 'package:cake_wallet/exchange/sideshift/sideshift_request.dart'; import 'package:cake_wallet/exchange/simpleswap/simpleswap_exchange_provider.dart'; import 'package:cake_wallet/exchange/simpleswap/simpleswap_request.dart'; +import 'package:cake_wallet/exchange/trocador/trocador_exchange_provider.dart'; +import 'package:cake_wallet/exchange/trocador/trocador_request.dart'; import 'package:cw_core/transaction_priority.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/crypto_currency.dart'; @@ -53,6 +57,7 @@ abstract class ExchangeViewModelBase with Store { isDepositAddressEnabled = false, isReceiveAddressEnabled = false, isReceiveAmountEditable = false, + _useTorOnly = false, receiveCurrencies = [], depositCurrencies = [], limits = Limits(min: 0, max: 0), @@ -60,8 +65,10 @@ abstract class ExchangeViewModelBase with Store { limitsState = LimitsInitialState(), receiveCurrency = wallet.currency, depositCurrency = wallet.currency, - providerList = [ChangeNowExchangeProvider(), SideShiftExchangeProvider(), SimpleSwapExchangeProvider()], + providerList = [], selectedProviders = ObservableList() { + _useTorOnly = _settingsStore.exchangeStatus == ExchangeApiMode.torOnly; + _setProviders(); const excludeDepositCurrencies = [CryptoCurrency.btt, CryptoCurrency.nano]; const excludeReceiveCurrencies = [CryptoCurrency.xlm, CryptoCurrency.xrp, CryptoCurrency.bnb, CryptoCurrency.btt, CryptoCurrency.nano]; @@ -117,13 +124,20 @@ abstract class ExchangeViewModelBase with Store { _calculateBestRate(); }); } - + bool _useTorOnly; final WalletBase wallet; final Box trades; final ExchangeTemplateStore _exchangeTemplateStore; final TradesStore tradesStore; final SharedPreferences sharedPreferences; + List get _allProviders => [ + ChangeNowExchangeProvider(), + SideShiftExchangeProvider(), + SimpleSwapExchangeProvider(), + TrocadorExchangeProvider(useTorOnly: _useTorOnly), + ]; + @observable ExchangeProvider? provider; @@ -192,7 +206,7 @@ abstract class ExchangeViewModelBase with Store { ObservableList get templates => _exchangeTemplateStore.templates; - + @computed TransactionPriority get transactionPriority { final priority = _settingsStore.priority[wallet.type]; @@ -308,10 +322,11 @@ abstract class ExchangeViewModelBase with Store { Future _calculateBestRate() async { final amount = double.tryParse(isFixedRateMode ? receiveAmount : depositAmount) ?? 1; + final _providers = _tradeAvailableProviders + .where((element) => !isFixedRateMode || element.supportsFixedRate).toList(); + final result = await Future.wait( - _tradeAvailableProviders - .where((element) => !isFixedRateMode || element.supportsFixedRate) - .map((element) => element.fetchRate( + _providers.map((element) => element.fetchRate( from: depositCurrency, to: receiveCurrency, amount: amount, @@ -324,7 +339,12 @@ abstract class ExchangeViewModelBase with Store { for (int i=0;i provider.supportsOnionAddress).toList(); + } else { + providerList = _allProviders; + } + } } diff --git a/lib/view_model/ionia/ionia_payment_status_view_model.dart b/lib/view_model/ionia/ionia_payment_status_view_model.dart index 19f5f8537..8f43e0244 100644 --- a/lib/view_model/ionia/ionia_payment_status_view_model.dart +++ b/lib/view_model/ionia/ionia_payment_status_view_model.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:cake_wallet/anypay/any_pay_chain.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/foundation.dart'; import 'package:cake_wallet/ionia/ionia_service.dart'; @@ -39,6 +40,8 @@ abstract class IoniaPaymentStatusViewModelBase with Store { Timer? get timer => _timer; + bool get payingByBitcoin => paymentInfo.anyPayPayment.chain == AnyPayChain.btc; + Timer? _timer; @action diff --git a/lib/view_model/node_list/node_list_view_model.dart b/lib/view_model/node_list/node_list_view_model.dart index a50720d9d..deb1f29cf 100644 --- a/lib/view_model/node_list/node_list_view_model.dart +++ b/lib/view_model/node_list/node_list_view_model.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/generated/i18n.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; import 'package:cw_core/wallet_base.dart'; @@ -30,6 +31,10 @@ abstract class NodeListViewModelBase with Store { return node; } + String getAlertContent(String uri) => + S.current.change_current_node(uri) + + '${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + S.current.orbot_running_alert : ''}'; + final ObservableList nodes; final SettingsStore settingsStore; final WalletBase wallet; diff --git a/lib/view_model/send/send_view_model.dart b/lib/view_model/send/send_view_model.dart index b6604789a..e0ae5dab8 100644 --- a/lib/view_model/send/send_view_model.dart +++ b/lib/view_model/send/send_view_model.dart @@ -180,7 +180,8 @@ abstract class SendViewModelBase with Store { WalletType get walletType => _wallet.type; - String? get walletCurrencyName => _wallet.currency.name?.toLowerCase(); + String? get walletCurrencyName => + _wallet.currency.fullName?.toLowerCase() ?? _wallet.currency.name; bool get hasCurrecyChanger => walletType == WalletType.haven; diff --git a/lib/view_model/settings/privacy_settings_view_model.dart b/lib/view_model/settings/privacy_settings_view_model.dart index f8c3e5b50..110afb07a 100644 --- a/lib/view_model/settings/privacy_settings_view_model.dart +++ b/lib/view_model/settings/privacy_settings_view_model.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/entities/exchange_api_mode.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:mobx/mobx.dart'; import 'package:cake_wallet/entities/fiat_api_mode.dart'; @@ -12,27 +13,21 @@ abstract class PrivacySettingsViewModelBase with Store { final SettingsStore _settingsStore; @computed - bool get disableExchange => _settingsStore.disableExchange; + ExchangeApiMode get exchangeStatus => _settingsStore.exchangeStatus; @computed bool get shouldSaveRecipientAddress => _settingsStore.shouldSaveRecipientAddress; @computed - bool get isFiatDisabled => _settingsStore.fiatApiMode == FiatApiMode.disabled; + FiatApiMode get fiatApiMode => _settingsStore.fiatApiMode; @action void setShouldSaveRecipientAddress(bool value) => _settingsStore.shouldSaveRecipientAddress = value; @action - void setEnableExchange(bool value) => _settingsStore.disableExchange = value; + void setExchangeApiMode(ExchangeApiMode value) => _settingsStore.exchangeStatus = value; @action - void setFiatMode(bool value) { - if (value) { - _settingsStore.fiatApiMode = FiatApiMode.disabled; - return; - } - _settingsStore.fiatApiMode = FiatApiMode.enabled; - } + void setFiatMode(FiatApiMode fiatApiMode) => _settingsStore.fiatApiMode = fiatApiMode; } diff --git a/lib/view_model/support_view_model.dart b/lib/view_model/support_view_model.dart index 5fa81b288..15c25968f 100644 --- a/lib/view_model/support_view_model.dart +++ b/lib/view_model/support_view_model.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:mobx/mobx.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; -import 'package:cake_wallet/wallet_type_utils.dart'; part 'support_view_model.g.dart'; @@ -19,7 +18,9 @@ abstract class SupportViewModelBase with Store { RegularListItem( title: S.current.faq, handler: (BuildContext context) async { - if (await canLaunch(url)) await launch(url); + try { + await launch(url); + } catch (e) {} }, ), LinkListItem( @@ -42,7 +43,7 @@ abstract class SupportViewModelBase with Store { title: 'Telegram', icon: 'assets/images/Telegram.png', linkTitle: '@cakewallet_bot', - link: 'https:t.me/cakewallet_bot'), + link: 'https://t.me/cakewallet_bot'), LinkListItem( title: 'Twitter', icon: 'assets/images/Twitter.png', @@ -84,7 +85,7 @@ abstract class SupportViewModelBase with Store { // link: 'mailto:support@y.at') ]; - static const url = 'https://cakewallet.com/guide/'; + static const url = 'https://guides.cakewallet.com'; List items; } \ No newline at end of file diff --git a/lib/view_model/trade_details_view_model.dart b/lib/view_model/trade_details_view_model.dart index 5a1f78774..3a6f1ec74 100644 --- a/lib/view_model/trade_details_view_model.dart +++ b/lib/view_model/trade_details_view_model.dart @@ -6,6 +6,7 @@ import 'package:cake_wallet/exchange/morphtoken/morphtoken_exchange_provider.dar import 'package:cake_wallet/exchange/sideshift/sideshift_exchange_provider.dart'; import 'package:cake_wallet/exchange/simpleswap/simpleswap_exchange_provider.dart'; import 'package:cake_wallet/exchange/trade.dart'; +import 'package:cake_wallet/exchange/trocador/trocador_exchange_provider.dart'; import 'package:cake_wallet/exchange/xmrto/xmrto_exchange_provider.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/utils/date_formatter.dart'; @@ -22,16 +23,15 @@ import 'package:cake_wallet/src/screens/trade_details/trade_details_status_item. import 'package:url_launcher/url_launcher.dart'; part 'trade_details_view_model.g.dart'; -class TradeDetailsViewModel = TradeDetailsViewModelBase - with _$TradeDetailsViewModel; +class TradeDetailsViewModel = TradeDetailsViewModelBase with _$TradeDetailsViewModel; abstract class TradeDetailsViewModelBase with Store { TradeDetailsViewModelBase({ required Trade tradeForDetails, required this.trades, - required this.settingsStore}) - : items = ObservableList(), - trade = tradeForDetails { + required this.settingsStore, + }) : items = ObservableList(), + trade = tradeForDetails { switch (trade.provider) { case ExchangeProviderDescription.xmrto: _provider = XMRTOExchangeProvider(); @@ -45,9 +45,12 @@ abstract class TradeDetailsViewModelBase with Store { case ExchangeProviderDescription.sideShift: _provider = SideShiftExchangeProvider(); break; - case ExchangeProviderDescription.simpleSwap: + case ExchangeProviderDescription.simpleSwap: _provider = SimpleSwapExchangeProvider(); break; + case ExchangeProviderDescription.trocador: + _provider = TrocadorExchangeProvider(); + break; } items = ObservableList(); @@ -96,12 +99,7 @@ abstract class TradeDetailsViewModelBase with Store { items.clear(); items.add( - DetailsListStatusItem( - title: S.current.trade_details_state, - value: trade.state != null - ? trade.state.toString() - : S.current.trade_details_fetching) - ); + DetailsListStatusItem(title: S.current.trade_details_state, value: trade.state.toString())); items.add(TradeDetailsListCardItem.tradeDetails( id: trade.id, @@ -114,15 +112,11 @@ abstract class TradeDetailsViewModelBase with Store { }, )); - if (trade.provider != null) { - items.add(StandartListItem( - title: S.current.trade_details_provider, - value: trade.provider.toString())); - } + items.add(StandartListItem( + title: S.current.trade_details_provider, value: trade.provider.toString())); if (trade.provider == ExchangeProviderDescription.changeNow) { - final buildURL = - 'https://changenow.io/exchange/txs/${trade.id.toString()}'; + final buildURL = 'https://changenow.io/exchange/txs/${trade.id.toString()}'; items.add(TrackTradeListItem( title: 'Track', value: buildURL, @@ -133,14 +127,25 @@ abstract class TradeDetailsViewModelBase with Store { if (trade.provider == ExchangeProviderDescription.sideShift) { final buildURL = 'https://sideshift.ai/orders/${trade.id.toString()}'; - items.add(TrackTradeListItem( - title: 'Track', value: buildURL, onTap: () => launch(buildURL))); + items.add(TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => launch(buildURL))); } if (trade.provider == ExchangeProviderDescription.simpleSwap) { final buildURL = 'https://simpleswap.io/exchange?id=${trade.id.toString()}'; - items.add(TrackTradeListItem( - title: 'Track', value: buildURL, onTap: () => launch(buildURL))); + items.add(TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => launch(buildURL))); + } + + if (trade.provider == ExchangeProviderDescription.trocador) { + final buildURL = 'https://trocador.app/en/checkout/${trade.id.toString()}'; + items.add(TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => launch(buildURL))); + + items.add(StandartListItem( + title: '${trade.providerName} ${S.current.id.toUpperCase()}', + value: trade.providerId ?? '')); + + if (trade.password != null && trade.password!.isNotEmpty) + items.add(StandartListItem( + title: '${trade.providerName} ${S.current.password}', value: trade.password ?? '')); } } } diff --git a/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart b/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart index 43db6099f..a4eb3d386 100644 --- a/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart +++ b/lib/view_model/wallet_address_list/wallet_address_edit_or_create_view_model.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart'; import 'package:mobx/mobx.dart'; import 'package:flutter/foundation.dart'; import 'package:cw_core/wallet_base.dart'; @@ -27,10 +28,10 @@ class AddressEditOrCreateStateFailure extends AddressEditOrCreateState { abstract class WalletAddressEditOrCreateViewModelBase with Store { WalletAddressEditOrCreateViewModelBase( - {required WalletBase wallet, dynamic item}) + {required WalletBase wallet, WalletAddressListItem? item}) : isEdit = item != null, state = AddressEditOrCreateStateInitial(), - label = item?.fullName as String? ?? '', + label = item?.name ?? '', _item = item, _wallet = wallet; @@ -42,7 +43,7 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store { bool isEdit; - final dynamic _item; + final WalletAddressListItem? _item; final WalletBase _wallet; Future save() async { @@ -98,27 +99,20 @@ abstract class WalletAddressEditOrCreateViewModelBase with Store { await wallet.walletAddresses.updateAddress(_item.address as String); await wallet.save(); }*/ - - if (wallet.type == WalletType.monero) { - await monero - !.getSubaddressList(wallet) - .setLabelSubaddress( - wallet, - accountIndex: monero!.getCurrentAccount(wallet).id, - addressIndex: _item.id as int, - label: label); - await wallet.save(); - } - - if (wallet.type == WalletType.haven) { - await haven - !.getSubaddressList(wallet) - .setLabelSubaddress( - wallet, - accountIndex: haven!.getCurrentAccount(wallet).id, - addressIndex: _item.id as int, - label: label); - await wallet.save(); + final index = _item?.id; + if (index != null) { + if (wallet.type == WalletType.monero) { + await monero!.getSubaddressList(wallet).setLabelSubaddress(wallet, + accountIndex: monero!.getCurrentAccount(wallet).id, addressIndex: index, label: label); + await wallet.save(); + } + if (wallet.type == WalletType.haven) { + await haven!.getSubaddressList(wallet).setLabelSubaddress(wallet, + accountIndex: haven!.getCurrentAccount(wallet).id, + addressIndex: index, + label: label); + await wallet.save(); + } } } } diff --git a/pubspec_base.yaml b/pubspec_base.yaml index 00e1a39b1..61282761c 100644 --- a/pubspec_base.yaml +++ b/pubspec_base.yaml @@ -6,7 +6,7 @@ dependencies: flutter_cupertino_localizations: ^1.0.1 intl: ^0.17.0 url_launcher: ^6.1.4 - qr: ^3.0.1 + qr_flutter: ^4.0.0 uuid: 3.0.6 shared_preferences: ^2.0.15 flutter_secure_storage: @@ -22,8 +22,8 @@ dependencies: barcode_scan2: ^4.2.1 http: ^0.13.4 path_provider: ^2.0.11 - mobx: ^2.0.7+4 - flutter_mobx: ^2.0.6+1 + mobx: ^2.1.4 + flutter_mobx: ^2.0.6+5 flutter_slidable: ^2.0.0 share_plus: ^4.0.10 # date_range_picker: ^1.0.6 @@ -38,7 +38,7 @@ dependencies: auto_size_text: ^3.0.0 dotted_border: ^2.0.0+2 smooth_page_indicator: ^1.0.0+2 - webview_flutter: ^3.0.4 + flutter_inappwebview: ^5.7.2+3 flutter_spinkit: ^5.1.0 uni_links: ^0.5.1 lottie: ^1.3.0 @@ -55,12 +55,14 @@ dependencies: another_flushbar: ^1.12.29 archive: ^3.3.0 cryptography: ^2.0.5 - file_picker: ^4.6.1 + file_picker: ^5.2.5 unorm_dart: ^0.2.0 # check unorm_dart for usage and for replace permission_handler: ^10.0.0 device_display_brightness: ^0.0.6 platform_device_id: ^1.0.1 + flutter_mailer: ^2.0.2 + device_info_plus: ^8.1.0 cake_backup: git: url: https://github.com/cake-tech/cake_backup.git @@ -71,7 +73,7 @@ dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.1.11 - mobx_codegen: ^2.0.7 + mobx_codegen: ^2.1.1 build_resolvers: ^2.0.9 hive_generator: ^1.1.3 flutter_launcher_icons: ^0.9.3 diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 01708d5fd..8222467bd 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -398,8 +398,7 @@ "biometric_auth_reason":"امسح بصمة إصبعك للمصادقة", "version":"الإصدار ${currentVersion}", - "openalias_alert_title":"تم ايجاد العنوان", - "openalias_alert_content":"سوف ترسل الأموال إلى\n${recipient_name}", + "extracted_address_content":"سوف ترسل الأموال إلى\n${recipient_name}", "card_address":"العنوان:", "buy":"اشتري", @@ -677,5 +676,11 @@ "disabled":"معطلة", "enabled":"ممكنة", "tor_only":"Tor فقط", - "unmatched_currencies": "عملة محفظتك الحالية لا تتطابق مع عملة QR الممسوحة ضوئيًا" + "unmatched_currencies": "عملة محفظتك الحالية لا تتطابق مع عملة QR الممسوحة ضوئيًا", + "orbot_running_alert": "يرجى التأكد من تشغيل Orbot قبل الاتصال بهذه العقدة.", + "bitcoin_payments_require_1_confirmation": "تتطلب مدفوعات Bitcoin تأكيدًا واحدًا ، والذي قد يستغرق 20 دقيقة أو أكثر. شكرا لصبرك! سيتم إرسال بريد إلكتروني إليك عند تأكيد الدفع.", + "send_to_this_address" : "أرسل ${currency} ${tag}إلى هذا العنوان", + "arrive_in_this_address" : "سيصل ${currency} ${tag}إلى هذا العنوان", + "do_not_send": "لا ترسل", + "error_dialog_content": "عفوًا ، لقد حصلنا على بعض الخطأ.\n\nيرجى إرسال تقرير التعطل إلى فريق الدعم لدينا لتحسين التطبيق." } diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb new file mode 100644 index 000000000..2099abc19 --- /dev/null +++ b/res/values/strings_bg.arb @@ -0,0 +1,688 @@ +{ + "welcome" : "Добре дошли в", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "Невероятен портфейл за Monero, Bitcoin, Litecoin и Haven", + "please_make_selection" : "Моля, изберете отдолу за създаване или възстановяване на портфейл.", + "create_new" : "Създаване на нов портфейл", + "restore_wallet" : "Възстановяване на портфейл", + + "monero_com": "Monero.com от Cake Wallet", + "monero_com_wallet_text": "Невероятен портфейл за Monero", + + "haven_app": "Haven от Cake Wallet", + "haven_app_wallet_text": "Невероятен портфейл за Haven", + + "accounts" : "Профили", + "edit" : "Промени", + "account" : "Профил", + "add" : "Добави", + + + "address_book" : "Адресна книга", + "contact" : "Контакт", + "please_select" : "Моля, изберете:", + "cancel" : "Откажи", + "ok" : "Ок", + "contact_name" : "Име на контакт", + "reset" : "Нулиране", + "save" : "Запази", + "address_remove_contact" : "Премахни контакт", + "address_remove_content" : "Сигурни ли сте, че искате да премахнете избрания контакт?", + + + "authenticated" : "Удостоверено", + "authentication" : "Удостоверяване", + "failed_authentication" : "Неуспешно удостоверяване. ${state_error}", + + + "wallet_menu" : "Меню", + "Blocks_remaining" : "${status} оставащи блока", + "please_try_to_connect_to_another_node" : "Моля, опитайте се да се свържете към друг node.", + "xmr_hidden" : "Скрит", + "xmr_available_balance" : "Наличен баланс", + "xmr_full_balance" : "Пълен баланс", + "send" : "Изпрати", + "receive" : "Получи", + "transactions" : "Транзакции", + "incoming" : "Входящи", + "outgoing" : "Изходящи", + "transactions_by_date" : "Транзакции по дата", + "trades" : "Trades", + "filter_by": "Филтрирай по", + "today" : "Днес", + "yesterday" : "Вчера", + "received" : "Получени", + "sent" : "Изпратени", + "pending" : " (чакащи)", + "rescan" : "Сканирай отново", + "reconnect" : "Reconnect", + "wallets" : "Портфейли", + "show_seed" : "Покажи seed", + "show_keys" : "Покажи seed/keys", + "address_book_menu" : "Адресна книга", + "reconnection" : "Свързване отново", + "reconnect_alert_text" : "Сигурни ли сте, че искате да се свържете отново?", + + + "exchange" : "Exchange", + "clear" : "Изчисти", + "refund_address" : "Refund address", + "change_exchange_provider" : "Промяна на Exchange Provider", + "you_will_send" : "Обръщане от", + "you_will_get" : "Обръщане в", + "amount_is_guaranteed" : "Сумата за получаване е гарантирана", + "amount_is_estimate" : "Сумата за получаване е ", + "powered_by" : "Powered by ${title}", + "error" : "Грешка", + "estimated" : "Изчислено", + "min_value" : "Мин: ${value} ${currency}", + "max_value" : "Макс: ${value} ${currency}", + "change_currency" : "Смени валута", + "overwrite_amount" : "Промени сума", + "qr_payment_amount" : "Този QR код съдържа сума за плащане. Искате ли да промените стойността?", + + "copy_id" : "Копиране на ID", + "exchange_result_write_down_trade_id" : "Моля, запишете trade ID-то, за да продължите.", + "trade_id" : "Trade ID:", + "copied_to_clipboard" : "Копирано", + "saved_the_trade_id" : "Запазих trade ID-то", + "fetching" : "Обработване", + "id" : "ID: ", + "amount" : "Сума: ", + "payment_id" : "Payment ID: ", + "status" : "Статус: ", + "offer_expires_in" : "Предложението изтича след: ", + "trade_is_powered_by" : "This trade is powered by ${provider}", + "copy_address" : "Copy Address", + "exchange_result_confirm" : "By pressing confirm, you will be sending ${fetchingLabel} ${from} from your wallet called ${walletName} to the address shown below. Or you can send from your external wallet to the below address/QR code.\n\nPlease press confirm to continue or go back to change the amounts.", + "exchange_result_description" : "You must send a minimum of ${fetchingLabel} ${from} to the address shown on the next page. If you send an amount lower than ${fetchingLabel} ${from} it may not get converted and it may not be refunded.", + "exchange_result_write_down_ID" : "*Please copy or write down your ID shown above.", + "confirm" : "Потвърждаване", + "confirm_sending" : "Потвърждаване на изпращането", + "commit_transaction_amount_fee" : "Изпълняване на транзакция\nСума: ${amount}\nТакса: ${fee}", + "sending" : "Изпращане", + "transaction_sent" : "Сумата е изпратена!", + "expired" : "Изтекло", + "time" : "${minutes} мин ${seconds} сек", + "send_xmr" : "Изпращане на XMR", + "exchange_new_template" : "Нов шаблон", + + "faq" : "FAQ", + + + "enter_your_pin" : "Въведете PIN", + "loading_your_wallet" : "Зареждане на портфейл", + + + "new_wallet" : "Нов портфейл", + "wallet_name" : "Име на портфейл", + "continue_text" : "Напред", + "choose_wallet_currency" : "Изберете валута за портфейла:", + + + "node_new" : "Нов Node", + "node_address" : "Нов адрес", + "node_port" : "Node порт", + "login" : "Влизане", + "password" : "Парола", + "nodes" : "Nodes", + "node_reset_settings_title" : "Възстановяване на настройки", + "nodes_list_reset_to_default_message" : "Сигурни ли сте, че искате да възстановите фабричните настройки?", + "change_current_node" : "Сигурни ли сте, че искате да промените сегашния node на ${node}?", + "change" : "Промени", + "remove_node" : "Премахни node", + "remove_node_message" : "Сигурни ли сте, че искате да премахнете избрания node?", + "remove" : "Премахни", + "delete" : "Изтрий", + "add_new_node" : "Добави нов node", + "change_current_node_title" : "Промени сегашния node", + "node_test" : "Тест", + "node_connection_successful" : "Връзката бе установена успешно", + "node_connection_failed" : "Връзката не можа да бъде установена", + "new_node_testing" : "Тестване на нов node", + + + "use" : "Смяна на ", + "digit_pin" : "-цифрен PIN", + + + "share_address" : "Сподели адрес", + "receive_amount" : "Сума", + "subaddresses" : "Подадреси", + "addresses" : "Адреси", + "scan_qr_code" : "Сканирайте QR кода, за да получите адреса", + "qr_fullscreen" : "Натиснете, за да отворите QR кода на цял екран", + "rename" : "Промяна на името", + "choose_account" : "Избиране на профил", + "create_new_account" : "Създаване на нов профил", + "accounts_subaddresses" : "Профили и подадреси", + + + "restore_restore_wallet" : "Възстановяване на портфейл", + "restore_title_from_seed_keys" : "Възстановяване от seed/keys", + "restore_description_from_seed_keys" : "Възстановете своя портфейл от seed/keys, които сте съхранили на сигурно място", + "restore_next" : "Next", + "restore_title_from_backup" : "Възстановяване от резервно копие", + "restore_description_from_backup" : "Можете да възстановите цялото приложение Cake Wallet от своя резервен файл", + "restore_seed_keys_restore" : "Възстановяне от Seed/Keys", + "restore_title_from_seed" : "Възстановяване от seed", + "restore_description_from_seed" : "Възстановяване на портфейл от кода от 13 или 25 думи", + "restore_title_from_keys" : "Възстановяване от keys", + "restore_description_from_keys" : "Възстановяване на портфейл от генерираните от Вашите тайни ключове клавиши", + "restore_wallet_name" : "Име на портфейл", + "restore_address" : "Адреси", + "restore_view_key_private" : "View key (таен)", + "restore_spend_key_private" : "Spend key (публичен)", + "restore_recover" : "Възстановяване", + "restore_wallet_restore_description" : "Описание на възстановяване на портфейл", + "restore_new_seed" : "Нов seed", + "restore_active_seed" : "Активиране на seed", + "restore_bitcoin_description_from_seed" : "Възстановяване на портфейл чрез код от 24 думи", + "restore_bitcoin_description_from_keys" : "Възстановяване на портфейл чрез WIF, изведен от Вашите private keys", + "restore_bitcoin_title_from_keys" : "Възстановяване от WIF", + "restore_from_date_or_blockheight" : "Моля, въведете дата няколко дни преди създаването на този портфейл. Ако знаете blockheight-а, въведето него вместо това", + + + "seed_reminder" : "Моля, запишете го в случай на загуба на устройството.", + "seed_title" : "Seed", + "seed_share" : "Споделяне на seed", + "copy" : "Копиране", + + + "seed_language_choose" : "Моля, изберете език на seed-а:", + "seed_choose" : "Изберете език на seed-а", + "seed_language_next" : "Следващ", + "seed_language_english" : "Английски", + "seed_language_chinese" : "Китайски", + "seed_language_dutch" : "Нидерландски", + "seed_language_german" : "Немски", + "seed_language_japanese" : "Японски", + "seed_language_portuguese" : "Португалски", + "seed_language_russian" : "Руски", + "seed_language_spanish" : "Испански", + "seed_language_french": "Френски", + "seed_language_italian": "Италиански", + + + "send_title" : "Изпращане", + "send_your_wallet" : "Вашият портфейл", + "send_address" : "${cryptoCurrency} адрес", + "send_payment_id" : "Payment ID (не е задължително)", + "all" : "ALL", + "send_error_minimum_value" : "Минималната сума е 0.01", + "send_error_currency" : "Валутата може да съдържа само числа", + "send_estimated_fee" : "Изчислена такса:", + "send_priority" : "В момента таксата е на ${transactionPriority} приоритетност.\nПриоритетността на транзакцията може да бъде променена в настройките", + "send_creating_transaction" : "Създаване на транзакция", + "send_templates" : "Шаблони", + "send_new" : "Ново", + "send_amount" : "Сума:", + "send_fee" : "Такса:", + "send_name" : "Име", + "send_got_it" : "Готово", + "send_sending" : "Изпращане...", + "send_success" : "Вашите ${crypto} бяха успешно изпратени", + + + "settings_title" : "Настройки", + "settings_nodes" : "Nodes", + "settings_current_node" : "Сегашен node", + "settings_wallets" : "Портфейли", + "settings_display_balance" : "Показване на баланс", + "settings_currency" : "Валута", + "settings_fee_priority" : "Таксова приоритетност", + "settings_save_recipient_address" : "Запазване адрес на получател", + "settings_personal" : "Лични", + "settings_change_pin" : "Промяна на PIN", + "settings_change_language" : "Промяна на езика", + "settings_allow_biometrical_authentication" : "Позволяване на биометрично удостоверяване.", + "settings_dark_mode" : "Тъмен режим", + "settings_transactions" : "Транзакции", + "settings_trades" : "Сделки", + "settings_display_on_dashboard_list" : "Показване на таблото", + "settings_all" : "Всичко", + "settings_only_trades" : "Само сделки", + "settings_only_transactions" : "Само транзакции", + "settings_none" : "Липсва", + "settings_support" : "Поддръжка", + "settings_terms_and_conditions" : "Условия", + "pin_is_incorrect" : "Грешен PIN", + + + "setup_pin" : "Настройване на PIN", + "enter_your_pin_again" : "Въведете своя PIN отново", + "setup_successful" : "Вашият PIN бе успешно настроен!", + + + "wallet_keys" : "Seed/keys на портфейла", + "wallet_seed" : "Seed на портфейла", + "private_key" : "Таен ключ", + "public_key" : "Публичен ключ", + "view_key_private" : "View key (таен)", + "view_key_public" : "View key (публичен)", + "spend_key_private" : "Spend key (таен)", + "spend_key_public" : "Spend key (публичен)", + "copied_key_to_clipboard" : "Копиран ключ: ${key}", + + + "new_subaddress_title" : "Нов адрес", + "new_subaddress_label_name" : "Име на Label", + "new_subaddress_create" : "Създаване", + + "address_label" : "Адресен label", + + "subaddress_title" : "Лист от подадреси", + + + "trade_details_title" : "Подробности на сделката", + "trade_details_id" : "ID", + "trade_details_state" : "Статус", + "trade_details_fetching" : "Обработка", + "trade_details_provider" : "Provider", + "trade_details_created_at" : "Създадено", + "trade_details_pair" : "Pair", + "trade_details_copied" : "${title} копирано", + + + "trade_history_title" : "История на сделките", + + + "transaction_details_title" : "Подробности на транзакцията", + "transaction_details_transaction_id" : "Transaction ID", + "transaction_details_date" : "Дата", + "transaction_details_height" : "Height", + "transaction_details_amount" : "Сума", + "transaction_details_fee" : "Такса", + "transaction_details_copied" : "${title} копирано", + "transaction_details_recipient_address" : "Адрес на получател", + + + "wallet_list_title" : "Monero портфейл", + "wallet_list_create_new_wallet" : "Създаване на нов портфейл", + "wallet_list_restore_wallet" : "Възстановяване на портфейл", + "wallet_list_load_wallet" : "Зареждане на портфейл", + "wallet_list_loading_wallet" : "Зареждане на портфейл ${wallet_name}", + "wallet_list_failed_to_load" : "Грешка при зареждането на портфейл ${wallet_name}. ${error}", + "wallet_list_removing_wallet" : "Премахване на портфейл ${wallet_name}", + "wallet_list_failed_to_remove" : "Грешка при премахването на портфейл${wallet_name}. ${error}", + + + "widgets_address" : "Адрес", + "widgets_restore_from_blockheight" : "Възстановяване от blockheight", + "widgets_restore_from_date" : "Възстановяване от дата", + "widgets_or" : "или", + "widgets_seed" : "Seed", + + + "router_no_route" : "Няма дефиниран път за ${name}", + + + "error_text_account_name" : "Името на профила може да съдържа само букви и числа \nи трябва да е между 1 и 15 символа", + "error_text_contact_name" : "Името на контакта не може да съдържа символите ` , ' \" \nи и трябва да е между 1 и 32 символа", + "error_text_address" : "Адресът на портфейла трябва да отговаря \n на вида криптовалута", + "error_text_node_address" : "Моля, въведете iPv4 адрес", + "error_text_node_port" : "Node port-ът е цяло число между 0 и 65535", + "error_text_payment_id" : "Payment ID-то може да съдържа само между 16 и 64 шестнайсетични символа", + "error_text_xmr" : "XMR сумата не може да надхвърля наличния баланс.\nБроят на цифрите след десетичната запетая може да бъде най-много 12", + "error_text_fiat" : "Сумата не може да надвишава наличния баланс.\nThe number of fraction digits must be less or equal to 2", + "error_text_subaddress_name" : "Името на подадреса не може да съдържат символите ` , ' \" \n и трябва да е между 1 и 20 символа", + "error_text_amount" : "Сумата може да съдържа само числа", + "error_text_wallet_name" : "Името на портфейла може да съдържа само букви, цифри, и символите _ и - \n и трябва да е между 1 и 33 символа", + "error_text_keys" : "Ключовете за портфейл може да съдържат само 64 шестнайсетични символа", + "error_text_crypto_currency" : "Броят на цифрите след десетичната запетая\nможе да бъде най-много 12", + "error_text_minimal_limit" : "Сделка за ${provider} не беше създадена. Сумата е по-малко от минималната: ${min} ${currency}", + "error_text_maximum_limit" : "Сделка за ${provider} не беше създадена. Сумата надвишава максималната: ${max} ${currency}", + "error_text_limits_loading_failed" : "Сделка за ${provider} не беше създадена. Неуспешно зареждане на лимити", + "error_text_template" : "Имената на шаблони и адреси не могат да съдържат ` , ' \" \nи трябва да са между 1 и 106 символа.", + + + "auth_store_ban_timeout" : "ban_timeout", + "auth_store_banned_for" : "Забрана за ", + "auth_store_banned_minutes" : " минути", + "auth_store_incorrect_password" : "Грешен PIN", + "wallet_store_monero_wallet" : "Monero портфейл", + "wallet_restoration_store_incorrect_seed_length" : "Грешна дължина на seed-а", + + + "full_balance" : "Пълен баланс", + "available_balance" : "Наличен баланс", + "hidden_balance" : "Скрит баланс", + + + "sync_status_syncronizing" : "СИНХРОНИЗИРАНЕ", + "sync_status_syncronized" : "СИНХРОНИЗИРАНО", + "sync_status_not_connected" : "НЯМА ВРЪЗКА", + "sync_status_starting_sync" : "ЗАПОЧВАНЕ НА СИНХРОНИЗАЦИЯ", + "sync_status_failed_connect" : "НЕУСПЕШНО СВЪРЗВАНЕ", + "sync_status_connecting" : "СВЪРЗВАНЕ", + "sync_status_connected" : "СВЪРЗВАНЕ", + "sync_status_attempting_sync" : "ОПИТ ЗА СИНХРОНИЗАЦИЯ", + + + "transaction_priority_slow" : "Бавно", + "transaction_priority_regular" : "Обичайно", + "transaction_priority_medium" : "Средно", + "transaction_priority_fast" : "Бързо", + "transaction_priority_fastest" : "Най-бързо", + + + "trade_for_not_created" : "Сделка за ${title} не бе създадена.", + "trade_not_created" : "Сделка не бе създадена.", + "trade_id_not_found" : "Сделка ${tradeId} на ${title} не бе намерена.", + "trade_not_found" : "Сделката не бе намерена.", + + + "trade_state_pending" : "Изчаква се", + "trade_state_confirming" : "Потвърждава се", + "trade_state_trading" : "Trading", + "trade_state_traded" : "Traded", + "trade_state_complete" : "Завършено", + "trade_state_to_be_created" : "Изчаква създаване", + "trade_state_unpaid" : "Неплатено", + "trade_state_underpaid" : "Недостатъчно плащане", + "trade_state_paid_unconfirmed" : "Непотвърдено плащане", + "trade_state_paid" : "Платено", + "trade_state_btc_sent" : "Btc изпратен", + "trade_state_timeout" : "Време за изчакване", + "trade_state_created" : "Създадено", + "trade_state_finished" : "Завършено", + + "change_language" : "Смяна на езика", + "change_language_to" : "Смяна на езика на ${language}?", + + "paste" : "Поставяне", + "restore_from_seed_placeholder" : "Моля, въведете своя seed тук", + "add_new_word" : "Добавяне на нова дума", + "incorrect_seed" : "Въведеният текст е невалиден.", + + "biometric_auth_reason" : "Сканирайте своя пръстов отпечатък", + "version" : "Версия ${currentVersion}", + + "extracted_address_content" : "Ще изпратите средства на \n${recipient_name}", + + "card_address" : "Адрес:", + "buy" : "Купуване", + "sell": "Продаване", + + "placeholder_transactions" : "Вашите транзакции ще се покажат тук", + "placeholder_contacts" : "Вашите контакти ще се покажат тук", + + "template" : "Шаблон", + "confirm_delete_template" : "Този шаблон ще бъде изтрит. Искате ли да продължите?", + "confirm_delete_wallet" : "Този портфейл ще бъде изтрит. Искате ли да продължите?", + + "picker_description" : "За да изберете ChangeNOW или MorphToken, моля, първо променете своя trading pair", + + "change_wallet_alert_title" : "Смяна на сегашния портфейл", + "change_wallet_alert_content" : "Искате ли да смените сегашния портфейл на ${wallet_name}?", + + "creating_new_wallet" : "Създаване на нов портфейл", + "creating_new_wallet_error" : "Грешка: ${description}", + + "seed_alert_title" : "Внимание", + "seed_alert_content" : "Seed-ът е единственият начин да възстановите портфейла си. Записахте ли го?", + "seed_alert_back" : "Назад", + "seed_alert_yes" : "Да", + + "exchange_sync_alert_content" : "Моля, изчакайте синхронизирането на Вашия портфейл", + + "pre_seed_title" : "ВАЖНО", + "pre_seed_description" : "На следващата страница ще видите поредица от ${words} думи. Това е вашият таен личен seed и е единственият начин да възстановите портфейла си. Отговорността за съхранението му на сигурно място извън приложението на Cake Wallet е изцяло ВАША.", + "pre_seed_button_text" : "Разбирам. Покажи seed", + + "xmr_to_error" : "XMR.TO грешка", + "xmr_to_error_description" : "Невалидна сума - най-много 8 цифри след десетичната запетая", + + "provider_error" : "Грешка на ${provider} ", + + "use_ssl" : "Използване на SSL", + "trusted" : "Надежден", + + "color_theme" : "Цвят", + "light_theme" : "Светло", + "bright_theme" : "Ярко", + "dark_theme" : "Тъмно", + "enter_your_note" : "Въвеждане на бележка…", + "note_optional" : "Бележка (не е задължително)", + "note_tap_to_change" : "Бележка (натиснете за промяна)", + "view_in_block_explorer" : "Вижте в Block Explorer", + "view_transaction_on" : "Вижте транзакция на ", + "transaction_key" : "Transaction Key", + "confirmations" : "потвърждения", + "recipient_address" : "Адрес на получател", + + "extra_id" : "Допълнително ID:", + "destination_tag" : "Destination tag:", + "memo" : "Мемо:", + + "backup" : "Резервно копие", + "change_password" : "Смяна на парола", + "backup_password" : "Парола за възстановяване", + "write_down_backup_password" : "Моля, запишете своята парола за възстановяване. Тя се използва за импортиране на резервни копия на Вашите файлове.", + "export_backup" : "Експортиране на резервно копие", + "save_backup_password" : "Моля, запишете своята парола за възстановяване. Импортирането на резервни копия не е възможно без нея.", + "backup_file" : "Резервно копие", + + "edit_backup_password" : "Промяна на паролата за възстановяване", + "save_backup_password_alert" : "Запазване на паролата за възстановяване", + "change_backup_password_alert" : "Предишните резервни копия не могат да бъдат импортирани с новата парола. Те ще се използва само за нови такива. Are you sure that you want to change backup password?", + + "enter_backup_password" : "Въведете парола за възстановяване", + "select_backup_file" : "Избор на резервно копие", + "import" : "Импортиране", + "please_select_backup_file" : "Моля, изберете резервно копие и въведете парола за възстановяване.", + + "fixed_rate" : "Постоянен обменен курс", + "fixed_rate_alert" : "Ще можете да въведете сумата за получаване, когато е избранен постоянен обменен курс. Искате ли да изберете постоянен обменен курс?", + + "xlm_extra_info" : "Не забравяйте да дадете Memo ID-то, докато изпращате XLM транзакцията за обмена", + "xrp_extra_info" : "Не забравяйте да дадете Destination Tag-а, когато изпращате XRP транзакцията за обмена", + + "exchange_incorrect_current_wallet_for_xmr" : "Ако искате да обмените XMR от своя Cake Wallet Monero баланс, първо изберете своя Monero портфейл.", + "confirmed" : "Потвърдено", + "unconfirmed" : "Непотвърдено", + "displayable" : "Възможност за показване", + + "submit_request" : "изпращане на заявка", + + "buy_alert_content" : "В момента поддържаме покупката само на Bitcoin и Litecoin. За да закупите Bitcoin или Litecoin, създайте или изберете своя Bitcoin или Litecoin портфейл.", + "sell_alert_content": "В момента поддържаме само продажбата на Bitcoin. За да продавате Bitcoin, създайте или изберете своя Bitcoin портфейл.", + + "outdated_electrum_wallet_description" : "Нови Bitcoin портфейли, създадени в Cake, сега имат seed от 24 думи. Трябва да създадете нов Bitcoin адрес и да прехвърлите всичките си средства в него и веднага да спрете използването на стари портфейли. Моля, напревете това незабавно, за да подсигурите средствата си.", + "understand" : "Разбирам", + + "apk_update" : "APK ъпдейт", + + "buy_bitcoin" : "Купуване на Bitcoin", + "buy_with" : "Купуване чрез", + "moonpay_alert_text" : "Сумата трябва да бъде най-малко ${minAmount} ${fiatCurrency}", + + "outdated_electrum_wallet_receive_warning": "Ако този адрес има seed от 12 думи и е създаден чрез Cake, НЕ добавяйте Bitcoin в него. Всякакъв Bitcoin, изпратен на този адрес, може да бъде загубен завинаги. Създайте нов портфейл от 24 думи (натиснете менюто горе, вдясно, изберете Портфейли, изберете Създаване на нов портфейл, след това изберете Bitcoin) и НЕЗАБАВНО преместете своя Bitcoin там. Нови (такива с 24 думи) Bitcoin портфейли от Cake са надеждни", + "do_not_show_me": "Не показвай повече това", + + "unspent_coins_title" : "Неизползвани монети", + "unspent_coins_details_title" : "Подробности за неизползваните монети", + "freeze" : "Замразяване", + "frozen" : "Замразени", + "coin_control" : "Управление на монетите (не е задължително)", + + "address_detected" : "Открит е адрес", + "address_from_domain" : "Този адрес е от ${domain} на Unstoppable Domains", + + "add_receiver" : "Добавяне на друг получател (не е задължително)", + + "manage_yats" : "Управление на Yats", + "yat_alert_title" : "Търгувайте с крипто много по-лесно чрез Yat", + "yat_alert_content" : "Потребителите на Cake Wallet вече могат да изпращат и получават любимите си валути чрез неповторимо потребителско име от емоджита.", + "get_your_yat" : "Получете своя Yat", + "connect_an_existing_yat" : "Добавете съществуващ Yat", + "connect_yats": "Добавете Yats", + "yat_address" : "Yat Адрес", + "yat" : "Yat", + "address_from_yat" : "Този адрес е от ${emoji} в Yat", + "yat_error" : "Yat грешка", + "yat_error_content" : "Няма адреси, свързани с този Yat. Опитайте с друг Yat", + "choose_address" : "\n\nМоля, изберете адреса:", + "yat_popup_title" : "Адресът на вашия портфейл може да съдържа емоджита.", + "yat_popup_content" : "Вече можете да изпращате и да получавате крипто в Cake Wallet с вашия Yat - кратко потребителско име във формата на емоджи. Управлявайте своите Yats по всяко време в настройките", + "second_intro_title" : "Един емоджи адрес, обединяващ всички останали.", + "second_intro_content" : "Вашият Yat е уникален адрес във формата на емоджи, който играе ролята на всички Ваши дълги шестнайсетични портфейли за всяка валута.", + "third_intro_title" : "Yat добре се сработва с други", + "third_intro_content" : "Yats също живее извън Cake Wallet. Всеки адрес на портфейл може да бъде заменен с Yat!", + "learn_more" : "Научете още", + "search": "Търсене", + "search_language": "Търсене на език", + "search_currency": "Търсене на валута", + "new_template" : "Нов шаблон", + "electrum_address_disclaimer": "Нови адреси се генерират всеки път, когато използвате този, но и предишните продължават да работят", + "wallet_name_exists": "Вече има портфейл с това име. Моля, изберете друго име или преименувайте другия портфейл.", + "market_place": "Магазин", + "cake_pay_title": "Cake Pay Gift Карти", + "cake_pay_subtitle": "Купете гифткарти на намалени цени (само за САЩ)", + "cake_pay_web_cards_title": "Cake Pay Онлайн Карти", + "cake_pay_web_cards_subtitle": "Купете световно признати предплатени и гифт карти", + "about_cake_pay": "Cake Pay Ви позволява лесно да купувате предплатени карти, които веднага могат да се използват с над 150,000 търговци на територията на САЩ.", + "cake_pay_account_note": "Регистрайте се само с един имейл, за да виждате и купувате карти. За някои има дори и отстъпка!", + "already_have_account": "Вече имате профил?", + "create_account": "Създаване на профил", + "privacy_policy": "Политика за поверителността", + "welcome_to_cakepay": "Добре дошли в Cake Pay!", + "sign_up": "Регистрация", + "forgot_password": "Забравена парола", + "reset_password": "Нулиране на парола", + "gift_cards": "Gift Карти", + "setup_your_debit_card": "Настройте своята дебитна карта", + "no_id_required": "Без нужда от документ за самоличност. Използвайте навсякъде", + "how_to_use_card": "Как се ползва тази карта", + "purchase_gift_card": "Купуване на Gift Card", + "verification": "Потвърждаване", + "fill_code": "Моля, въведето кода за потвърждаване, изпратен на Вашия имейл", + "dont_get_code": "Не получихте код?", + "resend_code": "Повторно изпращане", + "debit_card": "Дебитна карта", + "cakepay_prepaid_card": "CakePay предплатена дебитна карта", + "no_id_needed": "Без нужда от документ за самоличност!", + "frequently_asked_questions": "Често задавани въпроси", + "debit_card_terms": "Съхранението и използването на данните от вашата платежна карта в този дигитален портфейл подлежат на условията на съответното съгласие за картодържец от издателя на картата.", + "please_reference_document": "Моля, вижте документите по-долу за повече информация.", + "cardholder_agreement": "Съгласие за картодържец", + "e_sign_consent": "E-Sign съгласие", + "agree_and_continue": "Съгласяване и продължаване", + "email_address": "Имейл адрес", + "agree_to": "Чрез създаването на акаунт вие се съгласявате с ", + "and": "и", + "enter_code": "Въведете код", + "congratulations": "Поздравления!", + "you_now_have_debit_card": "Вече имате дебитна карта", + "min_amount" : "Мин: ${value}", + "max_amount" : "Макс: ${value}", + "enter_amount": "Въведете сума", + "billing_address_info": "Ако Ви попитат за билинг адрес, въведето своя адрес за доставка", + "order_physical_card": "Поръчка на физическа карта", + "add_value": "Добавяне на стойност", + "activate": "Активиране", + "get_a": "Вземете ", + "digital_and_physical_card": " дигитална или физическа предплатена дебитна карта", + "get_card_note": ", която можете да заредите с дигитална валута. Без нужда от допълнителна информация!", + "signup_for_card_accept_terms": "Регистрайте се за картата и приемете условията.", + "add_fund_to_card": "Добавете предплатени средства в картите (до ${value})", + "use_card_info_two": "Средствата се обръщат в USD, когато биват запазени в предплатената карта, а не в дигитална валута.", + "use_card_info_three": "Използвайте дигиталната карта онлайн или чрез безконтактен метод на плащане.", + "optionally_order_card": "По желание поръчайте и физическа карта.", + "hide_details" : "Скриване на подробностите", + "show_details" : "Показване на подробностите", + "upto": "до ${value}", + "discount": "Спестете ${value}%", + "gift_card_amount": "Сума в Gift Card", + "bill_amount": "Искана сума", + "you_pay": "Вие плащате", + "tip": "Tip:", + "custom": "персонализирано", + "by_cake_pay": "от Cake Pay", + "expires": "Изтича", + "mm": "мм", + "yy": "гг", + "online": "Онлайн", + "offline": "Офлайн", + "gift_card_number": "Номер на Gift Card", + "pin_number": "PIN код", + "total_saving": "Общо спестявания", + "last_30_days": "Последните 30 дни", + "avg_savings": "Средни спестявания", + "view_all": "Виж всички", + "active_cards": "Активни карти", + "delete_account": "Изтриване на акаунт", + "cards": "Карти", + "active": "Активиране", + "redeemed": "Използвани", + "gift_card_balance_note": "Гифткарти с наличен баланс ще се покажат тук", + "gift_card_redeemed_note": "Използваните гифткарти ще се покажат тук", + "logout": "Logout", + "add_tip": "Add Tip", + "percentageOf": "от ${amount}", + "is_percentage": "е", + "search_category": "Търсене в категория", + "mark_as_redeemed": "Отбележи като използван", + "more_options": "Още настройки", + "awaiting_payment_confirmation": "Чака се потвърждение на плащането", + "transaction_sent_notice": "Ако процесът продължи повече от 1 минута, проверете някой block explorer и своя имейл.", + "agree": "Съгласен/а съм", + "in_store": "In Store", + "generating_gift_card": "Създаване на Gift Card", + "payment_was_received": "Плащането бе получено.", + "proceed_after_one_minute": "Ако процесът продължи повече от 1 минута, проверете своя имейл.", + "order_id": "ID на поръчка", + "gift_card_is_generated": "Gift Card бе създадена", + "open_gift_card": "Отвори Gift Card", + "contact_support": "Свържи се с отдел поддръжка", + "gift_cards_unavailable": "В момента гифткарти могат да бъдат закупени само с Monero, Bitcoin и Litecoin", + "introducing_cake_pay": "Запознайте се с Cake Pay!", + "cake_pay_learn_more": "Купете и използвайте гифткарти директно в приложението!\nПлъзнете отляво надясно, за да научите още.", + "automatic": "Автоматично", + "fixed_pair_not_supported": "Този fixed pair не се поддържа от избраната борса", + "variable_pair_not_supported": "Този variable pair не се поддържа от избраната борса", + "none_of_selected_providers_can_exchange": "Нито един от избраните provider-ъри не може да направи този превод", + "choose_one": "Изберете едно", + "choose_from_available_options": "Изберете от следните опции:", + "custom_redeem_amount": "Персонализирана сума за използване", + "add_custom_redemption": "Добавете персонализиран Redemption", + "remaining": "оставащи", + "delete_wallet": "Изтриване на портфейл", + "delete_wallet_confirm_message" : "Сигурни ли сте, че искате да изтриете протфейла ${wallet_name}?", + "low_fee": "Ниска такса", + "low_fee_alert": "Използвате ниска приоритетност в мрежата. Това може да доведе до дълго чакане, различни обменни курсове или отказани сделки. Препоръчваме използването на по-висока такса.", + "ignor": "Игнориране", + "use_suggested": "Използване на предложеното", + "do_not_share_warning_text" : "Не споделяйте това с никого, дори и отдел поддръжка.\n\nПарите Ви могат и ще бъдат откраднати!", + "help": "Помощ", + "all_transactions": "Всички транзакции", + "all_trades": "Всички сделкки", + "connection_sync": "Свързване и синхронизиране", + "security_and_backup": "Сигурност и резервни копия", + "create_backup": "Създаване на резервно копие", + "privacy_settings": "Настройки за поверителност", + "privacy": "Поверителност", + "display_settings": "Настройки на екрана", + "other_settings": "Други настройки", + "require_pin_after": "Въведете PIN след", + "always": "Винаги", + "minutes_to_pin_code": "${minute} минути", + "disable_exchange": "Деактивиране на борса", + "advanced_privacy_settings": "Допълнителни настройки за поверителност", + "settings_can_be_changed_later": "Тези настройки могат да бъдат променени по-късно от приложението", + "add_custom_node": "Добавяне на нов персонализиран Node", + "disable_fiat": "Деактивиране на fiat", + "fiat_api": "Fiat API", + "disabled": "Деактивирано", + "enabled": "Активирано", + "tor_only": "Само чрез Tor", + "unmatched_currencies": "Валутата на този портфейл не съвпада с тази от сканирания QR код", + "orbot_running_alert": "Моля, включете Orbot преди да свържете към този node.", + "contact_list_contacts": "Контакти", + "contact_list_wallets": "Моите портфейли", + "bitcoin_payments_require_1_confirmation": "Плащанията с Bitcoin изискват потвърждение, което може да отнеме 20 минути или повече. Благодарим за търпението! Ще получите имейл, когато плащането е потвърдено.", + "send_to_this_address" : "Send ${currency} ${tag}to this address", + "arrive_in_this_address" : "${currency} ${tag}ще отидат на този адрес", + "do_not_send": "Не изпращай", + "error_dialog_content": "Получихме грешка.\n\nМоля, изпратете доклада до нашия отдел поддръжка, за да подобрим приложението." +} diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb new file mode 100644 index 000000000..cc66b8144 --- /dev/null +++ b/res/values/strings_cs.arb @@ -0,0 +1,688 @@ +{ + "welcome" : "Vítejte v", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "Úžasná peněženka pro Monero, Bitcoin, Litecoin a Haven", + "please_make_selection" : "Prosím vyberte si níže, jestli chcete vytvořit, nebo obnovit peněženku.", + "create_new" : "Vytvořit novou peněženku", + "restore_wallet" : "Obnovit peněženku", + + "monero_com": "Monero.com od Cake Wallet", + "monero_com_wallet_text": "Úžasná peněženka pro Monero", + + "haven_app": "Haven od Cake Wallet", + "haven_app_wallet_text": "Úžasná peněženka pro Haven", + + "accounts" : "Účty", + "edit" : "Upravit", + "account" : "Účet", + "add" : "Přidat", + + + "address_book" : "Adresář", + "contact" : "Kontakt", + "please_select" : "Zvolte si:", + "cancel" : "Zrušit", + "ok" : "OK", + "contact_name" : "Jméno kontaktu", + "reset" : "Vymazat", + "save" : "Uložit", + "address_remove_contact" : "Smazat kontakt", + "address_remove_content" : "Opravdu chcete smazat označený kontakt?", + + + "authenticated" : "Ověřeno", + "authentication" : "Ověřování", + "failed_authentication" : "Ověřování selhalo. ${state_error}", + + + "wallet_menu" : "Menu", + "Blocks_remaining" : "Zbývá ${status} bloků", + "please_try_to_connect_to_another_node" : "Zkuste se prosím připojit k jinému uzlu", + "xmr_hidden" : "Skryto", + "xmr_available_balance" : "Zůstatek (dostupný)", + "xmr_full_balance" : "Zůstatek (celkový)", + "send" : "Poslat", + "receive" : "Přijmout", + "transactions" : "Transakce", + "incoming" : "Příchozí", + "outgoing" : "Odchozí", + "transactions_by_date" : "Transakce podle data", + "trades" : "Obchody", + "filter_by": "Filtrovat podle", + "today" : "Dnes", + "yesterday" : "Včera", + "received" : "Přijato", + "sent" : "Odesláno", + "pending" : " (čeká)", + "rescan" : "Znovu prohledat", + "reconnect" : "Znovu připojit", + "wallets" : "Peněženky", + "show_seed" : "Zobrazit seed", + "show_keys" : "Zobrazit seed/klíče", + "address_book_menu" : "Adresář", + "reconnection" : "Znovu připojit", + "reconnect_alert_text" : "Opravdu se chcete znovu připojit?", + + + "exchange" : "Směnit", + "clear" : "Smazat", + "refund_address" : "Adresa pro vrácení", + "change_exchange_provider" : "Změnit směnárnu", + "you_will_send" : "Směnit z", + "you_will_get" : "Směnit na", + "amount_is_guaranteed" : "Částka, kterou dostanete, je konečná", + "amount_is_estimate" : "Částka, kterou dostanete, je jen odhad.", + "powered_by" : "Zajišťuje ${title}", + "error" : "Chyba", + "estimated" : "Odhadováno", + "min_value" : "Min: ${value} ${currency}", + "max_value" : "Max: ${value} ${currency}", + "change_currency" : "Změnit měnu", + "overwrite_amount" : "Přepsat částku", + "qr_payment_amount" : "Tento QR kód obsahuje i částku. Chcete přepsat současnou hodnotu?", + + "copy_id" : "Kopírovat ID", + "exchange_result_write_down_trade_id" : "Prosím zkopírujte si, nebo zapište si ID transakce (trade ID) pro pokračování.", + "trade_id" : "ID transakce (trade ID):", + "copied_to_clipboard" : "Zkopírováno do schránky", + "saved_the_trade_id" : "Uložil jsem si ID transakce (trade ID)", + "fetching" : "Načítá se", + "id" : "ID: ", + "amount" : "Částka: ", + "payment_id" : "ID platby: ", + "status" : "Status: ", + "offer_expires_in" : "Nabídka vyprší: ", + "trade_is_powered_by" : "Tento obchod zajišťuje ${provider}", + "copy_address" : "Zkopírovat adresu", + "exchange_result_confirm" : "Po stisknutí Potvrdit odešlete ${fetchingLabel} ${from} ze své peněženky s názvem ${walletName} na adresu uvedenou níže. Nebo můžete prostředky poslat ze své externí peněženky na níže uvedenou adresu/QR kód.\n\nProsím stiskněte Potvrdit pro pokračování, nebo se vraťte zpět pro změnu částky.", + "exchange_result_description" : "Musíte poslat minimálně ${fetchingLabel} ${from} na adresu uvedenou na následující stránce. Pokud pošlete nižší částku než ${fetchingLabel} ${from} nemusí dojít ke směně, ani k jejímu vrácení.", + "exchange_result_write_down_ID" : "*Prosím zkopírujte si, nebo zapište si výše uvedené ID.", + "confirm" : "Potvrdit", + "confirm_sending" : "Potvrdit odeslání", + "commit_transaction_amount_fee" : "Odeslat transakci\nČástka: ${amount}\nPoplatek: ${fee}", + "sending" : "Odesílání", + "transaction_sent" : "Transakce odeslána!", + "expired" : "Vypršelo", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "Odeslat XMR", + "exchange_new_template" : "Nová šablona", + + "faq" : "FAQ", + + + "enter_your_pin" : "Zadejte svůj PIN", + "loading_your_wallet" : "Načítám peněženku", + + + "new_wallet" : "Nová peněženka", + "wallet_name" : "Název peněženky", + "continue_text" : "Pokračovat", + "choose_wallet_currency" : "Prosím zvolte si měnu pro peněženku:", + + + "node_new" : "Nový uzel", + "node_address" : "Adresa uzlu", + "node_port" : "Port uzlu", + "login" : "Login", + "password" : "Heslo", + "nodes" : "Uzly", + "node_reset_settings_title" : "Zrušit nastavení", + "nodes_list_reset_to_default_message" : "Opravdu chcete zrušit nastavení a vrátit výchozí hodnotu?", + "change_current_node" : "Opravdu chcete změnit současný uzel na ${node}?", + "change" : "Změnit", + "remove_node" : "Odstranit uzel", + "remove_node_message" : "Opravdu chcete odstranit označený uzel?", + "remove" : "Odstranit", + "delete" : "Smazat", + "add_new_node" : "Přidat nový uzel", + "change_current_node_title" : "Změnit současný uzel", + "node_test" : "Otestovat", + "node_connection_successful" : "Připojení bylo úspěšné", + "node_connection_failed" : "Připojení selhalo", + "new_node_testing" : "Testování nového uzlu", + + + "use" : "Přepnout na ", + "digit_pin" : "-číselný PIN", + + + "share_address" : "Sdílet adresu", + "receive_amount" : "Částka", + "subaddresses" : "Subadresy", + "addresses" : "Adresy", + "scan_qr_code" : "Naskenujte QR kód pro získání adresy", + "qr_fullscreen" : "Poklepáním otevřete QR kód na celé obrazovce", + "rename" : "Přejmenovat", + "choose_account" : "Zvolte částku", + "create_new_account" : "Vytvořit nový účet", + "accounts_subaddresses" : "Účty a subadresy", + + + "restore_restore_wallet" : "Obnovit peněženku", + "restore_title_from_seed_keys" : "Obnovit ze seedu/klíčů", + "restore_description_from_seed_keys" : "Obnovte svou peněženku ze seedu/klíčů, které jste si uložili na bezpečném místě", + "restore_next" : "Další", + "restore_title_from_backup" : "Obnovit ze zálohy", + "restore_description_from_backup" : "Můžete obnovit celou Cake Wallet aplikaci ze souboru se zálohou", + "restore_seed_keys_restore" : "Obnovit ze seedu/klíčů", + "restore_title_from_seed" : "Obnovit ze seedu", + "restore_description_from_seed" : "Obnovte svou peněženku pomocí kombinace 25, nebo 13 slov", + "restore_title_from_keys" : "Obnovit z klíčů", + "restore_description_from_keys" : "Obnovte svou peněženku pomocí generovaných stisků kláves uložených z vašich soukromých klíčů", + "restore_wallet_name" : "Jméno peněženky", + "restore_address" : "Adresa", + "restore_view_key_private" : "Klíč pro zobrazení (soukromý)", + "restore_spend_key_private" : "Klíč pro platby (soukromý)", + "restore_recover" : "Obnovit", + "restore_wallet_restore_description" : "Popis obnovení peněženky", + "restore_new_seed" : "Nový seed", + "restore_active_seed" : "Aktivní seed", + "restore_bitcoin_description_from_seed" : "Obnovte svou peněženku pomocí kombinace 24 slov", + "restore_bitcoin_description_from_keys" : "Obnovte svou peněženku pomocí vygenerovaného WIF řetězce z vašich soukromých klíčů", + "restore_bitcoin_title_from_keys" : "Obnovit z WIF", + "restore_from_date_or_blockheight" : "Prosím zadejte datum z doby několik dnů před tím, než jste si zakládali tuto peněženku. Nebo místo toho zadejte výšku bloku, pokud ji znáte.", + + + "seed_reminder" : "Prosím zapište si toto pro případ ztráty, nebo poškození telefonu", + "seed_title" : "Seed", + "seed_share" : "Sdílet seed", + "copy" : "Kopírovat", + + + "seed_language_choose" : "Prosím zvolte si jazyk seedu:", + "seed_choose" : "Zvolte si jazyk seedu", + "seed_language_next" : "Další", + "seed_language_english" : "Angličtina", + "seed_language_chinese" : "Čínština", + "seed_language_dutch" : "Nizozemština", + "seed_language_german" : "Němčina", + "seed_language_japanese" : "Japonština", + "seed_language_portuguese" : "Portugalština", + "seed_language_russian" : "Ruština", + "seed_language_spanish" : "Španělština", + "seed_language_french": "Francouzština", + "seed_language_italian": "Italština", + + + "send_title" : "Poslat", + "send_your_wallet" : "Vaše peněženka", + "send_address" : "${cryptoCurrency} adresa", + "send_payment_id" : "ID platby (nepovinné)", + "all" : "VŠE", + "send_error_minimum_value" : "Minimální částka je 0,01", + "send_error_currency" : "Měna může obsahovat pouze čísla", + "send_estimated_fee" : "Odhadovaný poplatek:", + "send_priority" : "Momentálně je poplatek nastaven na prioritu: ${transactionPriority}.\nPriorita transakce může být upravena v nastavení.", + "send_creating_transaction" : "Vytváření transakce", + "send_templates" : "Šablony", + "send_new" : "Nová", + "send_amount" : "Částka:", + "send_fee" : "Poplatek:", + "send_name" : "Název", + "send_got_it" : "Rozumím", + "send_sending" : "Odesílání...", + "send_success" : "Vaše ${crypto} bylo úspěšně odesláno", + + + "settings_title" : "Nastavení", + "settings_nodes" : "Uzly", + "settings_current_node" : "Aktuální uzel", + "settings_wallets" : "Peněženky", + "settings_display_balance" : "Zobrazovat zůstatek", + "settings_currency" : "Měna", + "settings_fee_priority" : "Priorita (poplatky)", + "settings_save_recipient_address" : "Ukládat adresu příjemce", + "settings_personal" : "Osobní", + "settings_change_pin" : "Změnit PIN", + "settings_change_language" : "Změnit jazyk", + "settings_allow_biometrical_authentication" : "Povolit biometrické ověření", + "settings_dark_mode" : "Tmavý režim", + "settings_transactions" : "Transakce", + "settings_trades" : "Obchody", + "settings_display_on_dashboard_list" : "Zobrazit na seznamu na dashboardu", + "settings_all" : "VŠE", + "settings_only_trades" : "Pouze obchody", + "settings_only_transactions" : "Pouze transakce", + "settings_none" : "Žádný", + "settings_support" : "Podpora", + "settings_terms_and_conditions" : "Obchodní podmínky", + "pin_is_incorrect" : "PIN není správný", + + + "setup_pin" : "Nastavit PIN", + "enter_your_pin_again" : "Zadejte znovu svůj PIN", + "setup_successful" : "Váš PIN byl úspěšně nastaven!", + + + "wallet_keys" : "Seed/klíče peněženky", + "wallet_seed" : "Seed peněženky", + "private_key" : "Soukromý klíč", + "public_key" : "Veřejný klíč", + "view_key_private" : "Klíč pro zobrazení (soukromý)", + "view_key_public" : "Klíč pro zobrazení (veřejný)", + "spend_key_private" : "Klíč pro platby (soukromý)", + "spend_key_public" : "Klíč pro platby (veřejný)", + "copied_key_to_clipboard" : "Zkopírován ${key} do schránky", + + + "new_subaddress_title" : "Nová adresa", + "new_subaddress_label_name" : "Popisek", + "new_subaddress_create" : "Vytvořit", + + "address_label" : "Popisek adresy", + + "subaddress_title" : "Seznam subadres", + + + "trade_details_title" : "Podrobnosti k obchodu", + "trade_details_id" : "ID", + "trade_details_state" : "Stav", + "trade_details_fetching" : "Získávám", + "trade_details_provider" : "Poskytovatel", + "trade_details_created_at" : "Vytvořeno v", + "trade_details_pair" : "Pár", + "trade_details_copied" : "${title} zkopírováno do schránky", + + + "trade_history_title" : "Historie obchodů", + + + "transaction_details_title" : "Podrobnosti o transakci", + "transaction_details_transaction_id" : "ID transakce", + "transaction_details_date" : "Datum", + "transaction_details_height" : "Výška", + "transaction_details_amount" : "Částka", + "transaction_details_fee" : "Poplatek", + "transaction_details_copied" : "${title} zkopírováno do schránky", + "transaction_details_recipient_address" : "Adresa příjemce", + + + "wallet_list_title" : "Monero Wallet", + "wallet_list_create_new_wallet" : "Vytvořit novou peněženku", + "wallet_list_restore_wallet" : "Obnovit peněženku", + "wallet_list_load_wallet" : "Načíst peněženku", + "wallet_list_loading_wallet" : "Načítám ${wallet_name} peněženku", + "wallet_list_failed_to_load" : "Chyba při načítání ${wallet_name} peněženky. ${error}", + "wallet_list_removing_wallet" : "Odstraňuji ${wallet_name} peněženku", + "wallet_list_failed_to_remove" : "Chyba při odstraňování ${wallet_name} peněženky. ${error}", + + + "widgets_address" : "Adresa", + "widgets_restore_from_blockheight" : "Obnovit z výšky bloku", + "widgets_restore_from_date" : "Obnovit z data", + "widgets_or" : "nebo", + "widgets_seed" : "Seed", + + + "router_no_route" : "Pro ${name} není definována žádná cesta", + + + "error_text_account_name" : "Název účtu může obsahovat jen písmena a čísla\na musí mít délku 1 až 15 znaků", + "error_text_contact_name" : "Jméno kontaktu nemůže obsahovat symboly ` , ' \" \na musí mít délku 1 až 32 znaků", + "error_text_address" : "Adresa peněženky musí odpovídat typu\nkryptoměny", + "error_text_node_address" : "prosím zadejte IPv4 adresu", + "error_text_node_port" : "Port uzlu musí být číslo mezi 0 a 65535", + "error_text_payment_id" : "ID platby se musí skládat z 16 až 64 hexadecimálních znaků", + "error_text_xmr" : "Hodnota XMR nemůže překročit dostupný zůstatek.\nPočet desetinných míst musí být menší, nebo roven 12", + "error_text_fiat" : "Částka nemůže překročit dostupný zůstatek.\nPočet desetinných míst musí být menší, nebo roven 2", + "error_text_subaddress_name" : "Subadresa nemůže obsahovat symboly ` , ' \" \na musí mít délku 1 až 20 znaků", + "error_text_amount" : "Částka může obsahovat pouze čísla", + "error_text_wallet_name" : "Jméno peněženky může obsahovat pouze písmena, čísla, symbol _ \na musí mít délku 1 až 33 znaků", + "error_text_keys" : "Klíče peněženky musí obsahovat 64 hexadecimálních znaků", + "error_text_crypto_currency" : "Počet desetinných míst\nmusí být menší, nebo roven 12", + "error_text_minimal_limit" : "Obchod pro ${provider} nebyl vytvořen. Částka je menší než minimální hodnota: ${min} ${currency}", + "error_text_maximum_limit" : "Obchod pro ${provider} nebyl vytvořen. Částka je větší než maximální hodnota: ${max} ${currency}", + "error_text_limits_loading_failed" : "Obchod pro ${provider} nebyl vytvořen. Selhalo načítání limitů", + "error_text_template" : "Jméno šablony a adresa nemohou obsahovat symboly ` , ' \" \na musí mít délku 1 až 106 znaků", + + + "auth_store_ban_timeout" : "ban_timeout", + "auth_store_banned_for" : "Zablokován na ", + "auth_store_banned_minutes" : " minut", + "auth_store_incorrect_password" : "Nesprávný PIN", + "wallet_store_monero_wallet" : "Monero Wallet", + "wallet_restoration_store_incorrect_seed_length" : "Nesprávná délka seedu", + + + "full_balance" : "Celkový zůstatek", + "available_balance" : "Dostupný zůstatek", + "hidden_balance" : "Skrytý zůstatek", + + + "sync_status_syncronizing" : "SYNCHRONIZUJI", + "sync_status_syncronized" : "SYNCHRONIZOVÁNO", + "sync_status_not_connected" : "NEPŘIPOJENO", + "sync_status_starting_sync" : "SPOUŠTĚNÍ SYNCHRONIZACE", + "sync_status_failed_connect" : "ODPOJENO", + "sync_status_connecting" : "PŘIPOJOVÁNÍ", + "sync_status_connected" : "PŘIPOJENO", + "sync_status_attempting_sync" : "ZAHAJUJI SYNCHR.", + + + "transaction_priority_slow" : "Pomalá", + "transaction_priority_regular" : "Běžná", + "transaction_priority_medium" : "Střední", + "transaction_priority_fast" : "Rychlá", + "transaction_priority_fastest" : "Nejrychlejší", + + + "trade_for_not_created" : "Obchod pro ${title} nebyl vytvořen.", + "trade_not_created" : "Obchod nebyl vytvořen", + "trade_id_not_found" : "Obchod ${tradeId} z ${title} nenalezen.", + "trade_not_found" : "Obchod nenalezen.", + + + "trade_state_pending" : "Čekající", + "trade_state_confirming" : "Ověřování", + "trade_state_trading" : "Obchoduji", + "trade_state_traded" : "Zobchodováno", + "trade_state_complete" : "Kompletní", + "trade_state_to_be_created" : "Bude vytvořen", + "trade_state_unpaid" : "Nezaplaceno", + "trade_state_underpaid" : "Zaplaceno méně", + "trade_state_paid_unconfirmed" : "Nepotvrzeně zaplaceno", + "trade_state_paid" : "Zaplaceno", + "trade_state_btc_sent" : "BTC odesláno", + "trade_state_timeout" : "Vypršel časový limit", + "trade_state_created" : "Vytvořeno", + "trade_state_finished" : "Hotovo", + + "change_language" : "Změnit jazyk", + "change_language_to" : "Změnit jazyk na ${language}?", + + "paste" : "Vložit", + "restore_from_seed_placeholder" : "Prosím zadejte, nebo vložte ze schránky svůj seed.", + "add_new_word" : "Přidat nové slovo", + "incorrect_seed" : "Zadaný text není správný.", + + "biometric_auth_reason" : "Naskenujte otisk prstu pro ověření", + "version" : "Verze ${currentVersion}", + + "extracted_address_content" : "Prostředky budete posílat na\n${recipient_name}", + + "card_address" : "Adresa:", + "buy" : "Koupit", + "sell": "Prodat", + + "placeholder_transactions" : "Vaše transakce budou zobrazeny zde", + "placeholder_contacts" : "Vaše kontakty budou zobrazeny zde", + + "template" : "Šablona", + "confirm_delete_template" : "Tato akce smaže tuto šablonu. Přejete si pokračovat?", + "confirm_delete_wallet" : "Tato akce smaže tuto peněženku. Přejete si pokračovat?", + + "picker_description" : "Pro volbu ChangeNOW, nebo MorphToken si prosím vyberte nejprve pár pro obchodování", + + "change_wallet_alert_title" : "Přepnout peněženku", + "change_wallet_alert_content" : "Opravdu chcete změnit aktivní peněženku na ${wallet_name}?", + + "creating_new_wallet" : "Vytvářím novou peněženku", + "creating_new_wallet_error" : "Chyba: ${description}", + + "seed_alert_title" : "Pozor", + "seed_alert_content" : "Tento seed představuje jedinou možnost, jak obnovit peněženku. Zapsali jste si ho?", + "seed_alert_back" : "Zpět", + "seed_alert_yes" : "Ano", + + "exchange_sync_alert_content" : "Prosím počkejte, dokud nebude vaše peněženka synchronizována", + + "pre_seed_title" : "DŮLEŽITÉ", + "pre_seed_description" : "Na následující stránce uvidíte sérii ${words} slov. Je to váš tzv. seed a je to JEDINÁ možnost, jak můžete později obnovit svou peněženku v případě ztráty nebo poruchy. Je VAŠÍ zodpovědností zapsat si ho a uložit si ho na bezpečném místě mimo aplikaci Cake Wallet.", + "pre_seed_button_text" : "Rozumím. Ukaž mi můj seed.", + + "xmr_to_error" : "XMR.TO chyba", + "xmr_to_error_description" : "Neplatná částka. Maximálně lze použít 8 desetinných míst", + + "provider_error" : "${provider} chyba", + + "use_ssl" : "Použít SSL", + "trusted" : "Důvěřovat", + + "color_theme" : "Barevný motiv", + "light_theme" : "Světlý", + "bright_theme" : "Jasný", + "dark_theme" : "Tmavý", + "enter_your_note" : "Zadejte poznámku…", + "note_optional" : "Poznámka (nepovinné)", + "note_tap_to_change" : "Poznámka (poklepáním upravit)", + "view_in_block_explorer" : "Zobrazit v Block Exploreru", + "view_transaction_on" : "Zobrazit transakci na ", + "transaction_key" : "Klíč transakce", + "confirmations" : "Potvrzení", + "recipient_address" : "Adresa příjemce", + + "extra_id" : "Extra ID:", + "destination_tag" : "Destination Tag:", + "memo" : "Memo:", + + "backup" : "Záloha", + "change_password" : "Změnit heslo", + "backup_password" : "Heslo pro zálohy", + "write_down_backup_password" : "Prosím zapište si své heslo pro zálohy, které se používá pro import vašich souborů se zálohami.", + "export_backup" : "Exportovat zálohu", + "save_backup_password" : "Prosím ujistěte se, že máte uschováno heslo pro zálohy. Bez něj nebudete moci naimportovat soubory se zálohami.", + "backup_file" : "Soubor se zálohou", + + "edit_backup_password" : "Upravit heslo pro zálohy", + "save_backup_password_alert" : "Uložit heslo pro zálohy", + "change_backup_password_alert" : "Vaše předchozí soubory se zálohami nebude možné naimportovat s novým heslem. Nové heslo bude použito pouze pro nové zálohy. Opravdu chcete změnit heslo pro zálohy?", + + "enter_backup_password" : "Zde zadejte své heslo pro zálohy", + "select_backup_file" : "Vybrat soubor se zálohou", + "import" : "Importovat", + "please_select_backup_file" : "Prosím vyberte soubor se zálohou a zadejte heslo pro zálohy.", + + "fixed_rate" : "Pevný kurz", + "fixed_rate_alert" : "Když je zvolený pevný kurz, můžete zadat konkrétní částku, kterou chcete dostat. Chcete se přepnout do režimu s pevným kurzem?", + + "xlm_extra_info" : "Prosím nezapomeňte zadat Memo ID, když posíláte XLM transakce ke směně", + "xrp_extra_info" : "Prosím nezapomeňte zadat Destination Tag, když posíláte XRP transakce ke směně", + + "exchange_incorrect_current_wallet_for_xmr" : "Pokud chcete směnit XMR z Monero částky v Cake Wallet, prosím přepněte se nejprve do své Monero peněženky.", + "confirmed" : "Potvrzeno", + "unconfirmed" : "Nepotvrzeno", + "displayable" : "Zobrazitelné", + + "submit_request" : "odeslat požadavek", + + "buy_alert_content" : "V současné době podporujeme nákup pouze Bitcoinu a Litecoinu. Pro nákup Bitcoinu, nebo Litecoinu si prosím vytvořte Bitcoinovou, nebo Litecoinovou peněženku, nebo se do ní přepněte.", + "sell_alert_content": "V současné době podporujeme pouze prodej Bitcoinu. Pro prodej Bitcoinu si prosím vytvořte Bitcoinovou peněženku, nebo se do ní přepněte.", + + "outdated_electrum_wallet_description" : "Nové Bitcoinové peněženky vytvořené v Cake mají nyní seed se 24 slovy. Je třeba si vytvořit novou Bitcoinovou peněženku se 24 slovy, převést na ni všechny prostředky a přestat používat seed se 12 slovy. Prosím udělejte to hned pro zabezpečení svých prostředků.", + "understand" : "Rozumím", + + "apk_update" : "aktualizace APK", + + "buy_bitcoin" : "Nakoupit Bitcoin", + "buy_with" : "Nakoupit pomocí", + "moonpay_alert_text" : "Částka musí být větší nebo rovna ${minAmount} ${fiatCurrency}", + + "outdated_electrum_wallet_receive_warning": "Tato peněženka má seed se 12 slovy a byla vytvořena pomocí Cake, NEUKLÁDEJTE Bitcoin na tuto peněženku. Jakékoliv BTC převedené na tuto peněženku může být ztraceno. Vytvořte si novou peněženku s 24 slovy (otevřete menu vpravo nahoře, vyberte Peněženky, zvolte Vytvořit novou peněženku a pak zvolte Bitcoin) a IHNED tam přesuňte své BTC. Nové (24-slovní) BTC peněženky z Cake jsou bezpečné", + "do_not_show_me": "Příště nezobrazovat", + + "unspent_coins_title" : "Neutracené mince", + "unspent_coins_details_title" : "Podrobnosti o neutracených mincích", + "freeze" : "Zmrazit", + "frozen" : "Zmraženo", + "coin_control" : "Volba mincí (nepovinné)", + + "address_detected" : "Adresa detekována", + "address_from_domain" : "Tato adresa je z ${domain} na Unstoppable Domains", + + "add_receiver" : "Přidat dalšího příjemce (nepovinné)", + + "manage_yats" : "Spravovat Yaty", + "yat_alert_title" : "Posílejte a přijímejte crypto jednodušeji s Yat", + "yat_alert_content" : "Uživatelé Cake Wallet mohou nyní posílat a přijímat všechny své oblíbené měny pomocí něco jako uživatelského jména tvořeného emoji.", + "get_your_yat" : "Získat Yat", + "connect_an_existing_yat" : "Připojit existující Yat", + "connect_yats": "Připojit Yaty", + "yat_address" : "Yat adresa", + "yat" : "Yat", + "address_from_yat" : "Tato adresa je z ${emoji} na Yatu", + "yat_error" : "Yat chyba", + "yat_error_content" : "Žádná adresa není spojena s tímto Yatem. Zkuste jiný Yat", + "choose_address" : "\n\nProsím vyberte adresu:", + "yat_popup_title" : "Adresa Vaší peněženky může být emojifikována.", + "yat_popup_content" : "Nyní můžete posílat a přijímat crypto v Cake Wallet se svým Yatem - krátkým uživatelským jménem složeným z emoji. Spravujte kdykoliv Yaty na stránce s nastavením", + "second_intro_title" : "Jedna emoji adresa vládne všem", + "second_intro_content" : "Váš Yat je jediná unikátní emoji adresa, která nahrazuje všechny Vaše dlouhé hexadecimální adresy pro všechny Vaše měny.", + "third_intro_title" : "Yat dobře spolupracuje s ostatními", + "third_intro_content" : "Yat existuje i mimo Cake Wallet. Jakákoliv adresa peněženky na světě může být nahrazena Yatem!", + "learn_more" : "Zjistit více", + "search": "Hledat", + "search_language": "Hledat jazyk", + "search_currency": "Hledat měnu", + "new_template" : "Nová šablona", + "electrum_address_disclaimer": "Po každém použití je generována nová adresa, ale předchozí adresy také stále fungují", + "wallet_name_exists": "Peněženka s tímto názvem už existuje. Prosím zvolte si jiný název, nebo nejprve přejmenujte nejprve druhou peněženku.", + "market_place": "Obchod", + "cake_pay_title": "Cake Pay dárkové karty", + "cake_pay_subtitle": "Kupte si zlevněné dárkové karty (pouze USA)", + "cake_pay_web_cards_title": "Cake Pay webové karty", + "cake_pay_web_cards_subtitle": "Kupte si celosvětové předplacené a dárkové karty", + "about_cake_pay": "Cake Pay umožňuje jednoduše nakupovat dárkové karty pomocí virtuálních prostředků, které lze okamžitě uplatnit u více než 150 000 obchodníků ve Spojených státech.", + "cake_pay_account_note": "Přihlaste se svou e-mailovou adresou pro zobrazení a nákup karet. Některé jsou dostupné ve slevě!", + "already_have_account": "Máte už účet?", + "create_account": "Vytvořit účet", + "privacy_policy": "Zásady ochrany soukromí", + "welcome_to_cakepay": "Vítejte v Cake Pay!", + "sign_up": "Registrovat se", + "forgot_password": "Zapomenuté heslo", + "reset_password": "Resetovat heslo", + "gift_cards": "Dárkové karty", + "setup_your_debit_card": "Nastavit debetní kartu", + "no_id_required": "Žádní ID není potřeba. Dobijte si a utrácejte kdekoliv", + "how_to_use_card": "Jak použít tuto kartu", + "purchase_gift_card": "Objednat dárkovou kartu", + "verification": "Ověření", + "fill_code": "Prosím vyplňte ověřovací kód zaslaný na Váš e-mail", + "dont_get_code": "Nepřišel Vám kód?", + "resend_code": "Prosím poslat znovu", + "debit_card": "Debetní karta", + "cakepay_prepaid_card": "CakePay předplacená debetní karta", + "no_id_needed": "Žádné ID není potřeba!", + "frequently_asked_questions": "Často kladené otázky", + "debit_card_terms": "Uložení a použití vašeho čísla platební karty (a přihlašovací údaje k vašemu číslu karty) v této digitální peněžence se řídí Obchodními podmínkami smlouvy příslušného držitele karty s vydavatelem karty (v jejich nejaktuálnější verzi).", + "please_reference_document": "Více informací naleznete v dokumentu níže.", + "cardholder_agreement": "Smlouva držitele karty", + "e_sign_consent": "E-Sign souhlas", + "agree_and_continue": "Souhlasím & pokračovat", + "email_address": "E-mailová adresa", + "agree_to": "Vytvořením účtu souhlasíte s ", + "and": "a", + "enter_code": "Zadejte kód", + "congratulations": "Gratulujeme!", + "you_now_have_debit_card": "Nyní máte debetní kartu", + "min_amount" : "Min: ${value}", + "max_amount" : "Max: ${value}", + "enter_amount": "Zadejte částku", + "billing_address_info": "Při dotazu na fakturační adresu, zadejte svou doručovací adresu", + "order_physical_card": "Objednat fyzickou kartu", + "add_value": "Přidat hodnotu", + "activate": "Aktivovat", + "get_a": "Získejte ", + "digital_and_physical_card": " digitální a fyzické předplacené debetní karty,", + "get_card_note": " které můžete nabít digitální měnou. Žádné další informace nejsou vyžadovány!", + "signup_for_card_accept_terms": "Zaregistrujte se pro kartu a souhlaste s podmínkami.", + "add_fund_to_card": "Všechny předplacené prostředky na kartě (až ${value})", + "use_card_info_two": "Prostředky jsou převedeny na USD, když jsou drženy na předplaceném účtu, nikoliv na digitální měnu.", + "use_card_info_three": "Použijte tuto digitální kartu online nebo bezkontaktními platebními metodami.", + "optionally_order_card": "Volitelně objednat fyzickou kartu.", + "hide_details" : "Skrýt detaily", + "show_details" : "Zobrazit detaily", + "upto": "až ${value}", + "discount": "Ušetříte ${value}%", + "gift_card_amount": "Hodnota dárkové karty", + "bill_amount": "Účtovaná částka", + "you_pay": "Zaplatíte", + "tip": "Spropitné:", + "custom": "vlastní", + "by_cake_pay": "od Cake Pay", + "expires": "Vyprší", + "mm": "MM", + "yy": "YY", + "online": "Online", + "offline": "Offline", + "gift_card_number": "Číslo dárkové karty", + "pin_number": "Číslo PIN", + "total_saving": "Celkem ušetřeno", + "last_30_days": "Posledních 30 dnů", + "avg_savings": "Prům. ušetřeno", + "view_all": "Zobrazit vše", + "active_cards": "Aktivní karty", + "delete_account": "Smazat účet", + "cards": "Karty", + "active": "Aktivní", + "redeemed": "Uplatněné", + "gift_card_balance_note": "Dárkové karty se zbývající částkou se zobrazí zde", + "gift_card_redeemed_note": "Dárkové karty, které jste uplatnili, se zobrazí zde", + "logout": "Odhlásit", + "add_tip": "Přidat spropitné", + "percentageOf": "z ${amount}", + "is_percentage": "je", + "search_category": "Hledat kategorii", + "mark_as_redeemed": "Označit jako uplatněný", + "more_options": "Více možností", + "awaiting_payment_confirmation": "Čeká se na potvrzení platby", + "transaction_sent_notice": "Pokud proces nepokročí během 1 minuty, zkontrolujte block explorer a svůj e-mail.", + "agree": "Souhlasím", + "in_store": "V obchodě", + "generating_gift_card": "Generuji dárkovou kartu", + "payment_was_received": "Vaše platba byla přijata.", + "proceed_after_one_minute": "Pokud proces nepokročí během 1 minuty, zkontrolujte svůj e-mail.", + "order_id": "ID objednávky", + "gift_card_is_generated": "Generuje se dárková karta", + "open_gift_card": "Otevřít dárkovou kartu", + "contact_support": "Kontaktovat podporu", + "gift_cards_unavailable": "Dárkové karty jsou v tuto chvíli dostupné pro zakoupení pouze pomocí Monera, Bitcoinu a Litecoinu.", + "introducing_cake_pay": "Představujeme Cake Pay!", + "cake_pay_learn_more": "Okamžitý nákup a uplatnění dárkových karet v aplikaci!\nPřejeďte prstem zleva doprava pro další informace.", + "automatic": "Automatický", + "fixed_pair_not_supported": "Tento pár s pevným kurzem není ve zvolené směnárně podporován", + "variable_pair_not_supported": "Tento pár s tržním kurzem není ve zvolené směnárně podporován", + "none_of_selected_providers_can_exchange": "Žádný ze zvolených poskytovatelů nemůže provést tuto směnu", + "choose_one": "Zvolte si", + "choose_from_available_options": "Zvolte si z dostupných možností:", + "custom_redeem_amount": "Vlastní částka pro uplatnění", + "add_custom_redemption": "Přidat vlastní uplatnění", + "remaining": "zbývá", + "delete_wallet": "Smazat peněženku", + "delete_wallet_confirm_message" : "Opravdu chcete smazat ${wallet_name} peněženku?", + "low_fee": "Nízký poplatek", + "low_fee_alert": "Momentálně máte nastavené nízké poplatky pro transakce. To může způsobovat dlouhé čekání, změnu směnného kurzu, nebo zrušení směny. Doporučujeme nastavit vyšší poplatek.", + "ignor": "Ignorovat", + "use_suggested": "Použít doporučený", + "do_not_share_warning_text" : "Toto nesdílejte s nikým jiným, ani s podporou.\n\nJinak mohou být Vaše prostředky ukradeny!", + "help": "pomoc", + "all_transactions": "Všechny transakce", + "all_trades": "Všechny obchody", + "connection_sync": "Připojení a synch.", + "security_and_backup": "Bezpečnost a zálohy", + "create_backup": "Vytvořit zálohu", + "privacy_settings": "Nastavení soukromí", + "privacy": "Soukromí", + "display_settings": "Nastavení zobrazení", + "other_settings": "Další nastavení", + "require_pin_after": "Vyžadovat PIN po", + "always": "Vždy", + "minutes_to_pin_code": "${minute} minutách", + "disable_exchange": "Zakázat směnárny", + "advanced_privacy_settings": "Pokročilá nastavení soukromí", + "settings_can_be_changed_later": "Tato nastavení mohou být změněna později v nastavení v této aplikaci", + "add_custom_node": "Přidat vlastní uzel", + "disable_fiat": "Zakázat fiat", + "fiat_api": "Fiat API", + "disabled": "Zakázáno", + "enabled": "Povoleno", + "tor_only": "Pouze Tor", + "unmatched_currencies": "Měna vaší současné peněženky neodpovídá té v naskenovaném QR kódu", + "orbot_running_alert": "Prosím ujistěte se, že je Orbot spuštěný, před tím, než se připojíte k tomuto uzlu.", + "contact_list_contacts": "Kontakty", + "contact_list_wallets": "Moje peněženky", + "bitcoin_payments_require_1_confirmation": "U plateb Bitcoinem je vyžadováno alespoň 1 potvrzení, což může trvat 20 minut i déle. Děkujeme za vaši trpělivost! Až bude platba potvrzena, budete informováni e-mailem.", + "send_to_this_address" : "Poslat ${currency} ${tag}na tuto adresu", + "arrive_in_this_address" : "${currency} ${tag}přijde na tuto adresu", + "do_not_send": "Neodesílat", + "error_dialog_content": "Nastala chyba.\n\nProsím odešlete zprávu o chybě naší podpoře, aby mohli zajistit opravu." +} diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 9ba0a7553..6483305a4 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scannen Sie Ihren Fingerabdruck zur Authentifizierung", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Adresse Erkannt", - "openalias_alert_content" : "Sie senden Geld an\n${recipient_name}", + "extracted_address_content" : "Sie senden Geld an\n${recipient_name}", "card_address" : "Adresse:", "buy" : "Kaufen", @@ -678,6 +677,12 @@ "enabled": "Ermöglicht", "tor_only": "Nur Tor", "unmatched_currencies": "Die Währung Ihres aktuellen Wallets stimmt nicht mit der des gescannten QR überein", + "orbot_running_alert": "Bitte stellen Sie sicher, dass Orbot läuft, bevor Sie sich mit diesem Knoten verbinden.", "contact_list_contacts": "Kontakte", - "contact_list_wallets": "Meine Geldbörsen" + "contact_list_wallets": "Meine Geldbörsen", + "bitcoin_payments_require_1_confirmation": "Bitcoin-Zahlungen erfordern 1 Bestätigung, was 20 Minuten oder länger dauern kann. Danke für Ihre Geduld! Sie erhalten eine E-Mail, wenn die Zahlung bestätigt ist.", + "send_to_this_address" : "Senden Sie ${currency} ${tag}an diese Adresse", + "arrive_in_this_address" : "${currency} ${tag}wird an dieser Adresse ankommen", + "do_not_send": "Nicht senden", + "error_dialog_content": "Hoppla, wir haben einen Fehler.\n\nBitte senden Sie den Absturzbericht an unser Support-Team, um die Anwendung zu verbessern." } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index e9a0c4d49..655350304 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scan your fingerprint to authenticate", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Address Detected", - "openalias_alert_content" : "You will be sending funds to\n${recipient_name}", + "extracted_address_content" : "You will be sending funds to\n${recipient_name}", "card_address" : "Address:", "buy" : "Buy", @@ -678,6 +677,12 @@ "enabled": "Enabled", "tor_only": "Tor only", "unmatched_currencies": "Your current wallet's currency does not match that of the scanned QR", + "orbot_running_alert": "Please make sure Orbot is running prior to connecting to this node.", "contact_list_contacts": "Contacts", - "contact_list_wallets": "My Wallets" + "contact_list_wallets": "My Wallets", + "bitcoin_payments_require_1_confirmation": "Bitcoin payments require 1 confirmation, which can take 20 minutes or longer. Thanks for your patience! You will be emailed when the payment is confirmed.", + "send_to_this_address" : "Send ${currency} ${tag}to this address", + "arrive_in_this_address" : "${currency} ${tag}will arrive in this address", + "do_not_send": "Don't send", + "error_dialog_content": "Oops, we got some error.\n\nPlease send the crash report to our support team to make the application better." } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 10c866676..51d4bb0e3 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Escanee su huella digital para autenticar", "version" : "Versión ${currentVersion}", - "openalias_alert_title" : "Destinatario detectado", - "openalias_alert_content" : "Enviará fondos a\n${recipient_name}", + "extracted_address_content" : "Enviará fondos a\n${recipient_name}", "card_address" : "Dirección:", "buy" : "Comprar", @@ -678,6 +677,12 @@ "enabled": "Activado", "tor_only": "solo Tor", "unmatched_currencies": "La moneda de su billetera actual no coincide con la del QR escaneado", + "orbot_running_alert": "Asegúrese de que Orbot se esté ejecutando antes de conectarse a este nodo.", "contact_list_contacts": "Contactos", - "contact_list_wallets": "Mis billeteras" + "contact_list_wallets": "Mis billeteras", + "bitcoin_payments_require_1_confirmation": "Los pagos de Bitcoin requieren 1 confirmación, que puede demorar 20 minutos o más. ¡Gracias por su paciencia! Se le enviará un correo electrónico cuando se confirme el pago.", + "send_to_this_address" : "Enviar ${currency} ${tag}a esta dirección", + "arrive_in_this_address" : "${currency} ${tag}llegará a esta dirección", + "do_not_send": "no enviar", + "error_dialog_content": "Vaya, tenemos un error.\n\nEnvíe el informe de bloqueo a nuestro equipo de soporte para mejorar la aplicación." } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index 99fbcd282..5e412d4f1 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -149,7 +149,7 @@ "subaddresses" : "Sous-adresses", "addresses" : "Adresses", "scan_qr_code" : "Scannez le QR code pour obtenir l'adresse", - "qr_fullscreen" : "Appuyez pour ouvrir le QR code en plein écran", + "qr_fullscreen" : "Appuyez pour ouvrir le QR code en mode plein écran", "rename" : "Renommer", "choose_account" : "Choisir le compte", "create_new_account" : "Créer un nouveau compte", @@ -267,7 +267,7 @@ "new_subaddress_label_name" : "Nom", "new_subaddress_create" : "Créer", - "address_label" : "Étiquette de l'adresse", + "address_label" : "Nom de l'adresse", "subaddress_title" : "Liste des sous-adresses", @@ -396,8 +396,7 @@ "biometric_auth_reason" : "Scannez votre empreinte digitale pour vous authentifier", "version" : "Version ${currentVersion}", - "openalias_alert_title" : "Adresse Détectée", - "openalias_alert_content" : "Vous allez envoyer des fonds à\n${recipient_name}", + "extracted_address_content" : "Vous allez envoyer des fonds à\n${recipient_name}", "card_address" : "Adresse :", "buy" : "Acheter", @@ -676,6 +675,12 @@ "enabled": "Activé", "tor_only": "Tor uniquement", "unmatched_currencies": "La devise de votre portefeuille (wallet) actuel ne correspond pas à celle du QR code scanné", + "orbot_running_alert": "Veuillez vous assurer qu'Orbot est en cours d'exécution avant de vous connecter à ce nœud.", "contact_list_contacts": "Contacts", - "contact_list_wallets": "Mes portefeuilles (wallets)" + "contact_list_wallets": "Mes portefeuilles (wallets)", + "bitcoin_payments_require_1_confirmation": "Les paiements Bitcoin nécessitent 1 confirmation, ce qui peut prendre 20 minutes ou plus. Merci pour votre patience! Vous serez averti par e-mail lorsque le paiement sera confirmé.", + "send_to_this_address" : "Envoyez ${currency} ${tag}à cette adresse", + "arrive_in_this_address" : "${currency} ${tag}arrivera à cette adresse", + "do_not_send": "N'envoyez pas", + "error_dialog_content": "Oups, nous avons eu une erreur.\n\nVeuillez envoyer le rapport de plantage à notre équipe d'assistance pour améliorer l'application." } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index a5c27ddb4..1a3ddff74 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "प्रमाणित करने के लिए अपने फ़िंगरप्रिंट को स्कैन करें", "version" : "संस्करण ${currentVersion}", - "openalias_alert_title" : "पता मिला", - "openalias_alert_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}", + "extracted_address_content" : "आपको धनराशि भेजी जाएगी\n${recipient_name}", "card_address" : "पता:", "buy" : "खरीदें", @@ -678,6 +677,12 @@ "enabled": "सक्रिय", "tor_only": "Tor केवल", "unmatched_currencies": "आपके वर्तमान वॉलेट की मुद्रा स्कैन किए गए क्यूआर से मेल नहीं खाती" , + "orbot_running_alert": "कृपया सुनिश्चित करें कि इस नोड से कनेक्ट करने से पहले Orbot चल रहा है।", "contact_list_contacts": "संपर्क", - "contact_list_wallets": "मेरा बटुआ" + "contact_list_wallets": "मेरा बटुआ", + "bitcoin_payments_require_1_confirmation": "बिटकॉइन भुगतान के लिए 1 पुष्टिकरण की आवश्यकता होती है, जिसमें 20 मिनट या अधिक समय लग सकता है। आपके धैर्य के लिए धन्यवाद! भुगतान की पुष्टि होने पर आपको ईमेल किया जाएगा।", + "send_to_this_address" : "इस पते पर ${currency} ${tag}भेजें", + "arrive_in_this_address" : "${currency} ${tag}इस पते पर पहुंचेंगे", + "do_not_send": "मत भेजो", + "error_dialog_content": "ओह, हमसे कुछ गड़बड़ी हुई है.\n\nएप्लिकेशन को बेहतर बनाने के लिए कृपया क्रैश रिपोर्ट हमारी सहायता टीम को भेजें।" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index 9aa9f0b4f..c012ca72d 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Skenirajte svoj otisak prsta za autentifikaciju", "version" : "Verzija ${currentVersion}", - "openalias_alert_title" : "Otkrivena je adresa", - "openalias_alert_content" : "Poslat ćete sredstva primatelju\n${recipient_name}", + "extracted_address_content" : "Poslat ćete sredstva primatelju\n${recipient_name}", "card_address" : "Adresa:", "buy" : "Kupi", @@ -678,6 +677,12 @@ "enabled": "Omogućeno", "tor_only": "Samo Tor", "unmatched_currencies": "Valuta vašeg trenutnog novčanika ne odgovara onoj na skeniranom QR-u", + "orbot_running_alert": "Provjerite radi li Orbot prije spajanja na ovaj čvor.", "contact_list_contacts": "Kontakti", - "contact_list_wallets": "Moji novčanici" + "contact_list_wallets": "Moji novčanici", + "bitcoin_payments_require_1_confirmation": "Bitcoin plaćanja zahtijevaju 1 potvrdu, što može potrajati 20 minuta ili dulje. Hvala na Vašem strpljenju! Dobit ćete e-poruku kada plaćanje bude potvrđeno.", + "send_to_this_address" : "Pošaljite ${currency} ${tag}na ovu adresu", + "arrive_in_this_address" : "${currency} ${tag}će stići na ovu adresu", + "do_not_send": "Ne šalji", + "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju." } diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb new file mode 100644 index 000000000..b69f7641b --- /dev/null +++ b/res/values/strings_id.arb @@ -0,0 +1,670 @@ +{ + "welcome" : "Selamat datang di", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "Dompet luar biasa untuk Monero, Bitcoin, Litecoin, dan Haven", + "please_make_selection" : "Silahkan membuat pilihan di bawah ini untuk membuat atau memulihkan dompet Anda.", + "create_new" : "Buat Dompet Baru", + "restore_wallet" : "Pulihkan Dompet", + + "monero_com": "Monero.com Oleh Cake Wallet", + "monero_com_wallet_text": "Dompet luar biasa untuk Monero", + + "haven_app": "Haven Oleh Cake Wallet", + "haven_app_wallet_text": "Dompet luar biasa untuk Haven", + + "accounts" : "Akun", + "edit" : "Edit", + "account" : "Akun", + "add" : "Menambahkan", + + + "address_book" : "Buku Alamat", + "contact" : "Kontak", + "please_select" : "Silakan pilih:", + "cancel" : "Batal", + "ok" : "OK", + "contact_name" : "Nama Kontak", + "reset" : "Reset", + "save" : "Simpan", + "address_remove_contact" : "Hapus kontak", + "address_remove_content" : "Apakah Anda yakin ingin menghapus kontak yang dipilih?", + + "authenticated" : "Terotentikasi", + "authentication" : "Otentikasi", + "failed_authentication" : "Otentikasi gagal. ${state_error}", + + + "wallet_menu" : "Menu", + "Blocks_remaining" : "${status} Blok Tersisa", + "please_try_to_connect_to_another_node" : "Silakan coba untuk terhubung ke node lain", + "xmr_hidden" : "Tersembunyi", + "xmr_available_balance" : "Saldo Tersedia", + "xmr_full_balance" : "Saldo Penuh", + "send" : "Mengirim", + "receive" : "Menerima", + "transactions" : "Transaksi", + "incoming" : "Masuk", + "outgoing" : "Keluar", + "transactions_by_date" : "Transaksi berdasarkan tanggal", + "trades" : "Perdagangan", + "filter_by": "Filter berdasarkan", + "today" : "Hari ini", + "yesterday" : "Kemarin", + "received" : "Diterima", + "sent" : "Dikirim", + "pending" : " (pending)", + "rescan" : "Pindai ulang", + "reconnect" : "Sambungkan kembali", + "wallets" : "Dompet", + "show_seed" : "Tampilkan seed", + "show_keys" : "Tampilkan seed/kunci", + "address_book_menu" : "Buku alamat", + "reconnection" : "Koneksi kembali", + "reconnect_alert_text" : "Apakah Anda yakin ingin menyambungkan kembali?", + + + "exchange" : "Tukar", + "clear" : "Hapus", + "refund_address" : "Alamat pengembalian", + "change_exchange_provider" : "Ganti Penyedia Tukar", + "you_will_send" : "Konversi dari", + "you_will_get" : "Konversi ke", + "amount_is_guaranteed" : "Jumlah penerimaan dijamin", + "amount_is_estimate" : "Jumlah penerimaan diperkirakan", + "powered_by" : "Didukung oleh ${title}", + "error" : "Kesalahan", + "estimated" : "Diperkirakan", + "min_value" : "Min: ${value} ${currency}", + "max_value" : "Max: ${value} ${currency}", + "change_currency" : "Ganti Mata Uang", + "overwrite_amount" : "Timpa jumlah", + "qr_payment_amount" : "QR code ini berisi jumlah pembayaran. Apakah Anda ingin menimpa nilai saat ini?", + + "copy_id" : "Salin ID", + "exchange_result_write_down_trade_id" : "Silakan salin atau tulis ID perdagangan untuk melanjutkan.", + "trade_id" : "ID Perdagangan:", + "copied_to_clipboard" : "Disalin ke Clipboard", + "saved_the_trade_id" : "Saya telah menyimpan ID perdagangan", + "fetching" : "Mengambil", + "id" : "ID: ", + "amount" : "Jumlah: ", + "payment_id" : "ID Pembayaran: ", + "status" : "Status: ", + "offer_expires_in" : "Penawaran kedaluwarsa dalam: ", + "trade_is_powered_by" : "Perdagangan ini didukung oleh ${provider}", + "copy_address" : "Salin Alamat", + "exchange_result_confirm" : "Dengan menekan tombol konfirmasi, Anda akan mengirimkan ${fetchingLabel} ${from} dari dompet Anda yang disebut ${walletName} ke alamat yang ditampilkan di bawah. Anda juga dapat mengirim dari dompet eksternal Anda ke alamat/QR code di bawah.\n\nSilakan tekan konfirmasi untuk melanjutkan atau kembali untuk mengubah jumlah.", + "exchange_result_description" : "Anda harus mengirimkan minimal ${fetchingLabel} ${from} ke alamat yang ditampilkan di halaman berikutnya. Jika Anda mengirimkan jumlah yang lebih rendah dari ${fetchingLabel} ${from} maka uang tersebut mungkin tidak akan diubah dan mungkin tidak akan dikembalikan.", + "exchange_result_write_down_ID" : "*Silakan salin atau tulis ID Anda yang ditampilkan di atas.", + "confirm" : "Konfirmasi", + "confirm_sending" : "Konfirmasi pengiriman", + "commit_transaction_amount_fee" : "Lakukan transaksi\nJumlah: ${amount}\nBiaya: ${fee}", + "sending" : "Mengirim", + "transaction_sent" : "Transaksi terkirim!", + "expired" : "Kedaluwarsa", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "Kirim XMR", + "exchange_new_template" : "Template baru", + + "faq" : "Pertanyaan yang Sering Diajukan", + + + "enter_your_pin" : "Masukkan PIN Anda", + "loading_your_wallet" : "Memuat dompet Anda", + + + "new_wallet" : "Dompet Baru", + "wallet_name" : "Nama Dompet", + "continue_text" : "Lanjutkan", + "choose_wallet_currency" : "Silahkan pilih mata uang dompet:", + + "node_new" : "Node Baru", + "node_address" : "Alamat Node", + "node_port" : "Port Node", + "login" : "Masuk", + "password" : "Kata Sandi", + "nodes" : "Node", + "node_reset_settings_title" : "Atur ulang pengaturan", + "nodes_list_reset_to_default_message" : "Apakah Anda yakin ingin mengatur ulang pengaturan ke default?", + "change_current_node" : "Apakah Anda yakin ingin mengubah node saat ini menjadi ${node}?", + "change" : "Ubah", + "remove_node" : "Hapus node", + "remove_node_message" : "Apakah Anda yakin ingin menghapus node yang dipilih?", + "remove" : "Hapus", + "delete" : "Hapus", + "add_new_node" : "Tambah node baru", + "change_current_node_title" : "Ubah node saat ini", + "node_test" : "Uji", + "node_connection_successful" : "Koneksi berhasil", + "node_connection_failed" : "Koneksi gagal", + "new_node_testing" : "Pengujian node baru", + + + "use" : "Beralih ke ", + "digit_pin" : "-digit PIN", + + "share_address" : "Bagikan alamat", + "receive_amount" : "Jumlah", + "subaddresses" : "Sub-alamat", + "addresses" : "Alamat", + "scan_qr_code" : "Scan kode QR untuk mendapatkan alamat", + "qr_fullscreen" : "Tap untuk membuka layar QR code penuh", + "rename" : "Ganti nama", + "choose_account" : "Pilih akun", + "create_new_account" : "Buat akun baru", + "accounts_subaddresses" : "Akun dan sub-alamat", + + + "restore_restore_wallet" : "Pulihkan Dompet", + "restore_title_from_seed_keys" : "Pulihkan dari seed/kunci", + "restore_description_from_seed_keys" : "Dapatkan kembali dompet Anda dari seed/kunci yang Anda simpan di tempat yang aman", + "restore_next" : "Selanjutnya", + "restore_title_from_backup" : "Pulihkan dari cadangan", + "restore_description_from_backup" : "Anda dapat memulihkan seluruh aplikasi Cake Wallet dari file cadangan Anda", + "restore_seed_keys_restore" : "Pulihkan Seed/Kunci", + "restore_title_from_seed" : "Pulihkan dari seed", + "restore_description_from_seed" : "Pulihkan dompet Anda dari kombinasi kode 25 atau 13 kata", + "restore_title_from_keys" : "Pulihkan dari kunci", + "restore_description_from_keys" : "Pulihkan dompet Anda dari tombol yang dihasilkan yang disimpan dari kunci pribadi Anda", + "restore_wallet_name" : "Nama dompet", + "restore_address" : "Alamat", + "restore_view_key_private" : "Lihat kunci (pribadi)", + "restore_spend_key_private" : "Habiskan kunci (pribadi)", + "restore_recover" : "Pulihkan", + "restore_wallet_restore_description" : "Deskripsi pemulihan dompet", + "restore_new_seed" : "Seed baru", + "restore_active_seed" : "Seed aktif", + "restore_bitcoin_description_from_seed" : "Pulihkan dompet Anda dari kombinasi kode 24 kata", + "restore_bitcoin_description_from_keys" : "Pulihkan dompet Anda dari string WIF yang dihasilkan dari private keys Anda", + "restore_bitcoin_title_from_keys" : "Pulihkan dari WIF", + "restore_from_date_atau_blockheight" : "Silakan masukkan tanggal beberapa hari sebelum Anda membuat dompet ini. Atau jika Anda tahu blockheight, silakan masukkannya sebagai gantinya", + + + "seed_reminder" : "Silakan tulis ini di tempat yang aman jika kamu kehilangan atau menghapus ponselmu", + "seed_title" : "Bibit", + "seed_share" : "Bagikan bibit", + "copy" : "Salin", + + + "seed_language_choose" : "Silakan pilih bahasa bibit:", + "seed_choose" : "Pilih bahasa bibit", + "seed_language_next" : "Selanjutnya", + "seed_language_english" : "Inggris", + "seed_language_chinese" : "Cina", + "seed_language_dutch" : "Belanda", + "seed_language_german" : "Jerman", + "seed_language_japanese" : "Jepang", + "seed_language_portuguese" : "Portugis", + "seed_language_russian" : "Rusia", + "seed_language_spanish" : "Spanyol", + "seed_language_french": "Perancis", + "seed_language_italian": "Italia", + + + "send_title" : "Kirim", + "send_your_wallet" : "Dompetmu", + "send_address" : "Alamat ${cryptoCurrency}", + "send_payment_id" : "ID Pembayaran (opsional)", + "all" : "SEMUA", + "send_error_minimum_value" : "Nilai minimum jumlah adalah 0.01", + "send_error_currency" : "Mata uang hanya dapat berisi angka", + "send_estimated_fee" : "Biaya yang diperkirakan:", + "send_priority" : "Saat ini biaya diatur dengan prioritas ${transactionPriority}.\nPrioritas transaksi dapat diubah pada pengaturan", + "send_creating_transaction" : "Membuat transaksi", + "send_templates" : "Template", + "send_new" : "Baru", + "send_amount" : "Jumlah:", + "send_fee" : "Biaya:", + "send_name" : "Nama", + "send_got_it" : "Sudah paham", + "send_sending" : "Mengirim...", + "send_success" : "${crypto}mu berhasil dikirim", + + + "settings_title" : "Pengaturan", + "settings_nodes" : "Nodes", + "settings_current_node" : "Node saat ini", + "settings_wallets" : "Dompet", + "settings_display_balance" : "Tampilkan saldo", + "settings_currency" : "Mata uang", + "settings_fee_priority" : "Prioritas biaya", + "settings_save_recipient_address" : "Simpan alamat penerima", + "settings_personal" : "Pribadi", + "settings_change_pin" : "Ganti PIN", + "settings_change_language" : "Ganti bahasa", + "settings_allow_biometrical_authentication" : "Izinkan otentikasi biometrik", + "settings_dark_mode" : "Mode gelap", + "settings_transactions" : "Transaksi", + "settings_trades" : "Perdagangan", + "settings_display_on_dashboard_list" : "Tampilkan di daftar dashboard", + "settings_all" : "SEMUA", + "settings_only_trades" : "Hanya perdagangan", + "settings_only_transactions" : "Hanya transaksi", + "settings_none" : "Tidak ada", + "settings_support" : "Dukungan", + "settings_terms_and_conditions" : "Syarat dan Ketentuan", + "pin_is_incorrect" : "PIN salah", + + + "setup_pin" : "Pasang PIN", + "enter_your_pin_again" : "Masukkan PIN Anda lagi", + "setup_successful" : "PIN Anda telah berhasil diatur!", + + "wallet_keys" : "Seed/kunci dompet", + "wallet_seed" : "Seed dompet", + "private_key" : "Kunci privat", + "public_key" : "Kunci publik", + "view_key_private" : "Kunci tampilan (privat)", + "view_key_public" : "Kunci tampilan (publik)", + "spend_key_private" : "Kunci pengeluaran (privat)", + "spend_key_public" : "Kunci pengeluaran (publik)", + "copied_key_to_clipboard" : "Kunci ${key} disalin ke Clipboard", + + "new_subaddress_title" : "Alamat baru", + "new_subaddress_label_name" : "Nama label", + "new_subaddress_create" : "Buat", + + "address_label" : "Label alamat", + + "subaddress_title" : "Daftar sub-alamat", + + "trade_details_title" : "Detail Transaksi", + "trade_details_id" : "ID", + "trade_details_state" : "Status", + "trade_details_fetching" : "Mengambil", + "trade_details_provider" : "Penyedia", + "trade_details_created_at" : "Dibuat pada", + "trade_details_pair" : "Pasangan", + "trade_details_copied" : "${title} disalin ke Clipboard", + + "trade_history_title" : "Riwayat Transaksi", + + + "transaction_details_title" : "Rincian Transaksi", + "transaction_details_transaction_id" : "ID Transaksi", + "transaction_details_date" : "Tanggal", + "transaction_details_height" : "Tinggi", + "transaction_details_amount" : "Jumlah", + "transaction_details_fee" : "Biaya", + "transaction_details_copied" : "${title} disalin ke Clipboard", + "transaction_details_recipient_address" : "Alamat Penerima", + + "wallet_list_title" : "Dompet Monero", + "wallet_list_create_new_wallet" : "Buat Dompet Baru", + "wallet_list_restore_wallet" : "Pulihkan Dompet", + "wallet_list_load_wallet" : "Muat dompet", + "wallet_list_loading_wallet" : "Memuat ${wallet_name} dompet", + "wallet_list_failed_to_load" : "Gagal memuat ${wallet_name} dompet. ${error}", + "wallet_list_removing_wallet" : "Menghapus ${wallet_name} dompet", + "wallet_list_failed_to_remove" : "Gagal menghapus ${wallet_name} dompet. ${error}", + + "widgets_address" : "Alamat", + "widgets_restore_from_blockheight" : "Pulihkan dari tinggi blok", + "widgets_restore_from_date" : "Pulihkan dari tanggal", + "widgets_or" : "atau", + "widgets_seed" : "Biji", + + "router_no_route" : "Tidak ada rute yang ditentukan untuk ${name}", + + + "error_text_account_name" : "Nama akun hanya dapat berisi huruf, angka\ndan harus antara 1 dan 15 karakter panjang", + "error_text_contact_name" : "Nama kontak tidak boleh berisi simbol `, ' \"\ndan harus antara 1 dan 32 karakter panjang", + "error_text_address" : "Alamat dompet harus sesuai dengan tipe\nmata uang kripto", + "error_text_node_address" : "Silakan masukkan alamat iPv4", + "error_text_node_port" : "Port node hanya dapat berisi angka antara 0 dan 65535", + "error_text_payment_id" : "ID pembayaran hanya dapat berisi dari 16 hingga 64 karakter dalam hex", + "error_text_xmr" : "Nilai XMR tidak boleh melebihi saldo yang tersedia.\nJumlah digit pecahan harus kurang atau sama dengan 12", + "error_text_fiat" : "Nilai jumlah tidak boleh melebihi saldo yang tersedia.\nJumlah digit pecahan harus kurang atau sama dengan 2", + "error_text_subaddress_name" : "Nama subalamat tidak boleh berisi simbol `, ' \"\ndan harus antara 1 dan 20 karakter panjang", + "error_text_amount" : "Jumlah hanya dapat berisi angka", + "error_text_wallet_name" : "Nama dompet hanya dapat berisi huruf, angka, _ - simbol\ndan harus antara 1 dan 33 karakter panjang", + "error_text_keys" : "Kunci dompet hanya dapat berisi 64 karakter dalam hex", + "error_text_crypto_currency" : "Jumlah digit pecahan harus kurang atau sama dengan 12", + "error_text_minimal_limit" : "Perdagangan untuk ${provider} tidak dibuat. Jumlah kurang dari minimal: ${min} ${currency}", + "error_text_maximum_limit" : "Perdagangan untuk ${provider} tidak dibuat. Jumlah lebih dari maksimal: ${max} ${currency}", + "error_text_limits_loading_failed" : "Perdagangan untuk ${provider} tidak dibuat. Gagal memuat batas", + "error_text_template" : "Nama template dan alamat tidak boleh berisi simbol ` , ' \"\ndan harus antara 1 dan 106 karakter panjang", + + + "auth_store_ban_timeout" : "ban_timeout", + "auth_store_banned_for" : "Dilarang selama ", + "auth_store_banned_minutes" : "menit", + "auth_store_incorrect_password" : "PIN yang salah", + "wallet_store_monero_wallet" : "Dompet Monero", + "wallet_restoration_store_incorrect_seed_length" : "Panjang seed yang salah", + + + "full_balance" : "Saldo Penuh", + "available_balance" : "Saldo Tersedia", + "hidden_balance" : "Saldo Tersembunyi", + + "sync_status_syncronizing" : "SEDANG SINKRONISASI", + "sync_status_syncronized" : "SUDAH TERSINKRONISASI", + "sync_status_not_connected" : "TIDAK TERHUBUNG", + "sync_status_starting_sync" : "MULAI SINKRONISASI", + "sync_status_failed_connect" : "GAGAL TERHUBUNG", + "sync_status_connecting" : "MENGHUBUNGKAN", + "sync_status_connected" : "TERHUBUNG", + "sync_status_attempting_sync" : "MENCOBA SINKRONISASI", + + "transaction_priority_slow" : "Lambat", + "transaction_priority_regular" : "Normal", + "transaction_priority_medium" : "Sedang", + "transaction_priority_fast" : "Cepat", + "transaction_priority_fastest" : "Tercepat", + + "trade_for_not_created" : "Perdagangan untuk ${title} belum dibuat.", + "trade_not_created" : "Perdagangan belum dibuat", + "trade_id_not_found" : "Perdagangan ${tradeId} dari ${title} tidak ditemukan.", + "trade_not_found" : "Perdagangan tidak ditemukan.", + + "trade_state_pending" : "Menunggu", + "trade_state_confirming" : "Menegkonfirmasi", + "trade_state_trading" : "Berdagang", + "trade_state_traded" : "Telah Berdagang", + "trade_state_complete" : "Selesai", + "trade_state_to_be_created" : "Akan dibuat", + "trade_state_unpaid" : "Belum dibayar", + "trade_state_underpaid" : "Kurang bayar", + "trade_state_paid_unconfirmed" : "Dibayar belum dikonfirmasi", + "trade_state_paid" : "Dibayar", + "trade_state_btc_sent" : "Btc dikirim", + "trade_state_timeout" : "Waktu habis", + "trade_state_created" : "Dibuat", + "trade_state_finished" : "Selesai", + + "change_language" : "Ganti bahasa", + "change_language_to" : "Ganti bahasa ke ${language}?", + + "paste" : "Tempel", + "restore_from_seed_placeholder" : "Silakan masukkan atau tempel seed Anda di sini", + "add_new_word" : "Tambahkan kata baru", + "incorrect_seed" : "Teks yang dimasukkan tidak valid.", + + "biometric_auth_reason" : "Pindai sidik jari Anda untuk mengautentikasi", + "version" : "Versi ${currentVersion}", + + "openalias_alert_title" : "Alamat Terdeteksi", + "openalias_alert_content" : "Anda akan mengirim dana ke\n${recipient_name}", + + "card_address" : "Alamat:", + "buy" : "Beli", + "sell": "Jual", + + "placeholder_transactions" : "Transaksi Anda akan ditampilkan di sini", + "placeholder_contacts" : "Kontak Anda akan ditampilkan di sini", + + "template" : "Template", + "confirm_delete_template" : "Tindakan ini akan menghapus template ini. Apakah Anda ingin melanjutkan?", + "confirm_delete_wallet" : "Tindakan ini akan menghapus dompet ini. Apakah Anda ingin melanjutkan?", + + "picker_description" : "Untuk memilih ChangeNOW atau MorphToken, silakan ubah pasangan perdagangan Anda terlebih dahulu", + + "change_wallet_alert_title" : "Ganti dompet saat ini", + "change_wallet_alert_content" : "Apakah Anda ingin mengganti dompet saat ini ke ${wallet_name}?", + + "creating_new_wallet" : "Membuat dompet baru", + "creating_new_wallet_error" : "Error: ${description}", + + "seed_alert_title" : "Perhatian", + "seed_alert_content" : "Seed adalah satu-satunya cara untuk mengembalikan dompet Anda. Apakah Anda sudah menuliskannya?", + "seed_alert_back" : "Kembali", + "seed_alert_yes" : "Ya, sudah", + + "exchange_sync_alert_content" : "Silakan tunggu sampai dompet Anda tersinkronisasi", + + "pre_seed_title" : "PENTING", + "pre_seed_description" : "Di halaman berikutnya Anda akan melihat serangkaian kata ${words}. Ini adalah seed unik dan pribadi Anda dan itu SATU-SATUNYA cara untuk mengembalikan dompet Anda jika hilang atau rusak. Ini adalah TANGGUNG JAWAB Anda untuk menuliskannya dan menyimpan di tempat yang aman di luar aplikasi Cake Wallet.", + "pre_seed_button_text" : "Saya mengerti. Tampilkan seed saya", + + "xmr_to_error" : "XMR.TO error", + "xmr_to_error_description" : "Jumlah tidak valid. Batas maksimal 8 digit setelah koma", + + "provider_error" : "${provider} error", + + "use_ssl" : "Gunakan SSL", + "trusted" : "Dipercayai", + + "color_theme" : "Tema warna", + "light_theme" : "Terang", + "bright_theme" : "Cerah", + "dark_theme" : "Gelap", + "enter_your_note" : "Masukkan catatan Anda...", + "note_optional" : "Catatan (opsional)", + "note_tap_to_change" : "Catatan (tap untuk mengubah)", + "view_in_block_explorer" : "Lihat di Block Explorer", + "view_transaction_on" : "Lihat Transaksi di ", + "transaction_key" : "Kunci transaksi", + "confirmations" : "Konfirmasi", + "recipient_address" : "Alamat penerima", + + "extra_id" : "ID tambahan:", + "destination_tag" : "Tag tujuan:", + "memo" : "Memo:", + + "backup" : "Cadangan", + "change_password" : "Ubah kata sandi", + "backup_password" : "Kata sandi cadangan", + "write_down_backup_password" : "Silakan menuliskan kata sandi cadangan Anda, yang digunakan untuk impor file cadangan Anda.", + "export_backup" : "Ekspor cadangan", + "save_backup_password" : "Pastikan Anda telah menyimpan kata sandi cadangan Anda. Anda tidak akan dapat mengimpor file cadangan Anda tanpa itu.", + "backup_file" : "File cadangan", + + "edit_backup_password" : "Edit Kata Sandi Cadangan", + "save_backup_password_alert" : "Simpan kata sandi cadangan", + "change_backup_password_alert" : "File cadangan sebelumnya tidak akan tersedia untuk diimpor dengan kata sandi cadangan baru. Kata sandi cadangan baru hanya akan digunakan untuk file cadangan baru. Apakah Anda yakin ingin mengubah kata sandi cadangan?", + + "enter_backup_password" : "Masukkan kata sandi cadangan di sini", + "select_backup_file" : "Pilih file cadangan", + "import" : "Impor", + "please_select_backup_file" : "Silakan pilih file cadangan dan masukkan kata sandi cadangan.", + + "fixed_rate" : "Rate tetap", + "fixed_rate_alert" : "Anda akan dapat memasukkan jumlah penerimaan saat mode rate tetap dicentang. Apakah Anda ingin beralih ke mode rate tetap?", + + "xlm_extra_info" : "Jangan lupa untuk menentukan ID Memo saat mengirim transaksi XLM untuk pertukaran", + "xrp_extra_info" : "Jangan lupa untuk menentukan Tag Tujuan saat mengirim transaksi XRP untuk pertukaran", + + "exchange_incorrect_current_wallet_for_xmr" : "Jika Anda ingin menukar XMR dari saldo Monero Cake Wallet Anda, silakan beralih ke dompet Monero Anda terlebih dahulu.", + "confirmed" : "Dikonfirmasi", + "unconfirmed" : "Tidak dikonfirmasi", + "displayable" : "Dapat ditampilkan", + + "submit_request" : "kirim permintaan", + + "buy_alert_content" : "Saat ini kami hanya mendukung pembelian Bitcoin dan Litecoin. Untuk membeli Bitcoin atau Litecoin, silakan buat atau beralih ke dompet Bitcoin atau Litecoin Anda.", + "sell_alert_content": "Saat ini kami hanya mendukung penjualan Bitcoin. Untuk menjual Bitcoin, silakan buat atau beralih ke dompet Bitcoin Anda.", + + "outdated_electrum_wallet_description" : "Dompet Bitcoin baru yang dibuat di Cake sekarang memiliki biji semai 24 kata. Wajib bagi Anda untuk membuat dompet Bitcoin baru dan mentransfer semua dana Anda ke dompet 24 kata baru, dan berhenti menggunakan dompet dengan biji semai 12 kata. Silakan lakukan ini segera untuk mengamankan dana Anda.", + "understand" : "Saya mengerti", + + "apk_update" : "Pembaruan APK", + + "buy_bitcoin" : "Beli Bitcoin", + "buy_with" : "Beli dengan", + "moonpay_alert_text" : "Nilai jumlah harus lebih atau sama dengan ${minAmount} ${fiatCurrency}", + + "outdated_electrum_wallet_receive_warning": "Jika dompet ini memiliki biji semai 12 kata dan dibuat di Cake, JANGAN deposit Bitcoin ke dalam dompet ini. BTC apapun yang ditransfer ke dompet ini mungkin hilang. Buat dompet 24 kata baru (ketuk menu di pojok kanan atas, pilih Dompet, pilih Buat Dompet Baru, lalu pilih Bitcoin) dan SEGERA pindahkan BTC Anda ke sana. Dompet BTC (24 kata) baru dari Cake aman", + "do_not_show_me": "Jangan tampilkan ini lagi", + + "unspent_coins_title" : "Koin yang tidak terpakai", + "unspent_coins_details_title" : "Rincian koin yang tidak terpakai", + "freeze" : "Freeze", + "frozen" : "Dibekukan", + "coin_control" : "Kontrol koin (opsional)", + + "address_detected" : "Alamat terdeteksi", + "address_from_domain" : "Alamat ini dari ${domain} di Unstoppable Domains", + + "add_receiver" : "Tambahkan penerima lain (opsional)", + + "manage_yats" : "Kelola Yats", + "yat_alert_title" : "Kirim dan terima crypto dengan lebih mudah dengan Yat", + "yat_alert_content" : "Pengguna Cake Wallet sekarang dapat mengirim dan menerima semua mata uang favorit mereka dengan nama pengguna berbasis emoji yang satu-of-a-kind.", + "get_your_yat" : "Dapatkan Yat Anda", + "connect_an_existing_yat" : "Hubungkan Yat yang ada", + "connect_yats": "Hubungkan Yats", + "yat_address" : "Alamat Yat", + "yat" : "Yat", + "address_from_yat" : "Alamat ini berasal dari ${emoji} di Yat", + "yat_error" : "Kesalahan Yat", + "yat_error_content" : "Tidak ada alamat yang terkait dengan Yat ini. Coba Yat lain", + "choose_address" : "\n\nSilakan pilih alamat:", + "yat_popup_title" : "Alamat dompet Anda dapat diubah menjadi emoji.", + "yat_popup_content" : "Anda sekarang dapat mengirim dan menerima crypto di Cake Wallet dengan Yat Anda - nama pengguna berbasis emoji yang pendek. Kelola Yats kapan saja pada layar pengaturan", + "second_intro_title" : "Satu alamat emoji untuk menguasainya semua", + "second_intro_content" : "Yat Anda adalah satu alamat emoji yang unik yang menggantikan semua alamat heksadesimal panjang Anda untuk semua mata uang Anda.", + "third_intro_title" : "Yat bermain baik dengan yang lain", + "third_intro_content" : "Yats hidup di luar Cake Wallet juga. Setiap alamat dompet di dunia dapat diganti dengan Yat!", + "learn_more" : "Pelajari Lebih Lanjut", + "search": "Cari", + "search_language": "Cari bahasa", + "search_currency": "Cari mata uang", + "new_template" : "Template Baru", + "electrum_address_disclaimer": "Kami menghasilkan alamat baru setiap kali Anda menggunakan satu, tetapi alamat sebelumnya tetap berfungsi", + "wallet_name_exists": "Nama dompet sudah ada. Silakan pilih nama yang berbeda atau ganti nama dompet yang lain terlebih dahulu.", + "market_place": "Pasar", + "cake_pay_title": "Kartu Hadiah Cake Pay", + "cake_pay_subtitle": "Beli kartu hadiah dengan harga diskon (hanya USA)", + "cake_pay_web_cards_title": "Kartu Web Cake Pay", + "cake_pay_web_cards_subtitle": "Beli kartu prabayar dan kartu hadiah secara global", + "about_cake_pay": "Cake Pay memungkinkan Anda untuk dengan mudah membeli kartu hadiah dengan aset virtual, yang dapat digunakan segera di lebih dari 150.000 pedagang di Amerika Serikat.", + "cake_pay_account_note": "Daftar hanya dengan alamat email untuk melihat dan membeli kartu. Beberapa di antaranya bahkan tersedia dengan diskon!", + "already_have_account": "Sudah punya akun?", + "create_account": "Buat Akun", + "privacy_policy": "Kebijakan Privasi", + "welcome_to_cakepay": "Selamat Datang di Cake Pay!", + "sign_up": "Daftar", + "forgot_password": "Lupa Kata Sandi", + "reset_password": "Atur Ulang Kata Sandi", + "gift_cards": "Kartu Hadiah", + "setup_your_debit_card": "Pasang kartu debit Anda", + "no_id_required": "Tidak perlu ID. Isi ulang dan belanja di mana saja", + "how_to_use_card": "Bagaimana menggunakan kartu ini", + "purchase_gift_card": "Beli Kartu Hadiah", + "verification": "Verifikasi", + "fill_code": "Silakan isi kode verifikasi yang diterima di email Anda", + "dont_get_code": "Tidak mendapatkan kode?", + "resend_code": "Silakan kirim ulang", + "debit_card": "Kartu Debit", + "cakepay_prepaid_card": "Kartu Debit Prabayar CakePay", + "no_id_needed": "Tidak perlu ID!", + "frequently_asked_questions": "Pertanyaan yang sering diajukan", + "debit_card_terms": "Penyimpanan dan penggunaan nomor kartu pembayaran Anda (dan kredensial yang sesuai dengan nomor kartu pembayaran Anda) dalam dompet digital ini tertakluk pada Syarat dan Ketentuan persetujuan pemegang kartu yang berlaku dengan penerbit kartu pembayaran, seperti yang berlaku dari waktu ke waktu.", + "please_reference_document": "Silakan referensikan dokumen di bawah ini untuk informasi lebih lanjut.", + "cardholder_agreement": "Persetujuan Pemegang Kartu", + "e_sign_consent": "E-Sign Consent", + "agree_and_continue": "Setuju & Lanjutkan", + "email_address": "Alamat Email", + "agree_to": "Dengan membuat akun Anda setuju dengan ", + "and": "dan", + "enter_code": "Masukkan kode", + "congratulations": "Selamat!", + "you_now_have_debit_card": "Anda sekarang memiliki kartu debit", + "min_amount" : "Min: ${value}", + "max_amount" : "Max: ${value}", + "enter_amount": "Masukkan Jumlah", + "billing_address_info": "Jika diminta alamat billing, berikan alamat pengiriman Anda", + "order_physical_card": "Pesan Kartu Fisik", + "add_value": "Tambahkan nilai", + "activate": "Aktifkan", + "get_a": "Dapatkan ", + "digital_and_physical_card": " kartu debit pra-bayar digital dan fisik", + "get_card_note": " yang dapat Anda muat ulang dengan mata uang digital. Tidak perlu informasi tambahan!", + "signup_for_card_accept_terms": "Daftar untuk kartu dan terima syarat dan ketentuan.", + "add_fund_to_card": "Tambahkan dana pra-bayar ke kartu (hingga ${value})", + "use_card_info_two": "Dana dikonversi ke USD ketika disimpan dalam akun pra-bayar, bukan dalam mata uang digital.", + "use_card_info_three": "Gunakan kartu digital secara online atau dengan metode pembayaran tanpa kontak.", + "optionally_order_card": "Opsional memesan kartu fisik.", + "hide_details" : "Sembunyikan Rincian", + "show_details" : "Tampilkan Rincian", + "upto": "hingga ${value}", + "discount": "Hemat ${value}%", + "gift_card_amount": "Jumlah Kartu Hadiah", + "bill_amount": "Jumlah Tagihan", + "you_pay": "Anda Membayar", + "tip": "Tip:", + "custom": "kustom", + "by_cake_pay": "oleh Cake Pay", + "expires": "Kadaluarsa", + "mm": "MM", + "yy": "YY", + "online": "Online", + "offline": "Offline", + "gift_card_number": "Nomor Kartu Hadiah", + "pin_number": "Nomor PIN", + "total_saving": "Total Pembayaran", + "last_30_days": "30 hari terakhir", + "avg_savings": "Rata-rata Pembayaran", + "view_all": "Lihat Semua", + "active_cards": "Kartu Aktif", + "delete_account": "Hapus Akun", + "cards": "Kartu", + "active": "Aktif", + "redeemed": "Ditukar", + "gift_card_balance_note": "Kartu hadiah dengan saldo yang tersisa akan muncul di sini", + "gift_card_redeemed_note": "Kartu hadiah yang sudah Anda tukar akan muncul di sini", + "logout": "Keluar", + "add_tip": "Tambahkan Tip", + "percentageOf": "dari ${amount}", + "is_percentage": "adalah", + "search_category": "Cari kategori", + "mark_as_redeemed": "Tandai sebagai Ditukar", + "more_options": "Opsi Lainnya", + "awaiting_payment_confirmation": "Menunggu Konfirmasi Pembayaran", + "transaction_sent_notice": "Jika layar tidak bergerak setelah 1 menit, periksa block explorer dan email Anda.", + "agree": "Setuju", + "in_store": "Di Toko", + "generating_gift_card": "Membuat Kartu Hadiah", + "payment_was_received": "Pembayaran Anda telah diterima.", + "proceed_after_one_minute": "Jika layar tidak bergerak setelah 1 menit, periksa email Anda.", + "order_id": "ID Pesanan", + "gift_card_is_generated": "Kartu Hadiah telah dibuat", + "open_gift_card": "Buka Kartu Hadiah", + "contact_support": "Hubungi Dukungan", + "gift_cards_unavailable": "Kartu hadiah hanya tersedia untuk dibeli dengan Monero, Bitcoin, dan Litecoin saat ini", + "introducing_cake_pay": "Perkenalkan Cake Pay!", + "cake_pay_learn_more": "Beli dan tukar kartu hadiah secara instan di aplikasi!\nGeser ke kanan untuk informasi lebih lanjut.", + "automatic": "Otomatis", + "fixed_pair_not_supported": "Pasangan tetap ini tidak didukung dengan bursa yang dipilih", + "variable_pair_not_supported": "Pasangan variabel ini tidak didukung dengan bursa yang dipilih", + "none_of_selected_providers_can_exchange": "Tidak ada dari penyedia yang dipilih yang dapat melakukan pertukaran ini", + "choose_one": "Pilih satu", + "choose_from_available_options": "Pilih dari pilihan yang tersedia:", + "custom_redeem_amount": "Jumlah Tukar Kustom", + "add_custom_redemption": "Tambahkan Tukar Kustom", + "remaining": "sisa", + "delete_wallet": "Hapus dompet", + "delete_wallet_confirm_message" : "Apakah Anda yakin ingin menghapus dompet ${wallet_name}?", + "low_fee": "Biaya rendah", + "low_fee_alert": "Anda saat ini menggunakan prioritas biaya jaringan rendah. Ini dapat menyebabkan tunggu yang lama, kurs yang berbeda, atau perdagangan yang dibatalkan. Kami merekomendasikan menetapkan biaya yang lebih tinggi untuk pengalaman yang lebih baik.", + "ignor": "Abaikan", + "use_suggested": "Gunakan yang Disarankan", + "do_not_share_warning_text" : "Jangan berikan ini pada siapapun, termasuk dukungan.\n\nDana Anda bisa dan akan dicuri!", + "help": "bantuan", + "all_transactions": "Semua transaksi", + "all_trades": "Semua perdagangan", + "connection_sync": "Koneksi dan sinkronisasi", + "security_and_backup": "Keamanan dan cadangan", + "create_backup": "Buat cadangan", + "privacy_settings": "Pengaturan privasi", + "privacy": "Privasi", + "display_settings": "Pengaturan tampilan", + "other_settings": "Pengaturan lainnya", + "require_pin_after": "Meminta PIN setelah", + "always": "Selalu", + "minutes_to_pin_code": "${minute} menit", + "disable_exchange": "Nonaktifkan pertukaran", + "advanced_privacy_settings": "Pengaturan Privasi Lanjutan", + "settings_can_be_changed_later": "Pengaturan ini dapat diubah nanti di pengaturan aplikasi", + "add_custom_node": "Tambahkan Node Kustom Baru", + "disable_fiat": "Nonaktifkan fiat", + "fiat_api": "API fiat", + "disabled": "Dinonaktifkan", + "enabled": "Diaktifkan", + "tor_only": "Hanya Tor", + "unmatched_currencies": "Mata uang dompet Anda saat ini tidak cocok dengan yang ditandai QR", + "orbot_running_alert": "Pastikan Orbot sedang berjalan sebelum menghubungkan ke node ini.", + "contact_list_contacts": "Kontak", + "contact_list_wallets": "Dompet Saya" +} diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index e90fc20c2..4048e0866 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scansiona la tua impronta per autenticarti", "version" : "Versione ${currentVersion}", - "openalias_alert_title" : "Indirizzo Rilevato", - "openalias_alert_content" : "Invierai i tuoi fondi a\n${recipient_name}", + "extracted_address_content" : "Invierai i tuoi fondi a\n${recipient_name}", "card_address" : "Indirizzo:", "buy" : "Comprare", @@ -678,6 +677,12 @@ "enabled": "Abilitato", "tor_only": "Solo Tor", "unmatched_currencies": "La valuta del tuo portafoglio attuale non corrisponde a quella del QR scansionato", + "orbot_running_alert": "Assicurati che Orbot sia in esecuzione prima di connetterti a questo nodo.", "contact_list_contacts": "Contatti", - "contact_list_wallets": "I miei portafogli" + "contact_list_wallets": "I miei portafogli", + "bitcoin_payments_require_1_confirmation": "I pagamenti in bitcoin richiedono 1 conferma, che può richiedere 20 minuti o più. Grazie per la vostra pazienza! Riceverai un'e-mail quando il pagamento sarà confermato.", + "send_to_this_address" : "Invia ${currency} ${tag}a questo indirizzo", + "arrive_in_this_address" : "${currency} ${tag}arriverà a questo indirizzo", + "do_not_send": "Non inviare", + "error_dialog_content": "Ups, imamo grešku.\n\nPošaljite izvješće o padu našem timu za podršku kako bismo poboljšali aplikaciju." } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 3c5a5d951..831056785 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "प指紋をスキャンして認証する", "version" : "バージョン ${currentVersion}", - "openalias_alert_title" : "アドレスが検出されました", - "openalias_alert_content" : "に送金します\n${recipient_name}", + "extracted_address_content" : "に送金します\n${recipient_name}", "card_address" : "住所:", "buy" : "購入", @@ -678,6 +677,12 @@ "enabled": "有効", "tor_only": "Torのみ", "unmatched_currencies": "現在のウォレットの通貨がスキャンされたQRの通貨と一致しません", + "orbot_running_alert": "このノードに接続する前に、Orbot が実行されていることを確認してください", "contact_list_contacts": "連絡先", - "contact_list_wallets": "マイウォレット" + "contact_list_wallets": "マイウォレット", + "bitcoin_payments_require_1_confirmation": "ビットコインの支払いには 1 回の確認が必要で、これには 20 分以上かかる場合があります。お待ち頂きまして、ありがとうございます!支払いが確認されると、メールが送信されます。", + "send_to_this_address" : "${currency} ${tag}をこのアドレスに送金", + "arrive_in_this_address" : "${currency} ${tag}はこの住所に到着します", + "do_not_send": "送信しない", + "error_dialog_content": "Spiacenti, abbiamo riscontrato un errore.\n\nSi prega di inviare il rapporto sull'arresto anomalo al nostro team di supporto per migliorare l'applicazione." } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 216a3a143..2c2d564ae 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "지문을 스캔하여 인증", "version" : "버전 ${currentVersion}", - "openalias_alert_title" : "주소 감지됨", - "openalias_alert_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}", + "extracted_address_content" : "당신은에 자금을 보낼 것입니다\n${recipient_name}", "card_address" : "주소:", "buy" : "구입", @@ -678,6 +677,12 @@ "enabled": "사용", "tor_only": "Tor 뿐", "unmatched_currencies": "현재 지갑의 통화가 스캔한 QR의 통화와 일치하지 않습니다.", + "orbot_running_alert": "이 노드에 연결하기 전에 Orbot이 실행 중인지 확인하십시오.", "contact_list_contacts": "콘택트 렌즈", - "contact_list_wallets": "내 지갑" + "contact_list_wallets": "내 지갑", + "bitcoin_payments_require_1_confirmation": "비트코인 결제는 1번의 확인이 필요하며 20분 이상이 소요될 수 있습니다. 기다려 주셔서 감사합니다! 결제가 확인되면 이메일이 전송됩니다.", + "send_to_this_address" : "이 주소로 ${currency} ${tag}송금", + "arrive_in_this_address" : "${currency} ${tag}이(가) 이 주소로 도착합니다", + "do_not_send": "보내지 마세요", + "error_dialog_content": "죄송합니다. 오류가 발생했습니다.\n\n응용 프로그램을 개선하려면 지원 팀에 충돌 보고서를 보내주십시오." } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb new file mode 100644 index 000000000..401f5af3a --- /dev/null +++ b/res/values/strings_my.arb @@ -0,0 +1,688 @@ +{ + "welcome" : "မှကြိုဆိုပါတယ်။", + "cake_wallet" : "Cake ပိုက်ဆံအိတ်", + "first_wallet_text" : "Monero၊ Bitcoin၊ Litecoin နှင့် Haven အတွက် အလွန်ကောင်းမွန်သော ပိုက်ဆံအိတ်", + "please_make_selection" : "သင့်ပိုက်ဆံအိတ်ကို ဖန်တီးရန် သို့မဟုတ် ပြန်လည်ရယူရန် အောက်တွင် ရွေးချယ်မှုတစ်ခု ပြုလုပ်ပါ။", + "create_new" : "Wallet အသစ်ဖန်တီးပါ။", + "restore_wallet" : "ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + + "monero_com" : "Monero.com မှ Cake ပိုက်ဆံအိတ်", + "monero_com_wallet_text" : "Monero အတွက် အမိုက်စား ပိုက်ဆံအိတ်", + + "haven_app" : "ဟေးဗင် ကိတ် ဝေါလက်", + "haven_app_wallet_text" : "ဟေဗင်အတွက် အံ့ဩစရာကောင်းတဲ့ ပိုက်ဆံအုံး", + + "accounts" : "အကောင့်များ", + "edit" : "တည်းဖြတ်ပါ။", + "account" : "အကောင့်", + "add" : "ထည့်ပါ။", + + + "address_book" : "လိပ်စာစာအုပ်", + "contact" : "ဆက်သွယ်ရန်", + "please_select" : "ကျေးဇူးပြု၍ ရွေးချယ်ပါ-", + "cancel" : "မလုပ်တော့", + "ok" : "ရလား", + "contact_name" : "ဆက်သွယ်ရန်အမည်", + "reset" : "ပြန်လည်သတ်မှတ်ပါ။", + "save" : "သိမ်းဆည်းပါ။", + "address_remove_contact" : "အဆက်အသွယ်ကို ဖယ်ရှားပါ။", + "address_remove_content" : "ရွေးချယ်ထားသောအဆက်အသွယ်ကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။", + + + "authenticated" : "အစစ်အမှန်", + "authentication" : "စစ်ဆေးခြင်း", + "failed_authentication" : "အထောက်အထားစိစစ်ခြင်း မအောင်မြင်ပါ။. ${state_error}", + + + "wallet_menu" : "မီနူး", + "Blocks_remaining" : "${status} ဘလောက်များ ကျန်နေပါသည်။", + "please_try_to_connect_to_another_node" : "အခြား node သို့ ချိတ်ဆက်ရန် ကြိုးစားပါ။", + "xmr_hidden" : "ဝှက်ထားသည်။", + "xmr_available_balance" : "လက်ကျန်ငွေ ရရှိနိုင်", + "xmr_full_balance" : "မျှတမှု အပြည့်အစုံ", + "send" : "ပို့ပါ။", + "receive" : "လက်ခံသည်။", + "transactions" : "ငွေပေးငွေယူ", + "incoming" : "ဝင်လာ", + "outgoing" : "အထွက်", + "transactions_by_date" : "ရက်စွဲအလိုက် ငွေလွှဲမှုများ", + "trades" : "ကုန်သွယ်မှုများ", + "filter_by" : "အလိုက် စစ်ထုတ်ပါ။", + "today" : "ဒီနေ့", + "yesterday" : "မနေ့က", + "received" : "ရရှိခဲ့သည်။", + "sent" : "ပို့လိုက်ပါတယ်။", + "pending" : " (ဆိုင်းငံ့)", + "rescan" : "ပြန်စကင်န်လုပ်ပါ။", + "reconnect" : "ပြန်လည်ချိတ်ဆက်ပါ။", + "wallets" : "ပိုက်ဆံအိတ်", + "show_seed" : "မျိုးစေ့ကိုပြပါ။", + "show_keys" : "မျိုးစေ့ /သော့များကို ပြပါ။", + "address_book_menu" : "လိပ်စာစာအုပ်", + "reconnection" : "ပြန်လည်ချိတ်ဆက်မှု", + "reconnect_alert_text" : "ပြန်လည်ချိတ်ဆက်လိုသည်မှာ သေချာပါသလား။ ?", + + + "exchange" : "ချိန်းတယ်။", + "clear" : "ရှင်းလင်းသော", + "refund_address" : "ပြန်အမ်းငွေလိပ်စာ", + "change_exchange_provider" : "အပြန်အလှန် လဲလှယ်ရေး ထောက်ပံ့ပေးသူကို ပြောင်းလဲပါ", + "you_will_send" : "မှပြောင်းပါ။", + "you_will_get" : "သို့ပြောင်းပါ။", + "amount_is_guaranteed" : "ရရှိသည့်ပမာဏကို အာမခံပါသည်။", + "amount_is_estimate" : "ရရှိသည့်ပမာဏသည် ခန့်မှန်းချက်တစ်ခုဖြစ်သည်။", + "powered_by" : "${title} မှ ပံ့ပိုးပေးသည်", + "error" : "အမှား", + "estimated" : "ခန့်မှန်း", + "min_value" : "အနည်းဆုံး- ${value} ${currency}", + "max_value" : "အများဆုံး- ${value} ${currency}", + "change_currency" : "ငွေကြေးကိုပြောင်းပါ။", + "overwrite_amount" : "ပမာဏကို ထပ်ရေးပါ။", + "qr_payment_amount" : "ဤ QR ကုဒ်တွင် ငွေပေးချေမှုပမာဏတစ်ခုပါရှိသည်။ လက်ရှိတန်ဖိုးကို ထပ်ရေးလိုပါသလား။", + + "copy_id" : "ID ကူးယူပါ။", + "exchange_result_write_down_trade_id" : "ရှေ့ဆက်ရန် ကုန်သွယ်မှု ID ကို ကူးယူ သို့မဟုတ် ချရေးပါ။", + "trade_id" : "ကုန်သွယ်မှု ID:", + "copied_to_clipboard" : "ကလစ်ဘုတ်သို့ ကူးယူထားသည်။", + "saved_the_trade_id" : "ကုန်သွယ်မှု ID ကို သိမ်းဆည်းပြီးပါပြီ။", + "fetching" : "ခေါ်ယူခြင်း။", + "id" : "ID:", + "amount" : "ပမာဏ:", + "payment_id" : "ငွေပေးချေမှု ID:", + "status" : "အခြေအနေ:", + "offer_expires_in" : "ကမ်းလှမ်းချက် သက်တမ်းကုန်သည်:", + "trade_is_powered_by" : "ဤကုန်သွယ်မှုကို ${provider} မှ လုပ်ဆောင်သည်", + "copy_address" : "လိပ်စာကို ကူးယူပါ။", + "exchange_result_confirm" : "အတည်ပြုချက်ကို နှိပ်ခြင်းဖြင့်၊ သင်သည် ${fetchingLabel} ${from} ဟုခေါ်သော သင့်ပိုက်ဆံအိတ်မှ ${walletName} ကို အောက်ဖော်ပြပါလိပ်စာသို့ ပေးပို့မည်ဖြစ်ပါသည်။ သို့မဟုတ် သင့်ပြင်ပပိုက်ဆံအိတ်မှ အောက်ပါလိပ်စာ/QR ကုဒ်သို့ ပေးပို့နိုင်ပါသည်။\n\nပမာဏများကို ပြောင်းလဲရန် ဆက်လက်လုပ်ဆောင်ရန် သို့မဟုတ် ပြန်သွားရန် အတည်ပြုချက်ကို နှိပ်ပါ။", + "exchange_result_description" : "သင်သည် အနည်းဆုံး ${fetchingLabel} ${from} ကို နောက်စာမျက်နှာတွင် ပြသထားသည့် လိပ်စာသို့ ပေးပို့ရပါမည်။ ${fetchingLabel} ${from} ထက်နည်းသော ပမာဏကို ပေးပို့ပါက ၎င်းသည် ပြောင်းလဲ၍မရသည့်အပြင် ပြန်အမ်းမည်မဟုတ်ပါ။", + "exchange_result_write_down_ID" : "* ကျေးဇူးပြု၍ အထက်ဖော်ပြပါ သင်၏ ID ကို ကော်ပီ သို့မဟုတ် ရေးမှတ်ပါ။", + "confirm" : "အတည်ပြုပါ။", + "confirm_sending" : "ပေးပို့အတည်ပြုပါ။", + "commit_transaction_amount_fee" : "ငွေလွှဲခြင်း\nပမာဏ- ${amount}\nအခကြေးငွေ- ${fee}", + "sending" : "ပေးပို့ခြင်း။", + "transaction_sent" : "ငွေပေးချေမှု ပို့ပြီးပါပြီ။!", + "expired" : "သက်တမ်းကုန်သွားပြီ", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "XMR ပို့ပါ။", + "exchange_new_template" : "ပုံစံအသစ်", + + "faq" : "အမြဲမေးလေ့ရှိသောမေးခွန်းများ", + + + "enter_your_pin" : "သင်၏ PIN ကိုထည့်ပါ။", + "loading_your_wallet" : "သင့်ပိုက်ဆံအိတ်ကို ဖွင့်နေသည်။", + + + "new_wallet" : "ပိုက်ဆံအိတ်အသစ်", + "wallet_name" : "ပိုက်ဆံအိတ်နာမည", + "continue_text" : "ဆက်လက်", + "choose_wallet_currency" : "ပိုက်ဆံအိတ်ငွေကြေးကို ရွေးပါ-", + + + "node_new" : "နော်ဒီအသစ်", + "node_address" : "နိုဒီ လိပ်စာ", + "node_port" : "နော်ဒီဆိပ်ကမ်း", + "login" : "လော့ဂ်အင်", + "password" : "စကားဝှက်", + "nodes" : "ဆုံမှတ်များ", + "node_reset_settings_title" : "ဆက်တင်များကို ပြန်လည်သတ်မှတ်ပါ။", + "nodes_list_reset_to_default_message" : "ဆက်တင်များကို မူရင်းအတိုင်း ပြန်လည်သတ်မှတ်လိုသည်မှာ သေချာပါသလား။", + "change_current_node" : "လက်ရှိ နှာခေါင်း ကို ${node} သို့ ပြောင်းရန် သေချာပါသလား။", + "change" : "ပြောင်းလဲပါ။", + "remove_node" : "နှာခေါင်း ကို ဖယ်ရှားပါ။", + "remove_node_message" : "ရွေးချယ်ထားသော ကုဒ်ကို ဖယ်ရှားလိုသည်မှာ သေချာပါသလား။", + "remove" : "ဖယ်ရှားပါ။", + "delete" : "ဖျက်ပါ။", + "add_new_node" : "နှာခေါင်း အသစ်ထည့်ပါ။", + "change_current_node_title" : "လက်ရှိ နှာခေါင်း ကိုပြောင်းပါ။", + "node_test" : "စမ်း", + "node_connection_successful" : "ချိတ်ဆက်မှု အောင်မြင်ခဲ့သည်။", + "node_connection_failed" : "ချိတ်ဆက်မှု မအောင်မြင်ပါ။", + "new_node_testing" : "နှာခေါင်း အသစ်စမ်းသပ်ခြင်း။", + + + "use" : "သို့ပြောင်းပါ။", + "digit_pin" : "-ဂဏန်း PIN", + + + "share_address" : "လိပ်စာမျှဝေပါ။", + "receive_amount" : "ပမာဏ", + "subaddresses" : "လိပ်စာများ", + "addresses" : "လိပ်စာများ", + "scan_qr_code" : "လိပ်စာရယူရန် QR ကုဒ်ကို စကင်န်ဖတ်ပါ။", + "qr_fullscreen" : "မျက်နှာပြင်အပြည့် QR ကုဒ်ကိုဖွင့်ရန် တို့ပါ။", + "rename" : "အမည်ပြောင်းပါ။", + "choose_account" : "အကောင့်ကို ရွေးပါ။", + "create_new_account" : "အကောင့်အသစ်ဖန်တီးပါ။", + "accounts_subaddresses" : "အကောင့်များနှင့် လိပ်စာများ", + + + "restore_restore_wallet" : "ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + "restore_title_from_seed_keys" : "မျိုးစေ့/သော့များမှ ပြန်လည်ရယူပါ။", + "restore_description_from_seed_keys" : "သင့်ပိုက်ဆံအိတ်ကို လုံခြုံသောနေရာတွင် သိမ်းဆည်းထားသော မျိုးစေ့/သော့များမှ ပြန်လည်ရယူပါ။", + "restore_next" : "နောက်တစ်ခု", + "restore_title_from_backup" : "အရန်သိမ်းခြင်းမှ ပြန်လည်ရယူပါ။", + "restore_description_from_backup" : "သင့်အရန်ဖိုင်မှ Cake Wallet အက်ပ်တစ်ခုလုံးကို သင်ပြန်လည်ရယူနိုင်သည်။", + "restore_seed_keys_restore" : "မျိုးစေ့/သော့များ ပြန်လည်ရယူပါ။", + "restore_title_from_seed" : "မျိုးစေ့မှပြန်လည်ရယူပါ။", + "restore_description_from_seed" : "25 စကားလုံး သို့မဟုတ် 13 စကားလုံးပေါင်းစပ်ကုဒ်မှ သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူပါ။", + "restore_title_from_keys" : "သော့များမှ ပြန်လည်ရယူပါ။", + "restore_description_from_keys" : "သင့်ကိုယ်ပိုင်သော့များမှ သိမ်းဆည်းထားသော ထုတ်ပေးထားသော သော့ချက်များမှ သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူပါ။", + "restore_wallet_name" : "ပိုက်ဆံအိတ်နာမည်", + "restore_address" : "လိပ်စာ", + "restore_view_key_private" : "သော့ကိုကြည့်ရန် (သီးသန့်)", + "restore_spend_key_private" : "သော့သုံးရန် (သီးသန့်)", + "restore_recover" : "ပြန်ယူပါ။", + "restore_wallet_restore_description" : "Wallet ပြန်လည်ရယူသည့် ဖော်ပြချက်", + "restore_new_seed" : "မျိုးစေ့အသစ်", + "restore_active_seed" : "တက်ကြွသောအစေ့", + "restore_bitcoin_description_from_seed" : "24 စကားလုံးပေါင်းစပ်ကုဒ်မှ သင့်ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + "restore_bitcoin_description_from_keys" : "သင့်ကိုယ်ပိုင်သော့များမှ ထုတ်လုပ်ထားသော WIF စာကြောင်းမှ သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူပါ။", + "restore_bitcoin_title_from_keys" : "WIF မှ ပြန်လည်ရယူပါ။", + "restore_from_date_or_blockheight" : "ဤပိုက်ဆံအိတ်ကို သင်မဖန်တီးမီ ရက်အနည်းငယ်အလိုတွင် ရက်စွဲတစ်ခု ထည့်သွင်းပါ။ သို့မဟုတ် ဘလော့ခ်ဟိုက် ကို သိပါက ၎င်းအစား ၎င်းကို ထည့်ပါ။", + + + "seed_reminder" : "ကျေးဇူးပြု၍ သင့်ဖုန်းကို ပျောက်ဆုံးသွားပါက သို့မဟုတ် ဖျက်မိပါက ၎င်းတို့ကို ချရေးပါ။", + "seed_title" : "မျိုးစေ့", + "seed_share" : "မျိုးစေ့မျှဝေပါ။", + "copy" : "ကော်ပီ", + + + "seed_language_choose" : "ကျေးဇူးပြု၍ မျိုးစေ့ဘာသာစကားကို ရွေးပါ-", + "seed_choose" : "မျိုးစေ့ဘာသာစကားကို ရွေးချယ်ပါ။", + "seed_language_next" : "နောက်တစ်ခု", + "seed_language_english" : "အင်္ဂလိပ်စာ", + "seed_language_chinese" : "တရုတ်", + "seed_language_dutch" : "ဒတ်ခ်ျ", + "seed_language_german" : "ဂျာမန်", + "seed_language_japanese" : "ဂျပန်", + "seed_language_portuguese" : "ပေါ်တူဂီ", + "seed_language_russian" : "ရုရှ", + "seed_language_spanish" : "ငပိ", + "seed_language_french" : "ပြင်သစ်", + "seed_language_italian" : "အီတလီ", + + + "send_title" : "ပို့ပါ။", + "send_your_wallet" : "သင့်ပိုက်ဆံအိတ်", + "send_address" : "${cryptoCurrency} လိပ်စာ", + "send_payment_id" : "ငွေပေးချေမှု ID (ချန်လှပ်ထား)", + "all" : "အားလုံး", + "send_error_minimum_value" : "ပမာဏ၏ အနည်းဆုံးတန်ဖိုးမှာ 0.01 ဖြစ်သည်။", + "send_error_currency" : "ငွေကြေးတွင် နံပါတ်များသာ ပါဝင်နိုင်သည်။", + "send_estimated_fee" : "ခန့်မှန်းကြေး-", + "send_priority" : "လောလောဆယ်အခကြေးငွေကို ${transactionPriority} ဦးစားပေးတွင် သတ်မှတ်ထားပါသည်။\nငွေပေးငွေယူဦးစားပေးကို ဆက်တင်များတွင် ချိန်ညှိနိုင်ပါသည်။", + "send_creating_transaction" : "အရောင်းအဝယ်ပြုလုပ်ခြင်း။", + "send_templates" : "ပုံစံများ", + "send_new" : "အသစ်", + "send_amount" : "ပမာဏ-", + "send_fee" : "အခကြေးငွေ-", + "send_name" : "နာမည်", + "send_got_it" : "ရပြီ", + "send_sending" : "ပို့နေသည်...", + "send_success" : "သင်၏ ${crypto} ကို အောင်မြင်စွာ ပို့လိုက်ပါပြီ။", + + + "settings_title" : "ဆက်တင်များ", + "settings_nodes" : "ဆုံမှတ်များ", + "settings_current_node" : "လက်ရှိ node", + "settings_wallets" : "ပိုက်ဆံအိတ်", + "settings_display_balance" : "ပြသချိန်ခွင်", + "settings_currency" : "ငွေကြေး", + "settings_fee_priority" : "အခကြေးငွေဦးစားပေး", + "settings_save_recipient_address" : "လက်ခံသူလိပ်စာကို သိမ်းဆည်းပါ။", + "settings_personal" : "ပုဂ္ဂိုလ်ရေး", + "settings_change_pin" : "ပင်နံပါတ်ပြောင်းပါ။", + "settings_change_language" : "ဘာသာစကားပြောင်းပါ။", + "settings_allow_biometrical_authentication" : "ဇီဝဗေဒဆိုင်ရာ အထောက်အထားစိစစ်ခြင်းကို ခွင့်ပြုပါ။", + "settings_dark_mode" : "အမှောင်မုဒ်", + "settings_transactions" : "ငွေပေးငွေယူ", + "settings_trades" : "ကုန်သွယ်မှုများ", + "settings_display_on_dashboard_list" : "ဒက်ရှ်ဘုတ်စာရင်းတွင် ပြသပါ။", + "settings_all" : "အားလုံး", + "settings_only_trades" : "အရောင်းအဝယ်တွေချည်းပဲ။", + "settings_only_transactions" : "အရောင်းအဝယ်များသာ", + "settings_none" : "တစ်ခုမှ", + "settings_support" : "အထောက်အပံ့", + "settings_terms_and_conditions" : "စည်းကမ်းနှင့်သတ်မှတ်ချက်များ", + "pin_is_incorrect" : "ပင်နံပါတ် မမှန်ပါ။", + + + "setup_pin" : "ပင်နံပါတ်ကို စနစ်ထည့်သွင်းပါ။", + "enter_your_pin_again" : "သင့်ပင်နံပါတ်ကို ထပ်မံထည့်သွင်းပါ။", + "setup_successful" : "သင့်ပင်နံပါတ်ကို အောင်မြင်စွာ သတ်မှတ်ပြီးပါပြီ။", + + + "wallet_keys" : "ပိုက်ဆံအိတ် အစေ့/သော့များ", + "wallet_seed" : "ပိုက်ဆံအိတ်စေ့", + "private_key" : "သီးသန့်သော့", + "public_key" : "အများသူငှာသော့", + "view_key_private" : "သော့ကိုကြည့်ရန် (သီးသန့်)", + "view_key_public" : "သော့ကိုကြည့်ရန် (အများပြည်သူ)", + "spend_key_private" : "သော့သုံးရန် (သီးသန့်)", + "spend_key_public" : "သုံးစွဲရန်သော့ (အများပြည်သူ)", + "copied_key_to_clipboard" : "${key} ကို Clipboard သို့ ကူးယူထားသည်။", + + + "new_subaddress_title" : "လိပ်စာအသစ်", + "new_subaddress_label_name" : "အညွှန်းအမည်", + "new_subaddress_create" : "ဖန်တီးပါ။", + + "address_label" : "လိပ်စာတံဆိပ်", + + "subaddress_title" : "လိပ်စာစာရင်း", + + + "trade_details_title" : "ကုန်သွယ်မှုအသေးစိတ်", + "trade_details_id" : "အမှတ်သညာ", + "trade_details_state" : "အဆင့်အတန်း", + "trade_details_fetching" : "ခေါ်ယူခြင်း။", + "trade_details_provider" : "ပံ့ပိုးပေးသူ", + "trade_details_created_at" : "တွင်ဖန်တီးခဲ့သည်။", + "trade_details_pair" : "တွဲ", + "trade_details_copied" : "${title} ကို Clipboard သို့ ကူးယူထားသည်။", + + + "trade_history_title" : "ကုန်သွယ်မှုသမိုင်း", + + + "transaction_details_title" : "ငွေပေးငွေယူအသေးစိတ်", + "transaction_details_transaction_id" : "ငွေပေးငွေယူ ID", + "transaction_details_date" : "ရက်စွဲ", + "transaction_details_height" : "အရပ်အမြင့်", + "transaction_details_amount" : "ပမာဏ", + "transaction_details_fee" : "ကြေး", + "transaction_details_copied" : "${title} ကို Clipboard သို့ ကူးယူထားသည်။", + "transaction_details_recipient_address" : "လက်ခံသူလိပ်စာများ", + + + "wallet_list_title" : "Monero ပိုက်ဆံအိတ်", + "wallet_list_create_new_wallet" : "Wallet အသစ်ဖန်တီးပါ။", + "wallet_list_restore_wallet" : "ပိုက်ဆံအိတ်ကို ပြန်ယူပါ။", + "wallet_list_load_wallet" : "ပိုက်ဆံအိတ်ကို တင်ပါ။", + "wallet_list_loading_wallet" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖွင့်နေသည်။", + "wallet_list_failed_to_load" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖွင့်၍မရပါ။ ${error}", + "wallet_list_removing_wallet" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖယ်ရှားခြင်း။", + "wallet_list_failed_to_remove" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖယ်ရှား၍မရပါ။ ${error}", + + + "widgets_address" : "လိပ်စာ", + "widgets_restore_from_blockheight" : "အမြင့်မှ ပြန်လည်ရယူပါ။", + "widgets_restore_from_date" : "ရက်စွဲမှ ပြန်လည်ရယူပါ။", + "widgets_or" : "သို့မဟုတ်", + "widgets_seed" : "မျိုးစေ့", + + + "router_no_route" : "${name} အတွက် သတ်မှတ်ထားသော လမ်းကြောင်းမရှိပါ", + + + "error_text_account_name" : "အကောင့်အမည်သည် အက္ခရာများ၊ နံပါတ်များသာ ပါဝင်နိုင်သည်\nနှင့် စာလုံးရေ 1 နှင့် 15 ကြားရှိရပါမည်။", + "error_text_contact_name" : "အဆက်အသွယ်အမည်တွင် ` , ' \" သင်္ကေတများ မပါဝင်နိုင်ပါ\nနှင့် စာလုံးအရှည် 1 နှင့် 32 ကြားရှိရမည်", + "error_text_address" : "Wallet လိပ်စာသည် အမျိုးအစား\no cryptocurrency နှင့် ကိုက်ညီရပါမည်။", + "error_text_node_address" : "ကျေးဇူးပြု၍ iPv4 လိပ်စာကို ထည့်ပါ။", + "error_text_node_port" : "နော်ဒီဆိပ်ကမ်း တွင် 0 နှင့် 65535 အကြား နံပါတ်များသာ ပါဝင်နိုင်သည်။", + "error_text_payment_id" : "ငွေပေးချေမှု ID တွင် hex တွင် စာလုံး 16 လုံးမှ 64 လုံးသာ ပါဝင်နိုင်သည်။", + "error_text_xmr" : "XMR တန်ဖိုးသည် ရနိုင်သောလက်ကျန်ကို ကျော်လွန်၍မရပါ။\nအပိုင်းကိန်းဂဏန်းများ သည် 12 နှင့် လျော့နည်းရမည်", + "error_text_fiat" : "ပမာဏ၏တန်ဖိုးသည် ရနိုင်သောလက်ကျန်ကို မကျော်လွန်နိုင်ပါ။\nအပိုင်းကိန်းဂဏန်းအရေအတွက်သည် 2 နှင့် လျော့နည်းရမည်", + "error_text_subaddress_name" : "လိပ်စာခွဲအမည်တွင် ` , ' \" သင်္ကေတများ မပါဝင်နိုင်ပါ\nနှင့် စာလုံးရေ 1 နှင့် 20 ကြားရှိရမည်", + "error_text_amount" : "ပမာဏသည် နံပါတ်များသာ ပါဝင်နိုင်သည်။", + "error_text_wallet_name" : "ပိုက်ဆံအိတ်အမည်တွင် စာလုံးများ၊ နံပါတ်များ၊ _ - သင်္ကေတများသာ ပါဝင်နိုင်သည် \n နှင့် စာလုံးအရှည် 1 နှင့် 33 ကြားရှိရမည်", + "error_text_keys" : "ပိုက်ဆံအိတ်သော့များတွင် hex တွင် 64 လုံးသာပါဝင်နိုင်သည်။", + "error_text_crypto_currency" : "အပိုင်းကိန်းဂဏန်းများ၏ အရေအတွက်\nလျော့နည်းသည် သို့မဟုတ် 12 နှင့် ညီမျှရပါမည်။", + "error_text_minimal_limit" : "${provider} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။ ပမာဏသည် အနည်းငယ်ထက်နည်းသည်- ${min} ${currency}", + "error_text_maximum_limit" : "${provider} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။ ပမာဏသည် အများဆုံးထက် ပိုများသည်- ${max} ${currency}", + "error_text_limits_loading_failed" : "${provider} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။ ကန့်သတ်ချက်များ တင်ခြင်း မအောင်မြင်ပါ။", + "error_text_template" : "နမူနာပုံစံအမည်နှင့် လိပ်စာတွင် ` , ' \" သင်္ကေတများ မပါဝင်နိုင်ပါ\nနှင့် စာလုံးအရှည် 1 နှင့် 106 ကြား ရှိရမည်", + + + "auth_store_ban_timeout" : "အချိန်ကို ပိတ်ပင်ခြင်း", + "auth_store_banned_for" : "ပိတ်ပင်ထားသည်။", + "auth_store_banned_minutes" : " မိနစ်များ", + "auth_store_incorrect_password" : "ပင်နံပါတ် မှားနေသည်။", + "wallet_store_monero_wallet" : "Monero ပိုက်ဆံအိတ်", + "wallet_restoration_store_incorrect_seed_length" : "မျိုးစေ့အရှည် မမှန်ပါ။", + + + "full_balance" : "Balance အပြည့်", + "available_balance" : "လက်ကျန်ငွေ ရရှိနိုင်", + "hidden_balance" : "Hidden Balance", + + + "sync_status_syncronizing" : "ထပ်တူပြုခြင်း။", + "sync_status_syncronized" : "ထပ်တူပြုထားသည်။", + "sync_status_not_connected" : "မချိတ်ဆက်ပါ။", + "sync_status_starting_sync" : "စင့်ခ်လုပ်ခြင်း။", + "sync_status_failed_connect" : "အဆက်အသွယ်ဖြတ်ထားသည်။", + "sync_status_connecting" : "ချိတ်ဆက်ခြင်း။", + "sync_status_connected" : "ချိတ်ဆက်ထားသည်။", + "sync_status_attempting_sync" : "ချိန်ကိုက်ခြင်းကို ကြိုးစားနေသည်။", + + + "transaction_priority_slow" : "နှေးနှေး", + "transaction_priority_regular" : "ပုံမှန်အစည်းအဝေး", + "transaction_priority_medium" : "အလယ်အလတ်", + "transaction_priority_fast" : "မြန်သည်။", + "transaction_priority_fastest" : "အမြန်ဆုံး", + + + "trade_for_not_created" : "${title} အတွက် ကုန်သွယ်မှုကို ဖန်တီးမထားပါ။", + "trade_not_created" : "ကုန်သွယ်မှု မဖန်တီးပါ။", + "trade_id_not_found" : "${title} ၏ ${tradeId} ကုန်သွယ်မှုကို ရှာမတွေ့ပါ။", + "trade_not_found" : "ကုန်သွယ်မှု မတွေ့။", + + + "trade_state_pending" : "ဆိုင်းငံ့ထားသည်။", + "trade_state_confirming" : "အတည်ပြုခြင်း။", + "trade_state_trading" : "ရောင်းဝယ်ရေး", + "trade_state_traded" : "အရောင်းအဝယ်ဖြစ်ခဲ့သည်။", + "trade_state_complete" : "ပြီးအောင်", + "trade_state_to_be_created" : "ဖန်တီးဖို့", + "trade_state_unpaid" : "အခကြေးငွေမယူရသေး", + "trade_state_underpaid" : "ပေးချေမှုနည်းပါးသည်။", + "trade_state_paid_unconfirmed" : "အတည်မပြုနိုင်သေးပါ။", + "trade_state_paid" : "အခကြေးငွေ", + "trade_state_btc_sent" : "Btc ပို့လိုက်ပါတယ်။", + "trade_state_timeout" : "ခဏပွဲရပ်ခြင်း", + "trade_state_created" : "ဖန်တီးခဲ့သည်။", + "trade_state_finished" : "ပြီးပြီ။", + + "change_language" : "ဘာသာစကားပြောင်းပါ။", + "change_language_to" : "ဘာသာစကားကို ${language} သို့ ပြောင်းမလား။", + + "paste" : "ငါးပိ", + "restore_from_seed_placeholder" : "သင့်အစေ့ကို ဤနေရာတွင် ထည့်ပါ သို့မဟုတ် ကူးထည့်ပါ။", + "add_new_word" : "စကားလုံးအသစ်ထည့်ပါ။", + "incorrect_seed" : "ထည့်သွင်းထားသော စာသားသည် မမှန်ကန်ပါ။", + + "biometric_auth_reason" : "စစ်မှန်ကြောင်းအထောက်အထားပြရန် သင့်လက်ဗွေကို စကန်ဖတ်ပါ။", + "version" : "ဗားရှင်း ${currentVersion}", + + "extracted_address_content" : "သင်သည် \n${recipient_name} သို့ ရန်ပုံငွေများ ပေးပို့ပါမည်", + + "card_address" : "လိပ်စာ-", + "buy" : "ဝယ်ပါ။", + "sell" : "ရောင်း", + + "placeholder_transactions" : "သင်၏ ငွေပေးငွေယူများကို ဤနေရာတွင် ပြသပါမည်။", + "placeholder_contacts" : "သင့်အဆက်အသွယ်များကို ဤနေရာတွင် ပြသပါမည်။", + + "template" : "ပုံစံခွက်", + "confirm_delete_template" : "ဤလုပ်ဆောင်ချက်သည် ဤပုံစံပြားကို ဖျက်လိုက်ပါမည်။ ဆက်လုပ်လိုပါသလား။", + "confirm_delete_wallet" : "ဤလုပ်ဆောင်ချက်သည် ဤပိုက်ဆံအိတ်ကို ဖျက်လိုက်ပါမည်။ ဆက်လုပ်လိုပါသလား။", + + "picker_description" : "ChangeNOW သို့မဟုတ် MorphToken ကိုရွေးချယ်ရန်၊ ကျေးဇူးပြု၍ သင်၏ကုန်သွယ်မှုအတွဲကို ဦးစွာပြောင်းလဲပါ။", + + "change_wallet_alert_title" : "လက်ရှိပိုက်ဆံအိတ်ကို ပြောင်းပါ။", + "change_wallet_alert_content" : "လက်ရှိပိုက်ဆံအိတ်ကို ${wallet_name} သို့ ပြောင်းလိုပါသလား။", + + "creating_new_wallet" : "ပိုက်ဆံအိတ်အသစ်ဖန်တီးခြင်း။", + "creating_new_wallet_error" : "အမှား- ${description}", + + "seed_alert_title" : "အာရုံ", + "seed_alert_content" : "မျိုးစေ့သည် သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ရေးပြီးပြီလား။", + "seed_alert_back" : "ပြန်သွားသည်", + "seed_alert_yes" : "ဟုတ်ကဲ့၊", + + "exchange_sync_alert_content" : "သင့်ပိုက်ဆံအိတ်ကို စင့်ခ်လုပ်ထားသည့်အချိန်အထိ စောင့်ပါ။", + + "pre_seed_title" : "အရေးကြီးသည်။", + "pre_seed_description" : "နောက်စာမျက်နှာတွင် ${words} စကားလုံးများ အတွဲလိုက်ကို တွေ့ရပါမည်။ ၎င်းသည် သင်၏ထူးခြားပြီး သီးသန့်မျိုးစေ့ဖြစ်ပြီး ပျောက်ဆုံးခြင်း သို့မဟုတ် ချွတ်ယွင်းမှုရှိပါက သင့်ပိုက်ဆံအိတ်ကို ပြန်လည်ရယူရန် တစ်ခုတည်းသောနည်းလမ်းဖြစ်သည်။ ၎င်းကို Cake Wallet အက်ပ်၏အပြင်ဘက်တွင် လုံခြုံသောနေရာတွင် သိမ်းဆည်းရန်မှာ သင်၏တာဝန်ဖြစ်သည်။", + "pre_seed_button_text" : "ကျွန်တော်နားလည်ပါတယ်။ ငါ့အမျိုးအနွယ်ကို ပြလော့", + + "xmr_to_error" : "XMR.TO အမှား", + "xmr_to_error_description" : "ပမာဏ မမှန်ပါ။ ဒဿမအမှတ်ပြီးနောက် ဂဏန်း ၈ လုံးတွင် အများဆုံးကန့်သတ်ချက်", + + "provider_error" : "${provider} အမှား", + + "use_ssl" : "SSL ကိုသုံးပါ။", + "trusted" : "ယုံတယ်။", + + "color_theme" : "အရောင်အပြင်အဆင်", + "light_theme" : "အလင်း", + "bright_theme" : "တောက်ပ", + "dark_theme" : "မှောငျမိုကျသော", + "enter_your_note" : "သင့်မှတ်စုကို ထည့်ပါ...", + "note_optional" : "မှတ်ချက် (ချန်လှပ်ထားနိုင်သည်)", + "note_tap_to_change" : "မှတ်ချက် (ပြောင်းလဲရန် တို့ပါ)", + "view_in_block_explorer" : "Block Explorer တွင်ကြည့်ရှုပါ။", + "view_transaction_on" : "ငွေလွှဲခြင်းကို ဖွင့်ကြည့်ပါ။", + "transaction_key" : "ငွေသွင်းငွေထုတ်ကီး", + "confirmations" : "အတည်ပြုချက်များ", + "recipient_address" : "လက်ခံသူလိပ်စာ", + + "extra_id" : "အပို ID-", + "destination_tag" : "ခရီးဆုံးအမှတ်-", + "memo" : "မှတ်စုတို:", + + "backup" : "မိတ္တူ", + "change_password" : "စကားဝှက်ကိုပြောင်းရန်", + "backup_password" : "စကားဝှက်ကို အရန်သိမ်းဆည်းပါ။", + "write_down_backup_password" : "သင်၏ အရန်ဖိုင်များကို တင်သွင်းရန်အတွက် အသုံးပြုသည့် သင်၏ အရန်စကားဝှက်ကို ချရေးပါ။", + "export_backup" : "အရန်ကူးထုတ်ရန်", + "save_backup_password" : "သင်၏ အရန်စကားဝှက်ကို သိမ်းဆည်းထားကြောင်း သေချာပါစေ။ ၎င်းမပါဘဲ သင်၏ အရန်ဖိုင်များကို တင်သွင်းနိုင်မည် မဟုတ်ပါ။", + "backup_file" : "အရန်ဖိုင်", + + "edit_backup_password" : "Backup Password ကို တည်းဖြတ်ပါ။", + "save_backup_password_alert" : "အရန်စကားဝှက်ကို သိမ်းဆည်းပါ။", + "change_backup_password_alert" : "အရန်စကားဝှက်အသစ်ဖြင့် သင်၏ယခင်မိတ္တူဖိုင်များကို တင်သွင်းရန် မရနိုင်ပါ။ အရန်စကားဝှက်အသစ်ကို အရန်ဖိုင်အသစ်အတွက်သာ အသုံးပြုပါမည်။ အရန်စကားဝှက်ကို ပြောင်းလိုသည်မှာ သေချာပါသလား။", + + "enter_backup_password" : "အရန်စကားဝှက်ကို ဤနေရာတွင် ထည့်ပါ။", + "select_backup_file" : "အရန်ဖိုင်ကို ရွေးပါ။", + "import" : "သွင်းကုန်", + "please_select_backup_file" : "အရန်ဖိုင်ကို ရွေးပြီး အရန်စကားဝှက်ကို ထည့်ပါ။", + + "fixed_rate" : "ပုံသေနှုန်း", + "fixed_rate_alert" : "ပုံသေနှုန်းထားမုဒ်ကို စစ်ဆေးသည့်အခါ လက်ခံပမာဏကို ထည့်သွင်းနိုင်မည်ဖြစ်သည်။ ပုံသေနှုန်းမုဒ်သို့ ပြောင်းလိုပါသလား။", + + "xlm_extra_info" : "လဲလှယ်မှုအတွက် XLM ငွေလွှဲပို့နေစဉ် Memo ID ကို သတ်မှတ်ရန် မမေ့ပါနှင့်", + "xrp_extra_info" : "လဲလှယ်မှုအတွက် XRP ငွေလွှဲပို့နေစဉ် Destination Tag ကို သတ်မှတ်ရန် မမေ့ပါနှင့်", + + "exchange_incorrect_current_wallet_for_xmr" : "သင်၏ Cake Wallet Monero လက်ကျန်မှ XMR ကိုလဲလှယ်လိုပါက၊ သင်၏ Monero ပိုက်ဆံအိတ်သို့ ဦးစွာပြောင်းပါ။", + "confirmed" : "အတည်ပြုခဲ့သည်။", + "unconfirmed" : "အတည်မပြုနိုင်ပါ။", + "displayable" : "ပြသနိုင်သည်။", + + "submit_request" : "တောင်းဆိုချက်တစ်ခုတင်ပြပါ။", + + "buy_alert_content" : "လောလောဆယ် ကျွန်ုပ်တို့သည် Bitcoin နှင့် Litecoin ဝယ်ယူမှုကိုသာ ပံ့ပိုးပေးပါသည်။ Bitcoin သို့မဟုတ် Litecoin ဝယ်ယူရန်၊ သင်၏ Bitcoin သို့မဟုတ် Litecoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။", + "sell_alert_content" : "ကျွန်ုပ်တို့သည် လက်ရှိတွင် Bitcoin ရောင်းချခြင်းကိုသာ ပံ့ပိုးပေးပါသည်။ Bitcoin ရောင်းချရန်၊ သင်၏ Bitcoin ပိုက်ဆံအိတ်ကို ဖန်တီးပါ သို့မဟုတ် ပြောင်းပါ။", + + "outdated_electrum_wallet_description" : "ယခု Cake တွင်ဖန်တီးထားသော Bitcoin ပိုက်ဆံအိတ်အသစ်တွင် စကားလုံး 24 မျိုးရှိသည်။ Bitcoin ပိုက်ဆံအိတ်အသစ်တစ်ခုကို ဖန်တီးပြီး သင့်ငွေအားလုံးကို 24 စကားလုံးပိုက်ဆံအိတ်အသစ်သို့ လွှဲပြောင်းပြီး 12 စကားလုံးမျိုးစေ့ဖြင့် ပိုက်ဆံအိတ်များကို အသုံးပြုခြင်းကို ရပ်တန့်ရန် မဖြစ်မနေလိုအပ်ပါသည်။ သင့်ရန်ပုံငွေများကို လုံခြုံစေရန်အတွက် ၎င်းကိုချက်ချင်းလုပ်ဆောင်ပါ။", + "understand" : "ကျွန်တော်နားလည်ပါတယ်", + + "apk_update" : "APK အပ်ဒိတ်", + + "buy_bitcoin" : "Bitcoin ကိုဝယ်ပါ။", + "buy_with" : "အတူဝယ်ပါ။", + "moonpay_alert_text" : "ပမာဏ၏တန်ဖိုးသည် ${minAmount} ${fiatCurrency} နှင့် ပိုနေရမည်", + + "outdated_electrum_wallet_receive_warning" : "ဤပိုက်ဆံအိတ်တွင် စာလုံး 12 လုံးပါပြီး ကိတ်မုန့်တွင် ဖန်တီးပါက၊ Bitcoin ကို ဤပိုက်ဆံအိတ်ထဲသို့ မထည့်ပါနှင့်။ ဤပိုက်ဆံအိတ်သို့ လွှဲပြောင်းပေးသည့် မည်သည့် BTC မဆို ဆုံးရှုံးနိုင်သည်။ 24 စကားလုံးပိုက်ဆံအိတ်အသစ်တစ်ခုဖန်တီးပါ (ညာဘက်အပေါ်ထောင့်ရှိမီနူးကိုနှိပ်ပါ၊ Wallets ကိုရွေးချယ်ပါ၊ ပိုက်ဆံအိတ်အသစ်ဖန်တီးရန်ကိုရွေးချယ်ပါ၊ ထို့နောက် Bitcoin ကိုရွေးချယ်ပါ) နှင့်သင်၏ BTC ကိုထိုနေရာသို့ချက်ချင်းရွှေ့ပါ။ Cake မှ (24 စာလုံး) BTC ပိုက်ဆံအိတ်အသစ်များသည် လုံခြုံပါသည်။", + "do_not_show_me" : "ဒါကို ထပ်မပြနဲ့", + + "unspent_coins_title" : "အသုံးမဝင်သော အကြွေစေ့များ", + "unspent_coins_details_title" : "အသုံးမဝင်သော အကြွေစေ့အသေးစိတ်များ", + "freeze" : "အေးခဲ", + "frozen" : "ဖြူဖြူ", + "coin_control" : "အကြွေစေ့ထိန်းချုပ်မှု (ချန်လှပ်ထားနိုင်သည်)", + + "address_detected" : "လိပ်စာကို တွေ့ရှိခဲ့သည်။", + "address_from_domain" : "ဤလိပ်စာသည် Unstoppable Domains ရှိ ${domain} မှဖြစ်သည်။", + + "add_receiver" : "အခြားလက်ခံသူ ထည့်ပါ (ချန်လှပ်ထားနိုင်သည်)", + + "manage_yats" : "Yats ကို စီမံပါ။", + "yat_alert_title" : "Yat ဖြင့် crypto ကိုပိုမိုလွယ်ကူစွာပေးပို့လက်ခံပါ။", + "yat_alert_content" : "Cake Wallet အသုံးပြုသူများသည် တစ်မျိုးတည်းသော အီမိုဂျီအခြေခံအသုံးပြုသူအမည်ဖြင့် ၎င်းတို့၏ စိတ်ကြိုက်ငွေကြေးအားလုံးကို ပေးပို့နိုင်ပါပြီ။", + "get_your_yat" : "မင်းရဲ့ Yat ကိုယူလိုက်ပါ။", + "connect_an_existing_yat" : "ရှိပြီးသား Yat ကို ချိတ်ဆက်ပါ။", + "connect_yats" : "Yats ကိုချိတ်ဆက်ပါ။", + "yat_address" : "Yat လိပ်စာ", + "yat" : "ယတ်", + "address_from_yat" : "ဤလိပ်စာသည် Yat ရှိ ${emoji} မှဖြစ်သည်။", + "yat_error" : "Yat အမှား", + "yat_error_content" : "ဤ Yat နှင့် ချိတ်ဆက်ထားသော လိပ်စာမရှိပါ။ နောက်ထပ် Yat စမ်းကြည့်ပါ။", + "choose_address" : "\n\nလိပ်စာကို ရွေးပါ-", + "yat_popup_title" : "သင့်ပိုက်ဆံအိတ်လိပ်စာကို emojified လုပ်နိုင်ပါသည်။", + "yat_popup_content" : "သင်၏ Yat - တိုတောင်းသော အီမိုဂျီအခြေခံအသုံးပြုသူအမည်ဖြင့် Cake Wallet တွင် crypto ကို ယခု ပေးပို့နိုင်ပါပြီ။ ဆက်တင်စခရင်ပေါ်တွင် Yats ကို အချိန်မရွေး စီမံခန့်ခွဲပါ။", + "second_intro_title" : "၎င်းတို့အားလုံးကို အုပ်ချုပ်ရန် အီမိုဂျီလိပ်စာတစ်ခု", + "second_intro_content" : "သင်၏ Yat သည် သင့်ငွေကြေးအားလုံးအတွက် သင်၏ ရှည်လျားသော ဆဋ္ဌမကိန်းဂဏန်းများအားလုံးကို အစားထိုးသည့် တစ်မူထူးခြားသော အီမိုဂျီလိပ်စာတစ်ခုဖြစ်သည်။", + "third_intro_title" : "Yat သည် အခြားသူများနှင့် ကောင်းစွာကစားသည်။", + "third_intro_content" : "Yats သည် Cake Wallet အပြင်ဘက်တွင် နေထိုင်ပါသည်။ ကမ္ဘာပေါ်ရှိ မည်သည့်ပိုက်ဆံအိတ်လိပ်စာကို Yat ဖြင့် အစားထိုးနိုင်ပါသည်။", + "learn_more" : "ပိုမိုသိရှိရန်", + "search" : "ရှာရန်", + "search_language" : "ဘာသာစကားရှာပါ။", + "search_currency" : "ငွေကြေးကိုရှာပါ။", + "new_template" : "ပုံစံအသစ်", + "electrum_address_disclaimer" : "သင်အသုံးပြုသည့်အချိန်တိုင်းတွင် ကျွန်ုပ်တို့သည် လိပ်စာအသစ်များကို ထုတ်ပေးသော်လည်း ယခင်လိပ်စာများသည် ဆက်လက်အလုပ်လုပ်နေပါသည်။", + "wallet_name_exists" : "ထိုအမည်ဖြင့် ပိုက်ဆံအိတ်တစ်ခု ရှိနှင့်ပြီးဖြစ်သည်။ အခြားအမည်တစ်ခုကို ရွေးပါ သို့မဟုတ် အခြားပိုက်ဆံအိတ်ကို ဦးစွာ အမည်ပြောင်းပါ။", + "market_place" : "ဈေး", + "cake_pay_title" : "ကိတ်မုန့်လက်ဆောင်ကတ်များ", + "cake_pay_subtitle" : "လျှော့စျေးလက်ဆောင်ကတ်များဝယ်ပါ (USA သာ)", + "cake_pay_web_cards_title" : "Cake Pay ဝဘ်ကတ်များ", + "cake_pay_web_cards_subtitle" : "ကမ္ဘာတစ်ဝှမ်း ကြိုတင်ငွေပေးကတ်များနှင့် လက်ဆောင်ကတ်များကို ဝယ်ယူပါ။", + "about_cake_pay" : "Cake Pay သည် အမေရိကန်ပြည်ထောင်စုရှိ ကုန်သည် 150,000 ကျော်တွင် လက်ဆောင်ကတ်များကို လက်ဆောင်ကတ်များကို အလွယ်တကူ ဝယ်ယူနိုင်စေပါသည်။", + "cake_pay_account_note" : "ကတ်များကြည့်ရှုဝယ်ယူရန် အီးမေးလ်လိပ်စာတစ်ခုဖြင့် စာရင်းသွင်းပါ။ အချို့ကို လျှော့ဈေးဖြင့်ပင် ရနိုင်သည်။", + "already_have_account" : "အကောင့်ရှိပြီးသားလား?", + "create_account" : "အကောင့်ပြုလုပ်ပါ", + "privacy_policy" : "ကိုယ်ရေးအချက်အလက်မူဝါဒ", + "welcome_to_cakepay" : "Cake Pay မှကြိုဆိုပါသည်။", + "sign_up" : "ဆိုင်းအပ်", + "forgot_password" : "စကားဝှက်မေ့နေပါသလား", + "reset_password" : "လျှို့ဝှတ်နံပါတ်အားမူလအတိုင်းပြန်လုပ်သည်", + "gift_cards" : "လက်ဆောင်ကဒ်ပြား", + "setup_your_debit_card" : "သင့်ဒက်ဘစ်ကတ်ကို စနစ်ထည့်သွင်းပါ။", + "no_id_required" : "ID မလိုအပ်ပါ။ ငွေဖြည့်ပြီး ဘယ်နေရာမဆို သုံးစွဲပါ။", + "how_to_use_card" : "ဒီကတ်ကို ဘယ်လိုသုံးမလဲ။", + "purchase_gift_card" : "လက်ဆောင်ကတ်ဝယ်ပါ။", + "verification" : "စိစစ်ခြင်း။", + "fill_code" : "သင့်အီးမေးလ်သို့ ပေးထားသည့် အတည်ပြုကုဒ်ကို ဖြည့်ပါ။", + "dont_get_code" : "ကုဒ်ကို မရဘူးလား?", + "resend_code" : "ကျေးဇူးပြု၍ ပြန်ပို့ပါ။", + "debit_card" : "ဒက်ဘစ်ကတ်", + "cakepay_prepaid_card" : "CakePay ကြိုတင်ငွေဖြည့်ဒက်ဘစ်ကတ်", + "no_id_needed" : "ID မလိုအပ်ပါ။", + "frequently_asked_questions" : "မေးလေ့ရှိသောမေးခွန်းများ", + "debit_card_terms" : "ဤဒစ်ဂျစ်တယ်ပိုက်ဆံအိတ်ရှိ သင့်ငွေပေးချေမှုကတ်နံပါတ် (နှင့် သင့်ငွေပေးချေကတ်နံပါတ်နှင့် သက်ဆိုင်သောအထောက်အထားများ) ၏ သိုလှောင်မှုနှင့် အသုံးပြုမှုသည် အချိန်အခါနှင့်အမျှ သက်ရောက်မှုရှိသကဲ့သို့ ကတ်ကိုင်ဆောင်ထားသူ၏ သဘောတူညီချက်၏ စည်းကမ်းသတ်မှတ်ချက်များနှင့် ကိုက်ညီပါသည်။", + "please_reference_document" : "နောက်ထပ်အချက်အလက်များအတွက် အောက်ပါစာရွက်စာတမ်းများကို ကိုးကားပါ။", + "cardholder_agreement" : "ကတ်ကိုင်ဆောင်သူ သဘောတူညီချက်", + "e_sign_consent" : "E-Sign သဘောတူညီချက်", + "agree_and_continue" : "သဘောတူပြီး ရှေ့ဆက်ပါ။", + "email_address" : "အီးမေးလ်လိပ်စာ", + "agree_to" : "အကောင့်ဖန်တီးခြင်းဖြင့် သင်သည် ဤအရာကို သဘောတူပါသည်။", + "and" : "နှင့်", + "enter_code" : "ကုဒ်ထည့်ပါ။", + "congratulations" : "ဂုဏ်ယူပါသည်။", + "you_now_have_debit_card" : "ယခု သင့်တွင် ဒက်ဘစ်ကတ်တစ်ခုရှိသည်။", + "min_amount" : "အနည်းဆုံး- ${value}", + "max_amount" : "အများဆုံး- ${value}", + "enter_amount" : "ပမာဏကို ထည့်ပါ။", + "billing_address_info" : "ငွေပေးချေရမည့်လိပ်စာကို တောင်းဆိုပါက သင့်ပို့ဆောင်ရေးလိပ်စာကို ပေးပါ။", + "order_physical_card" : "ရုပ်ပိုင်းဆိုင်ရာကတ်ကို မှာယူပါ။", + "add_value" : "တန်ဖိုးထည့်ပါ။", + "activate" : "အသက်သွင်းပါ။", + "get_a" : "တစ်ခုရယူပါ။", + "digital_and_physical_card" : " ဒစ်ဂျစ်တယ်နှင့် ရုပ်ပိုင်းဆိုင်ရာ ကြိုတင်ငွေပေးချေသော ဒက်ဘစ်ကတ်", + "get_card_note" : " ဒစ်ဂျစ်တယ်ငွေကြေးများဖြင့် ပြန်လည်စတင်နိုင်သည်။ နောက်ထပ် အချက်အလက် မလိုအပ်ပါ။", + "signup_for_card_accept_terms" : "ကတ်အတွက် စာရင်းသွင်းပြီး စည်းကမ်းချက်များကို လက်ခံပါ။", + "add_fund_to_card" : "ကတ်များသို့ ကြိုတင်ငွေပေးငွေများ ထည့်ပါ (${value} အထိ)", + "use_card_info_two" : "ဒစ်ဂျစ်တယ်ငွေကြေးများဖြင့်မဟုတ်ဘဲ ကြိုတင်ငွေပေးချေသည့်အကောင့်တွင် သိမ်းထားသည့်အခါ ရန်ပုံငွေများကို USD သို့ ပြောင်းလဲပါသည်။", + "use_card_info_three" : "ဒစ်ဂျစ်တယ်ကတ်ကို အွန်လိုင်း သို့မဟုတ် ထိတွေ့မှုမဲ့ ငွေပေးချေမှုနည်းလမ်းများဖြင့် အသုံးပြုပါ။", + "optionally_order_card" : "ရုပ်ပိုင်းဆိုင်ရာကတ်ကို ရွေးချယ်နိုင်သည် ။", + "hide_details" : "အသေးစိတ်ကို ဝှက်ပါ။", + "show_details" : "အသေးစိတ်ပြ", + "upto" : "${value} အထိ", + "discount" : "${value}% ချွေတာ", + "gift_card_amount" : "လက်ဆောင်ကတ် ပမာဏ", + "bill_amount" : "ဘီလ်ပမာဏ", + "you_pay" : "သင်ပေးချေပါ။", + "tip" : "အကြံပြုချက်-", + "custom" : "စိတ်ကြိုက်", + "by_cake_pay" : "Cake Pay ဖြင့်", + "expires" : "သက်တမ်းကုန်သည်။", + "mm": "MM", + "yy": "YY", + "online" : "အွန်လိုင်း", + "offline" : "အော့ဖ်လိုင်း", + "gift_card_number" : "လက်ဆောင်ကတ်နံပါတ်", + "pin_number" : "လျှို့ဝှက်နံပါတ်", + "total_saving" : "စုစုပေါင်းစုဆောင်းငွေ", + "last_30_days" : "လွန်ခဲ့သော ရက် 30", + "avg_savings" : "ပျမ်းမျှ စုဆောင်းငွေ", + "view_all" : "အားလုံးကိုကြည့်ရှုပါ။", + "active_cards" : "အသက်ဝင်သောကတ်များ", + "delete_account" : "အကောင့်ဖျက်ပါ။", + "cards" : "ကတ်များ", + "active" : "အသက်ဝင်သည်။", + "redeemed" : "ရွေးနှုတ်ခဲ့သည်။", + "gift_card_balance_note" : "လက်ကျန်လက်ကျန်ရှိသည့် လက်ဆောင်ကတ်များ ဤနေရာတွင် ပေါ်လာပါမည်။", + "gift_card_redeemed_note" : "သင်ရွေးယူထားသော လက်ဆောင်ကတ်များ ဤနေရာတွင် ပေါ်လာပါမည်။", + "logout" : "ထွက်လိုက်ပါ။", + "add_tip" : "အကြံပြုချက်ထည့်ပါ။", + "percentageOf" : "${amount} ၏", + "is_percentage" : "သည်", + "search_category" : "ရှာဖွေမှုအမျိုးအစား", + "mark_as_redeemed" : "ရွေးနှုတ်ခြင်းအဖြစ် အမှတ်အသားပြုပါ။", + "more_options" : "နောက်ထပ် ရွေးချယ်စရာများ", + "awaiting_payment_confirmation" : "ငွေပေးချေမှု အတည်ပြုချက်ကို စောင့်မျှော်နေပါသည်။", + "transaction_sent_notice" : "မျက်နှာပြင်သည် ၁ မိနစ်အကြာတွင် ဆက်လက်မလုပ်ဆောင်ပါက၊ ပိတ်ဆို့ရှာဖွေသူနှင့် သင့်အီးမေးလ်ကို စစ်ဆေးပါ။", + "agree" : "သဘောတူသည်။", + "in_store" : "စတိုးတွင်", + "generating_gift_card" : "လက်ဆောင်ကတ်ထုတ်ပေးခြင်း။", + "payment_was_received" : "သင့်ငွေပေးချေမှုကို လက်ခံရရှိခဲ့သည်။", + "proceed_after_one_minute" : "မျက်နှာပြင်သည် ၁ မိနစ်အကြာတွင် ဆက်လက်မလုပ်ဆောင်ပါက သင့်အီးမေးလ်ကို စစ်ဆေးပါ။", + "order_id" : "မှာယူမှု ID", + "gift_card_is_generated" : "Gift Card ထုတ်ပေးပါသည်။", + "open_gift_card" : "Gift Card ကိုဖွင့်ပါ။", + "contact_support" : "ပံ့ပိုးကူညီမှုထံ ဆက်သွယ်ပါ။", + "gift_cards_unavailable" : "လက်ဆောင်ကတ်များကို ယခုအချိန်တွင် Monero၊ Bitcoin နှင့် Litecoin တို့ဖြင့်သာ ဝယ်ယူနိုင်ပါပြီ။", + "introducing_cake_pay" : "Cake Pay ကို မိတ်ဆက်ခြင်း။", + "cake_pay_learn_more" : "အက်ပ်ရှိ လက်ဆောင်ကတ်များကို ချက်ချင်းဝယ်ယူပြီး ကူပွန်ဖြင့် လဲလှယ်ပါ။\nပိုမိုလေ့လာရန် ဘယ်မှညာသို့ ပွတ်ဆွဲပါ။", + "automatic" : "အလိုအလျောက်", + "fixed_pair_not_supported" : "ရွေးချယ်ထားသော ဖလှယ်မှုများဖြင့် ဤပုံသေအတွဲကို ပံ့ပိုးမထားပါ။", + "variable_pair_not_supported" : "ရွေးချယ်ထားသော ဖလှယ်မှုများဖြင့် ဤပြောင်းလဲနိုင်သောအတွဲကို ပံ့ပိုးမထားပါ။", + "none_of_selected_providers_can_exchange" : "ရွေးချယ်ထားသော ဝန်ဆောင်မှုပေးသူများမှ ဤလဲလှယ်မှုကို ပြုလုပ်၍မရပါ။", + "choose_one" : "တစ်ခုရွေးပါ။", + "choose_from_available_options" : "ရနိုင်သောရွေးချယ်မှုများမှ ရွေးပါ-", + "custom_redeem_amount" : "စိတ်ကြိုက်သုံးငွေပမာဏ", + "add_custom_redemption" : "စိတ်ကြိုက်ရွေးယူမှုကို ထည့်ပါ။", + "remaining" : "ကျန်", + "delete_wallet" : "ပိုက်ဆံအိတ်ကို ဖျက်ပါ။", + "delete_wallet_confirm_message" : "${wallet_name} ပိုက်ဆံအိတ်ကို ဖျက်လိုသည်မှာ သေချာပါသလား။", + "low_fee" : "အနိမ့်ကြေး", + "low_fee_alert" : "သင်သည် လက်ရှိတွင် သက်သာသော ကွန်ရက်အခကြေးငွေဦးစားပေးကို အသုံးပြုနေပါသည်။ ၎င်းသည် အကြာကြီးစောင့်ဆိုင်းခြင်း၊ မတူညီသောနှုန်းထားများ သို့မဟုတ် ပယ်ဖျက်ထားသော ကုန်သွယ်မှုများကို ဖြစ်စေနိုင်သည်။ ပိုမိုကောင်းမွန်သော အတွေ့အကြုံအတွက် ပိုမိုမြင့်မားသော အခကြေးငွေ သတ်မှတ်ပေးရန် အကြံပြုအပ်ပါသည်။", + "ignor" : "လျစ်လျူရှုပါ။", + "use_suggested" : "အကြံပြုထားသည်ကို အသုံးပြုပါ။", + "do_not_share_warning_text" : "ပံ့ပိုးကူညီမှုအပါအဝင် ဤအရာများကို အခြားမည်သူနှင့်မျှ မမျှဝေပါနှင့်။\n\nသင့်ငွေများကို ခိုးယူခံရနိုင်သည်!", + "help" : "ကူညီပါ", + "all_transactions" : "အရောင်းအဝယ်အားလုံး", + "all_trades" : "ကုန်သွယ်မှုအားလုံး", + "connection_sync" : "ချိတ်ဆက်မှုနှင့် ထပ်တူပြုခြင်း။", + "security_and_backup" : "လုံခြုံရေးနှင့် မိတ္တူ", + "create_backup" : "အရန်သိမ်းခြင်းကို ဖန်တီးပါ။", + "privacy_settings" : "Privacy settings တွေကို", + "privacy" : "ကိုယ်ရေးကိုယ်တာ", + "display_settings" : "ပြသရန် ဆက်တင်များ", + "other_settings" : "အခြားဆက်တင်များ", + "require_pin_after" : "ပြီးနောက် PIN လိုအပ်ပါသည်။", + "always" : "အမြဲတမ်း", + "minutes_to_pin_code" : "${minute} မိနစ်", + "disable_exchange" : "လဲလှယ်မှုကို ပိတ်ပါ။", + "advanced_privacy_settings" : "အဆင့်မြင့် ကိုယ်ရေးကိုယ်တာ ဆက်တင်များ", + "settings_can_be_changed_later" : "အက်ပ်ဆက်တင်များတွင် ဤဆက်တင်များကို နောက်ပိုင်းတွင် ပြောင်းလဲနိုင်သည်။", + "add_custom_node" : "စိတ်ကြိုက် Node အသစ်ကို ထည့်ပါ။", + "disable_fiat" : "Fiat ကိုပိတ်ပါ။", + "fiat_api" : "Fiat API", + "disabled" : "မသန်စွမ်း", + "enabled" : "ဖွင့်ထားသည်။", + "tor_only" : "Tor သာ", + "unmatched_currencies" : "သင့်လက်ရှိပိုက်ဆံအိတ်၏ငွေကြေးသည် စကင်ဖတ်ထားသော QR နှင့် မကိုက်ညီပါ။", + "orbot_running_alert": "ဤ node သို့မချိတ်ဆက်မီ Orbot အလုပ်လုပ်နေကြောင်း သေချာပါစေ။", + "contact_list_contacts" : "အဆက်အသွယ်များ", + "contact_list_wallets" : "ကျွန်ုပ်၏ ပိုက်ဆံအိတ်များ", + "bitcoin_payments_require_1_confirmation": "Bitcoin ငွေပေးချေမှုများသည် မိနစ် 20 သို့မဟုတ် ထို့ထက်ပိုကြာနိုင်သည် 1 အတည်ပြုချက် လိုအပ်သည်။ မင်းရဲ့စိတ်ရှည်မှုအတွက် ကျေးဇူးတင်ပါတယ်။ ငွေပေးချေမှုကို အတည်ပြုပြီးသောအခါ သင့်ထံ အီးမေးလ်ပို့ပါမည်။", + "send_to_this_address" : "ဤလိပ်စာသို့ ${currency} ${tag}သို့ ပို့ပါ။", + "arrive_in_this_address" : "${currency} ${tag}ဤလိပ်စာသို့ ရောက်ရှိပါမည်။", + "do_not_send": "မပို့ပါနှင့်", + "error_dialog_content": "အိုး၊ ကျွန်ုပ်တို့တွင် အမှားအယွင်းအချို့ရှိသည်။\n\nအပလီကေးရှင်းကို ပိုမိုကောင်းမွန်စေရန်အတွက် ပျက်စီးမှုအစီရင်ခံစာကို ကျွန်ုပ်တို့၏ပံ့ပိုးကူညီရေးအဖွဲ့ထံ ပေးပို့ပါ။" +} diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 9ac0cd1d1..a3a043b75 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Scan uw vingerafdruk om te verifiëren", "version" : "Versie ${currentVersion}", - "openalias_alert_title" : "Adres Gedetecteerd", - "openalias_alert_content" : "U stuurt geld naar\n${recipient_name}", + "extracted_address_content" : "U stuurt geld naar\n${recipient_name}", "card_address" : "Adres:", "buy" : "Kopen", @@ -678,6 +677,12 @@ "enabled": "Ingeschakeld", "tor_only": "Alleen Tor", "unmatched_currencies": "De valuta van uw huidige portemonnee komt niet overeen met die van de gescande QR", + "orbot_running_alert": "Zorg ervoor dat Orbot actief is voordat u verbinding maakt met dit knooppunt.", "contact_list_contacts": "Contacten", - "contact_list_wallets": "Mijn portefeuilles" + "contact_list_wallets": "Mijn portefeuilles", + "bitcoin_payments_require_1_confirmation": "Bitcoin-betalingen vereisen 1 bevestiging, wat 20 minuten of langer kan duren. Dank voor uw geduld! U ontvangt een e-mail wanneer de betaling is bevestigd.", + "send_to_this_address" : "Stuur ${currency} ${tag}naar dit adres", + "arrive_in_this_address" : "${currency} ${tag}komt aan op dit adres", + "do_not_send": "Niet sturen", + "error_dialog_content": "Oeps, er is een fout opgetreden.\n\nStuur het crashrapport naar ons ondersteuningsteam om de applicatie te verbeteren." } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index dd200cc25..3c9b60eaa 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Zeskanuj swój odcisk palca, aby uwierzytelnić", "version" : "Wersja ${currentVersion}", - "openalias_alert_title" : "Wykryto Adres", - "openalias_alert_content" : "Wysyłasz środki na\n${recipient_name}", + "extracted_address_content" : "Wysyłasz środki na\n${recipient_name}", "card_address" : "Adres:", "buy" : "Kup", @@ -678,6 +677,12 @@ "enabled": "Włączone", "tor_only": "Tylko sieć Tor", "unmatched_currencies": "Waluta Twojego obecnego portfela nie zgadza się z waluctą zeskanowanego kodu QR", + "orbot_running_alert": "Upewnij się, że Orbot działa przed połączeniem z tym węzłem.", "contact_list_contacts": "Łączność", - "contact_list_wallets": "Moje portfele" + "contact_list_wallets": "Moje portfele", + "bitcoin_payments_require_1_confirmation": "Płatności Bitcoin wymagają 1 potwierdzenia, co może zająć 20 minut lub dłużej. Dziękuję za cierpliwość! Otrzymasz wiadomość e-mail, gdy płatność zostanie potwierdzona.", + "send_to_this_address" : "Wyślij ${currency} ${tag}na ten adres", + "arrive_in_this_address" : "${currency} ${tag}dotrze na ten adres", + "do_not_send": "Nie wysyłaj", + "error_dialog_content": "Ups, wystąpił błąd.\n\nPrześlij raport o awarii do naszego zespołu wsparcia, aby ulepszyć aplikację." } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 8529aadb8..39cef5f67 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Digitalize sua impressão digital para autenticar", "version" : "Versão ${currentVersion}", - "openalias_alert_title" : "Endereço Detectado", - "openalias_alert_content" : "Você enviará fundos para\n${recipient_name}", + "extracted_address_content" : "Você enviará fundos para\n${recipient_name}", "card_address" : "Endereço:", "buy" : "Comprar", @@ -677,6 +676,12 @@ "enabled": "Habilitado", "tor_only": "Tor apenas", "unmatched_currencies": "A moeda da sua carteira atual não corresponde à do QR digitalizado", + "orbot_running_alert": "Certifique-se de que o Orbot esteja em execução antes de se conectar a este nó.", "contact_list_contacts": "Contatos", - "contact_list_wallets": "minhas carteiras" + "contact_list_wallets": "minhas carteiras", + "bitcoin_payments_require_1_confirmation": "Os pagamentos em Bitcoin exigem 1 confirmação, o que pode levar 20 minutos ou mais. Obrigado pela sua paciência! Você receberá um e-mail quando o pagamento for confirmado.", + "send_to_this_address" : "Envie ${currency} ${tag}para este endereço", + "arrive_in_this_address" : "${currency} ${tag}chegará neste endereço", + "do_not_send": "não envie", + "error_dialog_content": "Ops, houve algum erro.\n\nPor favor, envie o relatório de falha para nossa equipe de suporte para melhorar o aplicativo." } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 1ba5fd85c..50c183f1b 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "Отсканируйте свой отпечаток пальца для аутентификации", "version" : "Версия ${currentVersion}", - "openalias_alert_title" : "Адрес Обнаружен", - "openalias_alert_content" : "Вы будете отправлять средства\n${recipient_name}", + "extracted_address_content" : "Вы будете отправлять средства\n${recipient_name}", "card_address" : "Адрес:", "buy" : "Купить", @@ -678,6 +677,12 @@ "enabled": "Включено", "tor_only": "Только Tor", "unmatched_currencies": "Валюта вашего текущего кошелька не соответствует валюте отсканированного QR-кода.", + "orbot_running_alert": "Перед подключением к этому узлу убедитесь, что Orbot запущен.", "contact_list_contacts": "Контакты", - "contact_list_wallets": "Мои кошельки" + "contact_list_wallets": "Мои кошельки", + "bitcoin_payments_require_1_confirmation": "Биткойн-платежи требуют 1 подтверждения, что может занять 20 минут или дольше. Спасибо тебе за твое терпение! Вы получите электронное письмо, когда платеж будет подтвержден.", + "send_to_this_address" : "Отправить ${currency} ${tag}на этот адрес", + "arrive_in_this_address" : "${currency} ${tag}придет на этот адрес", + "do_not_send": "Не отправлять", + "error_dialog_content": "Ой, у нас какая-то ошибка.\n\nПожалуйста, отправьте отчет о сбое в нашу службу поддержки, чтобы сделать приложение лучше." } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 242a8d110..2ecf1bf75 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -396,8 +396,7 @@ "biometric_auth_reason" : "สแกนลายนิ้วมือของคุณเพื่อยืนยันตัวตน", "version" : "เวอร์ชัน ${currentVersion}", - "openalias_alert_title" : "พบที่อยู่", - "openalias_alert_content" : "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}", + "extracted_address_content" : "คุณกำลังจะส่งเงินไปยัง\n${recipient_name}", "card_address" : "ที่อยู่:", "buy" : "ซื้อ", @@ -676,6 +675,12 @@ "enabled" : "เปิดใช้งาน", "tor_only" : "Tor เท่านั้น", "unmatched_currencies" : "สกุลเงินของกระเป๋าปัจจุบันของคุณไม่ตรงกับของ QR ที่สแกน", + "orbot_running_alert": "โปรดตรวจสอบว่า Orbot กำลังทำงานก่อนที่จะเชื่อมต่อกับโหนดนี้", "contact_list_contacts": "ติดต่อ", - "contact_list_wallets": "กระเป๋าเงินของฉัน" + "contact_list_wallets": "กระเป๋าเงินของฉัน", + "bitcoin_payments_require_1_confirmation": "การชำระเงินด้วย Bitcoin ต้องการการยืนยัน 1 ครั้ง ซึ่งอาจใช้เวลา 20 นาทีหรือนานกว่านั้น ขอบคุณสำหรับความอดทนของคุณ! คุณจะได้รับอีเมลเมื่อการชำระเงินได้รับการยืนยัน", + "send_to_this_address" : "ส่ง ${currency} ${tag}ไปยังที่อยู่นี้", + "arrive_in_this_address" : "${currency} ${tag}จะมาถึงที่อยู่นี้", + "do_not_send": "อย่าส่ง", + "error_dialog_content": "อ๊ะ เราพบข้อผิดพลาดบางอย่าง\n\nโปรดส่งรายงานข้อขัดข้องไปยังทีมสนับสนุนของเราเพื่อปรับปรุงแอปพลิเคชันให้ดียิ่งขึ้น" } diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb new file mode 100644 index 000000000..08dec0649 --- /dev/null +++ b/res/values/strings_tr.arb @@ -0,0 +1,688 @@ +{ + "welcome" : "Hoş Geldiniz", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "Monero, Bitcoin, Litecoin ve Haven için harika cüzdan", + "please_make_selection" : "Cüzdan oluşturmak veya geri döndürmek için aşağıdan seçim yap.", + "create_new" : "Yeni Cüzdan Oluştur", + "restore_wallet" : "Cüzdanı Geri Döndür", + + "monero_com": "Cake Wallet tarafından Monero.com", + "monero_com_wallet_text": "Monero için harika cüzdan", + + "haven_app": "Cake Wallet tarafından Haven", + "haven_app_wallet_text": "Haven için harika cüzdan ", + + "accounts" : "Hesaplar", + "edit" : "Düzenle", + "account" : "Hesap", + "add" : "Ekle", + + + "address_book" : "Adres Defteri", + "contact" : "Rehber", + "please_select" : "Lütfen seçim yap:", + "cancel" : "İptal", + "ok" : "Tamam", + "contact_name" : "Kişi ismi", + "reset" : "Sıfırla", + "save" : "Kaydet", + "address_remove_contact" : "Kişiyi sil", + "address_remove_content" : "Seçili kişiyi silmek istediğinden emin misin?", + + + "authenticated" : "Doğrulandı", + "authentication" : "Doğrulama", + "failed_authentication" : "Doğrulama başarısız oldu. ${state_error}", + + + "wallet_menu" : "Menü", + "Blocks_remaining" : "${status} Blok Kaldı", + "please_try_to_connect_to_another_node" : "Lütfen farklı düğüme bağlanmayı dene", + "xmr_hidden" : "Gizli", + "xmr_available_balance" : "Kullanılabilir Bakiye", + "xmr_full_balance" : "Tüm Bakiye", + "send" : "Para Gönder", + "receive" : "Para Al", + "transactions" : "İşlemler", + "incoming" : "Gelen", + "outgoing" : "Giden", + "transactions_by_date" : "Tarihe göre transferler", + "trades" : "Takaslar", + "filter_by": "Şuna göre filtrele", + "today" : "Bugün", + "yesterday" : "Dün", + "received" : "Alındı", + "sent" : "Gönderildi", + "pending" : " (bekleyen)", + "rescan" : "Yeniden Tara", + "reconnect" : "Yeniden Bağlan", + "wallets" : "Cüzdanlar", + "show_seed" : "Tohumları göster", + "show_keys" : "Tohumları/anahtarları göster", + "address_book_menu" : "Adres defteri", + "reconnection" : "Yeniden bağlantı", + "reconnect_alert_text" : "Yeniden bağlanmak istediğinden emin misin?", + + + "exchange" : "Takas", + "clear" : "Temizle", + "refund_address" : "İade adresi", + "change_exchange_provider" : "Takas sağlayıcısını değiştir", + "you_will_send" : "Biçiminden dönüştür:", + "you_will_get" : "Biçimine dönüştür:", + "amount_is_guaranteed" : "Alacağınız tutar garantilidir", + "amount_is_estimate" : "Alacağınız tutar tahminidir", + "powered_by" : "${title} tarafından desteklenmektedir", + "error" : "Hata", + "estimated" : "Tahmini", + "min_value" : "En az: ${value} ${currency}", + "max_value" : "En fazla: ${value} ${currency}", + "change_currency" : "Para Birimini Değiştir", + "overwrite_amount" : "Miktarın üzerine yaz", + "qr_payment_amount" : "Bu QR kodu ödeme tutarını içeriyor. Geçerli miktarın üzerine yazmak istediğine emin misin?", + + "copy_id" : "ID'yi kopyala", + "exchange_result_write_down_trade_id" : "Devam etmek için lütfen ID'yi kopyala veya bir yere yaz.", + "trade_id" : "Takas ID'si:", + "copied_to_clipboard" : "Panoya Kopyalandı", + "saved_the_trade_id" : "Takas ID'imi kaydettim", + "fetching" : "Getiriliyor", + "id" : "ID: ", + "amount" : "Miktar: ", + "payment_id" : "Ödeme ID'si: ", + "status" : "Durum: ", + "offer_expires_in" : "Teklifin bitmesine kalan: ", + "trade_is_powered_by" : "Bu takas ${provider} tarafından desteklenmektedir", + "copy_address" : "Adresi kopyala", + "exchange_result_confirm" : "Onaylaya basarak, ${fetchingLabel} ${from} miktarında ${walletName} olarak adlandırılan cüzdanından aşağıda gösterilen adrese gönderilecek. Veya harici cüzdanından aşağıdaki adrese / QR koduna gönderebilirsin.\n\nLütfen devam etmek için onayla'ya bas veya tutarı değiştirmek için geri dön.", + "exchange_result_description" : "Lütfen en az ${fetchingLabel} miktarındaki ${from}'yi sonraki sayfada gönsterilen adrese gönder. Eğer ${fetchingLabel} ${from}'den az gönderirsen takas gerçekleşmeyebilir ve size geri iade edilebilir.", + "exchange_result_write_down_ID" : "*Lütfen yukarıda gösterilen ID'ni kopyala veya bir yere yaz.", + "confirm" : "Onayla", + "confirm_sending" : "Göndermeyi onayla", + "commit_transaction_amount_fee" : "Transferi gerçekleştir\nMiktar: ${amount}\nKomisyon: ${fee}", + "sending" : "Gönderiliyor", + "transaction_sent" : "Transfer gönderildi!", + "expired" : "Süresi doldu", + "time" : "${minutes}d ${seconds}s", + "send_xmr" : "XMR gönder", + "exchange_new_template" : "Yeni şablon", + + "faq" : "SSS", + + + "enter_your_pin" : "PIN'ini gir", + "loading_your_wallet" : "Cüzdanın yükleniyor", + + + "new_wallet" : "Yeni Cüzdan", + "wallet_name" : "Cüzdan ismi", + "continue_text" : "Devam et", + "choose_wallet_currency" : "Lütfen cüzdanın para birimini seç:", + + + "node_new" : "Yeni düğüm", + "node_address" : "Düğüm adresi", + "node_port" : "Düğüm port'u", + "login" : "Login", + "password" : "Parola", + "nodes" : "Düğümler", + "node_reset_settings_title" : "Ayarları sıfırla", + "nodes_list_reset_to_default_message" : "Ayarları varsayılana sıfırlamak istediğinizden emin misin?", + "change_current_node" : "Şimdiki düğümü ${node} düğümüne değiştirmek istediğinizden emin misin?", + "change" : "Değiştir", + "remove_node" : "Düğümü kaldır", + "remove_node_message" : "Seçili düğümü kaldırmak istediğinden emin misin?", + "remove" : "Kaldır", + "delete" : "Sil", + "add_new_node" : "Yeni düğüm ekle", + "change_current_node_title" : "Şimdiki düğümü değiştir", + "node_test" : "Test Et", + "node_connection_successful" : "Bağlantı başarılı oldu", + "node_connection_failed" : "Bağlantı başarısız oldu", + "new_node_testing" : "Yeni düğüm test ediliyor", + + + "use" : "Şuna geç: ", + "digit_pin" : " haneli PIN", + + + "share_address" : "Adresi paylaş", + "receive_amount" : "Miktar", + "subaddresses" : "Alt adresler", + "addresses" : "Adresler", + "scan_qr_code" : "Adresi getirmek için QR kodunu tara", + "qr_fullscreen" : "QR kodunu tam ekranda açmak için dokun", + "rename" : "Yeniden adlandır", + "choose_account" : "Hesabı seç", + "create_new_account" : "Yeni hesap oluştur", + "accounts_subaddresses" : "Hesaplar ve alt adresler", + + + "restore_restore_wallet" : "Cüzdanı Geri Döndür", + "restore_title_from_seed_keys" : "Tohumdan/anahtarlardan geri döndür", + "restore_description_from_seed_keys" : "Güvenli bir yere kaydettiğin tohumdan/anahtarlardan cüzdanını geri döndür", + "restore_next" : "İleri", + "restore_title_from_backup" : "Yedekten geri döndür", + "restore_description_from_backup" : "Yedek dosyandan tüm Cake Wallet uygulamasını geri döndürebilirsin", + "restore_seed_keys_restore" : "Tohumu/Anahtarları Geri Döndür", + "restore_title_from_seed" : "Tohumdan geri döndür", + "restore_description_from_seed" : "Cüzdanınızı 25 veya 13 kelimelik kombinasyon kodundan geri döndürün", + "restore_title_from_keys" : "Anahtarlardan geri döndür", + "restore_description_from_keys" : "Cüzdanınızı özel anahtarlarınızdan kaydedilen oluşturulmuş tuş vuruşlarından geri yükleyin", + "restore_wallet_name" : "Cüzdan ismi", + "restore_address" : "Adres", + "restore_view_key_private" : "İzleme anahtarı (Özel)", + "restore_spend_key_private" : "Harcama anahtarı (Özel)", + "restore_recover" : "Geri döndür", + "restore_wallet_restore_description" : "Cüzdan geri döndürme açıklaması", + "restore_new_seed" : "Yeni tohum", + "restore_active_seed" : "Tohumu aktifleştir", + "restore_bitcoin_description_from_seed" : "Cüzdanınızı 24 kelimelik kombinasyon kodundan geri yükle", + "restore_bitcoin_description_from_keys" : "Cüzdanını, oluşturulan WIF dizesinden veya özel anahtarlarından geri yükle", + "restore_bitcoin_title_from_keys" : "WIF'den geri yükle", + "restore_from_date_or_blockheight" : "Lütfen bu cüzdanı oluşturmadan birkaç gün önceki bir tarihi girin. Veya blok yüksekliğini biliyorsan, lütfen bunu gir", + + + "seed_reminder" : "Telefonunu kaybetmen veya silinmesi ihtimaline karşı lütfen bunları not et", + "seed_title" : "Tohum", + "seed_share" : "Tohumu paylaş", + "copy" : "Kopyala", + + + "seed_language_choose" : "Lütfen tohum dilini seç:", + "seed_choose" : "Tohum dilini seçin", + "seed_language_next" : "İleri", + "seed_language_english" : "İngilizce", + "seed_language_chinese" : "Çince", + "seed_language_dutch" : "Flemenkçe", + "seed_language_german" : "Almanca", + "seed_language_japanese" : "Japonca", + "seed_language_portuguese" : "Portekizce", + "seed_language_russian" : "Rusça", + "seed_language_spanish" : "İspanyolca", + "seed_language_french": "Fransızca", + "seed_language_italian": "İtalyanca", + + + "send_title" : "Gönder", + "send_your_wallet" : "Cüzdanın", + "send_address" : "${cryptoCurrency} adresi", + "send_payment_id" : "Ödeme ID'si (isteğe bağlı)", + "all" : "HEPSİ", + "send_error_minimum_value" : "Minimum tutar değeri 0.01'dir", + "send_error_currency" : "Para birimi sadece sayı içerebilir", + "send_estimated_fee" : "Tahmini komisyon:", + "send_priority" : "Şu anda ücret ${transactionPriority} önceliğine ayarlanmıştır.\nİşlem önceliği ayarlardan değiştirilebilir", + "send_creating_transaction" : "İşlem oluşturuluyor", + "send_templates" : "Şablonlar", + "send_new" : "Yeni", + "send_amount" : "Miktar:", + "send_fee" : "Komisyon:", + "send_name" : "İsim", + "send_got_it" : "Tamamdır", + "send_sending" : "Gönderiliyor...", + "send_success" : "${crypto} başarıyla gönderildi", + + + "settings_title" : "Ayarlar", + "settings_nodes" : "Düğümler", + "settings_current_node" : "Şimdiki düğüm", + "settings_wallets" : "Cüzdanlar", + "settings_display_balance" : "Bakiyeyi göster", + "settings_currency" : "Para birimi", + "settings_fee_priority" : "İşlem Komsiyonu önceliği", + "settings_save_recipient_address" : "Gönderilen adresi kaydet", + "settings_personal" : "Kişisel", + "settings_change_pin" : "PIN'i değiştir", + "settings_change_language" : "Dili değiştir", + "settings_allow_biometrical_authentication" : "Biyometrik doğrulamaya izin ver", + "settings_dark_mode" : "Karanlık mod", + "settings_transactions" : "İşlemler", + "settings_trades" : "Takaslar", + "settings_display_on_dashboard_list" : "Gösterge tablosu listesinde göster", + "settings_all" : "HEPSİ", + "settings_only_trades" : "Sadece takaslar", + "settings_only_transactions" : "Sadece transferler", + "settings_none" : "Hiçbiri", + "settings_support" : "Destek", + "settings_terms_and_conditions" : "Şartlar ve Koşullar", + "pin_is_incorrect" : "PIN kodu hatalı", + + + "setup_pin" : "PIN kodu kurulumu", + "enter_your_pin_again" : "PIN kodunu tekrar girin", + "setup_successful" : "PIN kodun başarıyla ayarlandı!", + + + "wallet_keys" : "Cüzdan tohumu/anahtarları", + "wallet_seed" : "Cüzdan tohumu", + "private_key" : "Özel anahtar", + "public_key" : "Genel Anahtar", + "view_key_private" : "İzleme anahtarı (özel)", + "view_key_public" : "İzleme anahtarı (genel)", + "spend_key_private" : "Harcama anahtarı (özel)", + "spend_key_public" : "Harcama anahtarı (genel)", + "copied_key_to_clipboard" : "${key} panoya kopyalandı", + + + "new_subaddress_title" : "Yeni adres", + "new_subaddress_label_name" : "Etiket ismi", + "new_subaddress_create" : "Oluştur", + + "address_label" : "Adres etiketi", + + "subaddress_title" : "Alt adres listesi", + + + "trade_details_title" : "Takas Detayları", + "trade_details_id" : "ID", + "trade_details_state" : "Durum", + "trade_details_fetching" : "Getiriliyor", + "trade_details_provider" : "Sağlayıcı", + "trade_details_created_at" : "'da oluşturuldu", + "trade_details_pair" : "Parite", + "trade_details_copied" : "${title} panoya kopyalandı", + + + "trade_history_title" : "Takas geçmişi", + + + "transaction_details_title" : "İşlem Detayları", + "transaction_details_transaction_id" : "İşem ID'si", + "transaction_details_date" : "Tarih", + "transaction_details_height" : "Yükseklik", + "transaction_details_amount" : "Miktar", + "transaction_details_fee" : "Fee", + "transaction_details_copied" : "${title} panoya kopyalandı", + "transaction_details_recipient_address" : "Alıcı adres", + + + "wallet_list_title" : "Monero Cüzdanı", + "wallet_list_create_new_wallet" : "Yeni Cüzdan Oluştur", + "wallet_list_restore_wallet" : "Cüzdanı Geri Yükle", + "wallet_list_load_wallet" : "Cüzdanı yükle", + "wallet_list_loading_wallet" : "${wallet_name} cüzdanı yükleniyor", + "wallet_list_failed_to_load" : "Failed to load ${wallet_name} wallet. ${error}", + "wallet_list_removing_wallet" : "Removing ${wallet_name} wallet", + "wallet_list_failed_to_remove" : "${wallet_name} cüzdanı yüklenirken hata oluştu. ${error}", + + + "widgets_address" : "Adres", + "widgets_restore_from_blockheight" : "Blok yüksekliğinden geri yükle", + "widgets_restore_from_date" : "Tarihten geri yükle", + "widgets_or" : "veya", + "widgets_seed" : "Tohum", + + + "router_no_route" : "${name} için rota tanımlanmadı", + + + "error_text_account_name" : "Hesap ismi yalnızca harf, rakam \nve 1 ile 15 uzunluğunda karakter içermelidir.", + "error_text_contact_name" : "Kişi ismi ` , ' \" sembollerini içeremez \nve 1 ile 32 uzunluğunda karakter içermelidir", + "error_text_address" : "Cüzdan adresi kripto para biriminin\ntürüne karşılık gelmelidir", + "error_text_node_address" : "Lütfen iPv4 adresi girin", + "error_text_node_port" : "Düğüm port'u yalnızca 0 ve 65535 arasında rakam içerebilir", + "error_text_payment_id" : "Ödeme ID'si yalnızca onaltılık (hex) olarak 16 veya 64 karakter içerebilir", + "error_text_xmr" : "XMR miktarı kullanılabilir bakiyeyi aşamaz.\nKesir basamaklarının sayısı 12'ye eşit veya daha az olmalıdır", + "error_text_fiat" : "Tutarın değeri, mevcut bakiyeyi aşamaz.\nKesir basamaklarının sayısı 2'ye eşit veya daha az olmalıdır", + "error_text_subaddress_name" : "Alt adres ismi ` , ' \" sembolleri içeremez\nve 1 ile 20 karakter arasında olmalıdır", + "error_text_amount" : "Miktar sadece sayı içerebilir", + "error_text_wallet_name" : "Cüzdan ismi yalnızca harf, rakam \nve 1 ile 33 uzunluğunda karakter içermelidir.", + "error_text_keys" : "Cüzdan anahtarları onaltılık (hex) olarak yalnızca 64 karakter içerebilir", + "error_text_crypto_currency" : "Kesir basamaklarının sayısı\n12'ye eşit veya daha az olmalıdır", + "error_text_minimal_limit" : "${provider} için işlem oluşturulmadı. Miktar minimumdan daha azdır: ${min} ${currency}", + "error_text_maximum_limit" : "${provider} için işlem oluşturulmadı. Miktar maksimumdan daha fazla: ${max} ${currency}", + "error_text_limits_loading_failed" : "${provider} için işlem oluşturulmadı. Limitler yüklenirken hata oluştu.", + "error_text_template" : "Şablon adı ve adresi ` , ' \" sembolleri içeremez\nve 1 ila 106 karakter uzunluğunda olmalı", + + + "auth_store_ban_timeout" : "ban_timeout", + "auth_store_banned_for" : "Bu kadar süreliğine yasaklandınız: ", + "auth_store_banned_minutes" : " dakika", + "auth_store_incorrect_password" : "Hatalı PIN", + "wallet_store_monero_wallet" : "Monero Cüzdanı", + "wallet_restoration_store_incorrect_seed_length" : "Yanlış tohum uzunluğu", + + + "full_balance" : "Tüm bakiye", + "available_balance" : "Kullanılabilir Bakiye", + "hidden_balance" : "Gizli Bakiye", + + + "sync_status_syncronizing" : "SENKRONİZE EDİLİYOR", + "sync_status_syncronized" : "SENKRONİZE EDİLDİ", + "sync_status_not_connected" : "BAĞLI DEĞİL", + "sync_status_starting_sync" : "SENKRONİZE BAŞLATILIYOR", + "sync_status_failed_connect" : "BAĞLANTI KESİLDİ", + "sync_status_connecting" : "BAĞLANILIYOR", + "sync_status_connected" : "BAĞLANILDI", + "sync_status_attempting_sync" : "SENKRONİZE EDİLMEYE ÇALIŞILIYOR", + + + "transaction_priority_slow" : "Yavaş", + "transaction_priority_regular" : "Normal", + "transaction_priority_medium" : "Orta", + "transaction_priority_fast" : "Hızlı", + "transaction_priority_fastest" : "En Hızlı", + + + "trade_for_not_created" : "${title} için takas oluşturulmadı.", + "trade_not_created" : "Takas oluşturulmadı", + "trade_id_not_found" : "Trade ${tradeId} of ${title} not found.", + "trade_not_found" : "Takas bulunamadı.", + + + "trade_state_pending" : "Beklemede", + "trade_state_confirming" : "Onaylanıyor", + "trade_state_trading" : "Takas yapılıyor", + "trade_state_traded" : "Takas yapıldı", + "trade_state_complete" : "Tamamlandı", + "trade_state_to_be_created" : "Oluşturulacak", + "trade_state_unpaid" : "Ödenmedi", + "trade_state_underpaid" : "Eksik ödendi", + "trade_state_paid_unconfirmed" : "Ödendi onaylanmadı", + "trade_state_paid" : "Ödendi", + "trade_state_btc_sent" : "Btc gönderildi", + "trade_state_timeout" : "Zaman aşımı", + "trade_state_created" : "Oluşturuldu", + "trade_state_finished" : "Tamamlandı", + + "change_language" : "Dili değiştir", + "change_language_to" : "Dili şuna değiştir: ${language}?", + + "paste" : "Yapıştır", + "restore_from_seed_placeholder" : "Lütfen tohumunu buraya gir veya yapıştır", + "add_new_word" : "Yeni kelime ekle", + "incorrect_seed" : "Girilen metin geçerli değil.", + + "biometric_auth_reason" : "Kimlik doğrulaması için parmak izini okutun", + "version" : "Sürüm ${currentVersion}", + + "extracted_address_content" : "Parayı buraya gönderceksin:\n${recipient_name}", + + "card_address" : "Adres:", + "buy" : "Alış", + "sell": "Satış", + + "placeholder_transactions" : "İşlemlerin burada görüntülenecek", + "placeholder_contacts" : "Kişilerin burada görüntülenecek", + + "template" : "Şablon", + "confirm_delete_template" : "Bu eylem, bu şablonu silecek. Devam etmek istiyor musun?", + "confirm_delete_wallet" : "Bu eylem, bu cüzdanı silecek. Devam etmek istiyor musun?", + + "picker_description" : "ChangeNOW veya MorphToken'ı seçmek için lütfen önce işlem paritenizi değiştirin", + + "change_wallet_alert_title" : "Şimdiki cüzdanı değiştir", + "change_wallet_alert_content" : "Şimdiki cüzdanı ${wallet_name} cüzdanı ile değiştirmek istediğinden emin misin?", + + "creating_new_wallet" : "Cüzdan oluşturuluyor", + "creating_new_wallet_error" : "Hata: ${description}", + + "seed_alert_title" : "Dikkat", + "seed_alert_content" : "Cüzdanını kurtarmanın tek yolu tohumdur. Tohumunu yazdın mı?", + "seed_alert_back" : "Geriye dön", + "seed_alert_yes" : "Evet yazdım", + + "exchange_sync_alert_content" : "Lütfen cüzdanın senkronize olana kadar bekle", + + "pre_seed_title" : "UYARI", + "pre_seed_description" : "Bir sonraki sayfada ${words} kelime göreceksin. Bu senin benzersiz ve özel tohumundur, kaybetmen veya silinmesi durumunda cüzdanını kurtarmanın TEK YOLUDUR. Bunu yazmak ve Cake Wallet uygulaması dışında güvenli bir yerde saklamak tamamen SENİN sorumluluğunda.", + "pre_seed_button_text" : "Anladım. Bana tohumumu göster.", + + "xmr_to_error" : "XMR.TO hatası", + "xmr_to_error_description" : "Geçersiz tutar. Ondalık noktadan sonra maksimum limit 8 basamaktır", + + "provider_error" : "${provider} hatası", + + "use_ssl" : "SSL kullan", + "trusted" : "Güvenilir", + + "color_theme" : "Renk teması", + "light_theme" : "Aydınlık", + "bright_theme" : "Parlak", + "dark_theme" : "Karanlık", + "enter_your_note" : "Notunu gir…", + "note_optional" : "Not (isteğe bağlı)", + "note_tap_to_change" : "Not (değiştirmek için dokunun)", + "view_in_block_explorer" : "Blok Gezgini'nde görüntüle", + "view_transaction_on" : "İşlemi şurada görüntüle ", + "transaction_key" : "İşlem Anahtarı", + "confirmations" : "Onay", + "recipient_address" : "Alıcı adresi", + + "extra_id" : "Ekstra ID:", + "destination_tag" : "Hedef Etiketi:", + "memo" : "Memo:", + + "backup" : "Yedek", + "change_password" : "Parolayı değiştir", + "backup_password" : "Yedek parolası", + "write_down_backup_password" : "Lütfen yedekleme dosyasının içe aktarılması için kullanılan yedekleme parolanı not et.", + "export_backup" : "Yedeği dışa aktar", + "save_backup_password" : "Lütfen yedekleme parolanı kaydettiğinden emin ol. Bu parola olmadan yedekleme dosyasını içe aktaramazsın.", + "backup_file" : "Yedek dosyası", + + "edit_backup_password" : "Yedek parolasını değiştir", + "save_backup_password_alert" : "Yedek parolasını kaydet", + "change_backup_password_alert" : "Önceki yedekleme dosyaların yeni yedek parolası ile içe aktarılamayacaktır. Yeni yedekleme parolası yalnızca yeni yedekleme dosyaları için kullanılabilir olacak. Yedekleme parolasını değiştirmek istediğinden emin misin?", + + "enter_backup_password" : "Yedekleme parolasını buraya gir", + "select_backup_file" : "Yedek dosyası seç", + "import" : "İçe aktar", + "please_select_backup_file" : "Lütfen yedekleme dosyasını seç ve yedekleme parolasını gir.", + + "fixed_rate" : "Sabit oran", + "fixed_rate_alert" : "Sabit oran modunu işaretlersen alım tutarını girebilirsin. Sabit oran moduna geçmek ister misin?", + + "xlm_extra_info" : "Lütfen takas için XLM işlemi gönderirken Memo ID'yi belirtmeyi unutmayın", + "xrp_extra_info" : "Lütfen takas için XRP işlemi gönderirken Hedef Etiketi (Destination Tag) belirtmeyi unutmayın", + + "exchange_incorrect_current_wallet_for_xmr" : "Cake Wallet'daki Monero bakiyenizi kullanarak takas yapmak istiyorsan, lütfen önce Monero cüzdanına geç.", + "confirmed" : "Onaylı", + "unconfirmed" : "Onaylanmamış", + "displayable" : "Gösterilebilir", + + "submit_request" : "talep gönder", + + "buy_alert_content" : "Şu anda sadece Bitcoin ve Litecoin satın alımını destekliyoruz. Bitcoin veya Litecoin satın almak için lütfen Bitcoin veya Litecoin cüzdanınızı oluşturun veya bu cüzdanlardan birine geçiş yapın.", + "sell_alert_content": "Şu anda sadece Bitcoin satışını destekliyoruz. Bitcoin satmak için lütfen Bitcoin cüzdanınızı oluşturun veya Bitcoin cüzdanınıza geçiş yapın.", + + "outdated_electrum_wallet_description" : "Cake'te oluşturulan yeni Bitcoin cüzdanları artık 24 kelimelik bir tohuma sahip. Yeni bir Bitcoin cüzdanı oluşturmanız ve tüm paranızı 24 kelimelik yeni cüzdana aktarmanız ve 12 kelimelik tohuma sahip cüzdanları kullanmayı bırakmanız zorunludur. Lütfen paranızı güvence altına almak için bunu hemen yapın.", + "understand" : "Anladım", + + "apk_update" : "APK güncellemesi", + + "buy_bitcoin" : "Bitcoin Satın Al", + "buy_with" : "Şunun ile al: ", + "moonpay_alert_text" : "Tutar ${minAmount} ${fiatCurrency} miktarına eşit veya daha fazla olmalıdır", + + "outdated_electrum_wallet_receive_warning": "Bu cüzdanın 12 kelimelik bir tohumu varsa ve Cake'te oluşturulduysa, bu cüzdana Bitcoin YATIRMAYIN. Bu cüzdana aktarılan tüm BTC'ler kaybolabilir. 24 kelimelik yeni bir cüzdan oluşturun (sağ üstteki menüye dokunun, Cüzdanlar'ı seçin, Yeni Cüzdan Oluştur'u seçin, ardından Bitcoin'i seçin) ve BTC'nizi HEMEN oraya taşıyın. Cake'in yeni (24 kelimelik) BTC cüzdanları güvenlidir", + "do_not_show_me": "Bana bunu bir daha gösterme", + + "unspent_coins_title" : "Harcanmamış koinler", + "unspent_coins_details_title" : "Harcanmamış koin detayları", + "freeze" : "Dondur", + "frozen" : "Dondurulmuş", + "coin_control" : "Koin kontrolü (isteğe bağlı)", + + "address_detected" : "Adres tespit edildi", + "address_from_domain" : "Bu adres Unstoppable Domains'deki' ${domain} adresinden alındı", + + "add_receiver" : "Başka bir alıcı ekle (isteğe bağlı)", + + "manage_yats" : "Yats'ları yönet", + "yat_alert_title" : "Yat ile daha kolay kripto gönderin ve alın", + "yat_alert_content" : "Cake Wallet kullanıcıları artık tüm favori koin birimlerini benzersiz emoji tabanlı kullanıcı adıyla gönderebilir ve alabilirler.", + "get_your_yat" : "Yat'ını al", + "connect_an_existing_yat" : "Mevcut bir Yat'ı bağla", + "connect_yats": "Yat'lara bağlan", + "yat_address" : "Yat adresi", + "yat" : "Yat", + "address_from_yat" : "Bu adres Yat'taki ${emoji} adresinden alındı", + "yat_error" : "Yat hatası", + "yat_error_content" : "Bu Yat'a bağlı bir adres yok. Başka bir Yat'ı deneyin", + "choose_address" : "\n\nLütfen adresi seçin:", + "yat_popup_title" : "Cüzdan adresiniz emojileştirilebilir.", + "yat_popup_content" : "Artık Cake Wallet'ta kısa, emoji tabanlı bir kullanıcı adı olan Yat'ınızla kripto gönderebilir ve alabilirsiniz. Yats'ı istediğiniz zaman ayarlar ekranından yönetebilirsiniz", + "second_intro_title" : "Hepsini yönetebilen tek bir emoji adresi", + "second_intro_content" : "Yat'ınız, tüm para birimleriniz için uzun onaltılık adreslerinizin yerini alan benzersiz emoji adresidir.", + "third_intro_title" : "Yat diğerleriyle iyi çalışır", + "third_intro_content" : "Yat'lar Cake Wallet'ın dışında da çalışabilir. Dünya üzerindeki herhangi bir cüzdan adresi Yat ile değiştirilebilir!", + "learn_more" : "Daha fazla öğren", + "search": "Arat", + "search_language": "Dil arat", + "search_currency": "Para birimi ara", + "new_template" : "Yeni Şablon", + "electrum_address_disclaimer": "Adresini her kullandığında yeni adres oluşturuyoruz, ancak önceki adresler de çalışmaya devam eder", + "wallet_name_exists": "Bu isimde bir cüzdan zaten mevcut. Lütfen farklı bir isim seç veya önce diğer cüzdanı yeniden adlandır.", + "market_place": "Pazar Alanı", + "cake_pay_title": "Cake Pay Hediye Kartları", + "cake_pay_subtitle": "İndirimli hediye kartları satın alın (yalnızca ABD)", + "cake_pay_web_cards_title": "Cake Pay Web Kartları", + "cake_pay_web_cards_subtitle": "Dünya çapında ön ödemeli kartlar ve hediye kartları satın alın", + "about_cake_pay": "Cake Pay, Amerika Birleşik Devletleri'ndeki 150.000'den fazla işyerinde anında harcanabilen sanal varlıklarla kolayca hediye kartları satın almanızı sağlar.", + "cake_pay_account_note": "Kartları görmek ve satın almak için sadece bir e-posta adresiyle kaydolun. Hatta bazıları indirimli olarak bile mevcut!", + "already_have_account": "Zaten bir hesabınız var mı?", + "create_account": "Hesap oluştur", + "privacy_policy": "Gizlilik Politikası", + "welcome_to_cakepay": "Cake Pay'e Hoş Geldiniz!", + "sign_up": "Kaydol", + "forgot_password": "Parolamı unuttum", + "reset_password": "Parolamı sıfırla", + "gift_cards": "Hediye kartları", + "setup_your_debit_card": "Banka kartını ayarla", + "no_id_required": "Kimlik gerekmez. Para yükleyin ve istediğiniz yerde harcayın", + "how_to_use_card": "Bu kart nasıl kullanılır", + "purchase_gift_card": "Hediye Kartı Satın Al", + "verification": "Doğrulama", + "fill_code": "Lütfen e-postanıza gelen doğrulama kodunu girin", + "dont_get_code": "Kod gelmedi mi?", + "resend_code": "Lütfen tekrar gönder", + "debit_card": "Ön ödemeli Kart", + "cakepay_prepaid_card": "CakePay Ön Ödemeli Kart", + "no_id_needed": "Kimlik gerekmez!", + "frequently_asked_questions": "Sıkça sorulan sorular", + "debit_card_terms": "Ödeme kartı numaranızın (ve kart numaranıza karşılık gelen kimlik bilgilerinin) bu dijital cüzdanda saklanması ve kullanılması, zaman zaman yürürlükte olan ödeme kartı veren kuruluşla yapılan ilgili kart sahibi sözleşmesinin Hüküm ve Koşullarına tabidir.", + "please_reference_document": "Daha fazla bilgi için lütfen aşağıdaki belgelere bakınız.", + "cardholder_agreement": "Kart Sahibi Sözleşmesi", + "e_sign_consent": "E-İmza Onayı", + "agree_and_continue": "Kabul Et & Devam Et", + "email_address": "E-posta Adresi", + "agree_to": "Hesap oluşturarak bunları kabul etmiş olursunuz ", + "and": "ve", + "enter_code": "Kodu girin", + "congratulations": "Tebrikler!", + "you_now_have_debit_card": "Artık bir ön ödemeli kartın var", + "min_amount" : "Min: ${value}", + "max_amount" : "Maks: ${value}", + "enter_amount": "Miktar Girin", + "billing_address_info": "Eğer fatura adresi istenirse, kargo adresinizi girin", + "order_physical_card": "Fiziksel Kart Siparişi", + "add_value": "Değer ekle", + "activate": "Aktifleştir", + "get_a": "Bir ", + "digital_and_physical_card": " Dijital para birimleri ile para yükleyebileceğiniz ve ek bilgiye gerek olmayan", + "get_card_note": " dijital ve fiziksel ön ödemeli banka kartı edinin!", + "signup_for_card_accept_terms": "Kart için kaydol ve koşulları kabul et.", + "add_fund_to_card": "Ön ödemeli kartlara para ekle (En fazla yüklenebilir tutar: ${value})", + "use_card_info_two": "Paralar, dijital para birimlerinde değil, ön ödemeli hesapta tutulduğunda USD'ye dönüştürülür.", + "use_card_info_three": "Dijital kartı çevrimiçi olarak veya temassız ödeme yöntemleriyle kullanın.", + "optionally_order_card": "İsteğe bağlı olarak fiziksel bir kart sipariş edin.", + "hide_details" : "Detayları Gizle", + "show_details" : "Detayları Göster", + "upto": "Şu miktara kadar: ${value}", + "discount": "%${value} tasarruf et", + "gift_card_amount": "Hediye Kartı Tutarı", + "bill_amount": "Fatura Tutarı", + "you_pay": "Şu kadar ödeyeceksin: ", + "tip": "Bahşiş:", + "custom": "özel", + "by_cake_pay": "Cake Pay tarafından", + "expires": "Son kullanma tarihi", + "mm": "AA", + "yy": "YY", + "online": "Çevrimiçi", + "offline": "Çevrimdışı", + "gift_card_number": "Hediye kartı numarası", + "pin_number": "PIN kodu", + "total_saving": "Toplam Tasarruf", + "last_30_days": "Son 30 gün", + "avg_savings": "Ortalama Tasarruf", + "view_all": "Hepsini göster", + "active_cards": "Aktif kartlar", + "delete_account": "Hesabı sil", + "cards": "Kartlar", + "active": "Aktif", + "redeemed": "Kullanılmış", + "gift_card_balance_note": "Bakiyesi kalan olan hediye kartları burada görünecek", + "gift_card_redeemed_note": "Harcadığın hediye kartları burada görünecek", + "logout": "Çıkış yap", + "add_tip": "Bahşiş Ekle", + "percentageOf": "of ${amount}", + "is_percentage": "is", + "search_category": "Kategori ara", + "mark_as_redeemed": "Harcanmış olarak işaretle", + "more_options": "Daha Fazla Seçenek", + "awaiting_payment_confirmation": "Ödemenin onaylanması bekleniyor", + "transaction_sent_notice": "Ekran 1 dakika sonra ilerlemezse, blok gezgininden ve e-postanızdan kontrol edin.", + "agree": "Kabul Et", + "in_store": "Mağazada", + "generating_gift_card": "Hediye Kartı Oluşturuluyor", + "payment_was_received": "Ödemeniz alındı.", + "proceed_after_one_minute": "Ekran 1 dakika sonra ilerlemezse, e-postanızı kontrol edin.", + "order_id": "Sipariş ID'si", + "gift_card_is_generated": "Hediye Kartı oluşturuldu", + "open_gift_card": "Hediye Kartını Aç", + "contact_support": "Destek ile İletişime Geç", + "gift_cards_unavailable": "Hediye kartları şu anda yalnızca Monero, Bitcoin ve Litecoin ile satın alınabilir", + "introducing_cake_pay": "Cake Pay ile tanışın!", + "cake_pay_learn_more": "Uygulamada anında hediye kartları satın alın ve harcayın!\nDaha fazla öğrenmek için soldan sağa kaydır.", + "automatic": "Otomatik", + "fixed_pair_not_supported": "Bu sabit paritesi seçilen borsalarda desteklenmemekte", + "variable_pair_not_supported": "Bu değişken paritesi seçilen borsalarda desteklenmemekte", + "none_of_selected_providers_can_exchange": "Seçilen sağlayıcılardan hiçbiri bu takası yapamaz", + "choose_one": "Birini seç", + "choose_from_available_options": "Mevcut seçenekler arasından seçim yap:", + "custom_redeem_amount": "Özel Harcama Tutarı", + "add_custom_redemption": "Özel Bozdurma Ekle", + "remaining": "kalan", + "delete_wallet": "Cüzdanı sil", + "delete_wallet_confirm_message" : "${wallet_name} isimli cüzdanını silmek istediğinden emin misin?", + "low_fee": "Düşük komisyon", + "low_fee_alert": "Şu anda düşük bir ağ ücreti önceliği kullanıyorsunuz. Bu durum uzun beklemeler, farklı oranlar veya iptal edilen işlemlere neden olabilir. Daha iyi bir deneyim için daha yüksek bir ücret belirlemenizi öneririz.", + "ignor": "Yoksay", + "use_suggested": "Önerileni Kullan", + "do_not_share_warning_text" : "Bunları destek de dahil olmak üzere başka kimseyle paylaşma.\n\nParan çalınabilir ve çalınacaktır!", + "help": "yardım", + "all_transactions": "Tüm transferler", + "all_trades": "Tüm takaslar", + "connection_sync": "Bağlantı ve senkronizasyon", + "security_and_backup": "Güvenlik ve yedekleme", + "create_backup": "Yedek oluştur", + "privacy_settings": "Gizlilik ayarları", + "privacy": "Gizlilik", + "display_settings": "Görüntü ayarları", + "other_settings": "Diğer ayarlar", + "require_pin_after": "Şu kadar süre sonra PIN iste", + "always": "Her Zaman", + "minutes_to_pin_code": "${minute} dakika", + "disable_exchange": "Borsayı devre dışı bırak", + "advanced_privacy_settings": "Gelişmiş Gizlilik Ayarları", + "settings_can_be_changed_later": "Bu ayarlar daha sonra uygulama ayarlarından da değiştirilebilir", + "add_custom_node": "Yeni Özel Düğüm Ekleme", + "disable_fiat": "İtibari paraları devre dışı bırak", + "fiat_api": "İtibari Para API", + "disabled": "Devre dışı", + "enabled": "Etkin", + "tor_only": "Yalnızca Tor", + "unmatched_currencies": "Mevcut cüzdanınızın para birimi taranan QR ile eşleşmiyor", + "orbot_running_alert": "Lütfen bu düğüme bağlanmadan önce Orbot'un çalıştığından emin olun.", + "contact_list_contacts": "Rehberim", + "contact_list_wallets": "Cüzdanlarım", + "bitcoin_payments_require_1_confirmation": "Bitcoin ödemeleri, 20 dakika veya daha uzun sürebilen 1 onay gerektirir. Sabrınız için teşekkürler! Ödeme onaylandığında e-posta ile bilgilendirileceksiniz.", + "send_to_this_address" : "Bu adrese ${currency} ${tag}gönder", + "arrive_in_this_address" : "${currency} ${tag}bu adrese ulaşacak", + "do_not_send": "Gönderme", + "error_dialog_content": "Hay aksi, bir hatamız var.\n\nUygulamayı daha iyi hale getirmek için lütfen kilitlenme raporunu destek ekibimize gönderin." +} diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 4fad9a19d..19cf7946d 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -397,8 +397,7 @@ "biometric_auth_reason" : "Відскануйте свій відбиток пальця для аутентифікації", "version" : "Версія ${currentVersion}", - "openalias_alert_title" : "Виявлено адресу", - "openalias_alert_content" : "Ви будете відправляти кошти\n${recipient_name}", + "extracted_address_content" : "Ви будете відправляти кошти\n${recipient_name}", "card_address" : "Адреса:", "buy" : "Купити", @@ -677,6 +676,12 @@ "enabled": "Увімкнено", "tor_only": "Тільки Tor", "unmatched_currencies": "Валюта вашого гаманця не збігається з валютою сканованого QR-коду", + "orbot_running_alert": "Перед підключенням до цього вузла переконайтеся, що Orbot запущено.", "contact_list_contacts": "Контакти", - "contact_list_wallets": "Мої гаманці" + "contact_list_wallets": "Мої гаманці", + "bitcoin_payments_require_1_confirmation": "Платежі Bitcoin потребують 1 підтвердження, яке може зайняти 20 хвилин або більше. Дякую за Ваше терпіння! Ви отримаєте електронний лист, коли платіж буде підтверджено.", + "send_to_this_address" : "Надіслати ${currency} ${tag}на цю адресу", + "arrive_in_this_address" : "${currency} ${tag}надійде на цю адресу", + "do_not_send": "Не надсилайте", + "error_dialog_content": "На жаль, ми отримали помилку.\n\nБудь ласка, надішліть звіт про збій нашій команді підтримки, щоб покращити додаток." } diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb new file mode 100644 index 000000000..c3d6d8765 --- /dev/null +++ b/res/values/strings_ur.arb @@ -0,0 +1,689 @@ +{ + "welcome" : "میں خوش آمدید", + "cake_wallet" : "Cake والیٹ", + "first_wallet_text" : "Monero، Bitcoin، Litecoin، اور Haven کے لیے زبردست پرس", + "please_make_selection" : "اپنا بٹوہ بنانے یا بازیافت کرنے کے لیے براہ کرم ذیل میں ایک انتخاب کریں۔", + "create_new" : "نیا والیٹ بنائیں", + "restore_wallet" : "والیٹ کو بحال کریں۔", + + "monero_com" : "Monero.com بذریعہ Cake والیٹ", + "monero_com_wallet_text" : "Monero کے لئے بہت اچھا پرس", + + "haven_app" : "Haven از Cake والیٹ", + "haven_app_wallet_text" : "Havek کے لیے زبردست پرس", + + "accounts" : "اکاؤنٹس", + "edit" : "ترمیم", + "account" : "کھاتہ", + "add" : "شامل کریں۔", + + + "address_book" : "ایڈریس بک", + "contact" : "رابطہ کریں۔", + "please_select" : "براہ مہربانی منتخب کریں:", + "cancel" : "منسوخ کریں۔", + "ok" : "ٹھیک ہے", + "contact_name" : "رابطے کا نام", + "reset" : "دوبارہ ترتیب دیں۔", + "save" : "محفوظ کریں۔", + "address_remove_contact" : "رابطہ ہٹا دیں۔", + "address_remove_content" : "کیا آپ واقعی منتخب رابطہ کو ہٹانا چاہتے ہیں؟", + + + "authenticated" : "تصدیق شدہ", + "authentication" : "تصدیق", + "failed_authentication" : "ناکام تصدیق۔ ${state_error}", + + + "wallet_menu" : "مینو", + "Blocks_remaining" : "${status} بلاکس باقی ہیں۔", + "please_try_to_connect_to_another_node" : "براہ کرم کسی دوسرے نوڈ سے جڑنے کی کوشش کریں۔", + "xmr_hidden" : "پوشیدہ", + "xmr_available_balance" : "دستیاب بیلنس", + "xmr_full_balance" : "مکمل بیلنس", + "send" : "بھیجیں", + "receive" : "وصول کریں۔", + "transactions" : "لین دین", + "incoming" : "آنے والا", + "outgoing" : "سبکدوش ہونے والے", + "transactions_by_date" : "تاریخ کے لحاظ سے لین دین", + "trades" : "تجارت", + "filter_by" : "کی طرف سے فلٹر", + "today" : "آج", + "yesterday" : "کل", + "received" : "موصول ہوا۔", + "sent" : "بھیجا", + "pending" : " (زیر التواء)", + "rescan" : "دوبارہ اسکین کریں۔", + "reconnect" : "دوبارہ جڑیں۔", + "wallets" : "بٹوے", + "show_seed" : "بیج دکھائیں۔", + "show_keys" : "بیج / چابیاں دکھائیں۔", + "address_book_menu" : "ایڈریس بک", + "reconnection" : "دوبارہ رابطہ", + "reconnect_alert_text" : "کیا آپ واقعی دوبارہ جڑنا چاہتے ہیں؟", + + + "exchange" : "تبادلہ", + "clear" : "صاف", + "refund_address" : "رقم کی واپسی کا پتہ", + "change_exchange_provider" : "ایکسچینج فراہم کنندہ کو تبدیل کریں۔", + "you_will_send" : "سے تبدیل کریں۔", + "you_will_get" : "میں تبدیل کریں۔", + "amount_is_guaranteed" : "وصول شدہ رقم کی ضمانت ہے۔", + "amount_is_estimate" : "وصول شدہ رقم ایک تخمینہ ہے۔", + "powered_by" : "${title} کے ذریعے تقویت یافتہ", + "error" : "خرابی", + "estimated" : "تخمینہ لگایا", + "min_value" : "کم سے کم: ${value} ${currency}", + "max_value" : "زیادہ سے زیادہ: ${value} ${currency}", + "change_currency" : "کرنسی تبدیل کریں", + "overwrite_amount" : "رقم کو اوور رائٹ کریں۔", + "qr_payment_amount" : "اس QR کوڈ میں ادائیگی کی رقم شامل ہے۔ کیا آپ موجودہ قدر کو اوور رائٹ کرنا چاہتے ہیں؟", + + "copy_id" : "کاپی ID", + "exchange_result_write_down_trade_id" : "جاری رکھنے کے لیے براہ کرم تجارتی ID کاپی کریں یا لکھیں۔", + "trade_id" : "تجارتی ID:", + "copied_to_clipboard" : "کلپ بورڈ پر کاپی کیا گیا۔", + "saved_the_trade_id" : "میں نے تجارتی ID محفوظ کر لی ہے۔", + "fetching" : "لا رہا ہے۔", + "id" : "ID:", + "amount" : "رقم کی رقم:", + "payment_id" : "ادائیگی کی شناخت:", + "status" : "حالت:", + "offer_expires_in" : "پیشکش کی میعاد اس وقت ختم ہو جاتی ہے:", + "trade_is_powered_by" : "یہ تجارت ${provider} کے ذریعے تقویت یافتہ ہے", + "copy_address" : "ایڈریس کاپی کریں۔", + "exchange_result_confirm" : "تصدیق کو دبانے سے، آپ اپنے بٹوے سے ${fetchingLabel} ${from} بھیجیں گے جسے ${walletName} کہتے ہیں نیچے دکھائے گئے پتے پر۔ یا آپ اپنے بیرونی والیٹ سے نیچے دیئے گئے پتے/QR کوڈ پر بھیج سکتے ہیں۔\\n\\nجاری رکھنے کے لیے براہ کرم تصدیق کو دبائیں یا رقم تبدیل کرنے کے لیے واپس جائیں۔", + "exchange_result_description" : "آپ کو اگلے صفحہ پر دکھائے گئے پتے پر کم از کم ${fetchingLabel} ${from} بھیجنا ہوگا۔ اگر آپ ${fetchingLabel} ${from} سے کم رقم بھیجتے ہیں تو یہ تبدیل نہیں ہوسکتی ہے اور اسے واپس نہیں کیا جاسکتا ہے۔", + "exchange_result_write_down_ID" : "*براہ کرم اوپر دکھائی گئی اپنی ID کاپی کریں یا لکھیں۔", + "confirm" : "تصدیق کریں۔", + "confirm_sending" : "بھیجنے کی تصدیق کریں۔", + "commit_transaction_amount_fee" : "لین دین کا ارتکاب کریں\\nرقم: ${amount}\\nفیس: ${fee}", + "sending" : "بھیج رہا ہے۔", + "transaction_sent" : "لین دین بھیجا گیا!", + "expired" : "میعاد ختم", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "XMR بھیجیں۔", + "exchange_new_template" : "نیا سانچہ", + + "faq" : "عمومی سوالات", + + + "enter_your_pin" : "اپنا PIN درج کریں۔", + "loading_your_wallet" : "آپ کا بٹوہ لوڈ ہو رہا ہے۔", + + + "new_wallet" : "نیا پرس", + "wallet_name" : "بٹوے کا نام", + "continue_text" : "جاری رہے", + "choose_wallet_currency" : "براہ کرم والیٹ کرنسی کا انتخاب کریں:", + + + "node_new" : "نیا نوڈ", + "node_address" : "نوڈ ایڈریس", + "node_port" : "نوڈ پورٹ", + "login" : "لاگ ان کریں", + "password" : "پاس ورڈ", + "nodes" : "نوڈس", + "node_reset_settings_title" : "ترتیبات کو دوبارہ ترتیب دیں۔", + "nodes_list_reset_to_default_message" : "کیا آپ واقعی ترتیبات کو ڈیفالٹ پر دوبارہ ترتیب دینا چاہتے ہیں؟", + "change_current_node" : "کیا آپ یقینی طور پر موجودہ نوڈ کو ${node} میں تبدیل کرنا چاہتے ہیں؟", + "change" : "تبدیلی", + "remove_node" : "نوڈ کو ہٹا دیں۔", + "remove_node_message" : "کیا آپ واقعی منتخب نوڈ کو ہٹانا چاہتے ہیں؟", + "remove" : "دور", + "delete" : "حذف کریں۔", + "add_new_node" : "نیا نوڈ شامل کریں۔", + "change_current_node_title" : "موجودہ نوڈ کو تبدیل کریں۔", + "node_test" : "پرکھ", + "node_connection_successful" : "کنکشن کامیاب رہا۔", + "node_connection_failed" : "کنکشن ناکام ہو گیا تھا۔", + "new_node_testing" : "نیا نوڈ ٹیسٹنگ", + + + "use" : "تبدیل کرنا", + "digit_pin" : "-ہندسوں کا پن", + + + "share_address" : "پتہ شیئر کریں۔", + "receive_amount" : "رقم", + "subaddresses" : "ذیلی پتے", + "addresses" : "پتے", + "scan_qr_code" : "پتہ حاصل کرنے کے لیے QR کوڈ اسکین کریں۔", + "qr_fullscreen" : "فل سکرین QR کوڈ کھولنے کے لیے تھپتھپائیں۔", + "rename" : "نام تبدیل کریں۔", + "choose_account" : "اکاؤنٹ کا انتخاب کریں۔", + "create_new_account" : "نیا اکاؤنٹ بنانے", + "accounts_subaddresses" : "اکاؤنٹس اور ذیلی پتے", + + + "restore_restore_wallet" : "والیٹ کو بحال کریں۔", + "restore_title_from_seed_keys" : "بیج / چابیاں سے بحال کریں۔", + "restore_description_from_seed_keys" : "اپنے بٹوے کو بیج / چابیاں سے واپس حاصل کریں جنہیں آپ نے محفوظ جگہ پر محفوظ کیا ہے۔", + "restore_next" : "اگلے", + "restore_title_from_backup" : "بیک اپ سے بحال کریں۔", + "restore_description_from_backup" : "آپ اپنی بیک اپ فائل سے پوری کیک والیٹ ایپ کو بحال کر سکتے ہیں۔", + "restore_seed_keys_restore" : "بیج/کیز کی بحالی", + "restore_title_from_seed" : "بیج سے بحال کریں۔", + "restore_description_from_seed" : "اپنے بٹوے کو 25 لفظ یا 13 الفاظ کے مجموعہ کوڈ سے بحال کریں۔", + "restore_title_from_keys" : "چابیاں سے بحال کریں۔", + "restore_description_from_keys" : "اپنے بٹوے کو اپنی نجی کلیدوں سے محفوظ کردہ کی اسٹروکس سے بحال کریں۔", + "restore_wallet_name" : "بٹوے کا نام", + "restore_address" : "پتہ", + "restore_view_key_private" : "کلید دیکھیں (نجی)", + "restore_spend_key_private" : "خرچ کی کلید (نجی)", + "restore_recover" : "بحال کریں۔", + "restore_wallet_restore_description" : "والیٹ کی بحالی کی تفصیل", + "restore_new_seed" : "نیا بیج", + "restore_active_seed" : "فعال بیج", + "restore_bitcoin_description_from_seed" : "24 الفاظ کے مجموعہ کوڈ سے اپنے بٹوے کو بحال کریں۔", + "restore_bitcoin_description_from_keys" : "اپنی نجی کلیدوں سے تیار کردہ WIF سٹرنگ سے اپنے بٹوے کو بحال کریں۔", + "restore_bitcoin_title_from_keys" : "WIF سے بحال کریں۔", + "restore_from_date_or_blockheight" : "براہ کرم یہ پرس بنانے سے چند دن پہلے کی تاریخ درج کریں۔ یا اگر آپ کو بلاک ہائیٹ معلوم ہے تو براہ کرم اس کی بجائے اسے درج کریں۔", + + + "seed_reminder" : "اگر آپ اپنا فون کھو دیتے ہیں یا صاف کرتے ہیں تو براہ کرم یہ لکھ دیں۔", + "seed_title" : "بیج", + "seed_share" : "بیج بانٹیں۔", + "copy" : "کاپی", + + + "seed_language_choose" : "براہ کرم بیج کی زبان کا انتخاب کریں:", + "seed_choose" : "بیج کی زبان کا انتخاب کریں۔", + "seed_language_next" : "اگلے", + "seed_language_english" : "انگریزی", + "seed_language_chinese" : "چینی", + "seed_language_dutch" : "ڈچ", + "seed_language_german" : "جرمن", + "seed_language_japanese" : "جاپانی", + "seed_language_portuguese" : "پرتگالی", + "seed_language_russian" : "روسی", + "seed_language_spanish" : "ہسپانوی", + "seed_language_french" : "فرانسیسی", + "seed_language_italian" : "اطالوی", + + + "send_title" : "بھیجیں", + "send_your_wallet" : "آپ کا بٹوہ", + "send_address" : "${cryptoCurrency} پتہ", + "send_payment_id" : "ادائیگی کی شناخت (اختیاری)", + "all" : "تمام", + "send_error_minimum_value" : "رقم کی کم از کم قیمت 0.01 ہے۔", + "send_error_currency" : "کرنسی صرف نمبروں پر مشتمل ہو سکتی ہے۔", + "send_estimated_fee" : "تخمینی فیس:", + "send_priority" : "فی الحال فیس ${transactionPriority} کی ترجیح پر سیٹ ہے۔\\nٹرانزیکشن کی ترجیح سیٹنگز میں ایڈجسٹ کی جا سکتی ہے۔", + "send_creating_transaction" : "لین دین کی تخلیق", + "send_templates" : "ٹیمپلیٹس", + "send_new" : "نئی", + "send_amount" : "رقم:", + "send_fee" : "فیس:", + "send_name" : "نام", + "send_got_it" : "یہ مل گیا", + "send_sending" : "بھیج رہا ہے...", + "send_success" : "آپ کا ${crypto} کامیابی کے ساتھ بھیج دیا گیا۔", + + + "settings_title" : "ترتیبات", + "settings_nodes" : "نوڈس", + "settings_current_node" : "موجودہ نوڈ", + "settings_wallets" : "بٹوے", + "settings_display_balance" : "ڈسپلے بیلنس", + "settings_currency" : "کرنسی", + "settings_fee_priority" : "فیس کی ترجیح", + "settings_save_recipient_address" : "وصول کنندہ کا پتہ محفوظ کریں۔", + "settings_personal" : "ذاتی", + "settings_change_pin" : "پن تبدیل کریں۔", + "settings_change_language" : "زبان تبدیل کریں", + "settings_allow_biometrical_authentication" : "بایومیٹریکل تصدیق کی اجازت دیں۔", + "settings_dark_mode" : "ڈارک موڈ", + "settings_transactions" : "لین دین", + "settings_trades" : "تجارت", + "settings_display_on_dashboard_list" : "ڈیش بورڈ کی فہرست پر ڈسپلے کریں۔", + "settings_all" : "تمام", + "settings_only_trades" : "صرف تجارت", + "settings_only_transactions" : "صرف لین دین", + "settings_none" : "کوئی نہیں۔", + "settings_support" : "حمایت", + "settings_terms_and_conditions" : "شرائط و ضوابط", + "pin_is_incorrect" : "PIN غلط ہے۔", + + + "setup_pin" : "PIN سیٹ اپ کریں۔", + "enter_your_pin_again" : "اپنا پن دوبارہ درج کریں۔", + "setup_successful" : "آپ کا PIN کامیابی کے ساتھ ترتیب دیا گیا ہے!", + + + "wallet_keys" : "بٹوے کے بیج / چابیاں", + "wallet_seed" : "بٹوے کا بیج", + "private_key" : "نجی کلید", + "public_key" : "عوامی کلید", + "view_key_private" : "کلید دیکھیں (نجی)", + "view_key_public" : "کلید دیکھیں (عوامی)", + "spend_key_private" : "خرچ کی کلید (نجی)", + "spend_key_public" : "خرچ کی کلید (عوامی)", + "copied_key_to_clipboard" : "${key} کو کلپ بورڈ پر کاپی کیا گیا۔", + + + "new_subaddress_title" : "نیا پتہ", + "new_subaddress_label_name" : "لیبل کا نام", + "new_subaddress_create" : "بنانا", + + "address_label" : "پتے کا خانہ", + + "subaddress_title" : "ذیلی ایڈریس کی فہرست", + + + "trade_details_title" : "تجارت کی تفصیلات", + "trade_details_id" : "ID", + "trade_details_state" : "حالت", + "trade_details_fetching" : "لا رہا ہے۔", + "trade_details_provider" : "فراہم کرنے والا", + "trade_details_created_at" : "پر تخلیق کیا گیا۔", + "trade_details_pair" : "جوڑا", + "trade_details_copied" : "${title} کو کلپ بورڈ پر کاپی کیا گیا۔", + + + "trade_history_title" : "تجارتی تاریخ", + + + "transaction_details_title" : "لین دین کی تفصیلات", + "transaction_details_transaction_id" : "ٹرانزیکشن ID", + "transaction_details_date" : "تاریخ", + "transaction_details_height" : "اونچائی", + "transaction_details_amount" : "رقم", + "transaction_details_fee" : "فیس", + "transaction_details_copied" : "${title} کو کلپ بورڈ پر کاپی کیا گیا۔", + "transaction_details_recipient_address" : "وصول کنندگان کے پتے", + + + "wallet_list_title" : "Monero والیٹ", + "wallet_list_create_new_wallet" : "نیا والیٹ بنائیں", + "wallet_list_restore_wallet" : "والیٹ کو بحال کریں۔", + "wallet_list_load_wallet" : "پرس لوڈ کریں۔", + "wallet_list_loading_wallet" : "${wallet_name} والیٹ لوڈ ہو رہا ہے۔", + "wallet_list_failed_to_load" : "${wallet_name} والیٹ لوڈ کرنے میں ناکام۔ ${error}", + "wallet_list_removing_wallet" : "${wallet_name} والیٹ کو ہٹایا جا رہا ہے۔", + "wallet_list_failed_to_remove" : "${wallet_name} والیٹ کو ہٹانے میں ناکام۔ ${error}", + + + "widgets_address" : "پتہ", + "widgets_restore_from_blockheight" : "بلاک ہائیٹ سے بحال کریں۔", + "widgets_restore_from_date" : "تاریخ سے بحال کریں۔", + "widgets_or" : "یا", + "widgets_seed" : "بیج", + + + "router_no_route" : "${name} کے لیے کوئی راستہ متعین نہیں ہے", + + + "error_text_account_name" : "اکاؤنٹ کا نام صرف حروف، اعداد پر مشتمل ہو سکتا ہے\\nاور 1 سے 15 حروف کے درمیان ہونا چاہیے۔", + "error_text_contact_name" : "رابطہ کے نام میں ` , \\' \" علامات\\nنہیں ہو سکتے اور 1 سے 32 حروف کے درمیان ہونا چاہیے", + "error_text_address" : "والیٹ کا پتہ cryptocurrency کی قسم\\nکے مطابق ہونا چاہیے۔", + "error_text_node_address" : "براہ کرم ایک iPv4 پتہ درج کریں۔", + "error_text_node_port" : "نوڈ پورٹ میں صرف 0 اور 65535 کے درمیان نمبر ہوسکتے ہیں۔", + "error_text_payment_id" : "ادائیگی کی ID ہیکس میں صرف 16 سے 64 حروف پر مشتمل ہو سکتی ہے۔", + "error_text_xmr" : "XMR قدر دستیاب بیلنس سے زیادہ نہیں ہو سکتی۔\\nفرکشن ہندسوں کی تعداد 12 سے کم یا اس کے برابر ہونی چاہیے۔", + "error_text_fiat" : "رقم کی قدر دستیاب بیلنس سے زیادہ نہیں ہو سکتی۔\\nفرکشن ہندسوں کی تعداد 2 کے برابر یا کم ہونی چاہیے۔", + "error_text_subaddress_name" : "ذیلی پتے کے نام میں ` , \\ ' \" علامتیں نہیں ہو سکتی ہیں اور 1 اور 20 حروف کے درمیان ہونی چاہئیں", + "error_text_amount" : "رقم صرف اعداد پر مشتمل ہو سکتی ہے۔", + "error_text_wallet_name" : "والیٹ کے نام میں صرف حروف، اعداد، _ - علامتیں\\nاور 1 سے 33 حروف کے درمیان ہونی چاہئیں", + "error_text_keys" : "والیٹ کیز ہیکس میں صرف 64 حروف پر مشتمل ہو سکتی ہیں۔", + "error_text_crypto_currency" : "کسر ہندسوں کی تعداد\\n12 سے کم یا مساوی ہونی چاہیے۔", + "error_text_minimal_limit" : "${provider} کے لیے تجارت نہیں بنائی گئی ہے۔ رقم کم سے کم ہے: ${min} ${currency}", + "error_text_maximum_limit" : "${provider} کے لیے تجارت نہیں بنائی گئی ہے۔ رقم زیادہ سے زیادہ سے زیادہ ہے: ${max} ${currency}", + "error_text_limits_loading_failed" : "${provider} کے لیے تجارت نہیں بنائی گئی ہے۔ حدود کی لوڈنگ ناکام ہو گئی۔", + "error_text_template" : "ٹیمپلیٹ کا نام اور پتہ `` , \\' \" علامتوں پر مشتمل نہیں ہو سکتا ہے اور 1 اور 106 حروف کے درمیان ہونا چاہیے", + + + "auth_store_ban_timeout" : "پابندی_وقت ختم", + "auth_store_banned_for" : "کے لیے پابندی لگا دی گئی۔", + "auth_store_banned_minutes" : " منٹ", + "auth_store_incorrect_password" : "غلط PIN", + "wallet_store_monero_wallet" : "مونیرو والیٹ", + "wallet_restoration_store_incorrect_seed_length" : "غلط بیج کی لمبائی", + + + "full_balance" : "مکمل بیلنس", + "available_balance" : "دستیاب بیلنس", + "hidden_balance" : "پوشیدہ بیلنس", + + + "sync_status_syncronizing" : "مطابقت پذیری", + "sync_status_syncronized" : "مطابقت پذیر", + "sync_status_not_connected" : "منسلک نہیں", + "sync_status_starting_sync" : "مطابقت پذیری شروع کر رہا ہے۔", + "sync_status_failed_connect" : "منقطع", + "sync_status_connecting" : "جڑ رہا ہے۔", + "sync_status_connected" : "منسلک", + "sync_status_attempting_sync" : "ہم آہنگی کی کوشش کر رہا ہے۔", + + + "transaction_priority_slow" : "سست", + "transaction_priority_regular" : "باقاعدہ", + "transaction_priority_medium" : "درمیانہ", + "transaction_priority_fast" : "تیز", + "transaction_priority_fastest" : "تیز ترین", + + + "trade_for_not_created" : "${title} کے لیے تجارت نہیں بنائی گئی ہے۔", + "trade_not_created" : "تجارت پیدا نہیں ہوئی۔", + "trade_id_not_found" : "ٹریڈ ${tradeId} از ${title} نہیں ملا۔", + "trade_not_found" : "تجارت نہیں ملی۔", + + + "trade_state_pending" : "زیر التواء", + "trade_state_confirming" : "تصدیق کر رہا ہے۔", + "trade_state_trading" : "تجارت", + "trade_state_traded" : "تجارت کی۔", + "trade_state_complete" : "مکمل", + "trade_state_to_be_created" : "پیدا کیا جائے۔", + "trade_state_unpaid" : "بلا معاوضہ", + "trade_state_underpaid" : "کم معاوضہ", + "trade_state_paid_unconfirmed" : "غیر تصدیق شدہ ادائیگی", + "trade_state_paid" : "ادا کیا", + "trade_state_btc_sent" : "Btc بھیجا گیا۔", + "trade_state_timeout" : "وقت ختم", + "trade_state_created" : "بنایا", + "trade_state_finished" : "ختم", + + "change_language" : "زبان تبدیل کریں", + "change_language_to" : "زبان کو ${language} میں تبدیل کریں؟", + + "paste" : "چسپاں کریں۔", + "restore_from_seed_placeholder" : "براہ کرم اپنا بیج یہاں درج کریں یا پیسٹ کریں۔", + "add_new_word" : "نیا لفظ شامل کریں۔", + "incorrect_seed" : "درج کردہ متن درست نہیں ہے۔", + + "biometric_auth_reason" : "تصدیق کرنے کے لیے اپنے فنگر پرنٹ کو اسکین کریں۔", + "version" : "ورژن ${currentVersion}", + + + "openalias_alert_title" : "پتہ کا پتہ چلا", + "openalias_alert_content" : "آپ کو فنڈز بھیجیں گے\\n${recipient_name}", + + "card_address" : "پتہ:", + "buy" : "خریدنے", + "sell" : "بیچنا", + + "placeholder_transactions" : "آپ کے لین دین یہاں دکھائے جائیں گے۔", + "placeholder_contacts" : "آپ کے رابطے یہاں دکھائے جائیں گے۔", + + "template" : "سانچے", + "confirm_delete_template" : "یہ عمل اس ٹیمپلیٹ کو حذف کر دے گا۔ کیا آپ جاری رکھنا چاہتے ہیں؟", + "confirm_delete_wallet" : "اس کارروائی سے یہ پرس حذف ہو جائے گا۔ کیا آپ جاری رکھنا چاہتے ہیں؟", + + "picker_description" : "ChangeNOW یا MorphToken کو منتخب کرنے کے لیے، براہ کرم پہلے اپنا تجارتی جوڑا تبدیل کریں۔", + + "change_wallet_alert_title" : "موجودہ پرس تبدیل کریں۔", + "change_wallet_alert_content" : "کیا آپ موجودہ والیٹ کو ${wallet_name} میں تبدیل کرنا چاہتے ہیں؟", + + "creating_new_wallet" : "نیا پرس بنانا", + "creating_new_wallet_error" : "خرابی: ${description}", + + "seed_alert_title" : "توجہ", + "seed_alert_content" : "بیج آپ کے بٹوے کو بازیافت کرنے کا واحد طریقہ ہے۔ کیا آپ نے اسے لکھا ہے؟", + "seed_alert_back" : "واپس جاو", + "seed_alert_yes" : "ہاں میرے پاس ہے", + + "exchange_sync_alert_content" : "براہ کرم اس وقت تک انتظار کریں جب تک آپ کا بٹوہ مطابقت پذیر نہ ہو جائے۔", + + "pre_seed_title" : "اہم", + "pre_seed_description" : "اگلے صفحے پر آپ کو ${words} الفاظ کا ایک سلسلہ نظر آئے گا۔ یہ آپ کا انوکھا اور نجی بیج ہے اور یہ آپ کے بٹوے کو ضائع یا خرابی کی صورت میں بازیافت کرنے کا واحد طریقہ ہے۔ اسے لکھنا اور اسے کیک والیٹ ایپ سے باہر کسی محفوظ جگہ پر اسٹور کرنا آپ کی ذمہ داری ہے۔", + "pre_seed_button_text" : "میں سمجھتا ہوں۔ مجھے میرا بیج دکھاؤ", + + "xmr_to_error" : "XMR.TO غلطی", + "xmr_to_error_description" : "غلط رقم۔ اعشاریہ پوائنٹ کے بعد زیادہ سے زیادہ 8 ہندسے", + + "provider_error" : "${provider} خرابی۔", + + "use_ssl" : "SSL استعمال کریں۔", + "trusted" : "قابل اعتماد", + + "color_theme" : "رنگین تھیم", + "light_theme" : "روشنی", + "bright_theme" : "روشن", + "dark_theme" : "اندھیرا", + "enter_your_note" : "اپنا نوٹ درج کریں…", + "note_optional" : "نوٹ (اختیاری)", + "note_tap_to_change" : "نوٹ (تبدیل کرنے کے لیے تھپتھپائیں)", + "view_in_block_explorer" : "بلاک ایکسپلورر میں دیکھیں", + "view_transaction_on" : "لین دین دیکھیں آن", + "transaction_key" : "لین دین کی کلید", + "confirmations" : "تصدیقات", + "recipient_address" : "وصول کنندہ کا پتہ", + + "extra_id" : "اضافی ID:", + "destination_tag" : "منزل کا ٹیگ:", + "memo" : "میمو:", + + "backup" : "بیک اپ", + "change_password" : "پاس ورڈ تبدیل کریں", + "backup_password" : "بیک اپ پاس ورڈ", + "write_down_backup_password" : "براہ کرم اپنا بیک اپ پاس ورڈ لکھیں، جو آپ کی بیک اپ فائلوں کی درآمد کے لیے استعمال ہوتا ہے۔", + "export_backup" : "بیک اپ برآمد کریں۔", + "save_backup_password" : "براہ کرم یقینی بنائیں کہ آپ نے اپنا بیک اپ پاس ورڈ محفوظ کر لیا ہے۔ آپ اس کے بغیر اپنی بیک اپ فائلیں درآمد نہیں کر سکیں گے۔", + "backup_file" : "بیک اپ فائل", + + "edit_backup_password" : "بیک اپ پاس ورڈ میں ترمیم کریں۔", + "save_backup_password_alert" : "بیک اپ پاس ورڈ محفوظ کریں۔", + "change_backup_password_alert" : "آپ کی پچھلی بیک اپ فائلیں نئے بیک اپ پاس ورڈ کے ساتھ درآمد کرنے کے لیے دستیاب نہیں ہوں گی۔ نیا بیک اپ پاس ورڈ صرف نئی بیک اپ فائلوں کے لیے استعمال کیا جائے گا۔ کیا آپ واقعی بیک اپ پاس ورڈ تبدیل کرنا چاہتے ہیں؟", + + "enter_backup_password" : "یہاں بیک اپ پاس ورڈ درج کریں۔", + "select_backup_file" : "بیک اپ فائل کو منتخب کریں۔", + "import" : "درآمد کریں۔", + "please_select_backup_file" : "براہ کرم بیک اپ فائل منتخب کریں اور بیک اپ پاس ورڈ درج کریں۔", + + "fixed_rate" : "مقررہ شرح", + "fixed_rate_alert" : "فکسڈ ریٹ موڈ چیک ہونے پر آپ وصولی رقم درج کر سکیں گے۔ کیا آپ فکسڈ ریٹ موڈ پر سوئچ کرنا چاہتے ہیں؟", + + "xlm_extra_info" : "ایکسچینج کے لیے XLM ٹرانزیکشن بھیجتے وقت براہ کرم میمو ID بتانا نہ بھولیں۔", + "xrp_extra_info" : "ایکسچینج کے لیے XRP ٹرانزیکشن بھیجتے وقت ڈیسٹینیشن ٹیگ بتانا نہ بھولیں۔", + + "exchange_incorrect_current_wallet_for_xmr" : "اگر آپ اپنے Cake والیٹ Monero بیلنس سے XMR کا تبادلہ کرنا چاہتے ہیں، تو براہ کرم پہلے اپنے Monero والیٹ پر جائیں۔", + "confirmed" : "تصدیق شدہ", + "unconfirmed" : "غیر تصدیق شدہ", + "displayable" : "قابل نمائش", + + "submit_request" : "درخواست بھیج دو", + + "buy_alert_content" : "فی الحال ہم صرف Bitcoin اور Litecoin کی خریداری کی حمایت کرتے ہیں۔ Bitcoin یا Litecoin خریدنے کے لیے، براہ کرم اپنا Bitcoin یا Litecoin والیٹ بنائیں یا اس میں سوئچ کریں۔", + "sell_alert_content" : "ہم فی الحال صرف Bitcoin کی فروخت کی حمایت کرتے ہیں۔ Bitcoin فروخت کرنے کے لیے، براہ کرم اپنا Bitcoin والیٹ بنائیں یا اس میں سوئچ کریں۔", + + "outdated_electrum_wallet_description" : "Cake میں بنائے گئے نئے Bitcoin بٹوے میں اب 24 الفاظ کا بیج ہے۔ یہ لازمی ہے کہ آپ ایک نیا Bitcoin والیٹ بنائیں اور اپنے تمام فنڈز کو نئے 24 الفاظ والے والیٹ میں منتقل کریں، اور 12 الفاظ کے بیج والے بٹوے کا استعمال بند کریں۔ براہ کرم اپنے فنڈز کو محفوظ بنانے کے لیے فوری طور پر ایسا کریں۔", + "understand" : "میں سمجھتا ہوں۔", + + "apk_update" : "APK اپ ڈیٹ", + + "buy_bitcoin" : "Bitcoin خریدیں۔", + "buy_with" : "کے ساتھ خریدیں۔", + "moonpay_alert_text" : "رقم کی قدر ${minAmount} ${fiatCurrency} کے برابر یا زیادہ ہونی چاہیے۔", + + "outdated_electrum_wallet_receive_warning" : "اگر اس پرس میں 12 الفاظ کا بیج ہے اور اسے Cake میں بنایا گیا ہے، تو اس بٹوے میں Bitcoin جمع نہ کریں۔ اس بٹوے میں منتقل کیا گیا کوئی بھی BTC ضائع ہو سکتا ہے۔ ایک نیا 24 الفاظ والا والیٹ بنائیں (اوپر دائیں جانب مینو کو تھپتھپائیں، Wallets کو منتخب کریں، نیا والیٹ بنائیں، پھر Bitcoin کو منتخب کریں) اور فوری طور پر اپنے BTC کو وہاں منتقل کریں۔ Cake کے نئے (24-لفظوں) BTC بٹوے محفوظ ہیں۔", + "do_not_show_me" : "مجھے یہ دوبارہ مت دکھانا", + + "unspent_coins_title" : "غیر خرچ شدہ سکے ۔", + "unspent_coins_details_title" : "غیر خرچ شدہ سککوں کی تفصیلات", + "freeze" : "منجمد", + "frozen" : "منجمد", + "coin_control" : "سکے کنٹرول (اختیاری)", + + "address_detected" : "پتہ کا پتہ چلا", + "address_from_domain" : "یہ پتہ نہ رکنے والے ڈومینز پر ${domain} کا ہے۔", + + "add_receiver" : "دوسرا وصول کنندہ شامل کریں (اختیاری)", + + "manage_yats" : "یاٹس کا انتظام کریں۔", + "yat_alert_title" : "Yat کے ساتھ زیادہ آسانی سے کریپٹو بھیجیں اور وصول کریں۔", + "yat_alert_content" : "Cake والیٹ کے صارفین اب ایک قسم کے ایموجی پر مبنی صارف نام کے ساتھ اپنی تمام پسندیدہ کرنسیاں بھیج اور وصول کر سکتے ہیں۔", + "get_your_yat" : "اپنی Yat حاصل کریں۔", + "connect_an_existing_yat" : "ایک موجودہ Yat کو جوڑیں۔", + "connect_yats" : "Yats کو جوڑیں۔", + "yat_address" : "Yat ایڈریس", + "yat" : "Yat", + "address_from_yat" : "یہ پتہ Yat پر ${emoji} کا ہے۔", + "yat_error" : "Yat غلطی", + "yat_error_content" : "اس Yat کے ساتھ کوئی پتے منسلک نہیں ہیں۔ ایک اور یات آزمائیں۔", + "choose_address" : "\\n\\nبراہ کرم پتہ منتخب کریں:", + "yat_popup_title" : "آپ کے بٹوے کا پتہ ایموجائز کیا جا سکتا ہے۔", + "yat_popup_content" : "اب آپ Cake Wallet میں اپنے Yat کے ساتھ کرپٹو بھیج اور وصول کر سکتے ہیں - ایک مختصر، ایموجی پر مبنی صارف نام۔ ترتیبات کی سکرین پر کسی بھی وقت Yats کا نظم کریں۔", + "second_intro_title" : "ان سب پر حکمرانی کے لیے ایک ایموجی ایڈریس", + "second_intro_content" : "آپ کا Yat ایک منفرد ایموجی ایڈریس ہے جو آپ کی تمام کرنسیوں کے لیے آپ کے تمام لمبے ہیکسا ڈیسیمل پتوں کی جگہ لے لیتا ہے۔", + "third_intro_title" : "Yat دوسروں کے ساتھ اچھی طرح کھیلتا ہے۔", + "third_intro_content" : "Yats بھی Cake والیٹ سے باہر رہتے ہیں۔ زمین پر کسی بھی بٹوے کے پتے کو Yat سے تبدیل کیا جا سکتا ہے!", + "learn_more" : "اورجانیے", + "search" : "تلاش کریں۔", + "search_language" : "زبان تلاش کریں۔", + "search_currency" : "کرنسی تلاش کریں۔", + "new_template" : "نیا سانچہ", + "electrum_address_disclaimer" : "جب بھی آپ ایک کا استعمال کرتے ہیں تو ہم نئے پتے تیار کرتے ہیں، لیکن پچھلے پتے کام کرتے رہتے ہیں۔", + "wallet_name_exists" : "اس نام کا پرس پہلے سے موجود ہے۔ براہ کرم ایک مختلف نام منتخب کریں یا پہلے دوسرے بٹوے کا نام تبدیل کریں۔", + "market_place" : "بازار", + "cake_pay_title" : "Cake پے گفٹ کارڈز", + "cake_pay_subtitle" : "رعایتی گفٹ کارڈز خریدیں (صرف امریکہ)", + "cake_pay_web_cards_title" : "Cake پے ویب کارڈز", + "cake_pay_web_cards_subtitle" : "دنیا بھر میں پری پیڈ کارڈز اور گفٹ کارڈز خریدیں۔", + "about_cake_pay" : "Cake پے آپ کو ورچوئل اثاثوں کے ساتھ گفٹ کارڈز آسانی سے خریدنے کی اجازت دیتا ہے، جو ریاستہائے متحدہ میں 150,000 سے زیادہ تاجروں پر فوری طور پر خرچ کیے جا سکتے ہیں۔", + "cake_pay_account_note" : "کارڈز دیکھنے اور خریدنے کے لیے صرف ایک ای میل ایڈریس کے ساتھ سائن اپ کریں۔ کچھ رعایت پر بھی دستیاب ہیں!", + "already_have_account" : "پہلے سے ہی اکاؤنٹ ہے؟", + "create_account" : "اکاؤنٹ بنائیں", + "privacy_policy" : "رازداری کی پالیسی", + "welcome_to_cakepay" : "Cake پے میں خوش آمدید!", + "sign_up" : "سائن اپ", + "forgot_password" : "پاسورڈ بھول گے", + "reset_password" : "پاس ورڈ ری سیٹ", + "gift_cards" : "گفٹ کارڈز", + "setup_your_debit_card" : "اپنا ڈیبٹ کارڈ ترتیب دیں۔", + "no_id_required" : "کوئی ID درکار نہیں۔ ٹاپ اپ اور کہیں بھی خرچ کریں۔", + "how_to_use_card" : "اس کارڈ کو استعمال کرنے کا طریقہ", + "purchase_gift_card" : "گفٹ کارڈ خریدیں۔", + "verification" : "تصدیق", + "fill_code" : "براہ کرم اپنے ای میل پر فراہم کردہ تصدیقی کوڈ کو پُر کریں۔", + "dont_get_code" : "کوڈ نہیں ملتا؟", + "resend_code" : "براہ کرم اسے دوبارہ بھیجیں۔", + "debit_card" : "ڈیبٹ کارڈ", + "cakepay_prepaid_card" : "Cake پے پری پیڈ ڈیبٹ کارڈ", + "no_id_needed" : "شناخت کی ضرورت نہیں!", + "frequently_asked_questions" : "اکثر پوچھے گئے سوالات", + "debit_card_terms" : "اس ڈیجیٹل والیٹ میں آپ کے ادائیگی کارڈ نمبر (اور آپ کے ادائیگی کارڈ نمبر سے متعلقہ اسناد) کا ذخیرہ اور استعمال ادائیگی کارڈ جاری کنندہ کے ساتھ قابل اطلاق کارڈ ہولڈر کے معاہدے کی شرائط و ضوابط کے ساتھ مشروط ہے، جیسا کہ وقتاً فوقتاً نافذ ہوتا ہے۔", + "please_reference_document" : "مزید معلومات کے لیے براہ کرم نیچے دی گئی دستاویزات کا حوالہ دیں۔", + "cardholder_agreement" : "کارڈ ہولڈر کا معاہدہ", + "e_sign_consent" : "ای سائن کنسنٹ", + "agree_and_continue" : "اتفاق کریں اور جاری رکھیں", + "email_address" : "ای میل اڈریس", + "agree_to" : "اکاؤنٹ بنا کر آپ اس سے اتفاق کرتے ہیں۔", + "and" : "اور", + "enter_code" : "کوڈ درج کریں", + "congratulations" : "مبارک ہو!", + "you_now_have_debit_card" : "اب آپ کے پاس ڈیبٹ کارڈ ہے۔", + "min_amount" : "کم سے کم: ${value}", + "max_amount" : "زیادہ سے زیادہ: ${value}", + "enter_amount" : "رقم درج کریں۔", + "billing_address_info" : "اگر آپ سے بلنگ کا پتہ پوچھا جائے تو اپنا شپنگ ایڈریس فراہم کریں۔", + "order_physical_card" : "فزیکل کارڈ آرڈر کریں۔", + "add_value" : "قدر شامل کریں۔", + "activate" : "محرک کریں", + "get_a" : "حاصل", + "digital_and_physical_card" : " ڈیجیٹل اور فزیکل پری پیڈ ڈیبٹ کارڈ", + "get_card_note" : " جسے آپ ڈیجیٹل کرنسیوں کے ساتھ دوبارہ لوڈ کر سکتے ہیں۔ کوئی اضافی معلومات کی ضرورت نہیں!", + "signup_for_card_accept_terms" : "کارڈ کے لیے سائن اپ کریں اور شرائط کو قبول کریں۔", + "add_fund_to_card" : "کارڈز میں پری پیڈ فنڈز شامل کریں (${value} تک)", + "use_card_info_two" : "رقوم کو امریکی ڈالر میں تبدیل کیا جاتا ہے جب پری پیڈ اکاؤنٹ میں رکھا جاتا ہے، ڈیجیٹل کرنسیوں میں نہیں۔", + "use_card_info_three" : "ڈیجیٹل کارڈ آن لائن یا کنٹیکٹ لیس ادائیگی کے طریقوں کے ساتھ استعمال کریں۔", + "optionally_order_card" : "اختیاری طور پر ایک فزیکل کارڈ آرڈر کریں۔", + "hide_details" : "تفصیلات چھپائیں۔", + "show_details" : "تفصیلات دکھائیں", + "upto" : "${value} تک", + "discount" : "${value}% بچائیں", + "gift_card_amount" : "گفٹ کارڈ کی رقم", + "bill_amount" : "بل رقم", + "you_pay" : "تم ادا کرو", + "tip" : "ٹپ:", + "custom" : "اپنی مرضی کے مطابق", + "by_cake_pay" : "Cake پے کے ذریعے", + "expires" : "میعاد ختم", + "mm" : "MM", + "yy" : "YY", + "online" : "آن لائن", + "offline" : "آف لائن", + "gift_card_number" : "گفٹ کارڈ نمبر", + "pin_number" : "پن نمبر", + "total_saving" : "کل بچت", + "last_30_days" : "آخری 30 دن", + "avg_savings" : "اوسط بچت", + "view_all" : "سب دیکھیں", + "active_cards" : "فعال کارڈز", + "delete_account" : "کھاتہ مٹا دو", + "cards" : "کارڈز", + "active" : "فعال", + "redeemed" : "چھڑایا", + "gift_card_balance_note" : "باقی بیلنس والے گفٹ کارڈز یہاں ظاہر ہوں گے۔", + "gift_card_redeemed_note" : "آپ نے جن گفٹ کارڈز کو بھنایا ہے وہ یہاں ظاہر ہوں گے۔", + "logout" : "لاگ آوٹ", + "add_tip" : "ٹپ شامل کریں۔", + "percentageOf" : "${amount} کا", + "is_percentage" : "ہے", + "search_category" : "زمرہ تلاش کریں۔", + "mark_as_redeemed" : "ریڈیم کے بطور نشان زد کریں۔", + "more_options" : "مزید زرائے", + "awaiting_payment_confirmation" : "ادائیگی کی تصدیق کے منتظر", + "transaction_sent_notice" : "اگر اسکرین 1 منٹ کے بعد آگے نہیں بڑھتی ہے، تو بلاک ایکسپلورر اور اپنا ای میل چیک کریں۔", + "agree" : "متفق", + "in_store" : "اسٹور میں", + "generating_gift_card" : "گفٹ کارڈ تیار کرنا", + "payment_was_received" : "آپ کی ادائیگی موصول ہو گئی۔", + "proceed_after_one_minute" : "اگر اسکرین 1 منٹ کے بعد آگے نہیں بڑھتی ہے تو اپنا ای میل چیک کریں۔", + "order_id" : "ID آرڈر کریں۔", + "gift_card_is_generated" : "گفٹ کارڈ بنتا ہے۔", + "open_gift_card" : "گفٹ کارڈ کھولیں۔", + "contact_support" : "سپورٹ سے رابطہ کریں۔", + "gift_cards_unavailable" : "گفٹ کارڈز اس وقت صرف Monero، Bitcoin اور Litecoin کے ساتھ خریداری کے لیے دستیاب ہیں۔", + "introducing_cake_pay" : "Cake پے کا تعارف!", + "cake_pay_learn_more" : "ایپ میں فوری طور پر گفٹ کارڈز خریدیں اور بھنائیں!\\nمزید جاننے کے لیے بائیں سے دائیں سوائپ کریں۔", + "automatic" : "خودکار", + "fixed_pair_not_supported" : "یہ مقررہ جوڑا منتخب کردہ تبادلے کے ساتھ تعاون یافتہ نہیں ہے۔", + "variable_pair_not_supported" : "یہ متغیر جوڑا منتخب ایکسچینجز کے ساتھ تعاون یافتہ نہیں ہے۔", + "none_of_selected_providers_can_exchange" : "منتخب فراہم کنندگان میں سے کوئی بھی یہ تبادلہ نہیں کر سکتا", + "choose_one" : "ایک کا انتخاب کریں", + "choose_from_available_options" : "دستیاب اختیارات میں سے انتخاب کریں:", + "custom_redeem_amount" : "حسب ضرورت چھڑانے کی رقم", + "add_custom_redemption" : "حسب ضرورت چھٹکارا شامل کریں۔", + "remaining" : "باقی", + "delete_wallet" : "پرس کو حذف کریں۔", + "delete_wallet_confirm_message" : "کیا آپ واقعی ${wallet_name} والیٹ کو حذف کرنا چاہتے ہیں؟", + "low_fee" : "کم فیس", + "low_fee_alert" : "آپ فی الحال کم نیٹ ورک فیس کی ترجیح استعمال کر رہے ہیں۔ یہ طویل انتظار، مختلف شرحوں، یا منسوخ شدہ تجارتوں کا سبب بن سکتا ہے۔ ہم بہتر تجربہ کے لیے زیادہ فیس مقرر کرنے کی تجویز کرتے ہیں۔", + "ignor" : "نظر انداز کرنا", + "use_suggested" : "تجویز کردہ استعمال کریں۔", + "do_not_share_warning_text" : "سپورٹ سمیت کسی اور کے ساتھ ان کا اشتراک نہ کریں۔\\n\\nآپ کے فنڈز چوری ہو سکتے ہیں اور ہو جائیں گے!", + "help" : "مدد", + "all_transactions" : "تمام لین دین", + "all_trades" : "تمام تجارت", + "connection_sync" : "کنکشن اور مطابقت پذیری", + "security_and_backup" : "سیکیورٹی اور بیک اپ", + "create_backup" : "بیک اپ بنائیں", + "privacy_settings" : "رازداری کی ترتیبات", + "privacy" : "رازداری", + "display_settings" : "ڈسپلے کی ترتیبات", + "other_settings" : "دیگر ترتیبات", + "require_pin_after" : "اس کے بعد PIN کی ضرورت ہے۔", + "always" : "ہمیشہ", + "minutes_to_pin_code" : "${minute} منٹ", + "disable_exchange" : "تبادلے کو غیر فعال کریں۔", + "advanced_privacy_settings" : "اعلی درجے کی رازداری کی ترتیبات", + "settings_can_be_changed_later" : "ان ترتیبات کو بعد میں ایپ کی ترتیبات میں تبدیل کیا جا سکتا ہے۔", + "add_custom_node" : "نیا کسٹم نوڈ شامل کریں۔", + "disable_fiat" : "فیاٹ کو غیر فعال کریں۔", + "fiat_api" : "Fiat API", + "disabled" : "معذور", + "enabled" : "فعال", + "tor_only" : "صرف Tor", + "unmatched_currencies" : "آپ کے پرس کی موجودہ کرنسی اسکین شدہ QR سے مماثل نہیں ہے۔", + "orbot_running_alert" : "براہ کرم یقینی بنائیں کہ اس نوڈ سے منسلک ہونے سے پہلے Orbot چل رہا ہے۔", + "contact_list_contacts" : "رابطے", + "contact_list_wallets" : "میرے بٹوے", + "send_to_this_address" : "اس پتے پر ${currency} ${tag} بھیجیں۔", + "arrive_in_this_address" : "${currency} ${tag}اس پتے پر پہنچے گا۔", + "do_not_send" : "مت بھیجیں۔", + "error_dialog_content" : "افوہ، ہمیں کچھ خرابی ملی۔\n\nایپلی کیشن کو بہتر بنانے کے لیے براہ کرم کریش رپورٹ ہماری سپورٹ ٹیم کو بھیجیں۔" +} diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 7c0f4ab74..52fc9cd7a 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -398,8 +398,7 @@ "biometric_auth_reason" : "扫描指纹进行身份认证", "version" : "版本 ${currentVersion}", - "openalias_alert_title" : "检测到地址", - "openalias_alert_content" : "您将汇款至\n${recipient_name}", + "extracted_address_content" : "您将汇款至\n${recipient_name}", "card_address" : "地址:", "buy" : "购买", @@ -676,6 +675,12 @@ "enabled": "启用", "tor_only": "仅限 Tor", "unmatched_currencies": "您当前钱包的货币与扫描的 QR 的货币不匹配", + "orbot_running_alert": "请确保 Orbot 在连接到此节点之前正在运行。", "contact_list_contacts": "联系人", - "contact_list_wallets": "我的钱包" + "contact_list_wallets": "我的钱包", + "bitcoin_payments_require_1_confirmation": "比特币支付需要 1 次确认,这可能需要 20 分钟或更长时间。谢谢你的耐心!确认付款后,您将收到电子邮件。", + "send_to_this_address" : "发送 ${currency} ${tag}到这个地址", + "arrive_in_this_address" : "${currency} ${tag}将到达此地址", + "do_not_send": "不要发送", + "error_dialog_content": "糟糕,我们遇到了一些错误。\n\n请将崩溃报告发送给我们的支持团队,以改进应用程序。" } diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index c74d97c0f..ab6051d96 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -14,14 +14,14 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.2.5" -MONERO_COM_BUILD_NUMBER=36 +MONERO_COM_VERSION="1.3.0" +MONERO_COM_BUILD_NUMBER=40 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.5.6" -CAKEWALLET_BUILD_NUMBER=141 +CAKEWALLET_VERSION="4.6.0" +CAKEWALLET_BUILD_NUMBER=146 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" @@ -66,4 +66,4 @@ export APP_ANDROID_NAME export APP_ANDROID_VERSION export APP_ANDROID_BUILD_NUMBER export APP_ANDROID_BUNDLE_ID -export APP_ANDROID_PACKAGE +export APP_ANDROID_PACKAGE \ No newline at end of file diff --git a/scripts/android/build_haven.sh b/scripts/android/build_haven.sh index 5f3c9e50a..f745e942e 100755 --- a/scripts/android/build_haven.sh +++ b/scripts/android/build_haven.sh @@ -1,7 +1,7 @@ #!/bin/sh . ./config.sh -HAVEN_VERSION=tags/v3.0.0 +HAVEN_VERSION=tags/v3.0.7 HAVEN_SRC_DIR=${WORKDIR}/haven git clone https://github.com/haven-protocol-org/haven-main.git ${HAVEN_SRC_DIR} diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index 8588bfcb2..bc5f60355 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.2.5" -MONERO_COM_BUILD_NUMBER=33 +MONERO_COM_VERSION="1.3.0" +MONERO_COM_BUILD_NUMBER=38 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.5.6" -CAKEWALLET_BUILD_NUMBER=138 +CAKEWALLET_VERSION="4.6.0" +CAKEWALLET_BUILD_NUMBER=142 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" HAVEN_NAME="Haven" diff --git a/scripts/ios/build_haven.sh b/scripts/ios/build_haven.sh index 3199e3286..8de8b4c83 100755 --- a/scripts/ios/build_haven.sh +++ b/scripts/ios/build_haven.sh @@ -4,7 +4,7 @@ HAVEN_URL="https://github.com/haven-protocol-org/haven-main.git" HAVEN_DIR_PATH="${EXTERNAL_IOS_SOURCE_DIR}/haven" -HAVEN_VERSION=tags/v3.0.0 +HAVEN_VERSION=tags/v3.0.7 BUILD_TYPE=release PREFIX=${EXTERNAL_IOS_DIR} DEST_LIB_DIR=${EXTERNAL_IOS_LIB_DIR}/haven diff --git a/tool/utils/secret_key.dart b/tool/utils/secret_key.dart index e5202a829..c27bc5ff7 100644 --- a/tool/utils/secret_key.dart +++ b/tool/utils/secret_key.dart @@ -6,17 +6,12 @@ class SecretKey { static final base = [ SecretKey('salt', () => hex.encode(encrypt.Key.fromSecureRandom(16).bytes)), - SecretKey('keychainSalt', - () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), + SecretKey('keychainSalt', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), SecretKey('key', () => hex.encode(encrypt.Key.fromSecureRandom(16).bytes)), - SecretKey( - 'walletSalt', () => hex.encode(encrypt.Key.fromSecureRandom(4).bytes)), - SecretKey( - 'shortKey', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), - SecretKey( - 'backupSalt', () => hex.encode(encrypt.Key.fromSecureRandom(8).bytes)), - SecretKey('backupKeychainSalt', - () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), + SecretKey('walletSalt', () => hex.encode(encrypt.Key.fromSecureRandom(4).bytes)), + SecretKey('shortKey', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), + SecretKey('backupSalt', () => hex.encode(encrypt.Key.fromSecureRandom(8).bytes)), + SecretKey('backupKeychainSalt', () => hex.encode(encrypt.Key.fromSecureRandom(12).bytes)), SecretKey('changeNowApiKey', () => ''), SecretKey('wyreSecretKey', () => ''), SecretKey('wyreApiKey', () => ''), @@ -29,6 +24,9 @@ class SecretKey { SecretKey('anypayToken', () => ''), SecretKey('onramperApiKey', () => ''), SecretKey('ioniaClientId', () => ''), + SecretKey('trocadorApiKey', () => ''), + SecretKey('trocadorExchangeMarkup', () => ''), + SecretKey('twitterBearerToken', () => ''), ]; final String name;