From edd31954b03389949dad4d82fb19311e333f99e4 Mon Sep 17 00:00:00 2001 From: Justin Ehrenhofer Date: Thu, 10 Aug 2023 07:36:18 -0500 Subject: [PATCH 1/9] Minor changes: Update privacy policy (#1029) Minor changes, including: * Better reference Fiat API service and the ability to turn it off * Better reference optional Error logs sending * Minor other clarifications --- PRIVACY.md | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index d740dcba8..88f180c5e 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,6 +1,6 @@ Privacy Policy -Last modified: July 21, 2022 +Last modified: August 9, 2023 Introduction ============ @@ -13,7 +13,7 @@ Introduction - On this App. - In email, text, and other electronic messages between you and this App. It does not apply to information collected by: - - Us offline or through any other means, including on any other App operated by Company or any third party (including our affiliates and subsidiaries)]; or + - Us offline or through any other means, including on any other App operated by Company or any third party (including our affiliates and subsidiaries); or - Any third party (including our affiliates and subsidiaries), including through any application or content (including advertising) that may link to or be accessible from or on the App. Please read this policy carefully to understand our policies and practices regarding your information and how we will treat it. If you do not agree with our policies and practices, you have the choice to not use the App. By accessing or using this App, you agree to this privacy policy. This policy may change from time to time. Your continued use of this App after we make changes is deemed to be acceptance of those changes, so please check the policy periodically for updates. @@ -25,7 +25,7 @@ Definitions - "Node" means a server on a supported cryptocurrency network which transmits data to your App for processing and synchronization, and to which your Device transmits transactions which you would like to submit to the supported cryptocurrency networks. This includes full nodes, Electrum servers, and lightning network nodes. - "Cake Labs Nodes" refers to the set of cryptocurrency nodes operated and maintained by Cake Labs LLC. - "Service" refers to the App. - - "Third-party Service" refers to any service integrated into the App. This includes but is not limited to ChangeNOW, Wyre, MoonPay, and BlockBuy. + - "Third-party Service" refers to any service integrated into the App. This includes but is not limited to ChangeNOW, Onramper, and MoonPay. - "Usage Data" refers to data collected automatically about your usage of an App. - "You" means the individual, group, corporation, or any other entity accessing or using the Service. @@ -40,26 +40,29 @@ Information We Never Receive Nor Collect Information We May Receive But Do Not Retain -------------------------------------------- - We receive but do NOT store information from and about users of our App, including: + We may receive but do NOT store information from and about users of our App, including: - The device IP address, the block height to which your wallet is synchronized, and any transactions or channels which you use our Node to submit to supported cryptocurrency networks. We receive this information: - - Automatically as you use the App. + - Automatically as you use the App, unless you turn certain features off in your App privacy settings. - This data is provided by connecting to the Nodes and price API maintained by Cake Labs. You have the right to choose not to provide synchronization data to Cake Labs by choosing a different Node. We provide a list of Nodes in the app that include our own and third party Nodes, or you can use your own Node (which we recommend). + This data is provided by connecting to the Nodes and price API maintained by Cake Labs. You have the right to choose not to provide synchronization data to Cake Labs by choosing a different Node. We provide a list of Nodes in the app that include our own and third party Nodes, or you can use your own Node (which we recommend). You have the right to choose not to connect to our Fiat API service by disabling this Fiat API in App privacy settings. - Personal Data sent through the Cake Labs Nodes is limited to your device's IP address, the block height to which your wallet is synchronized, and any transactions or channels which you use our Node to submit to the supported cryptocurrency networks. Personal Data received by Cake Labs in this manner is not stored for any length of time, and thus Cake Labs is both unwilling to and incapable of sharing this data, or using it for any purpose beyond ensuring your appropriate connection to our Nodes. + Personal Data that may be sent through the Cake Labs Nodes is limited to your device's IP address, the block height to which your wallet is synchronized, and any transactions or channels which you use our Node to submit to the supported cryptocurrency networks. Personal Data received by Cake Labs in this manner is not stored for any length of time, and thus Cake Labs is incapable of sharing this data and will not use it for any purpose beyond ensuring your appropriate connection to our Nodes. If you decide to use a Node offered by any third party, some of which we include in our Apps, said third party will receive this Personal Data instead of Cake Labs. We take no responsibility for the actions of any third-party Node offered within the Application. We recommend connecting to your own Node to limit third party sharing of your Personal Information. + If you use our Fiat API service, you will share your IP address and the cryptocurrency and fiat currency exchange pair for which your wallet requests a spot price quote. You can disable this Fiat API in App privacy settings. + Information We May Collect About You and How We Collect It ---------------------------------------------------------- We collect several types of information from and about users of our App, including information: - - By which you may be personally identified, such as name, e-mail address, or and a/any other identifier by which you may be contacted online or offline ("personal information" or "Personal Data”), ONLY when you provide it to us; + - By which you may be personally identified, such as name, e-mail address, or and a/any other identifier by which you may be contacted online or offline ("personal information" or "Personal Data”); + - Device data and error log data; We collect this information: - - Directly from you when you provide it to us. + - Directly from you ONLY when you provide it to us. - Personal information is received by Cake Labs ONLY in the event that you choose to provide it to us by voluntarily contacting Cake Labs regarding support, questions or suggestions. + Personal information is received by Cake Labs ONLY in the event that you choose to provide it to us by voluntarily contacting Cake Labs regarding support, questions or suggestions. You may optionally send us Error reports to help us improve the App. These Error reports contain error logs and basic device data. You can review and make modifications to these Error reports before sending them to us, or you may choose not to send them to us at all. How We Use Your Information --------------------------- @@ -112,7 +115,9 @@ Data Security Links to Other Websites ----------------------- - The App may contain links to other websites that are not operated by us. If you click on a third-party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services. + The App may contain links to other websites that are not operated by us. If you click on a Third-Party Service link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit. We have no control over and assume no responsibility for the content, privacy policies or practices of any third-party sites or services. + + The App includes several optional Third-Party Services, which may not be available to all users. If you use Third-Party Services, you must agree to their respective Privacy Policies. Changes to Our Privacy Policy ----------------------------- From 21c656fdc3174328836ced3076341bf56466575f Mon Sep 17 00:00:00 2001 From: Justin Ehrenhofer Date: Thu, 10 Aug 2023 07:37:38 -0500 Subject: [PATCH 2/9] Add PYUSD to token list [skip ci] (#1027) PayPal USD (PYUSD) is disabled by default, to appear only in the token search list. https://github.com/paxosglobal/pyusd-contract --- cw_ethereum/lib/default_erc20_tokens.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cw_ethereum/lib/default_erc20_tokens.dart b/cw_ethereum/lib/default_erc20_tokens.dart index 241e301ce..8c38e2e64 100644 --- a/cw_ethereum/lib/default_erc20_tokens.dart +++ b/cw_ethereum/lib/default_erc20_tokens.dart @@ -283,6 +283,13 @@ class DefaultErc20Tokens { decimal: 18, enabled: false, ), + Erc20Token( + name: "PayPal USD", + symbol: "PYUSD", + contractAddress: "0x6c3ea9036406852006290770bedfcaba0e23a0e8", + decimal: 6, + enabled: false, + ), ]; List get initialErc20Tokens => _defaultTokens.map((token) { From e348f124917765f6b16f2d39a78fabf407390513 Mon Sep 17 00:00:00 2001 From: Justin Ehrenhofer Date: Thu, 10 Aug 2023 07:38:53 -0500 Subject: [PATCH 3/9] Update UD domains (#1017) * Try adding `.eth` to UD service * Remove eth and coin, add other supported https://api.unstoppabledomains.com/resolve/supported_tlds https://unstoppabledomains.com/blog/categories/announcements/article/coin --- lib/entities/parse_address_from_domain.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/entities/parse_address_from_domain.dart b/lib/entities/parse_address_from_domain.dart index 8ac9bb51f..c0eab6d65 100644 --- a/lib/entities/parse_address_from_domain.dart +++ b/lib/entities/parse_address_from_domain.dart @@ -19,14 +19,19 @@ class AddressResolver { 'crypto', 'zil', 'x', - 'coin', 'wallet', 'bitcoin', '888', 'nft', 'dao', 'blockchain', - 'polygon' + 'polygon', + 'klever', + 'hi', + 'kresus', + 'anime', + 'manga', + 'binanceus' ]; static String? extractAddressByType({required String raw, required CryptoCurrency type}) { From af9b5ff10ce2a6a59afa94e17658c25d65a20c99 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Thu, 10 Aug 2023 15:42:53 +0200 Subject: [PATCH 4/9] Cw 397 chatwoot live support (#1011) * initial button refactor and gradient background * CW-397 Use a separate Hive instance to avoid Issues with plugins using Hive * CW-397 Add Support Page Strings * CW-397 Add new Support Page * CW-397 Add Support Live Chat Page * CW-397 Add Hive Type Ids Doc * CW-397 Use Newer Chatwoot SDK Version and add new Images * CW-397 Update pubspec_base.yaml * CW-397 Add own Chatwoot Widget * Lowercase `s` skip-ci * CW-397 Fix WebMessageListener * CW-397 Fix Merge conflicts * CW-397 Add Erc20 Hive Type ID * CW-397 Fix Ethereum Hive Error * CW-397 Revert to Restore Button * CW-397 Only use In App chat on mobile * CW-397 Move Chatwoot Website Token to secrets * CW-397 Add Chatwoot Website Token to workflow * CW-397 Move Chatwoot fetchUrl to Support View Model --------- Co-authored-by: Rafael Saes Co-authored-by: Justin Ehrenhofer --- .github/workflows/pr_test_build.yml | 1 + assets/images/live_support.png | Bin 0 -> 1776 bytes assets/images/more_links.png | Bin 0 -> 1889 bytes assets/images/wallet_guides.png | Bin 0 -> 1760 bytes cw_core/lib/cake_hive.dart | 4 + cw_core/lib/erc20_token.dart | 3 +- cw_core/lib/hive_type_ids.dart | 13 +++ cw_core/lib/node.dart | 3 +- cw_core/lib/unspent_coins_info.dart | 5 +- cw_core/lib/wallet_info.dart | 8 +- cw_core/lib/wallet_type.dart | 4 +- cw_ethereum/lib/ethereum_wallet.dart | 7 +- lib/anonpay/anonpay_invoice_info.dart | 3 +- lib/buy/order.dart | 7 +- lib/core/backup_service.dart | 13 +-- lib/di.dart | 8 ++ lib/entities/contact.dart | 7 +- lib/entities/get_encryption_key.dart | 17 ++- lib/entities/template.dart | 3 +- lib/entities/transaction_description.dart | 3 +- lib/exchange/exchange_template.dart | 3 +- lib/exchange/trade.dart | 5 +- lib/main.dart | 70 +++++++------ lib/router.dart | 13 ++- lib/routes.dart | 2 + .../screens/restore/restore_options_page.dart | 2 - .../restore/widgets/restore_button.dart | 20 ++-- .../widgets/settings_cell_with_arrow.dart | 7 +- lib/src/screens/support/support_page.dart | 99 +++++++++++------- .../support/widgets/support_tiles.dart | 69 ++++++++++++ .../support_chat/support_chat_page.dart | 38 +++++++ .../support_chat/widgets/chatwoot_widget.dart | 62 +++++++++++ .../support_other_links_page.dart | 58 ++++++++++ lib/view_model/support_view_model.dart | 29 +++-- pubspec_base.yaml | 1 + res/values/strings_ar.arb | 26 +++-- res/values/strings_bg.arb | 8 +- res/values/strings_cs.arb | 8 +- res/values/strings_de.arb | 10 +- res/values/strings_en.arb | 8 +- res/values/strings_es.arb | 8 +- res/values/strings_fr.arb | 8 +- res/values/strings_ha.arb | 8 +- res/values/strings_hi.arb | 8 +- res/values/strings_hr.arb | 8 +- res/values/strings_id.arb | 8 +- res/values/strings_it.arb | 8 +- res/values/strings_ja.arb | 26 +++-- res/values/strings_ko.arb | 26 +++-- res/values/strings_my.arb | 26 +++-- res/values/strings_nl.arb | 8 +- res/values/strings_pl.arb | 8 +- res/values/strings_pt.arb | 8 +- res/values/strings_ru.arb | 27 +++-- res/values/strings_th.arb | 26 +++-- res/values/strings_tr.arb | 8 +- res/values/strings_uk.arb | 8 +- res/values/strings_ur.arb | 26 +++-- res/values/strings_yo.arb | 26 +++-- res/values/strings_zh.arb | 26 +++-- tool/append_translation.dart | 66 ++++++++++++ tool/update_secrets.dart | 3 +- tool/utils/secret_key.dart | 1 + 63 files changed, 762 insertions(+), 260 deletions(-) create mode 100644 assets/images/live_support.png create mode 100644 assets/images/more_links.png create mode 100644 assets/images/wallet_guides.png create mode 100644 cw_core/lib/cake_hive.dart create mode 100644 cw_core/lib/hive_type_ids.dart create mode 100644 lib/src/screens/support/widgets/support_tiles.dart create mode 100644 lib/src/screens/support_chat/support_chat_page.dart create mode 100644 lib/src/screens/support_chat/widgets/chatwoot_widget.dart create mode 100644 lib/src/screens/support_other_links/support_other_links_page.dart create mode 100644 tool/append_translation.dart diff --git a/.github/workflows/pr_test_build.yml b/.github/workflows/pr_test_build.yml index e2b932202..47378eef5 100644 --- a/.github/workflows/pr_test_build.yml +++ b/.github/workflows/pr_test_build.yml @@ -127,6 +127,7 @@ jobs: echo "const fiatApiKey = '${{ secrets.FIAT_API_KEY }}';" >> lib/.secrets.g.dart echo "const payfuraApiKey = '${{ secrets.PAYFURA_API_KEY }}';" >> lib/.secrets.g.dart echo "const etherScanApiKey = '${{ secrets.ETHER_SCAN_API_KEY }}';" >> cw_ethereum/lib/.secrets.g.dart + echo "const chatwootWebsiteToken = '${{ secrets.CHATWOOT_WEBSITE_TOKEN }}';" >> lib/.secrets.g.dart - name: Rename app run: echo -e "id=com.cakewallet.test\nname=$GITHUB_HEAD_REF" > /opt/android/cake_wallet/android/app.properties diff --git a/assets/images/live_support.png b/assets/images/live_support.png new file mode 100644 index 0000000000000000000000000000000000000000..89ad61f458cddcb9ee9c17f751c1d545137d6d95 GIT binary patch literal 1776 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 b(vE)tR=vS9SH@o300000NkvXXu0mjfr1x?h literal 0 HcmV?d00001 diff --git a/assets/images/wallet_guides.png b/assets/images/wallet_guides.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2d9f27059e0ee31cdc7016cbd0ea5caeb93f53 GIT binary patch literal 1760 zcmV<61|Ru}P)ycPI=n#LH)xTNDj_PPN=R&I!iuhF5fV$MYZg^^-NhhOu_$W0V1-1o zf@M;PeVr$$D^VqG>@&>oxyPu8rYExRPwqK0=bLZ7nQMf9jnOUYzyA_0b|_zJ05%$e zL6`4$h@iU!(DTg4ob|j*-Q8~=;PKrN^>07M8NB6aY6qG*j5~AMCWH+{KqLTU2jrOK z9Qccn^dA2K@sj|%GJkFTbael-`IuhiD>om%Glg@GBwts*q5-^uLtgn78{J@oC>HF) zcf`1yi+6mH%nN;{jHNnzq1U9tz3cN4oO7rn-42X-)q$?gyHpE`hN8gN)S}}P!_k$6 z^l?TO;L*>cS6{<9Mv{=Qm2Jq1vmrsPAv8=Nwl9Yy7`=8^f}Dg-o~OINTss-V8;-PC zEQYdsf!h}MF!%?;Xf}3;k=CKO@*#-%Iywh&{N&pFjhsnHX_zX5NenA6B@V|~A^Z{b`6i7HHpr9j&rJ$}Eq@)IIbRa@Qfg~7SOm2eh z-#$J)+`mly|8#^W41yEM_laeFMOHnpR8He92gkmm1~Sy5Nq=I~^nsTcltKlWa~mC^4V`AAkR=az+qQ!74=6IP0es zua?B7ArW`J>aYgwjf{k}q#gb~#@Ikv6HKENkrMh%%(x%UG>ECx4uxN{(qmNWN(fzf zPBKAvE=oFII}@$Ay<;_I>*46-h#7W~i8R0r#;B#92=W|+EN61Ug_NWm9O3nw%L$Y2 zizX9FHEsC$h7C6CLYI*#*DPpV_JgajUU&JL&ynx(k>vjF&cogvc+1hS=gPvu2`I9T zwbUoeM!@VaD=_3dQ256`eR?|LP~GE=9(;bz3f%C@h*T3bl+})I1TD2yT2bIuf_pes z*d&7xhrF#lLG8)46Yf=DDv0vY`WZf713Pb)B*yuFJU_#eCMid92$}AZ7c?}4;gGRP zTXdqDG?>Wg)Kpb$%?{-iXNM6YE?#!}ZXLCC+PuX=A2QVN%w{=1Wlkuoj?#Mi8yz0WKK16XLLBvKWdP2~ghu?g;c+|}}6LxF2o&`ed+#?g> zzI64G6-f%p)e!9=|E{nC~8KLV{-J0o-DRXK&K64D=IPtEg)`MmYz}eePIL{!Q zVHhq=vm0-lB=BC>&~4ROo|rY%q$A`KtyQe;IXAw$v3SN=!L>pwuhs}r;We$yQKdCY z`drqBt!fsIwE6(iK0pxH5mT;kJ)onea{^Cs4W6?DeXBDrY}`d@V{Hp-TZjdL=vNHl z$PDm`U6%z~aW2r(TBJ~LcESlRj?!epux9u{v&Tz1)I^F`g2*DzjzmQob)#}q)zgf4 z*GyQ7AVm?e_2M0fzb9J1#Vt&A5Q7>4Z|fOAvz zg4}C$5T@&Aom~h{2`aEmS9tP|7|@$Awa!5M0$7}-h(AP60@i7oGfq_Up2b5dmwCqB zz`Z%1UE2KPonvTu)s9=+@;1L1_Lj?GmwD4r=Yo{zh6yc4m3EG+{#XMd?EpRSA8(`q zk{@ugm31NWn&0Qneb(bfiD>zBeevGW*1_tJI{yH@j noteRaw ?? ''; set note(String value) => noteRaw = value; -} \ No newline at end of file +} diff --git a/cw_core/lib/wallet_info.dart b/cw_core/lib/wallet_info.dart index a25702cf7..6b3fa9e98 100644 --- a/cw_core/lib/wallet_info.dart +++ b/cw_core/lib/wallet_info.dart @@ -1,7 +1,7 @@ -import 'package:flutter/foundation.dart'; -import 'package:hive/hive.dart'; -import 'package:cw_core/wallet_type.dart'; import 'dart:async'; +import 'package:cw_core/hive_type_ids.dart'; +import 'package:cw_core/wallet_type.dart'; +import 'package:hive/hive.dart'; part 'wallet_info.g.dart'; @@ -30,7 +30,7 @@ class WalletInfo extends HiveObject { yatEid, yatLastUsedAddressRaw, showIntroCakePayCard); } - static const typeId = 4; + static const typeId = WALLET_INFO_TYPE_ID; static const boxName = 'WalletInfo'; @HiveField(0, defaultValue: '') diff --git a/cw_core/lib/wallet_type.dart b/cw_core/lib/wallet_type.dart index a65839041..62c2ad410 100644 --- a/cw_core/lib/wallet_type.dart +++ b/cw_core/lib/wallet_type.dart @@ -1,4 +1,5 @@ import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/hive_type_ids.dart'; import 'package:hive/hive.dart'; part 'wallet_type.g.dart'; @@ -10,9 +11,8 @@ const walletTypes = [ WalletType.haven, WalletType.ethereum, ]; -const walletTypeTypeId = 5; -@HiveType(typeId: walletTypeTypeId) +@HiveType(typeId: WALLET_TYPE_TYPE_ID) enum WalletType { @HiveField(0) monero, diff --git a/cw_ethereum/lib/ethereum_wallet.dart b/cw_ethereum/lib/ethereum_wallet.dart index ae05e6a4f..967a116e6 100644 --- a/cw_ethereum/lib/ethereum_wallet.dart +++ b/cw_ethereum/lib/ethereum_wallet.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'dart:math'; import 'package:cw_core/crypto_currency.dart'; +import 'package:cw_core/cake_hive.dart'; import 'package:cw_core/node.dart'; import 'package:cw_core/pathForWallet.dart'; import 'package:cw_core/pending_transaction.dart'; @@ -58,8 +59,8 @@ abstract class EthereumWalletBase this.walletInfo = walletInfo; transactionHistory = EthereumTransactionHistory(walletInfo: walletInfo, password: password); - if (!Hive.isAdapterRegistered(Erc20Token.typeId)) { - Hive.registerAdapter(Erc20TokenAdapter()); + if (!CakeHive.isAdapterRegistered(Erc20Token.typeId)) { + CakeHive.registerAdapter(Erc20TokenAdapter()); } _sharedPrefs.complete(SharedPreferences.getInstance()); @@ -95,7 +96,7 @@ abstract class EthereumWalletBase Completer _sharedPrefs = Completer(); Future init() async { - erc20TokensBox = await Hive.openBox(Erc20Token.boxName); + erc20TokensBox = await CakeHive.openBox(Erc20Token.boxName); await walletAddresses.init(); await transactionHistory.init(); _privateKey = await getPrivateKey(_mnemonic, _password); diff --git a/lib/anonpay/anonpay_invoice_info.dart b/lib/anonpay/anonpay_invoice_info.dart index 89613224e..bd6776d00 100644 --- a/lib/anonpay/anonpay_invoice_info.dart +++ b/lib/anonpay/anonpay_invoice_info.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/anonpay/anonpay_info_base.dart'; +import 'package:cw_core/hive_type_ids.dart'; import 'package:cw_core/keyable.dart'; import 'package:hive/hive.dart'; @@ -35,7 +36,7 @@ class AnonpayInvoiceInfo extends HiveObject with Keyable implements AnonpayInfoB @HiveField(13) final String provider; - static const typeId = 10; + static const typeId = ANONPAY_INVOICE_INFO_TYPE_ID; static const boxName = 'AnonpayInvoiceInfo'; AnonpayInvoiceInfo({ diff --git a/lib/buy/order.dart b/lib/buy/order.dart index 387fbcd34..5a677d291 100644 --- a/lib/buy/order.dart +++ b/lib/buy/order.dart @@ -1,7 +1,8 @@ import 'package:cake_wallet/buy/buy_provider_description.dart'; -import 'package:hive/hive.dart'; import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cw_core/format_amount.dart'; +import 'package:cw_core/hive_type_ids.dart'; +import 'package:hive/hive.dart'; part 'order.g.dart'; @@ -26,7 +27,7 @@ class Order extends HiveObject { } } - static const typeId = 8; + static const typeId = ORDER_TYPE_ID; static const boxName = 'Orders'; static const boxKey = 'ordersBoxKey'; @@ -66,4 +67,4 @@ class Order extends HiveObject { BuyProviderDescription.deserialize(raw: providerRaw); String amountFormatted() => formatAmount(amount); -} \ No newline at end of file +} diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 2e27d83c9..6476891ed 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; -import 'package:cake_wallet/entities/cake_2fa_preset_options.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; @@ -10,6 +9,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:cryptography/cryptography.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:archive/archive_io.dart'; +import 'package:cw_core/cake_hive.dart'; import 'package:cake_wallet/core/key_service.dart'; import 'package:cake_wallet/entities/encrypt.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; @@ -17,6 +17,7 @@ import 'package:cake_wallet/entities/secret_store_key.dart'; import 'package:cw_core/wallet_info.dart'; import 'package:cake_wallet/.secrets.g.dart' as secrets; import 'package:cake_wallet/wallet_types.g.dart'; + import 'package:cake_backup/backup.dart' as cake_backup; class BackupService { @@ -170,14 +171,14 @@ class BackupService { Future> _reloadHiveWalletInfoBox() async { final appDir = await getApplicationDocumentsDirectory(); - await Hive.close(); - Hive.init(appDir.path); + await CakeHive.close(); + CakeHive.init(appDir.path); - if (!Hive.isAdapterRegistered(WalletInfo.typeId)) { - Hive.registerAdapter(WalletInfoAdapter()); + if (!CakeHive.isAdapterRegistered(WalletInfo.typeId)) { + CakeHive.registerAdapter(WalletInfoAdapter()); } - return await Hive.openBox(WalletInfo.boxName); + return await CakeHive.openBox(WalletInfo.boxName); } Future _importPreferencesDump() async { diff --git a/lib/di.dart b/lib/di.dart index b02742e64..2a54c85a3 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -36,6 +36,8 @@ import 'package:cake_wallet/src/screens/setup_2fa/modify_2fa_page.dart'; import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_qr_page.dart'; import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa.dart'; import 'package:cake_wallet/src/screens/setup_2fa/setup_2fa_enter_code_page.dart'; +import 'package:cake_wallet/src/screens/support_chat/support_chat_page.dart'; +import 'package:cake_wallet/src/screens/support_other_links/support_other_links_page.dart'; import 'package:cake_wallet/src/screens/wallet/wallet_edit_page.dart'; import 'package:cake_wallet/themes/theme_list.dart'; import 'package:cake_wallet/utils/device_info.dart'; @@ -869,6 +871,12 @@ Future setup({ getIt.registerFactory(() => SupportPage(getIt.get())); + getIt.registerFactory(() => + SupportChatPage( + getIt.get(), secureStorage: getIt.get())); + + getIt.registerFactory(() => SupportOtherLinksPage(getIt.get())); + getIt.registerFactory(() { final wallet = getIt.get().wallet; diff --git a/lib/entities/contact.dart b/lib/entities/contact.dart index e111429ca..cd4fa55a2 100644 --- a/lib/entities/contact.dart +++ b/lib/entities/contact.dart @@ -1,8 +1,7 @@ -import 'package:flutter/foundation.dart'; -import 'package:hive/hive.dart'; import 'package:cw_core/crypto_currency.dart'; -import 'package:cake_wallet/utils/mobx.dart'; +import 'package:cw_core/hive_type_ids.dart'; import 'package:cw_core/keyable.dart'; +import 'package:hive/hive.dart'; part 'contact.g.dart'; @@ -14,7 +13,7 @@ class Contact extends HiveObject with Keyable { } } - static const typeId = 0; + static const typeId = CONTACT_TYPE_ID; static const boxName = 'Contacts'; @HiveField(0, defaultValue: '') diff --git a/lib/entities/get_encryption_key.dart b/lib/entities/get_encryption_key.dart index 5fc4983d7..e67380bb8 100644 --- a/lib/entities/get_encryption_key.dart +++ b/lib/entities/get_encryption_key.dart @@ -1,23 +1,18 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:hive/hive.dart'; +import 'package:cw_core/cake_hive.dart'; Future> getEncryptionKey( {required String forKey, required FlutterSecureStorage secureStorage}) async { - final stringifiedKey = - await secureStorage.read(key: 'transactionDescriptionsBoxKey'); + final stringifiedKey = await secureStorage.read(key: 'transactionDescriptionsBoxKey'); List key; if (stringifiedKey == null) { - key = Hive.generateSecureKey(); + key = CakeHive.generateSecureKey(); final keyStringified = key.join(','); - await secureStorage.write( - key: 'transactionDescriptionsBoxKey', value: keyStringified); + await secureStorage.write(key: 'transactionDescriptionsBoxKey', value: keyStringified); } else { - key = stringifiedKey - .split(',') - .map((i) => int.parse(i)) - .toList(); + key = stringifiedKey.split(',').map((i) => int.parse(i)).toList(); } return key; -} \ No newline at end of file +} diff --git a/lib/entities/template.dart b/lib/entities/template.dart index 6955136e0..7cdd2c74a 100644 --- a/lib/entities/template.dart +++ b/lib/entities/template.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/hive_type_ids.dart'; import 'package:hive/hive.dart'; part 'template.g.dart'; @@ -14,7 +15,7 @@ class Template extends HiveObject { required this.amountFiatRaw, this.additionalRecipientsRaw}); - static const typeId = 6; + static const typeId = TEMPLATE_TYPE_ID; static const boxName = 'Template'; @HiveField(0) diff --git a/lib/entities/transaction_description.dart b/lib/entities/transaction_description.dart index 86d6b043a..088f9c480 100644 --- a/lib/entities/transaction_description.dart +++ b/lib/entities/transaction_description.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/hive_type_ids.dart'; import 'package:hive/hive.dart'; part 'transaction_description.g.dart'; @@ -6,7 +7,7 @@ part 'transaction_description.g.dart'; class TransactionDescription extends HiveObject { TransactionDescription({required this.id, this.recipientAddress, this.transactionNote}); - static const typeId = 2; + static const typeId = TRANSACTION_TYPE_ID; static const boxName = 'TransactionDescriptions'; static const boxKey = 'transactionDescriptionsBoxKey'; diff --git a/lib/exchange/exchange_template.dart b/lib/exchange/exchange_template.dart index dcfd8d8e8..2182efd8c 100644 --- a/lib/exchange/exchange_template.dart +++ b/lib/exchange/exchange_template.dart @@ -1,3 +1,4 @@ +import 'package:cw_core/hive_type_ids.dart'; import 'package:hive/hive.dart'; part 'exchange_template.g.dart'; @@ -14,7 +15,7 @@ class ExchangeTemplate extends HiveObject { required this.depositCurrencyTitleRaw, required this.receiveCurrencyTitleRaw}); - static const typeId = 7; + static const typeId = EXCHANGE_TEMPLATE_TYPE_ID; static const boxName = 'ExchangeTemplate'; @HiveField(0) diff --git a/lib/exchange/trade.dart b/lib/exchange/trade.dart index 70dfa5713..db8c8fb3b 100644 --- a/lib/exchange/trade.dart +++ b/lib/exchange/trade.dart @@ -1,8 +1,9 @@ -import 'package:hive/hive.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cw_core/format_amount.dart'; +import 'package:cw_core/hive_type_ids.dart'; +import 'package:hive/hive.dart'; part 'trade.g.dart'; @@ -41,7 +42,7 @@ class Trade extends HiveObject { } } - static const typeId = 3; + static const typeId = TRADE_TYPE_ID; static const boxName = 'Trades'; static const boxKey = 'tradesBoxKey'; diff --git a/lib/main.dart b/lib/main.dart index e0cf58e62..62a0bfc9c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,6 +7,7 @@ import 'package:cake_wallet/locales/locale.dart'; import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; +import 'package:cw_core/hive_type_ids.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -38,6 +39,7 @@ import 'package:uni_links/uni_links.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; +import 'package:cw_core/cake_hive.dart'; final navigatorKey = GlobalKey(); final rootKey = GlobalKey(); @@ -57,7 +59,7 @@ Future main() async { return true; }; - await Hive.close(); + await CakeHive.close(); await initializeAppConfigs(); @@ -69,50 +71,50 @@ Future main() async { Future initializeAppConfigs() async { final appDir = await getApplicationDocumentsDirectory(); - Hive.init(appDir.path); + CakeHive.init(appDir.path); - if (!Hive.isAdapterRegistered(Contact.typeId)) { - Hive.registerAdapter(ContactAdapter()); + if (!CakeHive.isAdapterRegistered(Contact.typeId)) { + CakeHive.registerAdapter(ContactAdapter()); } - if (!Hive.isAdapterRegistered(Node.typeId)) { - Hive.registerAdapter(NodeAdapter()); + if (!CakeHive.isAdapterRegistered(Node.typeId)) { + CakeHive.registerAdapter(NodeAdapter()); } - if (!Hive.isAdapterRegistered(TransactionDescription.typeId)) { - Hive.registerAdapter(TransactionDescriptionAdapter()); + if (!CakeHive.isAdapterRegistered(TransactionDescription.typeId)) { + CakeHive.registerAdapter(TransactionDescriptionAdapter()); } - if (!Hive.isAdapterRegistered(Trade.typeId)) { - Hive.registerAdapter(TradeAdapter()); + if (!CakeHive.isAdapterRegistered(Trade.typeId)) { + CakeHive.registerAdapter(TradeAdapter()); } - if (!Hive.isAdapterRegistered(WalletInfo.typeId)) { - Hive.registerAdapter(WalletInfoAdapter()); + if (!CakeHive.isAdapterRegistered(WalletInfo.typeId)) { + CakeHive.registerAdapter(WalletInfoAdapter()); } - if (!Hive.isAdapterRegistered(walletTypeTypeId)) { - Hive.registerAdapter(WalletTypeAdapter()); + if (!CakeHive.isAdapterRegistered(WALLET_TYPE_TYPE_ID)) { + CakeHive.registerAdapter(WalletTypeAdapter()); } - if (!Hive.isAdapterRegistered(Template.typeId)) { - Hive.registerAdapter(TemplateAdapter()); + if (!CakeHive.isAdapterRegistered(Template.typeId)) { + CakeHive.registerAdapter(TemplateAdapter()); } - if (!Hive.isAdapterRegistered(ExchangeTemplate.typeId)) { - Hive.registerAdapter(ExchangeTemplateAdapter()); + if (!CakeHive.isAdapterRegistered(ExchangeTemplate.typeId)) { + CakeHive.registerAdapter(ExchangeTemplateAdapter()); } - if (!Hive.isAdapterRegistered(Order.typeId)) { - Hive.registerAdapter(OrderAdapter()); + if (!CakeHive.isAdapterRegistered(Order.typeId)) { + CakeHive.registerAdapter(OrderAdapter()); } - if (!isMoneroOnly && !Hive.isAdapterRegistered(UnspentCoinsInfo.typeId)) { - Hive.registerAdapter(UnspentCoinsInfoAdapter()); + if (!isMoneroOnly && !CakeHive.isAdapterRegistered(UnspentCoinsInfo.typeId)) { + CakeHive.registerAdapter(UnspentCoinsInfoAdapter()); } - if (!Hive.isAdapterRegistered(AnonpayInvoiceInfo.typeId)) { - Hive.registerAdapter(AnonpayInvoiceInfoAdapter()); + if (!CakeHive.isAdapterRegistered(AnonpayInvoiceInfo.typeId)) { + CakeHive.registerAdapter(AnonpayInvoiceInfoAdapter()); } final secureStorage = FlutterSecureStorage(); @@ -120,21 +122,21 @@ Future initializeAppConfigs() async { await getEncryptionKey(secureStorage: secureStorage, forKey: TransactionDescription.boxKey); final tradesBoxKey = await getEncryptionKey(secureStorage: secureStorage, forKey: Trade.boxKey); final ordersBoxKey = await getEncryptionKey(secureStorage: secureStorage, forKey: Order.boxKey); - final contacts = await Hive.openBox(Contact.boxName); - final nodes = await Hive.openBox(Node.boxName); - final transactionDescriptions = await Hive.openBox( + final contacts = await CakeHive.openBox(Contact.boxName); + final nodes = await CakeHive.openBox(Node.boxName); + final transactionDescriptions = await CakeHive.openBox( TransactionDescription.boxName, encryptionKey: transactionDescriptionsBoxKey); - final trades = await Hive.openBox(Trade.boxName, encryptionKey: tradesBoxKey); - final orders = await Hive.openBox(Order.boxName, encryptionKey: ordersBoxKey); - final walletInfoSource = await Hive.openBox(WalletInfo.boxName); - final templates = await Hive.openBox