From 8bd734c110dc1881317eab2a627fd4ec22cca1fc Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Thu, 19 May 2022 11:44:06 +0200 Subject: [PATCH 01/41] [DDW-809] Ensure all local storage data is reset --- source/main/ipc/electronStoreConversation.ts | 24 +------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/source/main/ipc/electronStoreConversation.ts b/source/main/ipc/electronStoreConversation.ts index f35dd075d1..bbed1f68f3 100644 --- a/source/main/ipc/electronStoreConversation.ts +++ b/source/main/ipc/electronStoreConversation.ts @@ -25,29 +25,7 @@ const unset = async (key: StorageKey) => }); const reset = async () => { - await unset(keys.APP_AUTOMATIC_UPDATE_FAILED); - await unset(keys.APP_UPDATE_COMPLETED); - await unset(keys.CURRENCY_ACTIVE); - await unset(keys.CURRENCY_SELECTED); - await unset(keys.DATA_LAYER_MIGRATION_ACCEPTANCE); - await unset(keys.DISCREET_MODE_ENABLED); - await unset(keys.DOWNLOAD_MANAGER); - await unset(keys.HARDWARE_WALLET_DEVICES); - await unset(keys.HARDWARE_WALLETS); - await unset(keys.READ_NEWS); - await unset(keys.SMASH_SERVER); - await unset(keys.STAKING_INFO_WAS_OPEN); - await unset(keys.STAKE_POOLS_LIST_VIEW_TOOLTIP); - await unset(keys.TERMS_OF_USE_ACCEPTANCE); - await unset(keys.THEME); - await unset(keys.USER_DATE_FORMAT_ENGLISH); - await unset(keys.USER_DATE_FORMAT_JAPANESE); - await unset(keys.USER_LOCALE); - await unset(keys.USER_NUMBER_FORMAT); - await unset(keys.USER_TIME_FORMAT); - await unset(keys.WALLET_MIGRATION_STATUS); - await unset(keys.WALLETS); - await unset(keys.WINDOW_BOUNDS); + await Promise.all(Object.values(keys).map(unset)); }; export const requestElectronStore = (request: ElectronStoreMessage) => { From bdcce07200c81fc2cb8f31d5a81855e21dfb63c4 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Thu, 19 May 2022 11:44:45 +0200 Subject: [PATCH 02/41] [DDW-809] Add tracking for routes and stake pool actions --- source/renderer/app/Routes.tsx | 93 ++++++++++++++----- .../staking/stake-pools/StakePools.tsx | 24 ++++- .../containers/staking/StakePoolsListPage.tsx | 2 + 3 files changed, 91 insertions(+), 28 deletions(-) diff --git a/source/renderer/app/Routes.tsx b/source/renderer/app/Routes.tsx index 75ce499e84..7f6129b635 100644 --- a/source/renderer/app/Routes.tsx +++ b/source/renderer/app/Routes.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Switch, Route, Redirect, withRouter } from 'react-router-dom'; +import { Redirect, Route, Switch, withRouter } from 'react-router-dom'; import { ROUTES } from './routes-config'; // PAGES import Root from './containers/Root'; @@ -35,6 +35,7 @@ import WalletUtxoPage from './containers/wallet/WalletUtxoPage'; import VotingRegistrationPage from './containers/voting/VotingRegistrationPage'; import { IS_STAKING_INFO_PAGE_AVAILABLE } from './config/stakingConfig'; import AnalyticsConsentPage from './containers/profile/AnalyticsConsentPage'; +import TrackedRoute from './analytics/TrackedRoute'; export const Routes = withRouter(() => ( @@ -54,11 +55,16 @@ export const Routes = withRouter(() => ( path={ROUTES.PROFILE.ANALYTICS} component={AnalyticsConsentPage} /> - - + ( path={ROUTES.WALLETS.ROOT} component={() => } /> - - - + - - + - - + @@ -94,31 +116,38 @@ export const Routes = withRouter(() => ( path={ROUTES.SETTINGS.ROOT} component={() => } /> - - - - - - - @@ -137,33 +166,47 @@ export const Routes = withRouter(() => ( )} /> - - - - - + {IS_STAKING_INFO_PAGE_AVAILABLE && ( - + )} - - diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index 746d0c5c3f..71298a8bb3 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -19,11 +19,10 @@ import { IS_RANKING_DATA_AVAILABLE, SMASH_SERVER_TYPES, } from '../../../config/stakingConfig'; -// @ts-ignore ts-migrate(2307) FIXME: Cannot find module '../../../assets/images/smash-s... Remove this comment to see the full error message import smashSettingsIcon from '../../../assets/images/smash-settings-ic.inline.svg'; -// @ts-ignore ts-migrate(2307) FIXME: Cannot find module '../../../assets/images/spinner... Remove this comment to see the full error message import tinySpinnerIcon from '../../../assets/images/spinner-tiny.inline.svg'; import { getSmashServerNameFromUrl } from '../../../utils/staking'; +import { AnalyticsClient } from '../../../analytics'; const messages = defineMessages({ delegatingListTitle: { @@ -70,6 +69,7 @@ const messages = defineMessages({ }); const SELECTED_INDEX_TABLE = 'selectedIndexTable'; type Props = { + analyticsClient: AnalyticsClient; currentLocale: string; currentTheme: string; getStakePoolById: (...args: Array) => any; @@ -119,22 +119,35 @@ class StakePools extends Component { this.setState({ search, }); + handleClearSearch = () => this.setState({ search: '', }); - handleGridView = () => + + handleGridView = () => { this.setState({ isGridView: true, isGridRewardsView: false, isListView: false, }); + + this.props.analyticsClient.sendEvent( + 'Stake Pools', + 'Changed view to grid view' + ); + }; handleGridRewardsView = () => { this.setState({ isGridView: false, isGridRewardsView: true, isListView: false, }); + + this.props.analyticsClient.sendEvent( + 'Stake Pools', + 'Changed view to grid rewards view' + ); }; handleListView = () => { this.setState({ @@ -142,6 +155,11 @@ class StakePools extends Component { isGridRewardsView: false, isListView: true, }); + + this.props.analyticsClient.sendEvent( + 'Stake Pools', + 'Changed view to list view' + ); }; handleSetListActive = (selectedList: string) => this.setState({ diff --git a/source/renderer/app/containers/staking/StakePoolsListPage.tsx b/source/renderer/app/containers/staking/StakePoolsListPage.tsx index 021da8f412..785e3e944d 100644 --- a/source/renderer/app/containers/staking/StakePoolsListPage.tsx +++ b/source/renderer/app/containers/staking/StakePoolsListPage.tsx @@ -55,6 +55,7 @@ class StakePoolsListPage extends Component { networkStatus, profile, wallets, + analytics, } = this.props.stores; const { currentTheme, currentLocale } = profile; const { isSynced } = networkStatus; @@ -77,6 +78,7 @@ class StakePoolsListPage extends Component { return ( Date: Thu, 19 May 2022 11:45:03 +0200 Subject: [PATCH 03/41] [DDW-809] Update Terms of Service --- .../app/i18n/locales/terms-of-use/en-US.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/renderer/app/i18n/locales/terms-of-use/en-US.md b/source/renderer/app/i18n/locales/terms-of-use/en-US.md index 8e1f73b0d9..0b2cc990fa 100644 --- a/source/renderer/app/i18n/locales/terms-of-use/en-US.md +++ b/source/renderer/app/i18n/locales/terms-of-use/en-US.md @@ -1,6 +1,6 @@ # IOHK Terms of Service Agreement -THIS TERMS OF SERVICE AGREEMENT ("Agreement") is made between Input Output HK Limited ("Company") and any person ("User") who completes the process to download, utilize, or operate any software or application created or offered by Company, including, but not limited to, the Daedalus Wallet application and the IOHK Incentivised Testnet ("Product"). You agree that this Agreement is a separate and independent agreement for each such Product. +THIS TERMS OF SERVICE AGREEMENT ("Agreement") is made between IOG Singapore Pte. Ltd. ("Company") and any person ("User") who completes the process to download, utilize, or operate any software or application created or offered by Company, including, but not limited to, the Daedalus Wallet application and the Incentivised Testnet (collectively, the "Product"). You agree that this Agreement is a separate and independent agreement for each such Product. **By confirming your acceptance of this Agreement, you agree to be bound by these terms on your own behalf. If you are duly authorized by a corporate entity, you agree on behalf of your corporate entity that it will be bound by the Agreement.** @@ -12,19 +12,19 @@ Company and User are collectively referred to as the "parties." **1.2 User Representations.** User represents and warrants to Company that: (a) User is over the age of eighteen (18) and has the power and authority to enter into and perform User's obligations under this Agreement; (b) all information provided by User to Company is truthful, accurate and complete; (c) User will comply with all laws and regulations of any applicable jurisdiction with regard to the User's access, use or installation of the Product; (d) User shall comply with all terms and conditions of this Agreement, including, without limitation, the provisions set forth at Section 1.7 (Prohibited Uses); and (e) User has provided and will provide accurate and complete information as required for access, use or installation of the Product. -**1.3 Reservation of Rights.** The Company retains all intellectual property rights, title, and interest in and to all of the Company's work, the Product, brands, logos, and trademarks, including but not limited to, Input Output HK Limited, IOHK, Daedalus, Daedalus Cryptocurrency Wallet, Daedalus Wallet, Daedalus App, and variations of the wording of the aforementioned brands, logos, and trademarks. User acknowledges and agrees that this Agreement conveys no title or ownership rights and User does not acquire any rights over the Company’s intellectual property law, express or implied, other than those expressly granted in this Agreement. All rights not expressly granted to User are reserved by the Company. +**1.3 Reservation of Rights.** The Company retains all intellectual property rights, title, and interest in and to all of the Company's work, the Product, brands, logos, and trademarks, including but not limited to, IOG Singapore Pte. Ltd., Input Output HK Limited, IOG, IOHK, Daedalus, Daedalus Cryptocurrency Wallet, Daedalus Wallet, Daedalus App, and variations of the wording of the aforementioned brands, logos, and trademarks. User acknowledges and agrees that this Agreement conveys no title or ownership rights and User does not acquire any rights over the Company's intellectual property law, express or implied, other than those expressly granted in this Agreement. All rights not expressly granted to User are reserved by the Company. **1.4 Grant of a License.** The Product is licensed to User under the terms of the Apache License, Version 2.0 (the "License"). The Product may not be used except in compliance with the License. User may obtain a copy of the License at [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0). User acknowledges and agrees that the Company shall not be responsible for any aspect of the information, content, or services contained in any third-party materials or on any third party sites accessible or linked to the Product and/or the Company. **1.5 User Obligations.** User is solely responsible for (a) providing, maintaining and ensuring compatibility with the Product, all hardware, software, electrical and other physical requirements for User's use of the Product, including, without limitation, telecommunications and internet access connections and links, web browsers or other equipment, programs and services required to access and use the Product; (b) the security, confidentiality and integrity of all information and content that User receives, transmits through or stores on the Product; and (c) any authorized or unauthorized access to any account of User by any person. -**1.6 Privacy.** When reasonably practicable, Company will endeavor to respect User's privacy. Company will not monitor, edit, or disclose any personal information about User or User's account, including its contents or User's use of the Product, without User's prior consent unless Company has a good faith belief that such action is necessary to: (i) comply with legal process or other legal requirements of any governmental authority; (ii) protect and defend the rights or property of Company; (iii) enforce this Agreement; (iv) protect the interests of users of the Product other than User or any other person; or (v) operate or conduct maintenance and repair of Company's services or equipment, including the Product as authorized by law. User has no expectation of privacy with respect to the Internet generally. User acknowledges that IP addresses are transmitted and recorded with each message or other information User sends from the Product. +**1.6 Privacy.** By accepting the terms of this Agreement, User also agrees to the terms of Company's [Privacy Policy](https://static.iohk.io/terms/iog-privacy-policy.pdf), attached and incorporated herein. Upon User's consent, which may be retracted at any time by the User by modifying User's settings within the Daedalus software, Company may also track certain aspects of User's behavior and device information for product development and improvement purposes. Such User behavior and device information includes the following: clicks, page visits, page scrolling, number of wallets, number of native assets, session duration, type of wallets (soft vs hardware wallets), geolocation (country of location), page performance, operating system, RAM and disk space. **1.7 Prohibited Uses.** User is solely responsible for any and all acts and omissions that occur under User's account, security information, keys or password, and User agrees not to engage in unacceptable use of the Product, which includes, without limitation, use of the Product to: (a) disseminate, store or transmit unsolicited messages, chain letters or unsolicited commercial email; (b) disseminate or transmit material that, to a reasonable person may be abusive, obscene, pornographic, defamatory, harassing, grossly offensive, vulgar, threatening or malicious; (c) disseminate, store or transmit files, graphics, software or other material that actually or potentially infringes the copyright, trademark, patent, trade secret or other intellectual property right of any person; (d) create a false identity or to otherwise attempt to mislead any person as to the identity or origin of any communication; (e) export, re-export or permit downloading of any message or content in violation of any export or import law, regulation or restriction of any applicable jurisdiction, or without all required approvals, licenses or exemptions; (f) interfere, disrupt or attempt to gain unauthorized access to other accounts on the Product or any other computer network; or (g) disseminate, store or transmit viruses, trojan horses or any other malicious code or program. **1.8 Warranties.** While the Product has undergone beta testing and continues to be improved by feedback from the developers community, open-source contributors and beta-testers, the Company cannot guarantee there will not be bugs in the Product. Unless required by applicable law or agreed to in writing, the Product is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. User agrees that from time to time the Product may be inaccessible or inoperable for any reason, including, without limitation: (i) equipment malfunctions; (ii) periodic maintenance procedures or repairs which Company may undertake from time to time; or (iii) causes beyond the control of Company or which are not reasonably foreseeable by Company. User acknowledges that User's use of this Product is at User's risk and discretion. -**1.9 Liability.** IN NO EVENT WILL IOHK OR ITS SHAREHOLDERS, DIRECTORS, OFFICERS, EMPLOYEES, CONTRACTORS OR SERVICE PROVIDERS, BE LIABLE TO USER OR ANY THIRD PARTY FOR ANY USE, INTERRUPTION, DELAY OR INABILITY TO USE THE SOFTWARE, LOST REVENUE OR PROFITS, LOST REWARDS, DELAYS, INTERRUPTION OR LOSS OF SERVICE, BUSINESS OR GOODWILL, LOSS OR CORRUPTION OF DATA, LOSS OF CRYPTOCURRENCY LOSS RESULTING FROM SYSTEM OR SYSTEM SERVICE FAILURE, MALFUNCTION OR SHUTDOWN, FAILURE TO ACCURATELY TRANSFER, READ OR TRANSMIT INFORMATION, FAILURE TO UPDATE OR PROVIDE CORRECT INFORMATION, SYSTEM INCOMPATIBILITY OR PROVISION OF INCORRECT COMPATIBILITY INFORMATION OR BREACHES IN SYSTEM SECURITY, OR FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, EXEMPLARY, SPECIAL OR PUNITIVE DAMAGES, WHETHER ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR OTHERWISE, AND REGARDLESS OF WHETHER SUCH DAMAGES WERE FORESEEABLE AND WHETHER OR NOT COMPANY WAS ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO EVENT SHALL THE COMPANY OR ITS SHAREHOLDERS, DIRECTORS, OFFICERS, EMPLOYEES, AFFILIATES OR AGENTS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM OR IN ANY WAY RELATED TO USER'S ACCESS, USE OR INSTALLATION OF THE SOFTWARE. SOME JURISDICTIONS PROHIBIT THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, THUS THIS LIMITATION OF LIABILITY MAY NOT APPLY TO USER. IF USER IS DISSATISFIED WITH THE SOFTWARE, USER'S SOLE AND EXCLUSIVE REMEDY SHALL BE FOR USER TO DISCONTINUE USE OF THE SOFTWARE. +**1.9 Liability.** IN NO EVENT WILL COMPANY OR ITS SHAREHOLDERS, AFFILIATES, DIRECTORS, OFFICERS, EMPLOYEES, CONTRACTORS OR SERVICE PROVIDERS, BE LIABLE TO USER OR ANY THIRD PARTY FOR ANY USE, INTERRUPTION, DELAY OR INABILITY TO USE THE SOFTWARE, LOST REVENUE OR PROFITS, LOST REWARDS, DELAYS, INTERRUPTION OR LOSS OF SERVICE, BUSINESS OR GOODWILL, LOSS OR CORRUPTION OF DATA, LOSS OF CRYPTOCURRENCY LOSS RESULTING FROM SYSTEM OR SYSTEM SERVICE FAILURE, MALFUNCTION OR SHUTDOWN, FAILURE TO ACCURATELY TRANSFER, READ OR TRANSMIT INFORMATION, FAILURE TO UPDATE OR PROVIDE CORRECT INFORMATION, SYSTEM INCOMPATIBILITY OR PROVISION OF INCORRECT COMPATIBILITY INFORMATION OR BREACHES IN SYSTEM SECURITY, OR FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, EXEMPLARY, SPECIAL OR PUNITIVE DAMAGES, WHETHER ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR OTHERWISE, AND REGARDLESS OF WHETHER SUCH DAMAGES WERE FORESEEABLE AND WHETHER OR NOT COMPANY WAS ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO EVENT SHALL THE COMPANY OR ITS SHAREHOLDERS, DIRECTORS, OFFICERS, EMPLOYEES, AFFILIATES OR AGENTS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM OR IN ANY WAY RELATED TO USER'S ACCESS, USE OR INSTALLATION OF THE SOFTWARE. SOME JURISDICTIONS PROHIBIT THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, THUS THIS LIMITATION OF LIABILITY MAY NOT APPLY TO USER. IF USER IS DISSATISFIED WITH THE SOFTWARE, USER'S SOLE AND EXCLUSIVE REMEDY SHALL BE FOR USER TO DISCONTINUE USE OF THE SOFTWARE. **1.10 Indemnification.** User agrees to indemnify, hold harmless and defend Company, its shareholders, directors, officers, employees, affiliates and agents ("Indemnified Parties") from and against any action, cause, claim, damage, debt, demand or liability, including reasonable costs and attorney's fees, asserted by any person, arising out of or relating to: (a) this Agreement; (b) User's access, use or installation of the Product, including any data or work transmitted or received by User; and (c) any unacceptable use of the Product by any person, including, without limitation, any statement, data or content made, transmitted or republished by User or any person which is prohibited as unacceptable under Section 1.7. THIS INDEMNIFICATION INCLUDES THE EXPRESS INDEMNIFICATION OF COMPANY AND ALL INDEMNIFIED PARTIES FOR ANY ALLEGED NEGLIGENCE, ALLEGED GROSS NEGLIGENCE, OR OTHER ALLEGED MISCONDUCT OF COMPANY OR ANY INDEMNIFIED PARTIES. @@ -58,21 +58,21 @@ Company and User are collectively referred to as the "parties." **3.1 Incentivised Testnet.** Company is testing and making available to Users a test rewards and incentivization mechanism which is intended to mimic the rewards and incentivization mechanism in the upcoming Shelley release (the "Incentivized Testnet"). Users may participate in the Incentivized Testnet by delegating their ada stake to their own stake pool or to a third party stake pool in exchange for a reward equivalent to a percentage of the proceeds generated by the stake pool ("Reward"). -**3.2 Rewards.** The amount of Rewards a User may earn from delegation depends on various factors including, but not limited to, user participation, stakepool profit margins and the volume of ada being delegated. It is possible that delegation generates no Reward for a User due to the above-mentioned factors. Rewards are earned as of the start of the 3rd epoch on the Cardano blockchain. When the Incentivized Testnet is discontinued, any Rewards earned can be transferred back to the User’s Daedalus or Yoroi wallet. +**3.2 Rewards.** The amount of Rewards a User may earn from delegation depends on various factors including, but not limited to, user participation, stakepool profit margins and the volume of ada being delegated. It is possible that delegation generates no Reward for a User due to the above-mentioned factors. Rewards are earned as of the start of the 3rd epoch on the Cardano blockchain. When the Incentivized Testnet is discontinued, any Rewards earned can be transferred back to the User's Daedalus or Yoroi wallet. **3.3 Delegation.** Users may delegate their stake to one of the various stake pools of the Company or to a third party stake pool. User will have the sole right to determine the volume to be delegated to a stake pool and may increase or decrease its level of participation at any time. Any information Company shares regarding stakepools, including performance metrics and Rewards, will be for indicative purposes only and may not be accurate. Users may only delegate their stake to a stake pool if their ada is in an updated Daedalus or an updated Yoroi wallet at the time of the setup process. User does not acquire any automatic right to Rewards as a result of delegating its stake. -**3.4 Company Stake-Pools.** The Company will operate various stake pools which will be visible in Daedalus or the explorer tool. The cost and network and server requirements to reliably operate such stake pools shall be determined by the Company in its sole discretion. Company will communicate the percentage amount of Reward to be shared with Users through the User’s Testnet Daedalus wallet. Rewards will accrue at the end of each epoch and will automatically appear in the User’s Testnet Deadalus wallet. Company will provide a dashboard detailing the Company’s staking performance to User. +**3.4 Company Stake-Pools.** The Company will operate various stake pools which will be visible in Daedalus or the explorer tool. The cost and network and server requirements to reliably operate such stake pools shall be determined by the Company in its sole discretion. Company will communicate the percentage amount of Reward to be shared with Users through the User's Testnet Daedalus wallet. Rewards will accrue at the end of each epoch and will automatically appear in the User's Testnet Deadalus wallet. Company will provide a dashboard detailing the Company's staking performance to User. **3.5 Redeeming Rewards.** User acknowledges and agrees that by redeeming Rewards in the Incentivised Testnet, User redeems TEST-ADA only, and that in order to redeem actual ada, User must repeat the procedure in the mainnet, once released. User shall be responsible for payment of all applicable taxes, if any, to which the Rewards might be subject and any and all other taxes which may apply to User once Rewards are redeemed. **3.6 Tools.** Company will provide Users and stake pool operators certain tools designed to estimate the amount of Rewards a User may earn on the Incentivized Testnet ("Rewards Calculator"). User understands that the Rewards Calculator is provided for illustrative purposes only and may not be accurate. Company does not promise that the Reward received will correspond to the amount indicated by the Rewards Calculator or by the stake pools. -**3.7 Prohibited Use.** User will not, and will not permit any other third party to use any device, software or routine to interfere with the proper function of the Incentivised Testnet. If there is a complaint or notice of violation, a User’s participation may be suspended without notice until resolved, and terminated if not resolved promptly. +**3.7 Prohibited Use.** User will not, and will not permit any other third party to use any device, software or routine to interfere with the proper function of the Incentivised Testnet. If there is a complaint or notice of violation, a User's participation may be suspended without notice until resolved, and terminated if not resolved promptly. -**3.8 Warranty.** The Service are provided to User on an "as is" and "as available" basis and all warranties, express, implied, statutory or otherwise, with respect to the Service are hereby excluded. User acknowledges that the Incentivized Testnet may not operate properly and that it may contain errors, design flaws or other issues. User’s use of the Incentivized Testnet remains at User’s risk and discretion. IOHK reserves the right to restart the Incentivised Testnet and reverse all or some Rewards in the case of errors and/or malicious behaviour in the system. +**3.8 Warranty.** The Product are provided to User on an "as is" and "as available" basis and all warranties, express, implied, statutory or otherwise, with respect to the Service are hereby excluded. User acknowledges that the Incentivized Testnet may not operate properly and that it may contain errors, design flaws or other issues. User's use of the Incentivized Testnet remains at User's risk and discretion. Company reserves the right to restart the Incentivised Testnet and reverse all or some Rewards in the case of errors and/or malicious behavior in the system. -**3.9 Termination of the Incentivised Testnet.** User understands and agrees that Company may change, withdraw, terminate access to and/or discontinue the Incentivized Testnet (or any portion thereof) at any time and in its sole discretion. User may end participation in the Incentivized Testnet at any time and any Rewards gained up to that time will still be transferred to User’s Daedalus or Yoroi mainnet wallet once the Incentivized Testnet is discontinued. +**3.9 Termination of the Incentivised Testnet.** User understands and agrees that Company may change, withdraw, terminate access to and/or discontinue the Incentivized Testnet (or any portion thereof) at any time and in its sole discretion. User may end participation in the Incentivized Testnet at any time and any Rewards gained up to that time will still be transferred to User's Daedalus or Yoroi mainnet wallet once the Incentivized Testnet is discontinued. **3.10 Feedback.** Users may provide suggestions, comments or ideas and report issues or problems related to their use of the Incentivized Testnet at any time by using any of the official feedback channels. From 824417df770981006df4605c9e759b7677c72545 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 23 May 2022 14:00:08 +0200 Subject: [PATCH 04/41] [DDW-809] WIP --- matomo.docker-compose.yml | 33 +++++++++++++++++++ source/renderer/app/config/analyticsConfig.ts | 2 ++ 2 files changed, 35 insertions(+) create mode 100644 matomo.docker-compose.yml diff --git a/matomo.docker-compose.yml b/matomo.docker-compose.yml new file mode 100644 index 0000000000..c567b10769 --- /dev/null +++ b/matomo.docker-compose.yml @@ -0,0 +1,33 @@ +version: "3" + +services: + matomo_db: + image: mariadb + command: --max-allowed-packet=64MB + restart: always + volumes: + - db:/var/lib/mysql + environment: &env + - MYSQL_ROOT_PASSWORD=matomo + - MATOMO_DATABASE_HOST=db + - MYSQL_PASSWORD=matomo + - MYSQL_DATABASE=matomo + - MYSQL_USER=matomo + - MATOMO_DATABASE_ADAPTER=mysql + - MATOMO_DATABASE_TABLES_PREFIX=matomo_ + - MATOMO_DATABASE_USERNAME=matomo + - MATOMO_DATABASE_PASSWORD=matomo + - MATOMO_DATABASE_DBNAME=matomo + + matomo: + image: matomo + restart: always + volumes: + - matomo:/var/www/html + environment: *env + ports: + - 9003:80 + +volumes: + db: + matomo: diff --git a/source/renderer/app/config/analyticsConfig.ts b/source/renderer/app/config/analyticsConfig.ts index 39d29a5376..de4a92725a 100644 --- a/source/renderer/app/config/analyticsConfig.ts +++ b/source/renderer/app/config/analyticsConfig.ts @@ -1,6 +1,8 @@ import { Network } from '../../../common/types/environment.types'; export const ANALYTICS_API_ENDPOINT = 'https://mazurek.matomo.cloud/matomo.php'; +export const PRIVACY_POLICY_LINK = + 'https://static.iohk.io/terms/iog-privacy-policy.pdf'; export const DEV_MODE_SITE_MAP_ID = 5; export const NETWORK_TO_ANALYTICS_SITE_ID_MAP: Record = { mainnet: 4, From e288b433f030978042a4c4d2ad2249e33c9758aa Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Fri, 10 Jun 2022 00:47:50 +0200 Subject: [PATCH 05/41] [DDW-809] Bring back missing files --- package.json | 3 +- source/renderer/app/analytics/MatomoClient.ts | 65 +++++++++++++++++++ .../renderer/app/analytics/TrackedRoute.tsx | 24 +++++++ source/renderer/app/analytics/index.ts | 2 +- .../app/analytics/noopAnalyticsClient.ts | 8 +++ source/renderer/app/analytics/types.ts | 5 ++ .../components/analytics/AnalyticsContext.tsx | 4 ++ .../analytics/AnalyticsProvider.tsx | 23 +++++++ .../app/components/analytics/index.ts | 2 + .../app/components/analytics/useAnalytics.ts | 4 ++ yarn.lock | 4 ++ 11 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 source/renderer/app/analytics/MatomoClient.ts create mode 100644 source/renderer/app/analytics/TrackedRoute.tsx create mode 100644 source/renderer/app/analytics/noopAnalyticsClient.ts create mode 100644 source/renderer/app/components/analytics/AnalyticsContext.tsx create mode 100644 source/renderer/app/components/analytics/AnalyticsProvider.tsx create mode 100644 source/renderer/app/components/analytics/index.ts create mode 100644 source/renderer/app/components/analytics/useAnalytics.ts diff --git a/package.json b/package.json index a73d5e9b6d..f58c762347 100644 --- a/package.json +++ b/package.json @@ -241,7 +241,8 @@ "inquirer": "7.3.3", "json-bigint": "1.0.0", "lodash": "4.17.21", - "lodash-es": "4.17.21", + "lodash-es": "4.17.15", + "matomo-tracker": "^2.2.4", "mime-types": "2.1.27", "mkdirp": "1.0.4", "mobx": "5.15.7", diff --git a/source/renderer/app/analytics/MatomoClient.ts b/source/renderer/app/analytics/MatomoClient.ts new file mode 100644 index 0000000000..a08daf3292 --- /dev/null +++ b/source/renderer/app/analytics/MatomoClient.ts @@ -0,0 +1,65 @@ +import MatomoTracker from 'matomo-tracker'; +import { AnalyticsClient } from './types'; +import { Environment } from '../../../common/types/environment.types'; +import formatCpuInfo from '../utils/formatCpuInfo'; +import { + ANALYTICS_API_ENDPOINT, + DEV_MODE_SITE_MAP_ID, + NETWORK_TO_ANALYTICS_SITE_ID_MAP, +} from '../config/analyticsConfig'; + +const CPU_DIMENSION_KEY = 'dimension2'; +const RAM_DIMENSION_KEY = 'dimension3'; +const OS_DIMENSION_KEY = 'dimension4'; +const VERSION_DIMENSION_KEY = 'dimension5'; + +/** + * Matomo API reference: + * https://developer.matomo.org/api-reference/tracking-api + */ +export class MatomoClient implements AnalyticsClient { + private matomoTracker: MatomoTracker; + + constructor(private environment: Environment, private userId: string) { + this.matomoTracker = new MatomoTracker( + this.getMatomoSiteId(environment), + ANALYTICS_API_ENDPOINT + ); + } + + sendPageNavigationEvent = async (pageTitle: string) => { + this.matomoTracker.track({ + _id: this.userId, + action_name: pageTitle, + url: this.getAnalyticsURL(), + [CPU_DIMENSION_KEY]: formatCpuInfo(this.environment.cpu), + [RAM_DIMENSION_KEY]: Math.round( + this.environment.ram / 1024 / 1024 / 1024 + ).toString(), + [OS_DIMENSION_KEY]: this.environment.os, + [VERSION_DIMENSION_KEY]: this.environment.version, + }); + }; + + sendEvent = async (category: string, action: string): Promise => { + this.matomoTracker.track({ + _id: this.userId, + ca: 1, + e_c: category, + e_a: action, + url: this.getAnalyticsURL(), + }); + }; + + private getAnalyticsURL() { + return 'http://daedalus/' + window.location.hash.replace('#/', ''); + } + + private getMatomoSiteId(environment: Environment) { + if (environment.isDev) { + return DEV_MODE_SITE_MAP_ID; + } + + return NETWORK_TO_ANALYTICS_SITE_ID_MAP[environment.network]; + } +} diff --git a/source/renderer/app/analytics/TrackedRoute.tsx b/source/renderer/app/analytics/TrackedRoute.tsx new file mode 100644 index 0000000000..e786e3ce83 --- /dev/null +++ b/source/renderer/app/analytics/TrackedRoute.tsx @@ -0,0 +1,24 @@ +import React, { FC, useEffect } from 'react'; +import { matchPath, Route, RouteProps } from 'react-router'; +import { useAnalytics } from '../components/analytics'; + +export type TrackedRouteProps = RouteProps & { + pageTitle: string; +}; + +const TrackedRoute: FC = (props) => { + const analytics = useAnalytics(); + const { pageTitle, ...restProps } = props; + + useEffect(() => { + const match = matchPath(window.location.hash.replace('#', ''), props); + + if (match !== null) { + analytics.sendPageNavigationEvent(pageTitle); + } + }, [window.location.hash, props, pageTitle]); + + return ; +}; + +export default TrackedRoute; diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index 328c7daa03..66f437bb26 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1 +1 @@ -export { AnalyticsAcceptanceStatus } from './types'; +export { AnalyticsAcceptanceStatus, AnalyticsClient } from './types'; diff --git a/source/renderer/app/analytics/noopAnalyticsClient.ts b/source/renderer/app/analytics/noopAnalyticsClient.ts new file mode 100644 index 0000000000..6348c62cd4 --- /dev/null +++ b/source/renderer/app/analytics/noopAnalyticsClient.ts @@ -0,0 +1,8 @@ +import { AnalyticsClient } from './types'; + +const NoopAnalyticsClient: AnalyticsClient = { + sendPageNavigationEvent: () => Promise.resolve(), + sendEvent: () => Promise.resolve(), +}; + +export { NoopAnalyticsClient }; diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index f67185663c..59f927ef6f 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -1,3 +1,8 @@ +export interface AnalyticsClient { + sendPageNavigationEvent(pageTitle: string): Promise; + sendEvent(category: string, name: string): Promise; +} + export enum AnalyticsAcceptanceStatus { PENDING = 'PENDING', ACCEPTED = 'ACCEPTED', diff --git a/source/renderer/app/components/analytics/AnalyticsContext.tsx b/source/renderer/app/components/analytics/AnalyticsContext.tsx new file mode 100644 index 0000000000..9bfa3bbce7 --- /dev/null +++ b/source/renderer/app/components/analytics/AnalyticsContext.tsx @@ -0,0 +1,4 @@ +import React from 'react'; +import { AnalyticsClient } from '../../analytics'; + +export const AnalyticsContext = React.createContext(null); diff --git a/source/renderer/app/components/analytics/AnalyticsProvider.tsx b/source/renderer/app/components/analytics/AnalyticsProvider.tsx new file mode 100644 index 0000000000..7f305b18b1 --- /dev/null +++ b/source/renderer/app/components/analytics/AnalyticsProvider.tsx @@ -0,0 +1,23 @@ +import React, { FC } from 'react'; +import { inject, observer } from 'mobx-react'; +import { AnalyticsContext } from './AnalyticsContext'; +import { InjectedProps } from '../../types/injectedPropsType'; + +interface AnalyticsProviderProps extends InjectedProps { + children: React.ReactNode; +} + +const AnalyticsProvider: FC = inject( + 'stores', + 'actions' +)( + observer((props: AnalyticsProviderProps) => { + return ( + + {props.children} + + ); + }) +); + +export { AnalyticsProvider }; diff --git a/source/renderer/app/components/analytics/index.ts b/source/renderer/app/components/analytics/index.ts new file mode 100644 index 0000000000..7f317c2d5b --- /dev/null +++ b/source/renderer/app/components/analytics/index.ts @@ -0,0 +1,2 @@ +export { AnalyticsProvider } from './AnalyticsProvider'; +export { useAnalytics } from './useAnalytics'; diff --git a/source/renderer/app/components/analytics/useAnalytics.ts b/source/renderer/app/components/analytics/useAnalytics.ts new file mode 100644 index 0000000000..caefabad39 --- /dev/null +++ b/source/renderer/app/components/analytics/useAnalytics.ts @@ -0,0 +1,4 @@ +import { useContext } from 'react'; +import { AnalyticsContext } from './AnalyticsContext'; + +export const useAnalytics = () => useContext(AnalyticsContext); diff --git a/yarn.lock b/yarn.lock index 95b3439491..763ec7c1d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11556,6 +11556,10 @@ mathml-tag-names@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" +matomo-tracker@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/matomo-tracker/-/matomo-tracker-2.2.4.tgz#ee397d915d7b2e7964996ca28a0a03f4f0692453" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" From ac5b72419449c7dfb3d475d7853a26a9845a2aab Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 13 Jun 2022 13:45:25 +0200 Subject: [PATCH 06/41] [DDW-809] Bring back missing files --- source/renderer/app/App.tsx | 79 ++++++++++--------- .../app/analytics/getAnalyticsClient.ts | 27 +++++++ source/renderer/app/analytics/index.ts | 4 +- source/renderer/app/stores/AnalyticsStore.ts | 20 +++++ source/renderer/app/stores/index.ts | 4 + 5 files changed, 95 insertions(+), 39 deletions(-) create mode 100644 source/renderer/app/analytics/getAnalyticsClient.ts create mode 100644 source/renderer/app/stores/AnalyticsStore.ts diff --git a/source/renderer/app/App.tsx b/source/renderer/app/App.tsx index 04b87ad789..2278d8cc87 100755 --- a/source/renderer/app/App.tsx +++ b/source/renderer/app/App.tsx @@ -22,6 +22,7 @@ import NewsFeedContainer from './containers/news/NewsFeedContainer'; import ToggleRTSFlagsDialogContainer from './containers/knownIssues/ToggleRTSFlagsDialogContainer'; import RTSFlagsRecommendationOverlayContainer from './containers/knownIssues/RTSFlagsRecommendationOverlayContainer'; import { MenuUpdater } from './containers/MenuUpdater'; +import { AnalyticsProvider } from './components/analytics'; @observer class App extends Component<{ @@ -61,45 +62,47 @@ class App extends Component<{ {/* @ts-ignore ts-migrate(2769) FIXME: No overload matches this call. */} - - - + + - - - - - {[ - // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message - isActiveDialog(ABOUT) && , - // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message - isActiveDialog(DAEDALUS_DIAGNOSTICS) && ( - - ), - // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message - isActiveDialog(TOGGLE_RTS_FLAGS_MODE) && ( - - ), - ]} - - - {canShowNews && [ - , - , - ]} - - - + + + + + + {[ + // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message + isActiveDialog(ABOUT) && , + // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message + isActiveDialog(DAEDALUS_DIAGNOSTICS) && ( + + ), + // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message + isActiveDialog(TOGGLE_RTS_FLAGS_MODE) && ( + + ), + ]} + + + {canShowNews && [ + , + , + ]} + + + + ); diff --git a/source/renderer/app/analytics/getAnalyticsClient.ts b/source/renderer/app/analytics/getAnalyticsClient.ts new file mode 100644 index 0000000000..1741b82858 --- /dev/null +++ b/source/renderer/app/analytics/getAnalyticsClient.ts @@ -0,0 +1,27 @@ +import { Environment } from '../../../common/types/environment.types'; +import { AnalyticsAcceptanceStatus, AnalyticsClient } from './types'; +import { NoopAnalyticsClient } from './noopAnalyticsClient'; +import LocalStorageApi from '../api/utils/localStorage'; +import { MatomoClient } from './MatomoClient'; + +let client: AnalyticsClient; + +const getAnalyticsClient = async ( + localStorage: LocalStorageApi, + environment: Environment +) => { + const analyticsAccepted = + (await localStorage.getAnalyticsAcceptance()) === + AnalyticsAcceptanceStatus.ACCEPTED; + + if (environment.analyticsFeatureEnabled && analyticsAccepted) { + if (!client) { + client = new MatomoClient(environment, await localStorage.getUserID()); + } + return client; + } + + return NoopAnalyticsClient; +}; + +export { getAnalyticsClient }; diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index 66f437bb26..9666ce935c 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1 +1,3 @@ -export { AnalyticsAcceptanceStatus, AnalyticsClient } from './types'; +export { getAnalyticsClient } from './getAnalyticsClient'; +export { NoopAnalyticsClient } from './noopAnalyticsClient'; +export { AnalyticsClient } from './types'; diff --git a/source/renderer/app/stores/AnalyticsStore.ts b/source/renderer/app/stores/AnalyticsStore.ts new file mode 100644 index 0000000000..7424eac1dc --- /dev/null +++ b/source/renderer/app/stores/AnalyticsStore.ts @@ -0,0 +1,20 @@ +import { observable, runInAction } from 'mobx'; +import Store from './lib/Store'; +import { AnalyticsClient, getAnalyticsClient } from '../analytics'; + +export default class AnalyticsStore extends Store { + @observable + analyticsClient: AnalyticsClient; + + setup() { + this.resetAnalyticsClient(); + } + + resetAnalyticsClient = async (): Promise => { + const client = await getAnalyticsClient(this.api.localStorage, environment); + + runInAction(() => { + this.analyticsClient = client; + }); + }; +} diff --git a/source/renderer/app/stores/index.ts b/source/renderer/app/stores/index.ts index f19c566371..4ce9ec261d 100644 --- a/source/renderer/app/stores/index.ts +++ b/source/renderer/app/stores/index.ts @@ -24,8 +24,10 @@ import WalletSettingsStore from './WalletSettingsStore'; import WalletsLocalStore from './WalletsLocalStore'; import WalletsStore from './WalletsStore'; import WindowStore from './WindowStore'; +import AnalyticsStore from './AnalyticsStore'; export const storeClasses = { + analytics: AnalyticsStore, addresses: AddressesStore, app: AppStore, appUpdate: AppUpdateStore, @@ -49,6 +51,7 @@ export const storeClasses = { window: WindowStore, }; export type StoresMap = { + analytics: AnalyticsStore; addresses: AddressesStore; app: AppStore; appUpdate: AppUpdateStore; @@ -95,6 +98,7 @@ export default action( // Create fresh instances of all stores // @ts-ignore ts-migrate(2322) FIXME: Type '{ addresses: Store; app: Store; assets: Stor... Remove this comment to see the full error message stores = observable({ + analytics: createStoreInstanceOf(AnalyticsStore), addresses: createStoreInstanceOf(AddressesStore), app: createStoreInstanceOf(AppStore), assets: createStoreInstanceOf(AssetsStore), From 2450b3ee8f5e489b98a78980469de6d0ca29940b Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 13 Jun 2022 14:01:47 +0200 Subject: [PATCH 07/41] [DDW-809] Fix issues --- source/renderer/app/analytics/index.ts | 2 +- .../app/i18n/locales/defaultMessages.json | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index 9666ce935c..928020a97e 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1,3 +1,3 @@ export { getAnalyticsClient } from './getAnalyticsClient'; export { NoopAnalyticsClient } from './noopAnalyticsClient'; -export { AnalyticsClient } from './types'; +export { AnalyticsAcceptanceStatus, AnalyticsClient } from './types'; diff --git a/source/renderer/app/i18n/locales/defaultMessages.json b/source/renderer/app/i18n/locales/defaultMessages.json index a540406425..fb63952edc 100644 --- a/source/renderer/app/i18n/locales/defaultMessages.json +++ b/source/renderer/app/i18n/locales/defaultMessages.json @@ -6263,13 +6263,13 @@ "description": "\"delegatingListTitle\" for the Stake Pools page.", "end": { "column": 3, - "line": 33 + "line": 32 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.delegatingListTitle", "start": { "column": 23, - "line": 29 + "line": 28 } }, { @@ -6277,13 +6277,13 @@ "description": "\"listTitle\" for the Stake Pools page.", "end": { "column": 3, - "line": 38 + "line": 37 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitle", "start": { "column": 13, - "line": 34 + "line": 33 } }, { @@ -6291,13 +6291,13 @@ "description": "\"listTitleLoading\" for the Stake Pools page.", "end": { "column": 3, - "line": 43 + "line": 42 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitleLoading", "start": { "column": 20, - "line": 39 + "line": 38 } }, { @@ -6305,13 +6305,13 @@ "description": "\"listTitleSearch\" for the Stake Pools page.", "end": { "column": 3, - "line": 48 + "line": 47 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitleSearch", "start": { "column": 19, - "line": 44 + "line": 43 } }, { @@ -6319,13 +6319,13 @@ "description": "\"listTitleStakePools\" for the Stake Pools page.", "end": { "column": 3, - "line": 53 + "line": 52 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitleStakePools", "start": { "column": 23, - "line": 49 + "line": 48 } }, { @@ -6333,13 +6333,13 @@ "description": "Loading stake pool message for the Delegation center body section.", "end": { "column": 3, - "line": 59 + "line": 58 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.loadingStakePoolsMessage", "start": { "column": 28, - "line": 54 + "line": 53 } }, { @@ -6347,13 +6347,13 @@ "description": "moderatedBy message for the Delegation center body section.", "end": { "column": 3, - "line": 64 + "line": 63 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.moderatedBy", "start": { "column": 15, - "line": 60 + "line": 59 } }, { @@ -6361,13 +6361,13 @@ "description": "unmoderated message for the Delegation center body section.", "end": { "column": 3, - "line": 69 + "line": 68 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.unmoderated", "start": { "column": 15, - "line": 65 + "line": 64 } } ], From afd0472faa4f5a239b13b1181aff1f7d407e2bb1 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 13 Jun 2022 19:46:40 +0200 Subject: [PATCH 08/41] [DDW-809] Make the dev instance ready for use for QA --- matomo.docker-compose.yml | 53 +++++++++---------- .../analytics/AnalyticsConsentForm.tsx | 7 +-- source/renderer/app/config/analyticsConfig.ts | 4 +- source/renderer/index.ejs | 2 +- 4 files changed, 31 insertions(+), 35 deletions(-) diff --git a/matomo.docker-compose.yml b/matomo.docker-compose.yml index c567b10769..326673539b 100644 --- a/matomo.docker-compose.yml +++ b/matomo.docker-compose.yml @@ -1,33 +1,32 @@ version: "3" - services: - matomo_db: - image: mariadb - command: --max-allowed-packet=64MB - restart: always + mariadb: + image: docker.io/bitnami/mariadb:10.6 + environment: + - ALLOW_EMPTY_PASSWORD=yes + - MARIADB_USER=bn_matomo + - MARIADB_DATABASE=bitnami_matomo + - MARIADB_EXTRA_FLAGS=--max_allowed_packet=64MB volumes: - - db:/var/lib/mysql - environment: &env - - MYSQL_ROOT_PASSWORD=matomo - - MATOMO_DATABASE_HOST=db - - MYSQL_PASSWORD=matomo - - MYSQL_DATABASE=matomo - - MYSQL_USER=matomo - - MATOMO_DATABASE_ADAPTER=mysql - - MATOMO_DATABASE_TABLES_PREFIX=matomo_ - - MATOMO_DATABASE_USERNAME=matomo - - MATOMO_DATABASE_PASSWORD=matomo - - MATOMO_DATABASE_DBNAME=matomo - + - "matomo_db_data:/bitnami/mariadb" matomo: - image: matomo - restart: always - volumes: - - matomo:/var/www/html - environment: *env + image: docker.io/bitnami/matomo:4 ports: - - 9003:80 - + - "8080:8080" + environment: + - MATOMO_DATABASE_HOST=mariadb + - MATOMO_DATABASE_PORT_NUMBER=3306 + - MATOMO_DATABASE_USER=bn_matomo + - MATOMO_DATABASE_NAME=bitnami_matomo + - MATOMO_USERNAME=user + - MATOMO_PASSWORD=password + - ALLOW_EMPTY_PASSWORD=yes + volumes: + - "matomo_data:/bitnami/matomo" + depends_on: + - mariadb volumes: - db: - matomo: + matomo_db_data: + driver: local + matomo_data: + driver: local diff --git a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx index 26d080fe04..6d485ef857 100644 --- a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx +++ b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx @@ -8,6 +8,7 @@ import styles from './AnalyticsConsentForm.scss'; import { Intl } from '../../../types/i18nTypes'; import { messages } from './AnalyticsConsentForm.messages'; import { CollectedDataOverview } from './CollectedDataOverview'; +import { PRIVACY_POLICY_LINK } from '../../../config/analyticsConfig'; interface AnalyticsConsentFormProps { intl: Intl; @@ -32,11 +33,7 @@ const AnalyticsConsentForm: FC = ({ const privacyPolicyLink = ( - onExternalLinkClick( - 'https://static.iohk.io/terms/iog-privacy-policy.pdf' - ) - } + onClick={() => onExternalLinkClick(PRIVACY_POLICY_LINK)} label={intl.formatMessage(messages.privacyPolicyLink)} hasIconAfter={false} /> diff --git a/source/renderer/app/config/analyticsConfig.ts b/source/renderer/app/config/analyticsConfig.ts index de4a92725a..bb7c9effb2 100644 --- a/source/renderer/app/config/analyticsConfig.ts +++ b/source/renderer/app/config/analyticsConfig.ts @@ -1,9 +1,9 @@ import { Network } from '../../../common/types/environment.types'; -export const ANALYTICS_API_ENDPOINT = 'https://mazurek.matomo.cloud/matomo.php'; +export const ANALYTICS_API_ENDPOINT = 'http://localhost:8080/matomo.php'; export const PRIVACY_POLICY_LINK = 'https://static.iohk.io/terms/iog-privacy-policy.pdf'; -export const DEV_MODE_SITE_MAP_ID = 5; +export const DEV_MODE_SITE_MAP_ID = 1; export const NETWORK_TO_ANALYTICS_SITE_ID_MAP: Record = { mainnet: 4, mainnet_flight: 4, diff --git a/source/renderer/index.ejs b/source/renderer/index.ejs index 7ee5a3f289..6c430af395 100644 --- a/source/renderer/index.ejs +++ b/source/renderer/index.ejs @@ -13,7 +13,7 @@ script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; - connect-src 'self' https://*.matomo.cloud/; + connect-src 'self' https://*.matomo.cloud/ http://localhost:8080; " > Daedalus From 7a531fc195647f7432c4d604b5f47c95a17a6428 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Wed, 15 Jun 2022 08:59:47 +0200 Subject: [PATCH 09/41] [DDW-809] Implement more event tracking --- source/renderer/app/analytics/MatomoClient.ts | 7 ++- .../app/analytics/getEventNameByWallet.ts | 4 ++ source/renderer/app/analytics/types.ts | 2 +- .../staking/stake-pools/StakePools.tsx | 16 ++++++- .../app/components/wallet/WalletSendForm.tsx | 10 ++++ .../transactions/WalletTransactionsList.tsx | 6 +++ .../app/containers/wallet/WalletSendPage.tsx | 1 + .../containers/wallet/WalletSummaryPage.tsx | 1 + source/renderer/app/stores/AppStore.ts | 22 +++++++-- source/renderer/app/stores/AssetsStore.ts | 12 +++++ source/renderer/app/stores/CurrencyStore.ts | 13 ++++++ .../app/stores/HardwareWalletsStore.ts | 18 ++++++++ .../renderer/app/stores/NetworkStatusStore.ts | 4 ++ source/renderer/app/stores/ProfileStore.ts | 12 +++++ source/renderer/app/stores/SidebarStore.ts | 14 +++++- source/renderer/app/stores/StakingStore.ts | 27 ++++++++++- .../renderer/app/stores/TransactionsStore.ts | 15 +++++- source/renderer/app/stores/UiDialogsStore.ts | 36 ++++++++++++++- source/renderer/app/stores/VotingStore.ts | 4 ++ .../app/stores/WalletMigrationStore.ts | 5 ++ .../app/stores/WalletSettingsStore.ts | 15 ++++++ source/renderer/app/stores/WalletsStore.ts | 46 ++++++++++++++++++- 22 files changed, 277 insertions(+), 13 deletions(-) create mode 100644 source/renderer/app/analytics/getEventNameByWallet.ts diff --git a/source/renderer/app/analytics/MatomoClient.ts b/source/renderer/app/analytics/MatomoClient.ts index a08daf3292..863386203b 100644 --- a/source/renderer/app/analytics/MatomoClient.ts +++ b/source/renderer/app/analytics/MatomoClient.ts @@ -41,12 +41,17 @@ export class MatomoClient implements AnalyticsClient { }); }; - sendEvent = async (category: string, action: string): Promise => { + sendEvent = async ( + category: string, + action: string, + name?: string + ): Promise => { this.matomoTracker.track({ _id: this.userId, ca: 1, e_c: category, e_a: action, + e_n: name, url: this.getAnalyticsURL(), }); }; diff --git a/source/renderer/app/analytics/getEventNameByWallet.ts b/source/renderer/app/analytics/getEventNameByWallet.ts new file mode 100644 index 0000000000..beb7c3f707 --- /dev/null +++ b/source/renderer/app/analytics/getEventNameByWallet.ts @@ -0,0 +1,4 @@ +import Wallet from '../domains/Wallet'; + +export const getEventNameByWallet = (wallet: Wallet) => + wallet.isHardwareWallet ? 'Hardware wallet' : 'Software wallet'; diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index 59f927ef6f..8d07442320 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -1,6 +1,6 @@ export interface AnalyticsClient { sendPageNavigationEvent(pageTitle: string): Promise; - sendEvent(category: string, name: string): Promise; + sendEvent(category: string, action: string, name?: string): Promise; } export enum AnalyticsAcceptanceStatus { diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index 71298a8bb3..253db6d3b8 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -23,6 +23,7 @@ import smashSettingsIcon from '../../../assets/images/smash-settings-ic.inline.s import tinySpinnerIcon from '../../../assets/images/spinner-tiny.inline.svg'; import { getSmashServerNameFromUrl } from '../../../utils/staking'; import { AnalyticsClient } from '../../../analytics'; +import { debounce } from 'lodash'; const messages = defineMessages({ delegatingListTitle: { @@ -115,11 +116,24 @@ class StakePools extends Component { intl: intlShape.isRequired, }; state = { ...initialState }; - handleSearch = (search: string) => + + sendSearchAnalyticsEvent = debounce( + () => + this.props.analyticsClient.sendEvent( + 'Stake Pools', + 'Used stake pools search' + ), + 5000 + ); + + handleSearch = (search: string) => { this.setState({ search, }); + this.sendSearchAnalyticsEvent(); + }; + handleClearSearch = () => this.setState({ search: '', diff --git a/source/renderer/app/components/wallet/WalletSendForm.tsx b/source/renderer/app/components/wallet/WalletSendForm.tsx index 95983db6a6..19e36c59ea 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.tsx +++ b/source/renderer/app/components/wallet/WalletSendForm.tsx @@ -41,6 +41,7 @@ import { DiscreetWalletAmount } from '../../features/discreet-mode'; import WalletTokenPicker from './tokens/wallet-token-picker/WalletTokenPicker'; import { ClearButton } from './widgets/ClearButton'; import { Divider } from './widgets/Divider'; +import { AnalyticsClient } from '../../analytics'; messages.fieldIsRequired = globalMessages.fieldIsRequired; type AdaInputState = 'restored' | 'updated' | 'reset' | 'none'; @@ -76,6 +77,7 @@ type Props = { walletName: string; onTokenPickerDialogOpen: (...args: Array) => any; onTokenPickerDialogClose: (...args: Array) => any; + analyticsClient?: AnalyticsClient; }; interface FormFields { @@ -706,6 +708,10 @@ class WalletSendForm extends Component { async () => { this.removeAssetFields(uniqueId); await this.calculateTransactionFee(true); + this.props.analyticsClient?.sendEvent( + 'Wallets', + 'Removed token from transaction' + ); } ); }; @@ -1163,6 +1169,10 @@ class WalletSendForm extends Component { onAdd={(checked) => { onTokenPickerDialogClose(); checked.forEach(this.addAssetRow); + this.props.analyticsClient.sendEvent( + 'Wallets', + 'Added token to transaction' + ); }} /> )} diff --git a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx index 37b3ea9c90..3b57148d4c 100644 --- a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx +++ b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx @@ -16,6 +16,7 @@ import { SimpleTransactionList } from './render-strategies/SimpleTransactionList import { TransactionInfo, TransactionsGroup } from './types'; import type { Row } from './types'; import { getNonZeroAssetTokens } from '../../../utils/assets'; +import { AnalyticsClient } from '../../../analytics'; const messages = defineMessages({ today: { @@ -69,6 +70,7 @@ type Props = { getAsset: (...args: Array) => any; isInternalAddress: (...args: Array) => any; onCopyAssetParam: (...args: Array) => any; + analyticsClient?: AnalyticsClient; }; type State = { isPreloading: boolean; @@ -203,6 +205,10 @@ class WalletTransactionsList extends Component { onShowMoreTransactions = (walletId: string) => { if (this.props.onShowMoreTransactions) { this.props.onShowMoreTransactions(walletId); + this.props.analyticsClient?.sendEvent( + 'Wallet Details', + 'Clicked Show More Transactions button' + ); } }; getExpandedTransactions = () => this.expandedTransactionIds; diff --git a/source/renderer/app/containers/wallet/WalletSendPage.tsx b/source/renderer/app/containers/wallet/WalletSendPage.tsx index 34b9c10ddc..c8a44f541c 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.tsx +++ b/source/renderer/app/containers/wallet/WalletSendPage.tsx @@ -164,6 +164,7 @@ class WalletSendPage extends Component { walletName={walletName} onTokenPickerDialogOpen={this.openTokenPickerDialog} onTokenPickerDialogClose={this.closeTokenPickerDialog} + analyticsClient={this.props.stores.analytics.analyticsClient} /> ); } diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.tsx b/source/renderer/app/containers/wallet/WalletSummaryPage.tsx index 5e1642812d..68fa6866e3 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.tsx +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.tsx @@ -162,6 +162,7 @@ class WalletSummaryPage extends Component { hasAssetsEnabled={hasAssetsEnabled} getAsset={getAsset} onCopyAssetParam={onCopyAssetParam.trigger} + analyticsClient={this.props.stores.analytics.analyticsClient} /> ); } else if (!hasAny) { diff --git a/source/renderer/app/stores/AppStore.ts b/source/renderer/app/stores/AppStore.ts index 75968db700..33fed663d6 100644 --- a/source/renderer/app/stores/AppStore.ts +++ b/source/renderer/app/stores/AppStore.ts @@ -87,6 +87,10 @@ export default class AppStore extends Store { @action _toggleNewsFeed = () => { this.newsFeedIsOpen = !this.newsFeedIsOpen; + + if (this.newsFeedIsOpen) { + this._sendAnalyticsEvent('Topbar', 'Opened newsfeed'); + } }; @action _closeNewsFeed = () => { @@ -114,29 +118,37 @@ export default class AppStore extends Store { case DIALOGS.ABOUT: // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message this._updateActiveDialog(DIALOGS.ABOUT); - + this._sendAnalyticsEvent('System menu', 'Showed about dialog'); break; case DIALOGS.DAEDALUS_DIAGNOSTICS: // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message this._updateActiveDialog(DIALOGS.DAEDALUS_DIAGNOSTICS); + this._sendAnalyticsEvent('System menu', 'Showed diagnostics dialog'); break; case DIALOGS.TOGGLE_RTS_FLAGS_MODE: // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message this._updateActiveDialog(DIALOGS.TOGGLE_RTS_FLAGS_MODE); - + this._sendAnalyticsEvent( + 'System menu', + 'Showed toggle RTS flags dialog' + ); break; case DIALOGS.ITN_REWARDS_REDEMPTION: // @ts-ignore ts-migrate(2554) FIXME: Expected 1 arguments, but got 0. this.actions.staking.onRedeemStart.trigger(); + this._sendAnalyticsEvent( + 'System menu', + 'Showed ITN rewards redemption dialog' + ); break; case NOTIFICATIONS.DOWNLOAD_LOGS: this._downloadLogs(); - + this._sendAnalyticsEvent('System menu', 'Downloaded logs'); break; case PAGES.SETTINGS: @@ -235,4 +247,8 @@ export default class AppStore extends Store { _setIsDownloadingLogs = (isDownloadNotificationVisible: boolean) => { this.isDownloadNotificationVisible = isDownloadNotificationVisible; }; + + _sendAnalyticsEvent = (category: string, actionName: string) => { + this.stores.analytics.analyticsClient.sendEvent(category, actionName); + }; } diff --git a/source/renderer/app/stores/AssetsStore.ts b/source/renderer/app/stores/AssetsStore.ts index c8ff22af56..856f9fc672 100644 --- a/source/renderer/app/stores/AssetsStore.ts +++ b/source/renderer/app/stores/AssetsStore.ts @@ -107,6 +107,11 @@ export default class AssetsStore extends Store { await this.api.localStorage.setAssetLocalData(policyId, assetName, { decimals, }); + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Changed native token settings' + ); }; @action _onEditedAssetUnset = () => { @@ -193,6 +198,13 @@ export default class AssetsStore extends Store { ); // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message await this.favoritesRequest.execute(); + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + !isFavorite + ? 'Added token from favorites' + : 'Removed token from favorites' + ); }; _retrieveAssetsRequest = (walletId: string): Request => this.assetsRequests[walletId] || this._createWalletTokensRequest(walletId); diff --git a/source/renderer/app/stores/CurrencyStore.ts b/source/renderer/app/stores/CurrencyStore.ts index 8ac7ad688c..f94a0f4ca8 100644 --- a/source/renderer/app/stores/CurrencyStore.ts +++ b/source/renderer/app/stores/CurrencyStore.ts @@ -127,10 +127,23 @@ export default class CurrencyStore extends Store { this.getCurrencyRate(); await this.api.localStorage.setCurrencySelected(selected.code); } + + this.stores.analytics.analyticsClient.sendEvent( + 'Settings', + 'Changed currency', + code + ); }; @action _toggleCurrencyIsActive = () => { this.isActive = !this.isActive; this.api.localStorage.setCurrencyIsActive(this.isActive); + + this.stores.analytics.analyticsClient.sendEvent( + 'Settings', + `Turned ${ + this.isActive ? 'on' : 'off' + } displaying ada balances in other currency` + ); }; } diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index 521b0b2be4..0d9e0afe7f 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -524,8 +524,19 @@ export default class HardwareWalletsStore extends Store { isVotingRegistrationTransaction, } ); + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Transaction made', + 'Hardware wallet' + ); } else { this.setTransactionPendingState(false); + this.stores.analytics.analyticsClient.sendEvent( + 'Stake pools', + 'Wallet delegated', + 'Hardware wallet' + ); } this.stores.wallets.refreshWalletsData(); @@ -1266,6 +1277,7 @@ export default class HardwareWalletsStore extends Store { this.unfinishedWalletAddressVerification = address; this.hwDeviceStatus = HwDeviceStatuses.CONNECTING; }); + const walletId = get(this.stores.wallets, ['active', 'id']); const hardwareWalletConnectionData = get( this.hardwareWalletsConnectionData, @@ -1463,6 +1475,12 @@ export default class HardwareWalletsStore extends Store { ); this.showAddress(params); } + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Verified wallet address with hardware wallet', + 'Software wallet' + ); } else { runInAction( 'HardwareWalletsStore:: Address Verified but not correct', diff --git a/source/renderer/app/stores/NetworkStatusStore.ts b/source/renderer/app/stores/NetworkStatusStore.ts index 4f6998e1cd..d5538fce0c 100644 --- a/source/renderer/app/stores/NetworkStatusStore.ts +++ b/source/renderer/app/stores/NetworkStatusStore.ts @@ -431,6 +431,10 @@ export default class NetworkStatusStore extends Store { // DEFINE ACTIONS @action _toggleRTSFlagsMode = async () => { + this.stores.analytics.analyticsClient.sendEvent( + 'Settings', + `RTS flags ${this.isRTSFlagsModeEnabled ? 'disabled' : 'enabled'}` + ); await toggleRTSFlagsModeChannel.send(); }; diff --git a/source/renderer/app/stores/ProfileStore.ts b/source/renderer/app/stores/ProfileStore.ts index c8a8e6c877..f0ddaf1fd6 100644 --- a/source/renderer/app/stores/ProfileStore.ts +++ b/source/renderer/app/stores/ProfileStore.ts @@ -379,12 +379,24 @@ export default class ProfileStore extends Store { // @ts-ignore ts-migrate(2339) FIXME: Property 'stores' does not exist on type 'ProfileS... Remove this comment to see the full error message this.stores.wallets.refreshWalletsData(); } + + this.stores.analytics.analyticsClient.sendEvent( + 'Settings', + 'Changed user settings', + param + ); }; _updateTheme = async ({ theme }: { theme: string }) => { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message await this.setThemeRequest.execute(theme); // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message await this.getThemeRequest.execute(); + + this.stores.analytics.analyticsClient.sendEvent( + 'Settings', + 'Changed theme', + theme + ); }; _acceptTermsOfUse = async () => { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message diff --git a/source/renderer/app/stores/SidebarStore.ts b/source/renderer/app/stores/SidebarStore.ts index 702f8288fd..3e5b65b37f 100644 --- a/source/renderer/app/stores/SidebarStore.ts +++ b/source/renderer/app/stores/SidebarStore.ts @@ -1,5 +1,5 @@ import { action, computed, observable } from 'mobx'; -import { get } from 'lodash'; +import { debounce, get } from 'lodash'; import { sidebarConfig } from '../config/sidebarConfig'; import type { SidebarCategoryInfo } from '../config/sidebarConfig'; import type { @@ -97,10 +97,13 @@ export default class SidebarStore extends Store { sortOrder: this.walletSortConfig.sortOrder, currentSortBy: this.walletSortConfig.sortBy, }); + + this._sendAnalyticsEvent('Changed wallet sorting settings'); }; @action onSearchValueUpdated = (searchValue: string) => { this.searchValue = searchValue; + this._sendSearchAnalyticsEvent(); }; @action _configureCategories = () => { @@ -175,14 +178,17 @@ export default class SidebarStore extends Store { @action _showSubMenus = () => { this.isShowingSubMenus = true; + this._sendAnalyticsEvent('Toggled submenu'); }; @action _hideSubMenus = () => { this.isShowingSubMenus = false; + this._sendAnalyticsEvent('Toggled submenu'); }; @action _toggleSubMenus = () => { this.isShowingSubMenus = !this.isShowingSubMenus; + this._sendAnalyticsEvent('Toggled submenu'); }; _syncSidebarRouteWithRouter = () => { const route = this.stores.app.currentRoute; @@ -199,4 +205,10 @@ export default class SidebarStore extends Store { this._configureCategories(); } }; + _sendAnalyticsEvent = (action: string) => { + this.stores.analytics.analyticsClient.sendEvent('Layout', action); + }; + _sendSearchAnalyticsEvent = debounce(() => { + this._sendAnalyticsEvent('Used wallet search'); + }, 5000); } diff --git a/source/renderer/app/stores/StakingStore.ts b/source/renderer/app/stores/StakingStore.ts index 704fa767c6..59a8ab41de 100644 --- a/source/renderer/app/stores/StakingStore.ts +++ b/source/renderer/app/stores/StakingStore.ts @@ -1,7 +1,7 @@ import { computed, action, observable, runInAction } from 'mobx'; import BigNumber from 'bignumber.js'; import path from 'path'; -import { orderBy, find, map, get } from 'lodash'; +import { orderBy, find, map, get, debounce } from 'lodash'; import Store from './lib/Store'; import Request from './lib/LocalizedRequest'; import { ROUTES } from '../routes-config'; @@ -227,10 +227,20 @@ export default class StakingStore extends Store { _setSelectedDelegationWalletId = (walletId: string) => { this.selectedDelegationWalletId = walletId; }; + + _sendStakePoolsSliderUsedAnalyticsEvent = debounce(() => { + this.stores.analytics.analyticsClient.sendEvent( + 'Stake Pools', + 'Used stake pools amount slider' + ); + }, 5000); + @action _setStake = (stake: number) => { this.stake = stake; + this._sendStakePoolsSliderUsedAnalyticsEvent(); }; + @action _rankStakePools = () => { this.isRanking = true; @@ -266,6 +276,10 @@ export default class StakingStore extends Store { // Update // @ts-ignore ts-migrate(2339) FIXME: Property 'api' does not exist on type 'StakingStor... Remove this comment to see the full error message await this.api.localStorage.setSmashServer(smashServerUrl); + this.stores.analytics.analyticsClient.sendEvent( + 'Settings', + 'Changed SMASH server' + ); } catch (error) { runInAction(() => { this.smashServerUrlError = error; @@ -383,6 +397,13 @@ export default class StakingStore extends Store { setTimeout(() => { this.resetStakePoolTransactionChecker(); }, STAKE_POOL_TRANSACTION_CHECKER_TIMEOUT); + + const wallet = this.stores.wallets.getWalletById(walletId); + + this.stores.analytics.analyticsClient.sendEvent( + 'Stake pools', + wallet.isDelegating ? 'Redelegated a wallet' : 'Delegated a wallet' + ); } catch (error) { this.resetStakePoolTransactionChecker(); throw error; @@ -507,6 +528,10 @@ export default class StakingStore extends Store { }); // @ts-ignore ts-migrate(2339) FIXME: Property 'actions' does not exist on type 'Staking... Remove this comment to see the full error message this.actions.staking.requestCSVFileSuccess.trigger(); + this.stores.analytics.analyticsClient.sendEvent( + 'Stake Pools', + 'Exported rewards as CSV' + ); }; calculateDelegationFee = async ( delegationFeeRequest: GetDelegationFeeRequest diff --git a/source/renderer/app/stores/TransactionsStore.ts b/source/renderer/app/stores/TransactionsStore.ts index 8f003da4f6..dbacd5b1a7 100644 --- a/source/renderer/app/stores/TransactionsStore.ts +++ b/source/renderer/app/stores/TransactionsStore.ts @@ -367,6 +367,11 @@ export default class TransactionsStore extends Store { ...currentFilterOptions, ...filterOptions, }; + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Set transaction filters' + ); return true; }; @action @@ -376,6 +381,7 @@ export default class TransactionsStore extends Store { this._filterOptionsForWallets[wallet.id] = { ...emptyTransactionFilterOptions, }; + return true; }; @action @@ -402,8 +408,13 @@ export default class TransactionsStore extends Store { getAsset, isInternalAddress, }); - // @ts-ignore ts-migrate(2554) FIXME: Expected 1 arguments, but got 0. - if (success) actions.transactions.requestCSVFileSuccess.trigger(); + if (success) { + actions.transactions.requestCSVFileSuccess.trigger(); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Exported transactions as CSV' + ); + } }; @action _createExternalTransaction = async (signedTransactionBlob: Buffer) => { diff --git a/source/renderer/app/stores/UiDialogsStore.ts b/source/renderer/app/stores/UiDialogsStore.ts index 5585eef1b0..4641037435 100644 --- a/source/renderer/app/stores/UiDialogsStore.ts +++ b/source/renderer/app/stores/UiDialogsStore.ts @@ -1,6 +1,9 @@ -import { ReactNode } from 'react'; +import { Component, ReactNode } from 'react'; import { observable, action } from 'mobx'; import Store from './lib/Store'; +import WalletReceiveDialog from '../components/wallet/receive/WalletReceiveDialog'; +import AssetSettingsDialog from '../components/assets/AssetSettingsDialog'; +import DelegationSetupWizardDialog from '../components/staking/delegation-setup-wizard/DelegationSetupWizardDialog'; export default class UiDialogsStore extends Store { @observable @@ -25,7 +28,7 @@ export default class UiDialogsStore extends Store { countdownSinceDialogOpened = (countDownTo: number) => Math.max(countDownTo - this.secondsSinceActiveDialogIsOpen, 0); @action - _onOpen = ({ dialog }: { dialog: (...args: Array) => any }) => { + _onOpen = ({ dialog }: { dialog: object }) => { this._reset(); this.activeDialog = dialog; @@ -34,6 +37,8 @@ export default class UiDialogsStore extends Store { this.secondsSinceActiveDialogIsOpen = 0; if (this._secondsTimerInterval) clearInterval(this._secondsTimerInterval); this._secondsTimerInterval = setInterval(this._updateSeconds, 1000); + + this._handleAnalytics(dialog); }; @action _onClose = () => { @@ -53,4 +58,31 @@ export default class UiDialogsStore extends Store { this.secondsSinceActiveDialogIsOpen = 0; this.dataForActiveDialog = {}; }; + _handleAnalytics = (dialog: object) => { + switch (dialog) { + case WalletReceiveDialog: + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Opened share wallet address modal' + ); + break; + + case AssetSettingsDialog: + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Opened native token settings' + ); + break; + + case DelegationSetupWizardDialog: + this.stores.analytics.analyticsClient.sendEvent( + 'Stake Pools', + 'Opened delegate wallet dialog' + ); + break; + + default: + break; + } + }; } diff --git a/source/renderer/app/stores/VotingStore.ts b/source/renderer/app/stores/VotingStore.ts index 5ab01a9511..89c8e2053d 100644 --- a/source/renderer/app/stores/VotingStore.ts +++ b/source/renderer/app/stores/VotingStore.ts @@ -406,6 +406,10 @@ export default class VotingStore extends Store { this._setQrCode(formattedArrayBufferToHexString(encrypt)); this._nextRegistrationStep(); + this.stores.analytics.analyticsClient.sendEvent( + 'Voting', + 'Registered for voting' + ); }; _saveAsPDF = async () => { const { qrCode, selectedWalletId } = this; diff --git a/source/renderer/app/stores/WalletMigrationStore.ts b/source/renderer/app/stores/WalletMigrationStore.ts index a593f1e5e7..7cb90c4d37 100644 --- a/source/renderer/app/stores/WalletMigrationStore.ts +++ b/source/renderer/app/stores/WalletMigrationStore.ts @@ -311,6 +311,11 @@ export default class WalletMigrationStore extends Store { runInAction('update isRestorationRunning', () => { this.isRestorationRunning = false; }); + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Restored legacy wallet(s)' + ); }; @action _restoreWallet = async (exportedWallet: ExportedByronWallet) => { diff --git a/source/renderer/app/stores/WalletSettingsStore.ts b/source/renderer/app/stores/WalletSettingsStore.ts index 7a0c407278..8df1e69095 100644 --- a/source/renderer/app/stores/WalletSettingsStore.ts +++ b/source/renderer/app/stores/WalletSettingsStore.ts @@ -156,6 +156,11 @@ export default class WalletSettingsStore extends Store { this.actions.dialogs.closeActiveDialog.trigger(); this.updateSpendingPasswordRequest.reset(); this.stores.wallets.refreshWalletsData(); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallet settings', + 'Changed wallet settings', + 'password' + ); }; @action _updateWalletField = async ({ @@ -189,6 +194,11 @@ export default class WalletSettingsStore extends Store { }); this.updateWalletRequest.reset(); this.stores.wallets.refreshWalletsData(); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallet Settings', + 'Changed wallet settings', + field + ); }; @action _exportToFile = async (params: WalletExportToFileParams) => { @@ -279,6 +289,11 @@ export default class WalletSettingsStore extends Store { const isCorrect = walletId === activeWalletId; const nextStep = isCorrect ? 3 : 4; + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Verified recovery phrase' + ); + if (isCorrect) { const recoveryPhraseVerificationDate = new Date(); await this.actions.walletsLocal.setWalletLocalData.trigger({ diff --git a/source/renderer/app/stores/WalletsStore.ts b/source/renderer/app/stores/WalletsStore.ts index f7f4799e0a..21768e4677 100644 --- a/source/renderer/app/stores/WalletsStore.ts +++ b/source/renderer/app/stores/WalletsStore.ts @@ -57,6 +57,7 @@ import type { HardwareWalletExtendedPublicKeyResponse, } from '../../../common/types/hardware-wallets.types'; import { NetworkMagics } from '../../../common/types/cardano-node.types'; +import { getEventNameByWallet } from '../analytics/getEventNameByWallet'; /* eslint-disable consistent-return */ /** @@ -365,6 +366,10 @@ export default class WalletsStore extends Store { runInAction('update account public key', () => { this.activePublicKey = accountPublicKey; }); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Reveal wallet public key' + ); } catch (error) { throw error; } @@ -397,6 +402,10 @@ export default class WalletsStore extends Store { runInAction('update ICO public key', () => { this.icoPublicKey = icoPublicKey; }); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Reveal wallet public key' + ); } catch (error) { throw error; } @@ -464,8 +473,13 @@ export default class WalletsStore extends Store { this.goToWalletRoute(restoredWallet.id); this.refreshWalletsData(); - this._restoreWalletResetRequests(); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Restored a software wallet', + this.walletKind + ); + this._restoreWalletResetRequests(); this._restoreWalletResetData(); } }; @@ -619,6 +633,10 @@ export default class WalletsStore extends Store { this.goToWalletRoute(wallet.id); this.refreshWalletsData(); this.actions.dialogs.closeActiveDialog.trigger(); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Created a new hardware wallet' + ); } } catch (error) { throw error; @@ -639,6 +657,10 @@ export default class WalletsStore extends Store { this.actions.dialogs.closeActiveDialog.trigger(); this.goToWalletRoute(wallet.id); this.refreshWalletsData(); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Created a new software wallet' + ); } }; _deleteWallet = async (params: { walletId: string; isLegacy: boolean }) => { @@ -681,6 +703,13 @@ export default class WalletsStore extends Store { }); } }); + + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Wallet deleted', + getEventNameByWallet(walletToDelete) + ); + this.actions.dialogs.closeActiveDialog.trigger(); this.actions.walletsLocal.unsetWalletLocalData.trigger({ walletId: params.walletId, @@ -817,6 +846,11 @@ export default class WalletsStore extends Store { assets: formattedAssets, hasAssetsRemainingAfterTransaction, }); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Transaction made', + 'Software wallet' + ); this.refreshWalletsData(); this.actions.dialogs.closeActiveDialog.trigger(); this.sendMoneyRequest.reset(); @@ -1508,6 +1542,11 @@ export default class WalletsStore extends Store { this.actions.wallets.generateAddressPDFSuccess.trigger({ walletAddress, }); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Saved wallet address as PDF', + 'Software wallet' + ); } catch (error) { throw new Error(error); } @@ -1528,6 +1567,11 @@ export default class WalletsStore extends Store { this.actions.wallets.saveQRCodeImageSuccess.trigger({ walletAddress, }); + this.stores.analytics.analyticsClient.sendEvent( + 'Wallets', + 'Saved wallet address as QR code', + 'Software wallet' + ); } catch (error) { throw new Error(error); } From fdefa7b679f858502035df44a21dee4a8d95781e Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Wed, 15 Jun 2022 18:45:54 +0200 Subject: [PATCH 10/41] [DDW-809] Fix issues --- .../staking/stake-pools/StakePools.tsx | 2 +- .../app/features/discreet-mode/context.tsx | 1 + .../app/features/discreet-mode/feature.ts | 19 ++++++-- .../app/i18n/locales/defaultMessages.json | 48 +++++++++---------- .../app/stores/HardwareWalletsStore.ts | 5 -- 5 files changed, 41 insertions(+), 34 deletions(-) diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index 253db6d3b8..79df0e807c 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -3,6 +3,7 @@ import SVGInline from 'react-svg-inline'; import { observer } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; import classnames from 'classnames'; +import { debounce } from 'lodash'; import { StakingPageScrollContext } from '../layouts/StakingWithNavigation'; import StakePoolsRanking from './StakePoolsRanking'; import { StakePoolsList } from './StakePoolsList'; @@ -23,7 +24,6 @@ import smashSettingsIcon from '../../../assets/images/smash-settings-ic.inline.s import tinySpinnerIcon from '../../../assets/images/spinner-tiny.inline.svg'; import { getSmashServerNameFromUrl } from '../../../utils/staking'; import { AnalyticsClient } from '../../../analytics'; -import { debounce } from 'lodash'; const messages = defineMessages({ delegatingListTitle: { diff --git a/source/renderer/app/features/discreet-mode/context.tsx b/source/renderer/app/features/discreet-mode/context.tsx index ad5cd5c240..7dfa98abbd 100644 --- a/source/renderer/app/features/discreet-mode/context.tsx +++ b/source/renderer/app/features/discreet-mode/context.tsx @@ -9,6 +9,7 @@ import { import { useLocalStorageFeature } from '../local-storage'; import { DiscreetMode } from './feature'; import { DiscreetModeApi } from './api'; +import { getAnalyticsClient } from '../../analytics'; export const discreetModeContext = React.createContext( null diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index 1f783de586..56cd4d345c 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -7,11 +7,8 @@ import { defaultReplacer } from './replacers/defaultReplacer'; import type { ReplacerFn } from './types'; export class DiscreetMode extends Feature { - api: DiscreetModeApi; - - constructor(api: DiscreetModeApi) { + constructor(private api: DiscreetModeApi) { super(); - this.api = api; runInAction(() => { this.getDiscreetModeSettingsRequest = new Request( this.api.getDiscreetModeSettings @@ -50,6 +47,13 @@ export class DiscreetMode extends Feature { @action toggleDiscreetMode = () => { this.isDiscreetMode = !this.isDiscreetMode; + // TODO: what is the best way to inject the analytics client? + global.daedalus.stores.analytics.analyticsClient.sendEvent( + 'Settings', + this.isDiscreetMode + ? 'Turned on discreet mode' + : 'Turned off discreet mode' + ); }; @action toggleOpenInDiscreetMode = async () => { @@ -59,6 +63,13 @@ export class DiscreetMode extends Feature { runInAction('Update open in discreet mode settings', () => { this.openInDiscreetMode = nextSetting; }); + // TODO: what is the best way to inject the analytics client? + global.daedalus.stores.analytics.analyticsClient.sendEvent( + 'Settings', + this.isDiscreetMode + ? 'Turned on discreet mode by default' + : 'Turned off discreet mode by default' + ); }; discreetValue({ diff --git a/source/renderer/app/i18n/locales/defaultMessages.json b/source/renderer/app/i18n/locales/defaultMessages.json index fb63952edc..ac353a2f09 100644 --- a/source/renderer/app/i18n/locales/defaultMessages.json +++ b/source/renderer/app/i18n/locales/defaultMessages.json @@ -6263,13 +6263,13 @@ "description": "\"delegatingListTitle\" for the Stake Pools page.", "end": { "column": 3, - "line": 32 + "line": 33 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.delegatingListTitle", "start": { "column": 23, - "line": 28 + "line": 29 } }, { @@ -6277,13 +6277,13 @@ "description": "\"listTitle\" for the Stake Pools page.", "end": { "column": 3, - "line": 37 + "line": 38 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitle", "start": { "column": 13, - "line": 33 + "line": 34 } }, { @@ -6291,13 +6291,13 @@ "description": "\"listTitleLoading\" for the Stake Pools page.", "end": { "column": 3, - "line": 42 + "line": 43 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitleLoading", "start": { "column": 20, - "line": 38 + "line": 39 } }, { @@ -6305,13 +6305,13 @@ "description": "\"listTitleSearch\" for the Stake Pools page.", "end": { "column": 3, - "line": 47 + "line": 48 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitleSearch", "start": { "column": 19, - "line": 43 + "line": 44 } }, { @@ -6319,13 +6319,13 @@ "description": "\"listTitleStakePools\" for the Stake Pools page.", "end": { "column": 3, - "line": 52 + "line": 53 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.listTitleStakePools", "start": { "column": 23, - "line": 48 + "line": 49 } }, { @@ -6333,13 +6333,13 @@ "description": "Loading stake pool message for the Delegation center body section.", "end": { "column": 3, - "line": 58 + "line": 59 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.loadingStakePoolsMessage", "start": { "column": 28, - "line": 53 + "line": 54 } }, { @@ -6347,13 +6347,13 @@ "description": "moderatedBy message for the Delegation center body section.", "end": { "column": 3, - "line": 63 + "line": 64 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.moderatedBy", "start": { "column": 15, - "line": 59 + "line": 60 } }, { @@ -6361,13 +6361,13 @@ "description": "unmoderated message for the Delegation center body section.", "end": { "column": 3, - "line": 68 + "line": 69 }, "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", "id": "staking.stakePools.unmoderated", "start": { "column": 15, - "line": 64 + "line": 65 } } ], @@ -14624,13 +14624,13 @@ "description": "Label for the \"Today\" label on the wallet summary page.", "end": { "column": 3, - "line": 25 + "line": 26 }, "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", "id": "wallet.summary.transactionsList.todayLabel", "start": { "column": 9, - "line": 21 + "line": 22 } }, { @@ -14638,13 +14638,13 @@ "description": "Label for the \"Yesterday\" label on the wallet summary page.", "end": { "column": 3, - "line": 30 + "line": 31 }, "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", "id": "wallet.summary.transactionsList.yesterdayLabel", "start": { "column": 13, - "line": 26 + "line": 27 } }, { @@ -14652,13 +14652,13 @@ "description": "Label for the \"Show more transactions\" button on the wallet summary page.", "end": { "column": 3, - "line": 36 + "line": 37 }, "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", "id": "wallet.summary.transactionsList.showMoreTransactionsButtonLabel", "start": { "column": 35, - "line": 31 + "line": 32 } }, { @@ -14666,13 +14666,13 @@ "description": "Syncing transactions message on async wallet restore.", "end": { "column": 3, - "line": 42 + "line": 43 }, "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", "id": "wallet.summary.transactionsList.syncingTransactionsMessage", "start": { "column": 30, - "line": 37 + "line": 38 } } ], diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index 0d9e0afe7f..9379c032ec 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -532,11 +532,6 @@ export default class HardwareWalletsStore extends Store { ); } else { this.setTransactionPendingState(false); - this.stores.analytics.analyticsClient.sendEvent( - 'Stake pools', - 'Wallet delegated', - 'Hardware wallet' - ); } this.stores.wallets.refreshWalletsData(); From 5b248dc03d90a5864aa0fb3cbc432c50f238f073 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 20 Jun 2022 15:57:42 +0200 Subject: [PATCH 11/41] [DDW-809] Cleanup --- source/renderer/app/analytics/getEventNameByWallet.ts | 4 ---- .../app/components/staking/stake-pools/StakePools.tsx | 10 +++++----- .../renderer/app/components/wallet/WalletSendForm.tsx | 2 +- source/renderer/app/stores/HardwareWalletsStore.ts | 1 - source/renderer/app/stores/StakingStore.ts | 2 +- source/renderer/app/stores/WalletSettingsStore.ts | 2 +- source/renderer/app/stores/WalletsStore.ts | 3 +-- source/renderer/app/stores/lib/Store.ts | 3 ++- 8 files changed, 11 insertions(+), 16 deletions(-) delete mode 100644 source/renderer/app/analytics/getEventNameByWallet.ts diff --git a/source/renderer/app/analytics/getEventNameByWallet.ts b/source/renderer/app/analytics/getEventNameByWallet.ts deleted file mode 100644 index beb7c3f707..0000000000 --- a/source/renderer/app/analytics/getEventNameByWallet.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Wallet from '../domains/Wallet'; - -export const getEventNameByWallet = (wallet: Wallet) => - wallet.isHardwareWallet ? 'Hardware wallet' : 'Software wallet'; diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index 79df0e807c..67fa470238 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -70,7 +70,7 @@ const messages = defineMessages({ }); const SELECTED_INDEX_TABLE = 'selectedIndexTable'; type Props = { - analyticsClient: AnalyticsClient; + analyticsClient?: AnalyticsClient; currentLocale: string; currentTheme: string; getStakePoolById: (...args: Array) => any; @@ -119,7 +119,7 @@ class StakePools extends Component { sendSearchAnalyticsEvent = debounce( () => - this.props.analyticsClient.sendEvent( + this.props.analyticsClient?.sendEvent( 'Stake Pools', 'Used stake pools search' ), @@ -146,7 +146,7 @@ class StakePools extends Component { isListView: false, }); - this.props.analyticsClient.sendEvent( + this.props.analyticsClient?.sendEvent( 'Stake Pools', 'Changed view to grid view' ); @@ -158,7 +158,7 @@ class StakePools extends Component { isListView: false, }); - this.props.analyticsClient.sendEvent( + this.props.analyticsClient?.sendEvent( 'Stake Pools', 'Changed view to grid rewards view' ); @@ -170,7 +170,7 @@ class StakePools extends Component { isListView: true, }); - this.props.analyticsClient.sendEvent( + this.props.analyticsClient?.sendEvent( 'Stake Pools', 'Changed view to list view' ); diff --git a/source/renderer/app/components/wallet/WalletSendForm.tsx b/source/renderer/app/components/wallet/WalletSendForm.tsx index 19e36c59ea..8135669c56 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.tsx +++ b/source/renderer/app/components/wallet/WalletSendForm.tsx @@ -1169,7 +1169,7 @@ class WalletSendForm extends Component { onAdd={(checked) => { onTokenPickerDialogClose(); checked.forEach(this.addAssetRow); - this.props.analyticsClient.sendEvent( + this.props.analyticsClient?.sendEvent( 'Wallets', 'Added token to transaction' ); diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index 9379c032ec..0b1a4e11b6 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -1474,7 +1474,6 @@ export default class HardwareWalletsStore extends Store { this.stores.analytics.analyticsClient.sendEvent( 'Wallets', 'Verified wallet address with hardware wallet', - 'Software wallet' ); } else { runInAction( diff --git a/source/renderer/app/stores/StakingStore.ts b/source/renderer/app/stores/StakingStore.ts index 59a8ab41de..a0fe63c7f1 100644 --- a/source/renderer/app/stores/StakingStore.ts +++ b/source/renderer/app/stores/StakingStore.ts @@ -401,7 +401,7 @@ export default class StakingStore extends Store { const wallet = this.stores.wallets.getWalletById(walletId); this.stores.analytics.analyticsClient.sendEvent( - 'Stake pools', + 'Stake Pools', wallet.isDelegating ? 'Redelegated a wallet' : 'Delegated a wallet' ); } catch (error) { diff --git a/source/renderer/app/stores/WalletSettingsStore.ts b/source/renderer/app/stores/WalletSettingsStore.ts index 8df1e69095..ac7ad57107 100644 --- a/source/renderer/app/stores/WalletSettingsStore.ts +++ b/source/renderer/app/stores/WalletSettingsStore.ts @@ -157,7 +157,7 @@ export default class WalletSettingsStore extends Store { this.updateSpendingPasswordRequest.reset(); this.stores.wallets.refreshWalletsData(); this.stores.analytics.analyticsClient.sendEvent( - 'Wallet settings', + 'Wallet Settings', 'Changed wallet settings', 'password' ); diff --git a/source/renderer/app/stores/WalletsStore.ts b/source/renderer/app/stores/WalletsStore.ts index 21768e4677..64311b3fd8 100644 --- a/source/renderer/app/stores/WalletsStore.ts +++ b/source/renderer/app/stores/WalletsStore.ts @@ -57,7 +57,6 @@ import type { HardwareWalletExtendedPublicKeyResponse, } from '../../../common/types/hardware-wallets.types'; import { NetworkMagics } from '../../../common/types/cardano-node.types'; -import { getEventNameByWallet } from '../analytics/getEventNameByWallet'; /* eslint-disable consistent-return */ /** @@ -707,7 +706,7 @@ export default class WalletsStore extends Store { this.stores.analytics.analyticsClient.sendEvent( 'Wallets', 'Wallet deleted', - getEventNameByWallet(walletToDelete) + walletToDelete.isHardwareWallet ? 'Hardware wallet' : 'Software wallet' ); this.actions.dialogs.closeActiveDialog.trigger(); diff --git a/source/renderer/app/stores/lib/Store.ts b/source/renderer/app/stores/lib/Store.ts index 6dee796702..93c454579d 100644 --- a/source/renderer/app/stores/lib/Store.ts +++ b/source/renderer/app/stores/lib/Store.ts @@ -3,6 +3,7 @@ import type { ActionsMap } from '../../actions/index'; import type { StoresMap } from '../index'; import type { Api } from '../../api/index'; import type { Environment } from '../../../../common/types/environment.types'; +import {AnalyticsClient} from "../../analytics"; export default class Store { stores: StoresMap; @@ -11,7 +12,7 @@ export default class Store { environment: Environment = global.environment; _reactions: Array = []; - constructor(api: Api, actions: ActionsMap) { + constructor(api: Api, actions: ActionsMap, analyticsClient?: AnalyticsClient) { this.api = api; this.actions = actions; } From 6fda1d0cda2b95bacbb8213cefe986051e4e6168 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 20 Jun 2022 17:44:12 +0200 Subject: [PATCH 12/41] [DDW-809] Cleanup discreet mode provider --- .../app/analytics/getAnalyticsClient.ts | 2 +- .../app/features/discreet-mode/context.tsx | 17 +++- .../app/features/discreet-mode/feature.ts | 9 +- .../app/features/local-storage/context.tsx | 1 + source/renderer/app/index.tsx | 8 +- source/renderer/app/stores/AnalyticsStore.ts | 4 +- .../app/stores/HardwareWalletsStore.ts | 3 +- source/renderer/app/stores/index.ts | 99 ++++++++++--------- source/renderer/app/stores/lib/Store.ts | 14 ++- 9 files changed, 90 insertions(+), 67 deletions(-) diff --git a/source/renderer/app/analytics/getAnalyticsClient.ts b/source/renderer/app/analytics/getAnalyticsClient.ts index 1741b82858..46fd444159 100644 --- a/source/renderer/app/analytics/getAnalyticsClient.ts +++ b/source/renderer/app/analytics/getAnalyticsClient.ts @@ -9,7 +9,7 @@ let client: AnalyticsClient; const getAnalyticsClient = async ( localStorage: LocalStorageApi, environment: Environment -) => { +): Promise => { const analyticsAccepted = (await localStorage.getAnalyticsAcceptance()) === AnalyticsAcceptanceStatus.ACCEPTED; diff --git a/source/renderer/app/features/discreet-mode/context.tsx b/source/renderer/app/features/discreet-mode/context.tsx index 7dfa98abbd..ae45ee088b 100644 --- a/source/renderer/app/features/discreet-mode/context.tsx +++ b/source/renderer/app/features/discreet-mode/context.tsx @@ -9,18 +9,31 @@ import { import { useLocalStorageFeature } from '../local-storage'; import { DiscreetMode } from './feature'; import { DiscreetModeApi } from './api'; -import { getAnalyticsClient } from '../../analytics'; +import { useAnalytics } from '../../components/analytics'; +import { AnalyticsClient } from '../../analytics'; export const discreetModeContext = React.createContext( null ); interface Props { children: Node; + analyticsClient: AnalyticsClient; } +<<<<<<< HEAD export function DiscreetModeFeatureProvider({ children }: Props) { +======= +export const DiscreetModeFeatureProvider = ({ + children, + analyticsClient, +}: Props) => { +>>>>>>> 1a8661dc7 ([DDW-809] Cleanup discreet mode provider) const localStorageFeature = useLocalStorageFeature(); + const [discreetModeFeature] = useState(() => { - const feature = new DiscreetMode(new DiscreetModeApi(localStorageFeature)); + const feature = new DiscreetMode( + new DiscreetModeApi(localStorageFeature), + analyticsClient + ); // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message window.daedalus = merge(window.daedalus, { features: { diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index 56cd4d345c..cd7a837fa0 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -5,9 +5,10 @@ import { DiscreetModeApi } from './api'; import { SENSITIVE_DATA_SYMBOL } from './config'; import { defaultReplacer } from './replacers/defaultReplacer'; import type { ReplacerFn } from './types'; +import { AnalyticsClient } from '../../analytics'; export class DiscreetMode extends Feature { - constructor(private api: DiscreetModeApi) { + constructor(private api: DiscreetModeApi, private analyticsClient: AnalyticsClient) { super(); runInAction(() => { this.getDiscreetModeSettingsRequest = new Request( @@ -47,8 +48,7 @@ export class DiscreetMode extends Feature { @action toggleDiscreetMode = () => { this.isDiscreetMode = !this.isDiscreetMode; - // TODO: what is the best way to inject the analytics client? - global.daedalus.stores.analytics.analyticsClient.sendEvent( + this.analyticsClient.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode' @@ -63,8 +63,7 @@ export class DiscreetMode extends Feature { runInAction('Update open in discreet mode settings', () => { this.openInDiscreetMode = nextSetting; }); - // TODO: what is the best way to inject the analytics client? - global.daedalus.stores.analytics.analyticsClient.sendEvent( + this.analyticsClient.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode by default' diff --git a/source/renderer/app/features/local-storage/context.tsx b/source/renderer/app/features/local-storage/context.tsx index 8cb02f87bc..31447813a3 100644 --- a/source/renderer/app/features/local-storage/context.tsx +++ b/source/renderer/app/features/local-storage/context.tsx @@ -4,6 +4,7 @@ import type { Node } from 'react'; import { merge } from 'lodash/fp'; import { getFeatureFromContext } from '../../utils/mobx-features/hooks'; import type { LocalStorageApi } from './types'; +import { useAnalytics } from '../../components/analytics'; export const localStorageContext = React.createContext( null diff --git a/source/renderer/app/index.tsx b/source/renderer/app/index.tsx index 1dd930ec81..66689864aa 100755 --- a/source/renderer/app/index.tsx +++ b/source/renderer/app/index.tsx @@ -30,11 +30,11 @@ addLocaleData([...en, ...ja]); const { environment } = global; const { isTest } = environment; -const initializeDaedalus = () => { +const initializeDaedalus = async () => { const api = setupApi(isTest); const hashHistory = createHashHistory(); const routingStore = new RouterStore(); - const stores = setupStores(api, actions, routingStore); + const stores = await setupStores(api, actions, routingStore); const history = syncHistoryWithStore(hashHistory, routingStore); // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message window.daedalus = { @@ -53,7 +53,9 @@ const initializeDaedalus = () => { if (!rootElement) throw new Error('No #root element found.'); render( - + , diff --git a/source/renderer/app/stores/AnalyticsStore.ts b/source/renderer/app/stores/AnalyticsStore.ts index 7424eac1dc..725ac46f36 100644 --- a/source/renderer/app/stores/AnalyticsStore.ts +++ b/source/renderer/app/stores/AnalyticsStore.ts @@ -6,8 +6,8 @@ export default class AnalyticsStore extends Store { @observable analyticsClient: AnalyticsClient; - setup() { - this.resetAnalyticsClient(); + async setup() { + return this.resetAnalyticsClient(); } resetAnalyticsClient = async (): Promise => { diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index 0b1a4e11b6..d33bb48d26 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -704,6 +704,7 @@ export default class HardwareWalletsStore extends Store { throw e; } }; + @action establishHardwareWalletConnection = async () => { runInAction('HardwareWalletsStore:: set HW device CONNECTING', () => { @@ -1473,7 +1474,7 @@ export default class HardwareWalletsStore extends Store { this.stores.analytics.analyticsClient.sendEvent( 'Wallets', - 'Verified wallet address with hardware wallet', + 'Verified wallet address with hardware wallet' ); } else { runInAction( diff --git a/source/renderer/app/stores/index.ts b/source/renderer/app/stores/index.ts index 4ce9ec261d..0c86d7fcc9 100644 --- a/source/renderer/app/stores/index.ts +++ b/source/renderer/app/stores/index.ts @@ -79,54 +79,57 @@ let stores: StoresMap | null | undefined = null; const storeNames = Object.keys(storeClasses); // Helpers -function executeOnEveryStore(fn: (store: Store) => void) { - storeNames.forEach((name) => { - if (stores && stores[name]) fn(stores[name]); - }); +async function executeOnEveryStore(fn: (store: Store) => void) { + await Promise.all( + storeNames.map((name) => { + if (stores && stores[name]) { + return fn(stores[name]); + } + return Promise.resolve(); + }) + ); } // Set up and return the stores for this app -> also used to reset all stores to defaults -export default action( - (api, actions, router): StoresMap => { - function createStoreInstanceOf( - StoreSubClass: Class - ): T { - return new StoreSubClass(api, actions); - } - - // Teardown existing stores - if (stores) executeOnEveryStore((store) => store.teardown()); - // Create fresh instances of all stores - // @ts-ignore ts-migrate(2322) FIXME: Type '{ addresses: Store; app: Store; assets: Stor... Remove this comment to see the full error message - stores = observable({ - analytics: createStoreInstanceOf(AnalyticsStore), - addresses: createStoreInstanceOf(AddressesStore), - app: createStoreInstanceOf(AppStore), - assets: createStoreInstanceOf(AssetsStore), - currency: createStoreInstanceOf(CurrencyStore), - appUpdate: createStoreInstanceOf(AppUpdateStore), - hardwareWallets: createStoreInstanceOf(HardwareWalletsStore), - networkStatus: createStoreInstanceOf(NetworkStatusStore), - newsFeed: createStoreInstanceOf(NewsFeedStore), - profile: createStoreInstanceOf(ProfileStore), - router, - sidebar: createStoreInstanceOf(SidebarStore), - staking: createStoreInstanceOf(StakingStore), - transactions: createStoreInstanceOf(TransactionsStore), - uiDialogs: createStoreInstanceOf(UiDialogsStore), - uiNotifications: createStoreInstanceOf(UiNotificationsStore), - voting: createStoreInstanceOf(VotingStore), - wallets: createStoreInstanceOf(WalletsStore), - walletsLocal: createStoreInstanceOf(WalletsLocalStore), - walletBackup: createStoreInstanceOf(WalletBackupStore), - walletMigration: createStoreInstanceOf(WalletMigrationStore), - walletSettings: createStoreInstanceOf(WalletSettingsStore), - window: createStoreInstanceOf(WindowStore), - }); - // Configure and initialize all stores - executeOnEveryStore((store) => { - if (stores) store.configure(stores); - }); - executeOnEveryStore((store) => store.initialize()); - return stores; +const setUpStores = async (api, actions, router): Promise => { + function createStoreInstanceOf(StoreSubClass: Class): T { + return new StoreSubClass(api, actions); } -); + + // Teardown existing stores + if (stores) executeOnEveryStore((store) => store.teardown()); + // Create fresh instances of all stores + // @ts-ignore ts-migrate(2322) FIXME: Type '{ addresses: Store; app: Store; assets: Stor... Remove this comment to see the full error message + stores = observable({ + analytics: createStoreInstanceOf(AnalyticsStore), + addresses: createStoreInstanceOf(AddressesStore), + app: createStoreInstanceOf(AppStore), + assets: createStoreInstanceOf(AssetsStore), + currency: createStoreInstanceOf(CurrencyStore), + appUpdate: createStoreInstanceOf(AppUpdateStore), + hardwareWallets: createStoreInstanceOf(HardwareWalletsStore), + networkStatus: createStoreInstanceOf(NetworkStatusStore), + newsFeed: createStoreInstanceOf(NewsFeedStore), + profile: createStoreInstanceOf(ProfileStore), + router, + sidebar: createStoreInstanceOf(SidebarStore), + staking: createStoreInstanceOf(StakingStore), + transactions: createStoreInstanceOf(TransactionsStore), + uiDialogs: createStoreInstanceOf(UiDialogsStore), + uiNotifications: createStoreInstanceOf(UiNotificationsStore), + voting: createStoreInstanceOf(VotingStore), + wallets: createStoreInstanceOf(WalletsStore), + walletsLocal: createStoreInstanceOf(WalletsLocalStore), + walletBackup: createStoreInstanceOf(WalletBackupStore), + walletMigration: createStoreInstanceOf(WalletMigrationStore), + walletSettings: createStoreInstanceOf(WalletSettingsStore), + window: createStoreInstanceOf(WindowStore), + }); + // Configure and initialize all stores + await executeOnEveryStore((store) => { + if (stores) store.configure(stores); + }); + await executeOnEveryStore((store) => store.initialize()); + return stores; +}; + +export default setUpStores; diff --git a/source/renderer/app/stores/lib/Store.ts b/source/renderer/app/stores/lib/Store.ts index 93c454579d..5156e675aa 100644 --- a/source/renderer/app/stores/lib/Store.ts +++ b/source/renderer/app/stores/lib/Store.ts @@ -3,7 +3,7 @@ import type { ActionsMap } from '../../actions/index'; import type { StoresMap } from '../index'; import type { Api } from '../../api/index'; import type { Environment } from '../../../../common/types/environment.types'; -import {AnalyticsClient} from "../../analytics"; +import { AnalyticsClient } from '../../analytics'; export default class Store { stores: StoresMap; @@ -12,7 +12,11 @@ export default class Store { environment: Environment = global.environment; _reactions: Array = []; - constructor(api: Api, actions: ActionsMap, analyticsClient?: AnalyticsClient) { + constructor( + api: Api, + actions: ActionsMap, + analyticsClient?: AnalyticsClient + ) { this.api = api; this.actions = actions; } @@ -27,10 +31,10 @@ export default class Store { this.stores = stores; } - setup() {} + async setup() {} - initialize() { - this.setup(); + async initialize() { + await this.setup(); this._reactions.forEach((reaction) => reaction.start()); } From 967bd45bb4976163ccfb8da02459af22d46dac21 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 20 Jun 2022 18:32:32 +0200 Subject: [PATCH 13/41] Revert "[DDW-809] Cleanup discreet mode provider" This reverts commit 1a8661dc7e0fe4e723095f236ad0c402b8e467c3. --- .../app/analytics/getAnalyticsClient.ts | 2 +- .../app/features/discreet-mode/context.tsx | 21 +--- .../app/features/discreet-mode/feature.ts | 6 +- .../app/features/local-storage/context.tsx | 1 - source/renderer/app/index.tsx | 8 +- source/renderer/app/stores/AnalyticsStore.ts | 4 +- .../app/stores/HardwareWalletsStore.ts | 3 +- source/renderer/app/stores/index.ts | 99 +++++++++---------- source/renderer/app/stores/lib/Store.ts | 14 +-- 9 files changed, 69 insertions(+), 89 deletions(-) diff --git a/source/renderer/app/analytics/getAnalyticsClient.ts b/source/renderer/app/analytics/getAnalyticsClient.ts index 46fd444159..1741b82858 100644 --- a/source/renderer/app/analytics/getAnalyticsClient.ts +++ b/source/renderer/app/analytics/getAnalyticsClient.ts @@ -9,7 +9,7 @@ let client: AnalyticsClient; const getAnalyticsClient = async ( localStorage: LocalStorageApi, environment: Environment -): Promise => { +) => { const analyticsAccepted = (await localStorage.getAnalyticsAcceptance()) === AnalyticsAcceptanceStatus.ACCEPTED; diff --git a/source/renderer/app/features/discreet-mode/context.tsx b/source/renderer/app/features/discreet-mode/context.tsx index ae45ee088b..b79a1a25f5 100644 --- a/source/renderer/app/features/discreet-mode/context.tsx +++ b/source/renderer/app/features/discreet-mode/context.tsx @@ -9,31 +9,20 @@ import { import { useLocalStorageFeature } from '../local-storage'; import { DiscreetMode } from './feature'; import { DiscreetModeApi } from './api'; -import { useAnalytics } from '../../components/analytics'; -import { AnalyticsClient } from '../../analytics'; +import { AnalyticsClient, getAnalyticsClient } from '../../analytics'; export const discreetModeContext = React.createContext( null ); interface Props { - children: Node; analyticsClient: AnalyticsClient; + children: Node; } -<<<<<<< HEAD -export function DiscreetModeFeatureProvider({ children }: Props) { -======= -export const DiscreetModeFeatureProvider = ({ - children, - analyticsClient, -}: Props) => { ->>>>>>> 1a8661dc7 ([DDW-809] Cleanup discreet mode provider) - const localStorageFeature = useLocalStorageFeature(); +export function DiscreetModeFeatureProvider({ children, analyticsClient }: Props) { + const localStorageFeature = useLocalStorageFeature(); const [discreetModeFeature] = useState(() => { - const feature = new DiscreetMode( - new DiscreetModeApi(localStorageFeature), - analyticsClient - ); + const feature = new DiscreetMode(new DiscreetModeApi(localStorageFeature), analyticsClient); // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message window.daedalus = merge(window.daedalus, { features: { diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index cd7a837fa0..b5ca995a63 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -48,7 +48,8 @@ export class DiscreetMode extends Feature { @action toggleDiscreetMode = () => { this.isDiscreetMode = !this.isDiscreetMode; - this.analyticsClient.sendEvent( + // TODO: what is the best way to inject the analytics client? + global.daedalus.stores.analytics.analyticsClient.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode' @@ -63,7 +64,8 @@ export class DiscreetMode extends Feature { runInAction('Update open in discreet mode settings', () => { this.openInDiscreetMode = nextSetting; }); - this.analyticsClient.sendEvent( + // TODO: what is the best way to inject the analytics client? + global.daedalus.stores.analytics.analyticsClient.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode by default' diff --git a/source/renderer/app/features/local-storage/context.tsx b/source/renderer/app/features/local-storage/context.tsx index 31447813a3..8cb02f87bc 100644 --- a/source/renderer/app/features/local-storage/context.tsx +++ b/source/renderer/app/features/local-storage/context.tsx @@ -4,7 +4,6 @@ import type { Node } from 'react'; import { merge } from 'lodash/fp'; import { getFeatureFromContext } from '../../utils/mobx-features/hooks'; import type { LocalStorageApi } from './types'; -import { useAnalytics } from '../../components/analytics'; export const localStorageContext = React.createContext( null diff --git a/source/renderer/app/index.tsx b/source/renderer/app/index.tsx index 66689864aa..1dd930ec81 100755 --- a/source/renderer/app/index.tsx +++ b/source/renderer/app/index.tsx @@ -30,11 +30,11 @@ addLocaleData([...en, ...ja]); const { environment } = global; const { isTest } = environment; -const initializeDaedalus = async () => { +const initializeDaedalus = () => { const api = setupApi(isTest); const hashHistory = createHashHistory(); const routingStore = new RouterStore(); - const stores = await setupStores(api, actions, routingStore); + const stores = setupStores(api, actions, routingStore); const history = syncHistoryWithStore(hashHistory, routingStore); // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message window.daedalus = { @@ -53,9 +53,7 @@ const initializeDaedalus = async () => { if (!rootElement) throw new Error('No #root element found.'); render( - + , diff --git a/source/renderer/app/stores/AnalyticsStore.ts b/source/renderer/app/stores/AnalyticsStore.ts index 725ac46f36..7424eac1dc 100644 --- a/source/renderer/app/stores/AnalyticsStore.ts +++ b/source/renderer/app/stores/AnalyticsStore.ts @@ -6,8 +6,8 @@ export default class AnalyticsStore extends Store { @observable analyticsClient: AnalyticsClient; - async setup() { - return this.resetAnalyticsClient(); + setup() { + this.resetAnalyticsClient(); } resetAnalyticsClient = async (): Promise => { diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index d33bb48d26..0b1a4e11b6 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -704,7 +704,6 @@ export default class HardwareWalletsStore extends Store { throw e; } }; - @action establishHardwareWalletConnection = async () => { runInAction('HardwareWalletsStore:: set HW device CONNECTING', () => { @@ -1474,7 +1473,7 @@ export default class HardwareWalletsStore extends Store { this.stores.analytics.analyticsClient.sendEvent( 'Wallets', - 'Verified wallet address with hardware wallet' + 'Verified wallet address with hardware wallet', ); } else { runInAction( diff --git a/source/renderer/app/stores/index.ts b/source/renderer/app/stores/index.ts index 0c86d7fcc9..4ce9ec261d 100644 --- a/source/renderer/app/stores/index.ts +++ b/source/renderer/app/stores/index.ts @@ -79,57 +79,54 @@ let stores: StoresMap | null | undefined = null; const storeNames = Object.keys(storeClasses); // Helpers -async function executeOnEveryStore(fn: (store: Store) => void) { - await Promise.all( - storeNames.map((name) => { - if (stores && stores[name]) { - return fn(stores[name]); - } - return Promise.resolve(); - }) - ); +function executeOnEveryStore(fn: (store: Store) => void) { + storeNames.forEach((name) => { + if (stores && stores[name]) fn(stores[name]); + }); } // Set up and return the stores for this app -> also used to reset all stores to defaults -const setUpStores = async (api, actions, router): Promise => { - function createStoreInstanceOf(StoreSubClass: Class): T { - return new StoreSubClass(api, actions); - } +export default action( + (api, actions, router): StoresMap => { + function createStoreInstanceOf( + StoreSubClass: Class + ): T { + return new StoreSubClass(api, actions); + } - // Teardown existing stores - if (stores) executeOnEveryStore((store) => store.teardown()); - // Create fresh instances of all stores - // @ts-ignore ts-migrate(2322) FIXME: Type '{ addresses: Store; app: Store; assets: Stor... Remove this comment to see the full error message - stores = observable({ - analytics: createStoreInstanceOf(AnalyticsStore), - addresses: createStoreInstanceOf(AddressesStore), - app: createStoreInstanceOf(AppStore), - assets: createStoreInstanceOf(AssetsStore), - currency: createStoreInstanceOf(CurrencyStore), - appUpdate: createStoreInstanceOf(AppUpdateStore), - hardwareWallets: createStoreInstanceOf(HardwareWalletsStore), - networkStatus: createStoreInstanceOf(NetworkStatusStore), - newsFeed: createStoreInstanceOf(NewsFeedStore), - profile: createStoreInstanceOf(ProfileStore), - router, - sidebar: createStoreInstanceOf(SidebarStore), - staking: createStoreInstanceOf(StakingStore), - transactions: createStoreInstanceOf(TransactionsStore), - uiDialogs: createStoreInstanceOf(UiDialogsStore), - uiNotifications: createStoreInstanceOf(UiNotificationsStore), - voting: createStoreInstanceOf(VotingStore), - wallets: createStoreInstanceOf(WalletsStore), - walletsLocal: createStoreInstanceOf(WalletsLocalStore), - walletBackup: createStoreInstanceOf(WalletBackupStore), - walletMigration: createStoreInstanceOf(WalletMigrationStore), - walletSettings: createStoreInstanceOf(WalletSettingsStore), - window: createStoreInstanceOf(WindowStore), - }); - // Configure and initialize all stores - await executeOnEveryStore((store) => { - if (stores) store.configure(stores); - }); - await executeOnEveryStore((store) => store.initialize()); - return stores; -}; - -export default setUpStores; + // Teardown existing stores + if (stores) executeOnEveryStore((store) => store.teardown()); + // Create fresh instances of all stores + // @ts-ignore ts-migrate(2322) FIXME: Type '{ addresses: Store; app: Store; assets: Stor... Remove this comment to see the full error message + stores = observable({ + analytics: createStoreInstanceOf(AnalyticsStore), + addresses: createStoreInstanceOf(AddressesStore), + app: createStoreInstanceOf(AppStore), + assets: createStoreInstanceOf(AssetsStore), + currency: createStoreInstanceOf(CurrencyStore), + appUpdate: createStoreInstanceOf(AppUpdateStore), + hardwareWallets: createStoreInstanceOf(HardwareWalletsStore), + networkStatus: createStoreInstanceOf(NetworkStatusStore), + newsFeed: createStoreInstanceOf(NewsFeedStore), + profile: createStoreInstanceOf(ProfileStore), + router, + sidebar: createStoreInstanceOf(SidebarStore), + staking: createStoreInstanceOf(StakingStore), + transactions: createStoreInstanceOf(TransactionsStore), + uiDialogs: createStoreInstanceOf(UiDialogsStore), + uiNotifications: createStoreInstanceOf(UiNotificationsStore), + voting: createStoreInstanceOf(VotingStore), + wallets: createStoreInstanceOf(WalletsStore), + walletsLocal: createStoreInstanceOf(WalletsLocalStore), + walletBackup: createStoreInstanceOf(WalletBackupStore), + walletMigration: createStoreInstanceOf(WalletMigrationStore), + walletSettings: createStoreInstanceOf(WalletSettingsStore), + window: createStoreInstanceOf(WindowStore), + }); + // Configure and initialize all stores + executeOnEveryStore((store) => { + if (stores) store.configure(stores); + }); + executeOnEveryStore((store) => store.initialize()); + return stores; + } +); diff --git a/source/renderer/app/stores/lib/Store.ts b/source/renderer/app/stores/lib/Store.ts index 5156e675aa..93c454579d 100644 --- a/source/renderer/app/stores/lib/Store.ts +++ b/source/renderer/app/stores/lib/Store.ts @@ -3,7 +3,7 @@ import type { ActionsMap } from '../../actions/index'; import type { StoresMap } from '../index'; import type { Api } from '../../api/index'; import type { Environment } from '../../../../common/types/environment.types'; -import { AnalyticsClient } from '../../analytics'; +import {AnalyticsClient} from "../../analytics"; export default class Store { stores: StoresMap; @@ -12,11 +12,7 @@ export default class Store { environment: Environment = global.environment; _reactions: Array = []; - constructor( - api: Api, - actions: ActionsMap, - analyticsClient?: AnalyticsClient - ) { + constructor(api: Api, actions: ActionsMap, analyticsClient?: AnalyticsClient) { this.api = api; this.actions = actions; } @@ -31,10 +27,10 @@ export default class Store { this.stores = stores; } - async setup() {} + setup() {} - async initialize() { - await this.setup(); + initialize() { + this.setup(); this._reactions.forEach((reaction) => reaction.start()); } From 56af141945cc0636e831086b1592ccbfe6056134 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 20 Jun 2022 23:18:03 +0200 Subject: [PATCH 14/41] [DDW-809] Cleanup discreet mode provider --- source/main/environment.ts | 2 +- source/renderer/app/App.tsx | 90 +++++++++++-------- source/renderer/app/api/index.ts | 1 + .../components/analytics/AnalyticsContext.tsx | 6 +- .../app/features/discreet-mode/context.tsx | 25 ++++-- .../app/features/discreet-mode/feature.ts | 10 ++- source/renderer/app/index.tsx | 13 +-- .../app/stores/HardwareWalletsStore.ts | 2 +- .../renderer/app/stores/SidebarStore.spec.ts | 3 + source/renderer/app/stores/lib/Store.ts | 8 +- tests/mocks/analyticsStoreMock.ts | 7 ++ 11 files changed, 101 insertions(+), 66 deletions(-) create mode 100644 tests/mocks/analyticsStoreMock.ts diff --git a/source/main/environment.ts b/source/main/environment.ts index 23269df4ed..36974bd362 100644 --- a/source/main/environment.ts +++ b/source/main/environment.ts @@ -44,7 +44,7 @@ const isAlonzoPurple = checkIsAlonzoPurple(NETWORK); const isShelleyQA = checkIsShelleyQA(NETWORK); const isSelfnode = checkIsSelfnode(NETWORK); const isDevelopment = checkIsDevelopment(NETWORK); -const analyticsFeatureEnabled = isMainnet || isStaging || isTestnet; +const analyticsFeatureEnabled = true; const keepLocalClusterRunning = process.env.KEEP_LOCAL_CLUSTER_RUNNING; const API_VERSION = process.env.API_VERSION || 'dev'; const NODE_VERSION = '1.34.1'; // TODO: pick up this value from process.env diff --git a/source/renderer/app/App.tsx b/source/renderer/app/App.tsx index 2278d8cc87..ae987f8c43 100755 --- a/source/renderer/app/App.tsx +++ b/source/renderer/app/App.tsx @@ -23,6 +23,11 @@ import ToggleRTSFlagsDialogContainer from './containers/knownIssues/ToggleRTSFla import RTSFlagsRecommendationOverlayContainer from './containers/knownIssues/RTSFlagsRecommendationOverlayContainer'; import { MenuUpdater } from './containers/MenuUpdater'; import { AnalyticsProvider } from './components/analytics'; +import LocalStorageApi from './api/utils/localStorage'; +import { + DiscreetModeFeatureProvider, + LocalStorageFeatureProvider, +} from './features'; @observer class App extends Component<{ @@ -63,45 +68,52 @@ class App extends Component<{ - - - - - - - - {[ - // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message - isActiveDialog(ABOUT) && , - // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message - isActiveDialog(DAEDALUS_DIAGNOSTICS) && ( - - ), - // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message - isActiveDialog(TOGGLE_RTS_FLAGS_MODE) && ( - - ), - ]} - - - {canShowNews && [ - , - , - ]} - - - + + + + + + + + + + {[ + // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message + isActiveDialog(ABOUT) && ( + + ), + // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message + isActiveDialog(DAEDALUS_DIAGNOSTICS) && ( + + ), + // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message + isActiveDialog(TOGGLE_RTS_FLAGS_MODE) && ( + + ), + ]} + + + {canShowNews && [ + , + , + ]} + + + + + + , diff --git a/source/renderer/app/api/index.ts b/source/renderer/app/api/index.ts index ca98f86621..1f54636431 100644 --- a/source/renderer/app/api/index.ts +++ b/source/renderer/app/api/index.ts @@ -6,6 +6,7 @@ export type Api = { localStorage: LocalStorageApi; setFaultyNodeSettingsApi?: boolean; }; + export const setupApi = (isTest: boolean): Api => ({ ada: new AdaApi(isTest, { hostname: 'localhost', diff --git a/source/renderer/app/components/analytics/AnalyticsContext.tsx b/source/renderer/app/components/analytics/AnalyticsContext.tsx index 9bfa3bbce7..349ab49cd0 100644 --- a/source/renderer/app/components/analytics/AnalyticsContext.tsx +++ b/source/renderer/app/components/analytics/AnalyticsContext.tsx @@ -1,4 +1,6 @@ import React from 'react'; -import { AnalyticsClient } from '../../analytics'; +import { AnalyticsClient, NoopAnalyticsClient } from '../../analytics'; -export const AnalyticsContext = React.createContext(null); +export const AnalyticsContext = React.createContext( + NoopAnalyticsClient +); diff --git a/source/renderer/app/features/discreet-mode/context.tsx b/source/renderer/app/features/discreet-mode/context.tsx index b79a1a25f5..f3da9d7494 100644 --- a/source/renderer/app/features/discreet-mode/context.tsx +++ b/source/renderer/app/features/discreet-mode/context.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; // @ts-ignore ts-migrate(2305) FIXME: Module '"react"' has no exported member 'Node'. import type { Node } from 'react'; import { merge } from 'lodash/fp'; @@ -9,29 +9,42 @@ import { import { useLocalStorageFeature } from '../local-storage'; import { DiscreetMode } from './feature'; import { DiscreetModeApi } from './api'; -import { AnalyticsClient, getAnalyticsClient } from '../../analytics'; +import { useAnalytics } from '../../components/analytics'; export const discreetModeContext = React.createContext( null ); interface Props { - analyticsClient: AnalyticsClient; children: Node; } -export function DiscreetModeFeatureProvider({ children, analyticsClient }: Props) { +export function DiscreetModeFeatureProvider({ children }: Props) { const localStorageFeature = useLocalStorageFeature(); + const analyticsClient = useAnalytics(); + const [discreetModeFeature] = useState(() => { - const feature = new DiscreetMode(new DiscreetModeApi(localStorageFeature), analyticsClient); - // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message + const feature = new DiscreetMode( + new DiscreetModeApi(localStorageFeature), + analyticsClient + ); + window.daedalus = merge(window.daedalus, { features: { discreetModeFeature: feature, }, }); + return feature; }); + + useEffect(() => { + if (analyticsClient) { + discreetModeFeature.setAnalyticsClient(analyticsClient); + } + }, [analyticsClient]); + useFeature(discreetModeFeature); + return ( {children} diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index b5ca995a63..997f1b4c4c 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -29,6 +29,10 @@ export class DiscreetMode extends Feature { @observable setDiscreetModeSettingsRequest: Request>; + setAnalyticsClient(analyticsClient: AnalyticsClient) { + this.analyticsClient = analyticsClient; + } + async start() { super.start(); await this._setupDiscreetMode(); @@ -48,8 +52,7 @@ export class DiscreetMode extends Feature { @action toggleDiscreetMode = () => { this.isDiscreetMode = !this.isDiscreetMode; - // TODO: what is the best way to inject the analytics client? - global.daedalus.stores.analytics.analyticsClient.sendEvent( + this.analyticsClient.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode' @@ -64,8 +67,7 @@ export class DiscreetMode extends Feature { runInAction('Update open in discreet mode settings', () => { this.openInDiscreetMode = nextSetting; }); - // TODO: what is the best way to inject the analytics client? - global.daedalus.stores.analytics.analyticsClient.sendEvent( + this.analyticsClient.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode by default' diff --git a/source/renderer/app/index.tsx b/source/renderer/app/index.tsx index 1dd930ec81..92a0d340fc 100755 --- a/source/renderer/app/index.tsx +++ b/source/renderer/app/index.tsx @@ -13,13 +13,8 @@ import utils from './utils'; import Action from './actions/lib/Action'; import translations from './i18n/translations'; import '!style-loader!css-loader!sass-loader!./themes/index.global.scss'; // eslint-disable-line - import { setupApi } from './api'; -import LocalStorageApi from './api/utils/localStorage'; -import { - DiscreetModeFeatureProvider, - LocalStorageFeatureProvider, -} from './features'; + // run MobX in strict mode configure({ enforceActions: 'always', @@ -52,11 +47,7 @@ const initializeDaedalus = () => { const rootElement = document.getElementById('root'); if (!rootElement) throw new Error('No #root element found.'); render( - - - - - , + , rootElement ); }; diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index 0b1a4e11b6..00b32b7096 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -1473,7 +1473,7 @@ export default class HardwareWalletsStore extends Store { this.stores.analytics.analyticsClient.sendEvent( 'Wallets', - 'Verified wallet address with hardware wallet', + 'Verified wallet address with hardware wallet' ); } else { runInAction( diff --git a/source/renderer/app/stores/SidebarStore.spec.ts b/source/renderer/app/stores/SidebarStore.spec.ts index ad1ba96246..ac2552717a 100644 --- a/source/renderer/app/stores/SidebarStore.spec.ts +++ b/source/renderer/app/stores/SidebarStore.spec.ts @@ -4,6 +4,8 @@ import type { ActionsMap } from '../actions/index'; import { WalletSortBy, WalletSortOrder } from '../types/sidebarTypes'; import type { SidebarWalletType } from '../types/sidebarTypes'; import SidebarStore from './SidebarStore'; +import { analyticsStoreMock } from '../../../../tests/mocks/analyticsStoreMock'; +import { StoresMap } from './index'; describe('Sidebar Store', () => { const api: Api = { @@ -36,6 +38,7 @@ describe('Sidebar Store', () => { networkStatus: { isConnected: true, }, + analytics: analyticsStoreMock, } as any; return sidebarStore; } diff --git a/source/renderer/app/stores/lib/Store.ts b/source/renderer/app/stores/lib/Store.ts index 93c454579d..62dfeaf650 100644 --- a/source/renderer/app/stores/lib/Store.ts +++ b/source/renderer/app/stores/lib/Store.ts @@ -3,7 +3,7 @@ import type { ActionsMap } from '../../actions/index'; import type { StoresMap } from '../index'; import type { Api } from '../../api/index'; import type { Environment } from '../../../../common/types/environment.types'; -import {AnalyticsClient} from "../../analytics"; +import { AnalyticsClient } from '../../analytics'; export default class Store { stores: StoresMap; @@ -12,7 +12,11 @@ export default class Store { environment: Environment = global.environment; _reactions: Array = []; - constructor(api: Api, actions: ActionsMap, analyticsClient?: AnalyticsClient) { + constructor( + api: Api, + actions: ActionsMap, + analyticsClient?: AnalyticsClient + ) { this.api = api; this.actions = actions; } diff --git a/tests/mocks/analyticsStoreMock.ts b/tests/mocks/analyticsStoreMock.ts new file mode 100644 index 0000000000..5661d39180 --- /dev/null +++ b/tests/mocks/analyticsStoreMock.ts @@ -0,0 +1,7 @@ +import {NoopAnalyticsClient} from "../../source/renderer/app/analytics"; + +export const analyticsStoreMock = { + analyticsClient: NoopAnalyticsClient, + setup: jest.fn(), + resetAnalyticsClient: jest.fn() +}; From 5f99307923f068cf21b400f770672b81356a98b0 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 20 Jun 2022 23:32:59 +0200 Subject: [PATCH 15/41] [DDW-809] Fill in changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aacf7ac11..5cea59b47b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - Added support for Ledger Nano S Plus ([PR 2975](https://github.com/input-output-hk/daedalus/pull/2975)) - Support of Apple AArch64 chip ([PR 2684](https://github.com/input-output-hk/daedalus/pull/2684)) +- Added analytics data collection ([PR 2927](https://github.com/input-output-hk/daedalus/pull/2927), [PR 2989](https://github.com/input-output-hk/daedalus/pull/2989), [PR 3003](https://github.com/input-output-hk/daedalus/pull/3003)) ### Chores From 433f888972703dcd82ee71ee6bfc6073a1ee7b1a Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 20 Jun 2022 23:33:10 +0200 Subject: [PATCH 16/41] [DDW-809] Remove leftover comma --- source/renderer/app/App.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/source/renderer/app/App.tsx b/source/renderer/app/App.tsx index ae987f8c43..3f1c9af220 100755 --- a/source/renderer/app/App.tsx +++ b/source/renderer/app/App.tsx @@ -113,7 +113,6 @@ class App extends Component<{ - , From fb457445665b035b3eb15aba41068af2ae2d3e86 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Wed, 22 Jun 2022 11:47:53 +0200 Subject: [PATCH 17/41] [DDW-809] Clean up --- source/renderer/app/features/discreet-mode/feature.ts | 5 ++++- tests/mocks/analyticsStoreMock.ts | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index 997f1b4c4c..3c4d48b372 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -8,7 +8,10 @@ import type { ReplacerFn } from './types'; import { AnalyticsClient } from '../../analytics'; export class DiscreetMode extends Feature { - constructor(private api: DiscreetModeApi, private analyticsClient: AnalyticsClient) { + constructor( + private api: DiscreetModeApi, + private analyticsClient: AnalyticsClient + ) { super(); runInAction(() => { this.getDiscreetModeSettingsRequest = new Request( diff --git a/tests/mocks/analyticsStoreMock.ts b/tests/mocks/analyticsStoreMock.ts index 5661d39180..61617e6f93 100644 --- a/tests/mocks/analyticsStoreMock.ts +++ b/tests/mocks/analyticsStoreMock.ts @@ -1,7 +1,7 @@ -import {NoopAnalyticsClient} from "../../source/renderer/app/analytics"; +import { NoopAnalyticsClient } from '../../source/renderer/app/analytics'; export const analyticsStoreMock = { analyticsClient: NoopAnalyticsClient, setup: jest.fn(), - resetAnalyticsClient: jest.fn() + resetAnalyticsClient: jest.fn(), }; From 7ea1fdb874350fd62027a73f5cd085dfc4ec8512 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 14:16:51 +0200 Subject: [PATCH 18/41] [DDW-809] Address code review comments --- source/renderer/app/App.tsx | 6 +- .../app/analytics/AnalyticsTracker.ts | 46 + .../renderer/app/analytics/TrackedRoute.tsx | 4 +- .../app/analytics/getAnalyticsClient.ts | 27 - source/renderer/app/analytics/index.ts | 5 +- source/renderer/app/analytics/types.ts | 5 +- .../components/analytics/AnalyticsContext.tsx | 4 +- .../analytics/AnalyticsProvider.tsx | 25 +- .../components/analytics/withAnalytics.tsx | 27 + .../staking/stake-pools/StakePools.tsx | 10 +- .../containers/staking/StakePoolsListPage.tsx | 10 +- .../app/i18n/locales/defaultMessages.json | 18459 +--------------- source/renderer/app/i18n/locales/en-US.json | 6 +- source/renderer/app/i18n/locales/ja-JP.json | 6 +- source/renderer/app/index.tsx | 15 +- source/renderer/app/stores/AnalyticsStore.ts | 20 - .../renderer/app/stores/SidebarStore.spec.ts | 3 +- .../renderer/app/stores/VotingStore.spec.ts | 4 +- source/renderer/app/stores/index.ts | 18 +- source/renderer/app/stores/lib/Store.ts | 12 +- translations/messages.json | 205 +- 21 files changed, 445 insertions(+), 18472 deletions(-) create mode 100644 source/renderer/app/analytics/AnalyticsTracker.ts delete mode 100644 source/renderer/app/analytics/getAnalyticsClient.ts create mode 100644 source/renderer/app/components/analytics/withAnalytics.tsx delete mode 100644 source/renderer/app/stores/AnalyticsStore.ts diff --git a/source/renderer/app/App.tsx b/source/renderer/app/App.tsx index 2278d8cc87..f63b4054fd 100755 --- a/source/renderer/app/App.tsx +++ b/source/renderer/app/App.tsx @@ -23,12 +23,14 @@ import ToggleRTSFlagsDialogContainer from './containers/knownIssues/ToggleRTSFla import RTSFlagsRecommendationOverlayContainer from './containers/knownIssues/RTSFlagsRecommendationOverlayContainer'; import { MenuUpdater } from './containers/MenuUpdater'; import { AnalyticsProvider } from './components/analytics'; +import { AnalyticsTracker } from './analytics'; @observer class App extends Component<{ stores: StoresMap; actions: ActionsMap; history: History; + analyticsTracker: AnalyticsTracker; }> { componentDidMount() { // Loads app's global environment variables into AppStore via ipc @@ -37,7 +39,7 @@ class App extends Component<{ } render() { - const { stores, actions, history } = this.props; + const { stores, actions, history, analyticsTracker } = this.props; const { app, networkStatus } = stores; const { isActiveDialog, isSetupPage } = app; const { isNodeStopping, isNodeStopped } = networkStatus; @@ -62,7 +64,7 @@ class App extends Component<{ {/* @ts-ignore ts-migrate(2769) FIXME: No overload matches this call. */} - + = (props) => { +function TrackedRoute(props: TrackedRouteProps) { const analytics = useAnalytics(); const { pageTitle, ...restProps } = props; @@ -19,6 +19,6 @@ const TrackedRoute: FC = (props) => { }, [window.location.hash, props, pageTitle]); return ; -}; +} export default TrackedRoute; diff --git a/source/renderer/app/analytics/getAnalyticsClient.ts b/source/renderer/app/analytics/getAnalyticsClient.ts deleted file mode 100644 index 1741b82858..0000000000 --- a/source/renderer/app/analytics/getAnalyticsClient.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Environment } from '../../../common/types/environment.types'; -import { AnalyticsAcceptanceStatus, AnalyticsClient } from './types'; -import { NoopAnalyticsClient } from './noopAnalyticsClient'; -import LocalStorageApi from '../api/utils/localStorage'; -import { MatomoClient } from './MatomoClient'; - -let client: AnalyticsClient; - -const getAnalyticsClient = async ( - localStorage: LocalStorageApi, - environment: Environment -) => { - const analyticsAccepted = - (await localStorage.getAnalyticsAcceptance()) === - AnalyticsAcceptanceStatus.ACCEPTED; - - if (environment.analyticsFeatureEnabled && analyticsAccepted) { - if (!client) { - client = new MatomoClient(environment, await localStorage.getUserID()); - } - return client; - } - - return NoopAnalyticsClient; -}; - -export { getAnalyticsClient }; diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index 928020a97e..659caad7a7 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1,3 +1,2 @@ -export { getAnalyticsClient } from './getAnalyticsClient'; -export { NoopAnalyticsClient } from './noopAnalyticsClient'; -export { AnalyticsAcceptanceStatus, AnalyticsClient } from './types'; +export { AnalyticsAcceptanceStatus } from './types'; +export { AnalyticsTracker } from './AnalyticsTracker'; diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index 59f927ef6f..8c661d18d8 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -1,7 +1,4 @@ -export interface AnalyticsClient { - sendPageNavigationEvent(pageTitle: string): Promise; - sendEvent(category: string, name: string): Promise; -} +export interface AnalyticsClient {} export enum AnalyticsAcceptanceStatus { PENDING = 'PENDING', diff --git a/source/renderer/app/components/analytics/AnalyticsContext.tsx b/source/renderer/app/components/analytics/AnalyticsContext.tsx index 9bfa3bbce7..b22d080b85 100644 --- a/source/renderer/app/components/analytics/AnalyticsContext.tsx +++ b/source/renderer/app/components/analytics/AnalyticsContext.tsx @@ -1,4 +1,4 @@ import React from 'react'; -import { AnalyticsClient } from '../../analytics'; +import { AnalyticsTracker } from '../../analytics'; -export const AnalyticsContext = React.createContext(null); +export const AnalyticsContext = React.createContext(null); diff --git a/source/renderer/app/components/analytics/AnalyticsProvider.tsx b/source/renderer/app/components/analytics/AnalyticsProvider.tsx index 7f305b18b1..89e22e336c 100644 --- a/source/renderer/app/components/analytics/AnalyticsProvider.tsx +++ b/source/renderer/app/components/analytics/AnalyticsProvider.tsx @@ -1,23 +1,18 @@ import React, { FC } from 'react'; -import { inject, observer } from 'mobx-react'; import { AnalyticsContext } from './AnalyticsContext'; -import { InjectedProps } from '../../types/injectedPropsType'; +import { AnalyticsTracker } from '../../analytics'; -interface AnalyticsProviderProps extends InjectedProps { +interface AnalyticsProviderProps { children: React.ReactNode; + tracker: AnalyticsTracker; } -const AnalyticsProvider: FC = inject( - 'stores', - 'actions' -)( - observer((props: AnalyticsProviderProps) => { - return ( - - {props.children} - - ); - }) -); +function AnalyticsProvider({ children, tracker }: AnalyticsProviderProps) { + return ( + + {children} + + ); +} export { AnalyticsProvider }; diff --git a/source/renderer/app/components/analytics/withAnalytics.tsx b/source/renderer/app/components/analytics/withAnalytics.tsx new file mode 100644 index 0000000000..6115bebd4c --- /dev/null +++ b/source/renderer/app/components/analytics/withAnalytics.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { AnalyticsTracker } from '../../analytics'; +import { useAnalytics } from './useAnalytics'; + +export interface WithAnalyticsTrackerProps { + analyticsTracker: AnalyticsTracker; +} + +export function withAnalytics< + T extends WithAnalyticsTrackerProps = WithAnalyticsTrackerProps +>(WrappedComponent: React.ComponentType) { + const displayName = + WrappedComponent.displayName || WrappedComponent.name || 'Component'; + + function ComponentWithTheme(props: Omit) { + const analyticsTracker = useAnalytics(); + + // props comes afterwards so the can override the default ones. + return ( + + ); + } + + ComponentWithTheme.displayName = `withAnalytics(${displayName})`; + + return ComponentWithTheme; +} diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index 71298a8bb3..7728a790e6 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -22,7 +22,7 @@ import { import smashSettingsIcon from '../../../assets/images/smash-settings-ic.inline.svg'; import tinySpinnerIcon from '../../../assets/images/spinner-tiny.inline.svg'; import { getSmashServerNameFromUrl } from '../../../utils/staking'; -import { AnalyticsClient } from '../../../analytics'; +import { AnalyticsTracker } from 'source/renderer/app/analytics'; const messages = defineMessages({ delegatingListTitle: { @@ -69,7 +69,7 @@ const messages = defineMessages({ }); const SELECTED_INDEX_TABLE = 'selectedIndexTable'; type Props = { - analyticsClient: AnalyticsClient; + analyticsTracker: AnalyticsTracker; currentLocale: string; currentTheme: string; getStakePoolById: (...args: Array) => any; @@ -132,7 +132,7 @@ class StakePools extends Component { isListView: false, }); - this.props.analyticsClient.sendEvent( + this.props.analyticsTracker.sendEvent( 'Stake Pools', 'Changed view to grid view' ); @@ -144,7 +144,7 @@ class StakePools extends Component { isListView: false, }); - this.props.analyticsClient.sendEvent( + this.props.analyticsTracker.sendEvent( 'Stake Pools', 'Changed view to grid rewards view' ); @@ -156,7 +156,7 @@ class StakePools extends Component { isListView: true, }); - this.props.analyticsClient.sendEvent( + this.props.analyticsTracker.sendEvent( 'Stake Pools', 'Changed view to list view' ); diff --git a/source/renderer/app/containers/staking/StakePoolsListPage.tsx b/source/renderer/app/containers/staking/StakePoolsListPage.tsx index 785e3e944d..2ac5d09dc5 100644 --- a/source/renderer/app/containers/staking/StakePoolsListPage.tsx +++ b/source/renderer/app/containers/staking/StakePoolsListPage.tsx @@ -6,8 +6,12 @@ import DelegationSetupWizardDialogContainer from './dialogs/DelegationSetupWizar import DelegationSetupWizardDialog from '../../components/staking/delegation-setup-wizard/DelegationSetupWizardDialog'; import { ROUTES } from '../../routes-config'; import type { InjectedProps } from '../../types/injectedPropsType'; +import { + withAnalytics, + WithAnalyticsTrackerProps, +} from '../../components/analytics/withAnalytics'; -type Props = InjectedProps; +type Props = InjectedProps & WithAnalyticsTrackerProps; @inject('stores', 'actions') @observer @@ -78,7 +82,7 @@ class StakePoolsListPage extends Component { return ( { } } -export default StakePoolsListPage; +export default withAnalytics(StakePoolsListPage); diff --git a/source/renderer/app/i18n/locales/defaultMessages.json b/source/renderer/app/i18n/locales/defaultMessages.json index fb63952edc..ef40e90596 100644 --- a/source/renderer/app/i18n/locales/defaultMessages.json +++ b/source/renderer/app/i18n/locales/defaultMessages.json @@ -97,18261 +97,7 @@ "id": "api.errors.NotEnoughFundsForTransactionFeesErrorWithTokens" } ], -<<<<<<< HEAD - "path": "source/renderer/app/api/errors.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Software update available!", - "description": "\"title\" for the App Update Overlay", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.title", - "start": { - "column": 9, - "line": 23 - } - }, - { - "defaultMessage": "!!!You are currently running Daedalus version {currentAppVersion}.
Daedalus version {availableAppVersion} is now available to download.", - "description": "\"subtitle\" for the App Update Overlay", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.subtitle", - "start": { - "column": 12, - "line": 28 - } - }, - { - "defaultMessage": "!!!I understand that I need to complete the installation before starting Daedalus.", - "description": "\"checkboxLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.checkboxLabel", - "start": { - "column": 17, - "line": 34 - } - }, - { - "defaultMessage": "!!!Quit Daedalus and start the installation", - "description": "\"buttonLaunchInstallerLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.button.launchInstaller.label", - "start": { - "column": 30, - "line": 40 - } - }, - { - "defaultMessage": "!!!Install the update and restart Daedalus", - "description": "\"buttonInstallUpdateLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.button.installUpdate.label", - "start": { - "column": 28, - "line": 45 - } - }, - { - "defaultMessage": "!!!Postpone the update", - "description": "\"manualUpdateLinkLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.postponeInstall.link.label", - "start": { - "column": 28, - "line": 50 - } - }, - { - "defaultMessage": "!!!Installing update...", - "description": "\"installingUpdateLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.installingUpdate.link.label", - "start": { - "column": 25, - "line": 55 - } - }, - { - "defaultMessage": "!!!Download in progress", - "description": "\"downloadProgressLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.downloadProgressLabel", - "start": { - "column": 25, - "line": 60 - } - }, - { - "defaultMessage": "!!!{downloadTimeLeft} left", - "description": "\"downloadTimeLeft\" for the App Update Overlay", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.downloadTimeLeft", - "start": { - "column": 20, - "line": 65 - } - }, - { - "defaultMessage": "!!!({totalDownloaded} of {totalDownloadSize} downloaded)", - "description": "\"downloadProgressData\" for the App Update Overlay", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.downloadProgressData", - "start": { - "column": 24, - "line": 70 - } - }, - { - "defaultMessage": "!!!We were unable to launch the update installer automatically.", - "description": "\"manualUpdateDescriptionError\" for the App Update Overlay", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.description.error", - "start": { - "column": 32, - "line": 75 - } - }, - { - "defaultMessage": "!!!We were unable to install the update.", - "description": "\"manualUpdateDescriptionErrorLinux\" for the App Update Overlay", - "end": { - "column": 3, - "line": 86 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.description.errorLinux", - "start": { - "column": 37, - "line": 81 - } - }, - { - "defaultMessage": "!!!Please manually update Daedalus to its latest version.", - "description": "\"manualUpdateDescriptionAction\" for the App Update Overlay", - "end": { - "column": 3, - "line": 91 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.description.action", - "start": { - "column": 33, - "line": 87 - } - }, - { - "defaultMessage": "!!!Follow instructions and manually update", - "description": "\"manualUpdateButtonLabel\" for the App Update Overlay", - "end": { - "column": 3, - "line": 96 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.button.label", - "start": { - "column": 27, - "line": 92 - } - }, - { - "defaultMessage": "!!!https://daedaluswallet.io/en/download/", - "description": "\"manualUpdateButtonUrl\" for the App Update Overlay on Mainnet", - "end": { - "column": 3, - "line": 102 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.button.url.mainnet", - "start": { - "column": 35, - "line": 97 - } - }, - { - "defaultMessage": "!!!https://daedaluswallet.io/en/flight/", - "description": "\"manualUpdateButtonUrl\" for the App Update Overlay on Flight", - "end": { - "column": 3, - "line": 107 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.button.url.flight", - "start": { - "column": 34, - "line": 103 - } - }, - { - "defaultMessage": "!!!https://developers.cardano.org/en/testnets/cardano/get-started/wallet/", - "description": "\"manualUpdateButtonUrl\" for the App Update Overlay on Testnet", - "end": { - "column": 3, - "line": 114 - }, - "file": "source/renderer/app/components/appUpdate/AppUpdateOverlay.tsx", - "id": "appUpdate.overlay.manualUpdate.button.url.testnet", - "start": { - "column": 35, - "line": 108 - } - } - ], - "path": "source/renderer/app/components/appUpdate/AppUpdateOverlay.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Fingerprint", - "description": "\"fingerprint\" item.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.fingerprint", - "start": { - "column": 19, - "line": 16 - } - }, - { - "defaultMessage": "!!!Policy Id", - "description": "\"policyId\" item.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.policyId", - "start": { - "column": 16, - "line": 21 - } - }, - { - "defaultMessage": "!!!Asset name", - "description": "\"assetName\" item.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.assetName", - "start": { - "column": 17, - "line": 26 - } - }, - { - "defaultMessage": "!!!Name", - "description": "\"name\" item.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.name", - "start": { - "column": 12, - "line": 31 - } - }, - { - "defaultMessage": "!!!Ticker", - "description": "\"ticker\" item.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.ticker", - "start": { - "column": 14, - "line": 36 - } - }, - { - "defaultMessage": "!!!Description", - "description": "\"description\" item.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.description", - "start": { - "column": 19, - "line": 41 - } - }, - { - "defaultMessage": "!!!Blank", - "description": "\"Blank\" item value.", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.param.blank", - "start": { - "column": 9, - "line": 46 - } - }, - { - "defaultMessage": "!!!You can configure the number of decimal places for this native token.", - "description": "Asset settings pop over content", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.assetToken.settings.cogPopOver", - "start": { - "column": 22, - "line": 51 - } - }, - { - "defaultMessage": "!!!Recommended configuration for decimal places for this native token is available.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.warning.available", - "start": { - "column": 35, - "line": 57 - } - }, - { - "defaultMessage": "!!!You are not using the recommended decimal place configuration for this native token.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/assets/Asset.tsx", - "id": "assets.warning.notUsing", - "start": { - "column": 34, - "line": 63 - } - } - ], - "path": "source/renderer/app/components/assets/Asset.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Unformatted amount {amount}", - "description": "Unformatted amount", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/assets/AssetAmount.tsx", - "id": "assets.assetAmount.unformattedAmount", - "start": { - "column": 21, - "line": 13 - } - } - ], - "path": "source/renderer/app/components/assets/AssetAmount.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Fingerprint", - "description": "\"fingerprint\" param.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.fingerprint", - "start": { - "column": 25, - "line": 15 - } - }, - { - "defaultMessage": "!!!Policy Id", - "description": "\"policyId\" param.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.policyId", - "start": { - "column": 22, - "line": 20 - } - }, - { - "defaultMessage": "!!!Asset name", - "description": "\"assetName\" param.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.assetName", - "start": { - "column": 23, - "line": 25 - } - }, - { - "defaultMessage": "!!!Name", - "description": "\"name\" param.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.name", - "start": { - "column": 18, - "line": 30 - } - }, - { - "defaultMessage": "!!!Ticker", - "description": "\"ticker\" param.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.ticker", - "start": { - "column": 20, - "line": 35 - } - }, - { - "defaultMessage": "!!!Description", - "description": "\"description\" param.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.description", - "start": { - "column": 25, - "line": 40 - } - }, - { - "defaultMessage": "!!!Blank", - "description": "\"Blank\" param value.", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.param.blank", - "start": { - "column": 9, - "line": 45 - } - }, - { - "defaultMessage": "!!!You can configure the number of decimal places for this native token.", - "description": "Asset settings pop over content", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.assetToken.settings.cogPopOver", - "start": { - "column": 22, - "line": 50 - } - }, - { - "defaultMessage": "!!!Recommended configuration for decimal places for this native token is available.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.warning.available", - "start": { - "column": 35, - "line": 56 - } - }, - { - "defaultMessage": "!!!You are not using the recommended decimal place configuration for this native token.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 67 - }, - "file": "source/renderer/app/components/assets/AssetContent.tsx", - "id": "assets.warning.notUsing", - "start": { - "column": 34, - "line": 62 - } - } - ], - "path": "source/renderer/app/components/assets/AssetContent.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Native token settings", - "description": "\"title\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.title", - "start": { - "column": 9, - "line": 23 - } - }, - { - "defaultMessage": "!!!Updates made here will be applied in other wallets containing this token too.", - "description": "\"description\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.description", - "start": { - "column": 15, - "line": 28 - } - }, - { - "defaultMessage": "!!!Unformatted amount", - "description": "\"formattedBalanceLabel\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.formattedAmount.label", - "start": { - "column": 25, - "line": 34 - } - }, - { - "defaultMessage": "!!!Formatted amount", - "description": "\"unformattedBalanceLabel\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.unformattedAmount.label", - "start": { - "column": 27, - "line": 39 - } - }, - { - "defaultMessage": "!!!Number of decimal places", - "description": "\"decimalPrecisionLabel\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.decimalPrecision.label", - "start": { - "column": 25, - "line": 44 - } - }, - { - "defaultMessage": "!!!(recommended)", - "description": "\"recommended\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.recommended", - "start": { - "column": 15, - "line": 49 - } - }, - { - "defaultMessage": "!!!(default)", - "description": "\"default\" for the Asset settings dialog", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.settings.dialog.default", - "start": { - "column": 11, - "line": 54 - } - }, - { - "defaultMessage": "!!!Recommended configuration for decimal places for this native token is available.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.warning.available", - "start": { - "column": 27, - "line": 59 - } - }, - { - "defaultMessage": "!!!You are not using the recommended decimal place configuration for this native token.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 70 - }, - "file": "source/renderer/app/components/assets/AssetSettingsDialog.tsx", - "id": "assets.warning.notUsing", - "start": { - "column": 26, - "line": 65 - } - } - ], - "path": "source/renderer/app/components/assets/AssetSettingsDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Connect your device and enter your PIN to unlock it", - "description": "\"Connect your device and enter your PIN to unlock it\" device state", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.connecting", - "start": { - "column": 14, - "line": 16 - } - }, - { - "defaultMessage": "!!!Disconnect and reconnect your device to restart the process.", - "description": "\"Connect failed\" device state", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.connecting.failed", - "start": { - "column": 21, - "line": 22 - } - }, - { - "defaultMessage": "!!!Connect the \"{walletName}\" device", - "description": "\"Connect the IOHK Trezor 1 device\" device state", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.connecting.known", - "start": { - "column": 20, - "line": 28 - } - }, - { - "defaultMessage": "!!!Launch Cardano application on your device", - "description": "\"Launch Cardano application on your device\" device state", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.launching_cardano_app", - "start": { - "column": 25, - "line": 33 - } - }, - { - "defaultMessage": "!!!Export the public key on your device", - "description": "\"Confirm exporting your public key on your device\" device state", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.exporting_public_key", - "start": { - "column": 24, - "line": 38 - } - }, - { - "defaultMessage": "!!!Exporting the public key failed", - "description": "\"Exporting public key failed\" device state", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.exporting_public_key_failed", - "start": { - "column": 31, - "line": 44 - } - }, - { - "defaultMessage": "!!!We do not recognize this wallet on your device. Please ensure that you are using the same device that you selected for pairing {walletName} and that you have entered the correct passphrase.", - "description": "\"Unrecognized wallet\" device state", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.unrecognized_wallet", - "start": { - "column": 23, - "line": 49 - } - }, - { - "defaultMessage": "!!!Disconnect and reconnect your device to restart the process.", - "description": "\"Disconnect and reconnect your device to start the process again\" device state", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.exportingPublicKeyError", - "start": { - "column": 27, - "line": 55 - } - }, - { - "defaultMessage": "!!!Enter passphrase if needed", - "description": "\"Enter passphrase if needed\" device sub-state", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.enterPassphrase", - "start": { - "column": 19, - "line": 62 - } - }, - { - "defaultMessage": "!!!Device ready", - "description": "\"Device ready\" device state", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.ready", - "start": { - "column": 9, - "line": 67 - } - }, - { - "defaultMessage": "!!!Confirm the transaction using the \"{walletName}\" device", - "description": "\"Confirm the transaction using the IOHK Trezor 1 device\" device state", - "end": { - "column": 3, - "line": 78 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_transaction", - "start": { - "column": 25, - "line": 72 - } - }, - { - "defaultMessage": "!!!Transaction verification and signing failed", - "description": "\"Transaction verification and signing failed\" device state", - "end": { - "column": 3, - "line": 83 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_transaction_failed", - "start": { - "column": 32, - "line": 79 - } - }, - { - "defaultMessage": "!!!Transaction confirmed", - "description": "\"Transaction verified and signed\" device state", - "end": { - "column": 3, - "line": 88 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_transaction_succeeded", - "start": { - "column": 35, - "line": 84 - } - }, - { - "defaultMessage": "!!!Trezor Bridge not installed!", - "description": "\"Trezor Bridge not installed! {instructionsLink}\" device state", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.trezor_bridge_failure", - "start": { - "column": 25, - "line": 89 - } - }, - { - "defaultMessage": "!!!Installation instructions", - "description": "Trezor Bridge installation instructions link label", - "end": { - "column": 3, - "line": 99 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.trezor_bridge_failure.link.label", - "start": { - "column": 36, - "line": 95 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360011451693", - "description": "URL for the \"Trezor Bridge\" update", - "end": { - "column": 3, - "line": 105 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.trezor_bridge_failure.link.url", - "start": { - "column": 34, - "line": 100 - } - }, - { - "defaultMessage": "!!!Unsupported firmware! {instructionsLink}", - "description": "\"Unsupported firmware!\" device state", - "end": { - "column": 3, - "line": 110 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.wrong_firmware", - "start": { - "column": 18, - "line": 106 - } - }, - { - "defaultMessage": "!!!Firmware update instructions", - "description": "Firmware update installation instructions link label", - "end": { - "column": 3, - "line": 115 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.wrong_firmware.link.label", - "start": { - "column": 29, - "line": 111 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360011451693", - "description": "URL for the \"Firmware Update\"", - "end": { - "column": 3, - "line": 121 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.wrong_firmware.link.url", - "start": { - "column": 27, - "line": 116 - } - }, - { - "defaultMessage": "!!!The device is not supported!", - "description": "\"The device is not supported!\" device state", - "end": { - "column": 3, - "line": 126 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.unsupported_device", - "start": { - "column": 22, - "line": 122 - } - }, - { - "defaultMessage": "!!!Outdated Ledger software!! {instructionsLink}", - "description": "\"Unsupported firmware!\" device state", - "end": { - "column": 3, - "line": 131 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.wrong_cardano_app_version", - "start": { - "column": 29, - "line": 127 - } - }, - { - "defaultMessage": "!!!Software update instructions", - "description": "Firmware update installation instructions link label", - "end": { - "column": 3, - "line": 136 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.wrong_cardano_app_version.link.label", - "start": { - "column": 40, - "line": 132 - } - }, - { - "defaultMessage": "!!!https://support.ledger.com/hc/en-us/articles/360020095874-Cardano-ADA-", - "description": "URL for the \"Firmware Update\"", - "end": { - "column": 3, - "line": 142 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.wrong_cardano_app_version.link.url", - "start": { - "column": 38, - "line": 137 - } - }, - { - "defaultMessage": "!!!Verify address on your \"{walletName}\" device", - "description": "\"Verify receiving address on your Hardware Wallet device", - "end": { - "column": 3, - "line": 147 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_address", - "start": { - "column": 21, - "line": 143 - } - }, - { - "defaultMessage": "!!!Please answer the question below", - "description": "\"Confirm receiving address on your Hardware Wallet device", - "end": { - "column": 3, - "line": 152 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_address_confirmation", - "start": { - "column": 34, - "line": 148 - } - }, - { - "defaultMessage": "!!!Address verification failed", - "description": "\"Address verification failed\" device state", - "end": { - "column": 3, - "line": 157 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_address_failed", - "start": { - "column": 28, - "line": 153 - } - }, - { - "defaultMessage": "!!!Verification was aborted by the user", - "description": "\"Address verification aborted\" device state", - "end": { - "column": 3, - "line": 162 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_address_aborted", - "start": { - "column": 29, - "line": 158 - } - }, - { - "defaultMessage": "!!!Address verified", - "description": "\"Address verified\" device state", - "end": { - "column": 3, - "line": 167 - }, - "file": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.tsx", - "id": "wallet.hardware.deviceStatus.verifying_address_succeeded", - "start": { - "column": 31, - "line": 163 - } - } - ], - "path": "source/renderer/app/components/hardware-wallet/HardwareWalletStatus.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Recommended hardware requirements status", - "description": "Title of the RTS flags recommendation overlay", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/knownIssues/RTSFlagsRecommendationOverlay/RTSFlagsRecommendationOverlay.tsx", - "id": "knownIssues.rtsRecommendationOverlay.title", - "start": { - "column": 9, - "line": 17 - } - }, - { - "defaultMessage": "!!!

Your system specifications do not meet Daedalus’ recommended hardware requirements.

You can enable RAM management (RTS Flags), an experimental setting that can reduce memory usage on computers with less than 16GB of RAM.

You can enable it now by clicking the ‘Enable and quit’ button. Note that you will have to restart Daedalus for this change to take effect. To enable or disable it at any time, go to the Help menu.

", - "description": "Content of the RTS flags recommendation overlay", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/knownIssues/RTSFlagsRecommendationOverlay/RTSFlagsRecommendationOverlay.tsx", - "id": "knownIssues.rtsRecommendationOverlay.content", - "start": { - "column": 11, - "line": 22 - } - }, - { - "defaultMessage": "!!!Enable and quit", - "description": "Enable and quit button label", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/knownIssues/RTSFlagsRecommendationOverlay/RTSFlagsRecommendationOverlay.tsx", - "id": "knownIssues.rtsRecommendationOverlay.enableAndQuitButtonLabel", - "start": { - "column": 28, - "line": 28 - } - }, - { - "defaultMessage": "!!!Decide later", - "description": "Decide later button label", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/knownIssues/RTSFlagsRecommendationOverlay/RTSFlagsRecommendationOverlay.tsx", - "id": "knownIssues.rtsRecommendationOverlay.decideLaterButtonLabel", - "start": { - "column": 26, - "line": 33 - } - } - ], - "path": "source/renderer/app/components/knownIssues/RTSFlagsRecommendationOverlay/RTSFlagsRecommendationOverlay.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Enable RTS flags (RAM management system)", - "description": "Headline for the RTS flags dialog - when enabling", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.enableRtsFlagsMode.title", - "start": { - "column": 30, - "line": 11 - } - }, - { - "defaultMessage": "!!!When enabled, the Cardano node will attempt to reduce its RAM usage. You will need to restart Daedalus for this change to take effect.", - "description": "Main body of the dialog - when enabling", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.enableRtsFlagsMode.explanation", - "start": { - "column": 33, - "line": 16 - } - }, - { - "defaultMessage": "!!!Enable and quit", - "description": "Enable RTS flags button label", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.enableRtsFlagsMode.actionButton", - "start": { - "column": 34, - "line": 22 - } - }, - { - "defaultMessage": "!!!Disable RTS flags (RAM management system)", - "description": "Headline for the RTS flags dialog - when disabling", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.disableRtsFlagsMode.title", - "start": { - "column": 31, - "line": 27 - } - }, - { - "defaultMessage": "!!!When disabled, the Cardano node will start in default mode. You will need to restart Daedalus for this change to take effect.", - "description": "Main body of the dialog - when disabling", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.disableRtsFlagsMode.explanation", - "start": { - "column": 34, - "line": 32 - } - }, - { - "defaultMessage": "!!!Disable and quit", - "description": "Disable RTS flags button label", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.disableRtsFlagsMode.actionButton", - "start": { - "column": 35, - "line": 38 - } - }, - { - "defaultMessage": "!!!I understand that I will need to launch Daedalus manually", - "description": "Manual relaunch confirmation checkbox label", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.tsx", - "id": "knownIssues.dialog.toggleRtsFlagsMode.manualRelaunchConfirmationCheckboxLabel", - "start": { - "column": 43, - "line": 43 - } - } - ], - "path": "source/renderer/app/components/knownIssues/ToggleRTSFlagsDialog/ToggleRTSFlagsDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Daedalus requires at least {diskSpaceRequired} of hard drive space to operate. Your computer is missing {diskSpaceMissing} of available space. Please delete some files to increase available hard drive space to continue using Daedalus.

It is recommended to have at least 15% of hard drive space available ({diskSpaceRecommended} in your case) for normal and stable operation of the operating system and installed programs. We strongly recommend that you free up at least that amount of space from your hard drive.", - "description": "Content of No disk space overlay", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/loading/no-disk-space-error/NoDiskSpaceError.tsx", - "id": "noDiskSpace.error.overlayContent", - "start": { - "column": 18, - "line": 10 - } - }, - { - "defaultMessage": "!!!Daedalus requires more hard drive space", - "description": "Title of No disk space overlay", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/loading/no-disk-space-error/NoDiskSpaceError.tsx", - "id": "noDiskSpace.error.overlayTitle", - "start": { - "column": 16, - "line": 16 - } - } - ], - "path": "source/renderer/app/components/loading/no-disk-space-error/NoDiskSpaceError.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Having trouble connecting to network?", - "description": "Report connecting issue text on the loading screen.", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.tsx", - "id": "loading.screen.reportIssue.connecting.text", - "start": { - "column": 29, - "line": 14 - } - }, - { - "defaultMessage": "!!!Open support ticket", - "description": "Open support ticket button label on the loading.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.tsx", - "id": "loading.screen.reportIssue.buttonLabel", - "start": { - "column": 26, - "line": 19 - } - }, - { - "defaultMessage": "!!!Read the article", - "description": "Read the article button label on the loading.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.tsx", - "id": "loading.screen.readArticle.buttonLabel", - "start": { - "column": 26, - "line": 24 - } - }, - { - "defaultMessage": "!!!Download logs", - "description": "Download logs button label on the loading.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.tsx", - "id": "loading.screen.reportIssue.downloadLogsLinkLabel", - "start": { - "column": 36, - "line": 29 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/requests/new/", - "description": "Link to Open Support page", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.tsx", - "id": "loading.screen.reportIssue.reportIssueButtonUrl", - "start": { - "column": 24, - "line": 34 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360010522913", - "description": "Link to connectivity issue article page", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.tsx", - "id": "loading.screen.readIssueArticle.connectivityIssueArticleUrl", - "start": { - "column": 31, - "line": 39 - } - } - ], - "path": "source/renderer/app/components/loading/syncing-connecting/ReportIssue.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Cardano node is running!", - "description": "Message \"Cardano node is running\" on the status icon tooltip", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeIsRunning", - "start": { - "column": 17, - "line": 20 - } - }, - { - "defaultMessage": "!!!Cardano node is starting!", - "description": "Message \"Node is starting\" on the status icon tooltip", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeIsStarting", - "start": { - "column": 18, - "line": 25 - } - }, - { - "defaultMessage": "!!!Cardano node is exiting!", - "description": "Message \"Cardano node is exiting\" on the status icon tooltip", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeIsExiting", - "start": { - "column": 17, - "line": 30 - } - }, - { - "defaultMessage": "!!!Cardano node is stopping!", - "description": "Message \"Cardano node is stopping\" on the status icon tooltip", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeIsStopping", - "start": { - "column": 18, - "line": 35 - } - }, - { - "defaultMessage": "!!!Cardano node has stopped!", - "description": "Message \"Cardano node has stopped\" on the status icon tooltip", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeHasStopped", - "start": { - "column": 18, - "line": 41 - } - }, - { - "defaultMessage": "!!!Cardano node is updating!", - "description": "Message \"Cardano node is updating\" on the status icon tooltip", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeIsUpdating", - "start": { - "column": 18, - "line": 47 - } - }, - { - "defaultMessage": "!!!Cardano node has been updated!", - "description": "Message \"Cardano node has been updated\" on the status icon tooltip", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeHasBeenUpdated", - "start": { - "column": 22, - "line": 53 - } - }, - { - "defaultMessage": "!!!Cardano node has crashed!", - "description": "Message \"Cardano node has crashed\" on the status icon tooltip", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeHasCrashed", - "start": { - "column": 18, - "line": 59 - } - }, - { - "defaultMessage": "!!!Cardano node has errored!", - "description": "Message \"Cardano node has errored\" on the status icon tooltip", - "end": { - "column": 3, - "line": 70 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeHasErrored", - "start": { - "column": 18, - "line": 65 - } - }, - { - "defaultMessage": "!!!Cardano node is unrecoverable!", - "description": "Message \"Cardano node is unrecoverable\" on the status icon tooltip", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.nodeIsUnrecoverable", - "start": { - "column": 23, - "line": 71 - } - }, - { - "defaultMessage": "!!!Check your Internet connection!", - "description": "Message \"Check your Internet connection\" on the status icon tooltip", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.checkYourInternetConnection", - "start": { - "column": 31, - "line": 77 - } - }, - { - "defaultMessage": "!!!Cardano node is responding!", - "description": "Message \"Cardano node is responding\" on the status icon tooltip", - "end": { - "column": 3, - "line": 88 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeRespondingOn", - "start": { - "column": 22, - "line": 83 - } - }, - { - "defaultMessage": "!!!Cardano node is not responding!", - "description": "Message \"Cardano node is not responding\" on the status icon tooltip", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeRespondingOff", - "start": { - "column": 23, - "line": 89 - } - }, - { - "defaultMessage": "!!!Checking if Cardano node is responding!", - "description": "Message \"Checking if Cardano node is responding\" on the status icon tooltip", - "end": { - "column": 3, - "line": 100 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeRespondingLoading", - "start": { - "column": 27, - "line": 95 - } - }, - { - "defaultMessage": "!!!Cardano node is subscribed!", - "description": "Message \"Cardano node is subscribed\" on the status icon tooltip", - "end": { - "column": 3, - "line": 106 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeSubscribedOn", - "start": { - "column": 22, - "line": 101 - } - }, - { - "defaultMessage": "!!!Cardano node is not subscribed!", - "description": "Message \"Cardano node is not subscribed\" on the status icon tooltip", - "end": { - "column": 3, - "line": 112 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeSubscribedOff", - "start": { - "column": 23, - "line": 107 - } - }, - { - "defaultMessage": "!!!Checking if Cardano node is subscribed!", - "description": "Message \"Checking if Cardano node is subscribed\" on the status icon tooltip", - "end": { - "column": 3, - "line": 118 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeSubscribedLoading", - "start": { - "column": 27, - "line": 113 - } - }, - { - "defaultMessage": "!!!Cardano node time is correct!", - "description": "Message \"Cardano node time is correct\" on the status icon tooltip", - "end": { - "column": 3, - "line": 124 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeTimeCorrectOn", - "start": { - "column": 23, - "line": 119 - } - }, - { - "defaultMessage": "!!!Cardano node time is not correct!", - "description": "Message \"Cardano node time is not correct\" on the status icon tooltip", - "end": { - "column": 3, - "line": 130 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeTimeCorrectOff", - "start": { - "column": 24, - "line": 125 - } - }, - { - "defaultMessage": "!!!Checking if Cardano node time is correct!", - "description": "Message \"Checking if Cardano node time is correct\" on the status icon tooltip", - "end": { - "column": 3, - "line": 136 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeTimeCorrectLoading", - "start": { - "column": 28, - "line": 131 - } - }, - { - "defaultMessage": "!!!Cardano node is syncing!", - "description": "Message \"Cardano node is syncing\" on the status icon tooltip", - "end": { - "column": 3, - "line": 141 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeSyncingOn", - "start": { - "column": 19, - "line": 137 - } - }, - { - "defaultMessage": "!!!Cardano node is not syncing!", - "description": "Message \"Cardano node is not syncing\" on the status icon tooltip", - "end": { - "column": 3, - "line": 147 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeSyncingOff", - "start": { - "column": 20, - "line": 142 - } - }, - { - "defaultMessage": "!!!Checking if Cardano node is syncing!", - "description": "Message \"Checking if Cardano node is syncing\" on the status icon tooltip", - "end": { - "column": 3, - "line": 153 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.tsx", - "id": "status.icons.isNodeSyncingLoading", - "start": { - "column": 24, - "line": 148 - } - } - ], - "path": "source/renderer/app/components/loading/syncing-connecting/StatusIcons.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Starting Cardano node", - "description": "Message \"Starting Cardano node\" on the loading screen.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.startingCardanoMessage", - "start": { - "column": 12, - "line": 13 - } - }, - { - "defaultMessage": "!!!This process validates the integrity of local blockchain data.", - "description": "Message \"Starting Cardano node\" on the loading screen.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.startingCardanoDescription", - "start": { - "column": 23, - "line": 18 - } - }, - { - "defaultMessage": "!!!Stopping Cardano node", - "description": "Message \"Stopping Cardano node\" on the loading screen.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.stoppingCardanoMessage", - "start": { - "column": 12, - "line": 24 - } - }, - { - "defaultMessage": "!!!This process updates the databases and could take several minutes.
To preserve data integrity, please wait until this process is complete.", - "description": "Message \"Stopping Cardano node\" on the loading screen.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.stoppingCardanoDescription", - "start": { - "column": 23, - "line": 29 - } - }, - { - "defaultMessage": "!!!Cardano node stopped", - "description": "Message \"Cardano node stopped\" on the loading screen.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.stoppedCardanoMessage", - "start": { - "column": 11, - "line": 35 - } - }, - { - "defaultMessage": "!!!Updating Cardano node", - "description": "Message \"Updating Cardano node\" on the loading screen.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.updatingCardanoMessage", - "start": { - "column": 12, - "line": 40 - } - }, - { - "defaultMessage": "!!!Cardano node updated", - "description": "Message \"Cardano node updated\" on the loading screen.", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.updatedCardanoMessage", - "start": { - "column": 11, - "line": 45 - } - }, - { - "defaultMessage": "!!!Cardano node crashed", - "description": "Message \"Cardano node crashed\" on the loading screen.", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.crashedCardanoMessage", - "start": { - "column": 11, - "line": 50 - } - }, - { - "defaultMessage": "!!!Unable to start Cardano node. Please submit a support request.", - "description": "Message \"Unable to start Cardano node. Please submit a support request.\" on the loading screen.", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.unrecoverableCardanoMessage", - "start": { - "column": 17, - "line": 55 - } - }, - { - "defaultMessage": "!!!Connecting to network", - "description": "Message \"Connecting to network\" on the loading screen.", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.connectingToNetworkMessage", - "start": { - "column": 14, - "line": 62 - } - }, - { - "defaultMessage": "!!!Network connection lost - reconnecting", - "description": "Message \"Network connection lost - reconnecting\" on the loading screen.", - "end": { - "column": 3, - "line": 72 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.reconnectingToNetworkMessage", - "start": { - "column": 16, - "line": 67 - } - }, - { - "defaultMessage": "!!!Loading wallet data", - "description": "Message \"Loading wallet data\" on the loading screen.", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.loadingWalletData", - "start": { - "column": 21, - "line": 73 - } - }, - { - "defaultMessage": "!!!TLS certificate is not valid, please restart Daedalus.", - "description": "The TLS cert is not valid and Daedalus should be restarted", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.tsx", - "id": "loading.screen.errors.tlsCertificateNotValidPleaseRestartError", - "start": { - "column": 31, - "line": 78 - } - } - ], - "path": "source/renderer/app/components/loading/syncing-connecting/SyncingConnectingStatus.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Verifying on-disk blockchain state", - "description": "One of three progress names on the loading screen.", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.ts", - "id": "loading.screen.validatingChunk", - "start": { - "column": 19, - "line": 5 - } - }, - { - "defaultMessage": "!!!Verifying the integrity of the blockchain calculating hashes", - "description": "Description of one of three progress names on the loading screen.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.ts", - "id": "loading.screen.validatingChunkDescription", - "start": { - "column": 30, - "line": 10 - } - }, - { - "defaultMessage": "!!!Replaying ledger from on-disk blockchain", - "description": "One of three progress names on the loading screen.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.ts", - "id": "loading.screen.replayedBlock", - "start": { - "column": 17, - "line": 17 - } - }, - { - "defaultMessage": "!!!Looking for a ledger snapshot and updating (recomputing) the latest state", - "description": "Description of one of three progress names on the loading screen.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.ts", - "id": "loading.screen.replayedBlockDescription", - "start": { - "column": 28, - "line": 22 - } - }, - { - "defaultMessage": "!!!Syncing blockchain", - "description": "One of three progress names on the loading screen.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.ts", - "id": "loading.screen.pushingLedger", - "start": { - "column": 17, - "line": 29 - } - }, - { - "defaultMessage": "!!!Performing initial chain selection and finalizing blockchain state", - "description": "Description of one of three progress names on the loading screen.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.ts", - "id": "loading.screen.pushingLedgerDescription", - "start": { - "column": 28, - "line": 34 - } - } - ], - "path": "source/renderer/app/components/loading/syncing-connecting/SyncingProgress/SyncingProgress.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Unable to sync - incorrect time", - "description": "Title of Sync error overlay", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.overlayTitle", - "start": { - "column": 16, - "line": 15 - } - }, - { - "defaultMessage": "!!!Attention, Daedalus is unable to sync with the blockchain because the time on your machine is different from the global time. Your time is off by 2 hours 12 minutes 54 seconds.", - "description": "First paragraph of Sync error overlay", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.overlayTextP1", - "start": { - "column": 17, - "line": 20 - } - }, - { - "defaultMessage": "!!!To synchronise the time and fix the issue, please read our {supportPortalLink} article.", - "description": "Second paragraph of Sync error overlay", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.overlayTextP2", - "start": { - "column": 17, - "line": 26 - } - }, - { - "defaultMessage": "!!!Attention, Daedalus is unable to check if the clock on your computer is synchronized with global time because NTP (Network Time Protocol) servers are unreachable, possibly due to firewalls on your network.", - "description": "Text of Sync error overlay when NTP service is unreachable", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.ntpUnreachableTextP1", - "start": { - "column": 24, - "line": 32 - } - }, - { - "defaultMessage": "!!!If your computer clock is off by more than 15 seconds, Daedalus will be unable to connect to the network. If you have this issue, please read our Support Portal article to synchronize the time on your machine.", - "description": "Text of Sync error overlay when NTP service is unreachable", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.ntpUnreachableTextP2", - "start": { - "column": 24, - "line": 38 - } - }, - { - "defaultMessage": "!!!Support Portal", - "description": "\"Support Portal\" link text", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.supportPortalLink", - "start": { - "column": 21, - "line": 44 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360010230873", - "description": "Link to \"Machine clock out of sync with Cardano network\" support page", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.supportPortalLinkUrl", - "start": { - "column": 24, - "line": 49 - } - }, - { - "defaultMessage": "!!!Check the time again", - "description": "Text of Check the time again button", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.onCheckTheTimeAgainLink", - "start": { - "column": 27, - "line": 56 - } - }, - { - "defaultMessage": "!!!Continue without clock synchronization checks", - "description": "Text of \"Continue without clock synchronization checks\" button", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx", - "id": "systemTime.error.onContinueWithoutClockSyncCheckLink", - "start": { - "column": 39, - "line": 61 - } - } - ], - "path": "source/renderer/app/components/loading/system-time-error/SystemTimeError.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Newsfeed is empty", - "description": "Newsfeed is empty", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/news/NewsFeed.tsx", - "id": "news.newsfeed.empty", - "start": { - "column": 17, - "line": 15 - } - }, - { - "defaultMessage": "Trying to fetch the newsfeed...", - "description": "Trying to fetch the newsfeed...", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/news/NewsFeed.tsx", - "id": "news.newsfeed.noFetch", - "start": { - "column": 19, - "line": 20 - } - }, - { - "defaultMessage": "Newsfeed", - "description": "Newsfeed", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/news/NewsFeed.tsx", - "id": "news.newsfeed.title", - "start": { - "column": 17, - "line": 25 - } - } - ], - "path": "source/renderer/app/components/news/NewsFeed.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Byron", - "description": "Label \"Byron\" on the legacy badge.", - "end": { - "column": 3, - "line": 12 - }, - "file": "source/renderer/app/components/notifications/LegacyBadge.tsx", - "id": "wallet.byron.badge.label", - "start": { - "column": 9, - "line": 8 - } - } - ], - "path": "source/renderer/app/components/notifications/LegacyBadge.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Move funds from {activeWalletName}", - "description": "Title \"Move funds from the legacy wallet\" on the legacy notification.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.moveFundsTitle", - "start": { - "column": 18, - "line": 12 - } - }, - { - "defaultMessage": "!!!Create a Shelley wallet", - "description": "Title \"Create a Shelley wallet\" on the legacy notification.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.addWalletTitle", - "start": { - "column": 18, - "line": 18 - } - }, - { - "defaultMessage": "!!!\"{activeWalletName}\"\" is a Byron legacy wallet that does not support Shelley delegation features. To earn ada from delegating your stake, please move all funds from this wallet to a new wallet that is Shelley-compatible.", - "description": "Legacy notification description.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.moveFundsDescription.line1", - "start": { - "column": 29, - "line": 23 - } - }, - { - "defaultMessage": "!!!You can create a {moveFundsLink} or move funds to one of your existing wallets.", - "description": "Legacy notification description.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.moveFundsDescription.line2", - "start": { - "column": 29, - "line": 29 - } - }, - { - "defaultMessage": "!!!brand new wallet", - "description": "Legacy notification link label.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.moveFundsDescription.line2.link.label", - "start": { - "column": 22, - "line": 35 - } - }, - { - "defaultMessage": "!!!\"{transferWalletName}\"\" is a legacy wallet. It does not support Shelley delegation features. To earn ada from delegating your stake, please move all funds from this wallet to a new, Shelley-compatible wallet. You can create a brand new wallet or move funds to one of the existing wallets.", - "description": "Legacy notification description WithFunds.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.legacy.notification.descriptionWithFunds", - "start": { - "column": 24, - "line": 40 - } - }, - { - "defaultMessage": "!!!\"{activeWalletName}\"\" is a Byron legacy wallet that does not support Shelley delegation features. To earn ada from delegating your stake, please move all funds from this wallet to a new wallet that is Shelley-compatible.", - "description": "Legacy notification description.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.addWalletDescription.line1", - "start": { - "column": 29, - "line": 46 - } - }, - { - "defaultMessage": "!!!Since all of your wallets are Byron legacy wallets you will first need to create a new Shelley wallet.", - "description": "Legacy notification description.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.addWalletDescription.line2", - "start": { - "column": 29, - "line": 52 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Learn more action of legacy notification.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.actionLearnMore", - "start": { - "column": 19, - "line": 58 - } - }, - { - "defaultMessage": "!!!Move ada to an existing wallet", - "description": "Move Move ada from this wallet of legacy notification.", - "end": { - "column": 3, - "line": 67 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.actionMove", - "start": { - "column": 14, - "line": 63 - } - }, - { - "defaultMessage": "!!!Create a new wallet", - "description": "Create a new wallet action of legacy notification.", - "end": { - "column": 3, - "line": 72 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.addWallet", - "start": { - "column": 13, - "line": 68 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360038726373", - "description": "\"Learn more\" link URL", - "end": { - "column": 3, - "line": 78 - }, - "file": "source/renderer/app/components/notifications/LegacyNotification.tsx", - "id": "wallet.byron.notification.learnMore.url", - "start": { - "column": 20, - "line": 73 - } - } - ], - "path": "source/renderer/app/components/notifications/LegacyNotification.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!The balance and transaction history of this wallet is {percentage}% synced with the blockchain.", - "description": "Status message \"Wallet restore in progress\" shown while wallet is being restored.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/notifications/RestoreNotification.tsx", - "id": "wallet.statusMessages.activeRestore", - "start": { - "column": 24, - "line": 11 - } - } - ], - "path": "source/renderer/app/components/notifications/RestoreNotification.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Anonymous data collection", - "description": "Analytics form title", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.form.title", - "start": { - "column": 9, - "line": 4 - } - }, - { - "defaultMessage": "!!!Analytic data is used for product development purposes only.", - "description": "Analytics data collection description", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.form.description", - "start": { - "column": 15, - "line": 9 - } - }, - { - "defaultMessage": "!!!Allow anonymous data collection", - "description": "Data collection agreement switch button label", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.form.dataCollectionSwitchText", - "start": { - "column": 30, - "line": 15 - } - }, - { - "defaultMessage": "!!!Allow", - "description": "Analytics data collection allow button text", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.form.allowButton", - "start": { - "column": 15, - "line": 20 - } - }, - { - "defaultMessage": "!!!Skip", - "description": "Analytics data collection skip button text", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.dialog.skipButton", - "start": { - "column": 14, - "line": 25 - } - }, - { - "defaultMessage": "!!!Daedalus Privacy Policy", - "description": "Daedalus Privacy Policy link text", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.form.privacyPolicyLink", - "start": { - "column": 21, - "line": 30 - } - }, - { - "defaultMessage": "!!!Read more about our privacy practices in the {privacyPolicyLink}.", - "description": "Analytics data collection description, under collapsible details", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts", - "id": "analytics.form.analyticsSectionPrivacyPolicy", - "start": { - "column": 33, - "line": 35 - } - } - ], - "path": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!We collect data on (1) User click behavior and (2) Device information.", - "description": "Data collection details title", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.form.dataCollectionDetailsTitle", - "start": { - "column": 9, - "line": 4 - } - }, - { - "defaultMessage": "!!!User click behavior", - "description": "Title for the user behaviour data collection", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.form.dataCollectionDetailsUserBehaviourTitle", - "start": { - "column": 21, - "line": 10 - } - }, - { - "defaultMessage": "!!!Clicks, page visits, page scrolling, number of wallets, number of native assets, session duration, type of wallets (soft vs hardware wallets), geolocation (country of location), and page performance.", - "description": "Description for the user behaviour data collection", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.form.dataCollectionDetailsUserBehaviorText", - "start": { - "column": 20, - "line": 15 - } - }, - { - "defaultMessage": "!!!Device info", - "description": "Title for the device info data collection", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.form.dataCollectionDetailsDeviceInfoTitle", - "start": { - "column": 19, - "line": 21 - } - }, - { - "defaultMessage": "!!!Operating system, RAM, and disk space.", - "description": "Description for the device info data collection", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.form.dataCollectionDetailsDeviceInfoText", - "start": { - "column": 18, - "line": 26 - } - }, - { - "defaultMessage": "!!!Expand details", - "description": "Expand details button", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.dialog.expandButton", - "start": { - "column": 16, - "line": 31 - } - }, - { - "defaultMessage": "!!!Collapse details", - "description": "Collapse details button", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts", - "id": "analytics.dialog.collapseButton", - "start": { - "column": 18, - "line": 36 - } - } - ], - "path": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet data migration", - "description": "Title for the Data Layer Migration screen.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/profile/data-layer-migration/DataLayerMigrationForm.tsx", - "id": "profile.dataLayerMigration.title", - "start": { - "column": 9, - "line": 10 - } - }, - { - "defaultMessage": "!!!You have installed a version of Daedalus that changes how wallet data is stored and managed. Because of this, all of your wallets need to be restored and synchronized with the complete history of the Cardano blockchain.", - "description": "Content for the Data Layer Migration screen.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/profile/data-layer-migration/DataLayerMigrationForm.tsx", - "id": "profile.dataLayerMigration.content1", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!This is an automatic process and does not require any action on your behalf.", - "description": "Content for the Data Layer Migration screen.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/profile/data-layer-migration/DataLayerMigrationForm.tsx", - "id": "profile.dataLayerMigration.content2", - "start": { - "column": 12, - "line": 21 - } - }, - { - "defaultMessage": "!!!Your transaction history and used addresses will appear in your wallets as they are recovered during the restoration process. Addresses that were not used will not be recovered because they are not recorded on the blockchain. If funds were sent to those addresses you will receive the funds and those addresses will appear in your wallet.", - "description": "Content for the Data Layer Migration screen.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/profile/data-layer-migration/DataLayerMigrationForm.tsx", - "id": "profile.dataLayerMigration.content3", - "start": { - "column": 12, - "line": 27 - } - }, - { - "defaultMessage": "!!!Start migration", - "description": "Submit label for the Data Layer Migration screen.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/profile/data-layer-migration/DataLayerMigrationForm.tsx", - "id": "profile.dataLayerMigration.submitLabel", - "start": { - "column": 15, - "line": 33 - } - } - ], - "path": "source/renderer/app/components/profile/data-layer-migration/DataLayerMigrationForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!I agree with terms of service", - "description": "Label for the \"I agree with terms of service\" checkbox.", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/profile/terms-of-use/TermsOfUseForm.tsx", - "id": "profile.termsOfUse.checkboxLabel", - "start": { - "column": 17, - "line": 14 - } - }, - { - "defaultMessage": "!!!I understand that the terms of use are only available in English and agree to the terms of use", - "description": "Label for the \"I agree with terms of service\" checkbox when terms of use are not translated.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/profile/terms-of-use/TermsOfUseForm.tsx", - "id": "profile.termsOfUse.checkboxLabelWithDisclaimer", - "start": { - "column": 31, - "line": 19 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for the \"Terms of service\" form submit button.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/profile/terms-of-use/TermsOfUseForm.tsx", - "id": "profile.termsOfUse.submitLabel", - "start": { - "column": 15, - "line": 26 - } - } - ], - "path": "source/renderer/app/components/profile/terms-of-use/TermsOfUseForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Theme", - "description": "Label for the \"Theme\" selection on the display settings page.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeLabel", - "start": { - "column": 14, - "line": 27 - } - }, - { - "defaultMessage": "!!!Incentivized Testnet", - "description": "Name of the \"Incentivized Testnet\" theme on the display settings page.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.incentivizedTestnet", - "start": { - "column": 28, - "line": 33 - } - }, - { - "defaultMessage": "!!!Light blue", - "description": "Name of the \"Light blue\" theme on the display settings page.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.lightBlue", - "start": { - "column": 18, - "line": 39 - } - }, - { - "defaultMessage": "!!!Cardano", - "description": "Name of the \"Cardano\" theme on the display settings page.", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.cardano", - "start": { - "column": 16, - "line": 44 - } - }, - { - "defaultMessage": "!!!Dark blue", - "description": "Name of the \"Dark blue\" theme on the display settings page.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.darkBlue", - "start": { - "column": 17, - "line": 49 - } - }, - { - "defaultMessage": "!!!Dark Cardano", - "description": "Name of the \"Dark cardano\" theme on the display settings page.", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.darkCardano", - "start": { - "column": 20, - "line": 54 - } - }, - { - "defaultMessage": "!!!Flight Candidate", - "description": "Name of the \"Flight Candidate\" theme on the display settings page.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.flightCandidate", - "start": { - "column": 24, - "line": 60 - } - }, - { - "defaultMessage": "!!!Shelley Testnet", - "description": "Name of the \"Shelley Testnet\" theme on the display settings page.", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.shelleyTestnet", - "start": { - "column": 23, - "line": 66 - } - }, - { - "defaultMessage": "!!!Yellow", - "description": "Name of the \"Yellow\" theme on the display settings page.", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.yellow", - "start": { - "column": 15, - "line": 72 - } - }, - { - "defaultMessage": "!!!White", - "description": "Name of the \"White\" theme on the display settings page.", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/settings/categories/DisplaySettings.tsx", - "id": "settings.display.themeNames.white", - "start": { - "column": 14, - "line": 77 - } - } - ], - "path": "source/renderer/app/components/settings/categories/DisplaySettings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Discreet mode", - "description": "Title for the \"Discreet mode\" setting in the security category.", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/components/settings/categories/SecuritySettings.messages.ts", - "id": "settings.security.discreetMode.title", - "start": { - "column": 21, - "line": 4 - } - }, - { - "defaultMessage": "!!!This mode uses asterisks to hide sensitive data", - "description": "Description for the \"Discreet mode\" setting in the security category.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/settings/categories/SecuritySettings.messages.ts", - "id": "settings.security.discreetMode.description", - "start": { - "column": 27, - "line": 10 - } - }, - { - "defaultMessage": "!!!Start the application in Discreet mode", - "description": "Title for the \"Open in discreet mode\" setting in the security category.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/settings/categories/SecuritySettings.messages.ts", - "id": "settings.security.openInDiscreetMode.title", - "start": { - "column": 27, - "line": 16 - } - }, - { - "defaultMessage": "!!!Daedalus will start with Discreet mode enabled by default", - "description": "Description for the \"Open in discreet mode\" setting in the security category.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/settings/categories/SecuritySettings.messages.ts", - "id": "settings.security.openInDiscreetMode.description", - "start": { - "column": 33, - "line": 22 - } - } - ], - "path": "source/renderer/app/components/settings/categories/SecuritySettings.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!The {link} is an off-chain metadata server that enables the fast loading of stake pool details. Stake pools are also curated and each server has a different curation policy.", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.description", - "start": { - "column": 15, - "line": 29 - } - }, - { - "defaultMessage": "!!!Stakepool Metadata Aggregation Server (SMASH)", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionLinkLabel", - "start": { - "column": 24, - "line": 35 - } - }, - { - "defaultMessage": "!!!https://iohk.io/en/blog/posts/2020/11/17/in-pools-we-trust/", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionLinkUrl", - "start": { - "column": 22, - "line": 40 - } - }, - { - "defaultMessage": "!!!The IOHK server ensures that registered stake pools are valid, helps to avoid duplicated ticker names or trademarks, and checks that the pools do not feature potentially offensive or harmful information.", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionIOHKContent1", - "start": { - "column": 27, - "line": 46 - } - }, - { - "defaultMessage": "!!!This allows us to deal with any scams, trolls, or abusive behavior by filtering out potentially problematic actors. {link} about the IOHK SMASH server.", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionIOHKContent2", - "start": { - "column": 27, - "line": 52 - } - }, - { - "defaultMessage": "!!!Read more", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionIOHKLinkLabel", - "start": { - "column": 28, - "line": 58 - } - }, - { - "defaultMessage": "!!!https://iohk.io/en/blog/posts/2020/11/17/in-pools-we-trust/", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionIOHKLinkUrl", - "start": { - "column": 26, - "line": 63 - } - }, - { - "defaultMessage": "!!!This option is not recommended! Without the off-chain metadata server your Daedalus client will fetch this data by contacting every stake pool individually, which is a very slow and resource-consuming process. The list of stake pools received is not curated, so Daedalus will receive legitimate pools, duplicates, and fake pools. An added risk to this process is that your antivirus or antimalware software could recognize the thousands of network requests as malicious behavior by the Daedalus client.", - "description": "description for the Stake Pools settings page.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.descriptionNone", - "start": { - "column": 19, - "line": 69 - } - }, - { - "defaultMessage": "!!!Off-chain metadata server (SMASH)", - "description": "smashSelectLabel for the \"Smash\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.select.label", - "start": { - "column": 20, - "line": 75 - } - }, - { - "defaultMessage": "!!!IOHK (Recommended)", - "description": "smashSelectCustomServer option for the \"Smash\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 86 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.select.IOHKServer", - "start": { - "column": 25, - "line": 81 - } - }, - { - "defaultMessage": "!!!None - let my Daedalus client fetch the data", - "description": "smashSelectCustomServer option for the \"Smash\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 92 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.select.direct", - "start": { - "column": 21, - "line": 87 - } - }, - { - "defaultMessage": "!!!Custom server", - "description": "smashSelectCustomServer option for the \"Smash\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 98 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smash.select.customServer", - "start": { - "column": 27, - "line": 93 - } - }, - { - "defaultMessage": "!!!SMASH server URL", - "description": "smashURLInputLabel for the \"Smash Custom Server\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 104 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smashUrl.input.label", - "start": { - "column": 22, - "line": 99 - } - }, - { - "defaultMessage": "!!!Enter custom server URL", - "description": "smashUrlInputPlaceholder for the \"Smash Custom Server\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 110 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smashUrl.input.placeholder", - "start": { - "column": 28, - "line": 105 - } - }, - { - "defaultMessage": "!!!Your changes have been saved", - "description": "Message \"Your changes have been saved\" for inline editing (eg. on Profile Settings page).", - "end": { - "column": 3, - "line": 116 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "inline.editing.input.changesSaved", - "start": { - "column": 16, - "line": 111 - } - }, - { - "defaultMessage": "!!!Invalid URL", - "description": "invalidUrl for the \"Smash Custom Server\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 122 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smashUrl.input.invalidUrl", - "start": { - "column": 14, - "line": 117 - } - }, - { - "defaultMessage": "!!!The URL should start with \"https://\"", - "description": "invalidUrlPrefix for the \"Smash Custom Server\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 128 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smashUrl.input.invalidUrlPrefix", - "start": { - "column": 20, - "line": 123 - } - }, - { - "defaultMessage": "!!!Only \"https://\" protocol and hostname (e.g. domain.com) are allowed", - "description": "invalidUrlParameter for the \"Smash Custom Server\" selection on the Stake Pools settings page.", - "end": { - "column": 3, - "line": 135 - }, - "file": "source/renderer/app/components/settings/categories/StakePoolsSettings.tsx", - "id": "settings.stakePools.smashUrl.input.invalidUrlParameter", - "start": { - "column": 23, - "line": 129 - } - } - ], - "path": "source/renderer/app/components/settings/categories/StakePoolsSettings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Help and support", - "description": "Title \"Help and support\" on the support settings page.", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.faq.title", - "start": { - "column": 12, - "line": 4 - } - }, - { - "defaultMessage": "!!!If you are experiencing a problem, please look for guidance using the list of {faqLink} on the support pages. If you can’t find a solution, please submit a support ticket.", - "description": "Content for the \"Help and support\" section on the support settings page.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.faq.content", - "start": { - "column": 14, - "line": 9 - } - }, - { - "defaultMessage": "!!!Known Issues", - "description": "\"Known Issues\" link in the \"Help and support\" section on the support settings page", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.faq.faqLink", - "start": { - "column": 11, - "line": 16 - } - }, - { - "defaultMessage": "!!!Steps for creating a support request:", - "description": "Title \"Steps for creating a support request\" on the support settings page.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.title", - "start": { - "column": 14, - "line": 22 - } - }, - { - "defaultMessage": "!!!Download the logs", - "description": "Title \"Download the logs\" on the support settings page.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.downloadLogs.title", - "start": { - "column": 26, - "line": 28 - } - }, - { - "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", - "description": "Description of \"Download the logs\" on the support settings page.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.downloadLogs.description", - "start": { - "column": 32, - "line": 33 - } - }, - { - "defaultMessage": "!!!download your logs here", - "description": "\"download your logs here\" link in the Logs section on the support settings page", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.downloadLogs.link", - "start": { - "column": 25, - "line": 40 - } - }, - { - "defaultMessage": "!!!Report a problem", - "description": "Title \"Report a problem\" on the support settings page.", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.reportProblem.title", - "start": { - "column": 27, - "line": 46 - } - }, - { - "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", - "description": "Description of \"Download the logs\" on the support settings page.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.reportProblem.description", - "start": { - "column": 33, - "line": 51 - } - }, - { - "defaultMessage": "!!!download your logs here", - "description": "\"download your logs here\" link in the Logs section on the support settings page", - "end": { - "column": 3, - "line": 63 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "settings.support.steps.reportProblem.link", - "start": { - "column": 26, - "line": 58 - } - }, - { - "defaultMessage": "!!!Analytics data collection", - "description": "Analytics form title", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "analytics.form.title", - "start": { - "column": 25, - "line": 64 - } - }, - { - "defaultMessage": "!!!You have opted in to analytics data collection. You can {changeAnalyticsSettingsLink}.", - "description": "Analytics data collection description when user opted in", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "analytics.form.analyticsAcceptedDescription", - "start": { - "column": 32, - "line": 69 - } - }, - { - "defaultMessage": "!!!You have opted out of analytics data collection. You can {changeAnalyticsSettingsLink}.", - "description": "Analytics data collection description when user opted out", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "analytics.form.analyticsDeclinedDescription", - "start": { - "column": 32, - "line": 75 - } - }, - { - "defaultMessage": "!!!change this setting here", - "description": "Change analytics settings link text", - "end": { - "column": 3, - "line": 85 - }, - "file": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts", - "id": "analytics.form.changeAnalyticsSettingsLink", - "start": { - "column": 31, - "line": 81 - } - } - ], - "path": "source/renderer/app/components/settings/categories/SupportSettings.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Display ada balances in other currency", - "description": "titleLabel for the Currency settings in the Wallets settings page.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/settings/categories/WalletsSettings.tsx", - "id": "settings.wallets.currency.titleLabel", - "start": { - "column": 22, - "line": 15 - } - }, - { - "defaultMessage": "!!!Select a conversion currency for displaying your ada balances.", - "description": "currencyDescription for the Currency settings in the Wallets settings page.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/settings/categories/WalletsSettings.tsx", - "id": "settings.wallets.currency.description", - "start": { - "column": 23, - "line": 21 - } - }, - { - "defaultMessage": "!!!Select currency", - "description": "currencySelectLabel for the Currency settings in the Wallets settings page.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/settings/categories/WalletsSettings.tsx", - "id": "settings.wallets.currency.selectLabel", - "start": { - "column": 23, - "line": 28 - } - }, - { - "defaultMessage": "!!!Conversion rates are provided by CoinGecko without any warranty. Please use the calculated conversion value only as a reference. Converted balances reflect the current global average price of ada on active cryptocurrency exchanges, as tracked by CoinGecko. Ada conversion is available only to fiat and cryptocurrencies that are supported by CoinGecko, other local currency conversions may not be available.", - "description": "currencyDisclaimer for the Currency settings in the Wallets settings page.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/settings/categories/WalletsSettings.tsx", - "id": "settings.wallets.currency.disclaimer", - "start": { - "column": 22, - "line": 34 - } - }, - { - "defaultMessage": "!!!Powered by", - "description": "currencyPoweredByLabel for the Currency settings in the Wallets settings page.", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/settings/categories/WalletsSettings.tsx", - "id": "settings.wallets.currency.poweredBy.label", - "start": { - "column": 26, - "line": 41 - } - } - ], - "path": "source/renderer/app/components/settings/categories/WalletsSettings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!General", - "description": "Label for the \"General\" link in the settings menu.", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.general.link.label", - "start": { - "column": 11, - "line": 4 - } - }, - { - "defaultMessage": "!!!Security", - "description": "Label for the \"Security\" link in the settings menu.", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.security.link.label", - "start": { - "column": 12, - "line": 9 - } - }, - { - "defaultMessage": "!!!Wallets", - "description": "Label for the \"Wallets\" link in the settings menu.", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.wallets.link.label", - "start": { - "column": 11, - "line": 14 - } - }, - { - "defaultMessage": "!!!Stake Pools", - "description": "Label for the \"Support\" link in the settings menu.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.stakePools.link.label", - "start": { - "column": 14, - "line": 19 - } - }, - { - "defaultMessage": "!!!Support", - "description": "Label for the \"Support\" link in the settings menu.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.support.link.label", - "start": { - "column": 11, - "line": 24 - } - }, - { - "defaultMessage": "!!!Terms of service", - "description": "Label for the \"Terms of service\" link in the settings menu.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.termsOfUse.link.label", - "start": { - "column": 14, - "line": 29 - } - }, - { - "defaultMessage": "!!!Themes", - "description": "Label for the \"Themes\" link in the settings menu.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/settings/menu/SettingsMenu.messages.ts", - "id": "settings.menu.display.link.label", - "start": { - "column": 11, - "line": 34 - } - } - ], - "path": "source/renderer/app/components/settings/menu/SettingsMenu.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallets", - "description": "Text for the tooltip of wallets category", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategory.messages.ts", - "id": "sidebar.categoryTooltip.wallets", - "start": { - "column": 11, - "line": 4 - } - }, - { - "defaultMessage": "!!!Staking", - "description": "Text for the tooltip of staking category", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategory.messages.ts", - "id": "sidebar.categoryTooltip.staking", - "start": { - "column": 11, - "line": 9 - } - }, - { - "defaultMessage": "!!!Settings", - "description": "Text for the tooltip of settings category", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategory.messages.ts", - "id": "sidebar.categoryTooltip.settings", - "start": { - "column": 12, - "line": 14 - } - }, - { - "defaultMessage": "!!!Voting", - "description": "Text for the tooltip of voting category", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategory.messages.ts", - "id": "sidebar.categoryTooltip.voting", - "start": { - "column": 10, - "line": 19 - } - } - ], - "path": "source/renderer/app/components/sidebar/SidebarCategory.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Mainnet vx", - "description": "Label for mainnet network with version.", - "end": { - "column": 3, - "line": 11 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.mainnetLabel", - "start": { - "column": 11, - "line": 7 - } - }, - { - "defaultMessage": "!!!Cardano mainnet - Daedalus Flight", - "description": "Label for Daedalus Flight with version.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.daedalusFlightLabel", - "start": { - "column": 10, - "line": 12 - } - }, - { - "defaultMessage": "!!!Testnet vx", - "description": "Label for testnet with version.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.testnetLabel", - "start": { - "column": 11, - "line": 17 - } - }, - { - "defaultMessage": "!!!Staging vx", - "description": "Label for staging network with version.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.stagingLabel", - "start": { - "column": 11, - "line": 22 - } - }, - { - "defaultMessage": "!!!Shelley QA", - "description": "Label for shelley_qa with version.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.shelleyQaLabel", - "start": { - "column": 14, - "line": 27 - } - }, - { - "defaultMessage": "!!!Alonzo Purple", - "description": "Label for alonzo_purple with version.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.alonzoPurpleLabel", - "start": { - "column": 17, - "line": 32 - } - }, - { - "defaultMessage": "!!!Selfnode vx", - "description": "Label for selfnode with version.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.selfnodeLabel", - "start": { - "column": 12, - "line": 37 - } - }, - { - "defaultMessage": "!!!Development vx", - "description": "Label for development with version.", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.tsx", - "id": "test.environment.developmentLabel", - "start": { - "column": 15, - "line": 42 - } - } - ], - "path": "source/renderer/app/components/sidebar/SidebarCategoryNetworkInfo.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Add wallet", - "description": "Label for the \"Add wallet\" button in wallet sidebar menu.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.addWallet", - "start": { - "column": 16, - "line": 25 - } - }, - { - "defaultMessage": "!!!Date", - "description": "Label for the \"Date\" sort button", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.sortByDateButton", - "start": { - "column": 20, - "line": 30 - } - }, - { - "defaultMessage": "!!!Sort wallets by creation date", - "description": "Tooltip message for Date sort button", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.sortByDateTooltip", - "start": { - "column": 21, - "line": 35 - } - }, - { - "defaultMessage": "!!!Balance", - "description": "Label for the \"Balance\" sort button", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.sortByBalanceButton", - "start": { - "column": 23, - "line": 40 - } - }, - { - "defaultMessage": "!!!Sort wallets by balance", - "description": "Tooltip message for Balance sort button", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.sortByBalanceTooltip", - "start": { - "column": 24, - "line": 45 - } - }, - { - "defaultMessage": "!!!A – Z", - "description": "Label for the \"Name\" sort button", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.sortByNameButton", - "start": { - "column": 20, - "line": 50 - } - }, - { - "defaultMessage": "!!!Sort wallets by name", - "description": "Tooltip message for Name sort button", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.tsx", - "id": "sidebar.wallets.sortByNameTooltip", - "start": { - "column": 21, - "line": 55 - } - } - ], - "path": "source/renderer/app/components/sidebar/wallets/SidebarWalletsMenu.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Filter", - "description": "Search placeholder for the sidebar wallet menu", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/sidebar/wallets/WalletSearch.tsx", - "id": "sidebar.wallets.search.placeholder", - "start": { - "column": 15, - "line": 14 - } - } - ], - "path": "source/renderer/app/components/sidebar/wallets/WalletSearch.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Daedalus", - "description": "Daedalus", - "end": { - "column": 3, - "line": 10 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.title", - "start": { - "column": 9, - "line": 6 - } - }, - { - "defaultMessage": "!!!FLIGHT", - "description": "FLIGHT", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightVersionName", - "start": { - "column": 15, - "line": 11 - } - }, - { - "defaultMessage": "!!!CARDANO MAINNET", - "description": "Rewards", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightNetworkName", - "start": { - "column": 15, - "line": 16 - } - }, - { - "defaultMessage": "!!!Thank you for downloading the Daedalus Flight wallet! This version of Daedalus is specially created so users can test new features and we can squash usability bugs before pushing releases to the mainnet production version of the Daedalus wallet.", - "description": "flightDescription1 on network splash screen", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightDescription1", - "start": { - "column": 22, - "line": 21 - } - }, - { - "defaultMessage": "!!!Although Flight candidates are designed to test functionality, this is on the mainnet and will be using mainnet ada. Transactions made using Flight candidates will be real ada payments. If you are not a power user, we recommend you stick to using our stable, fully-tested production Daedalus wallet client. It is very important to note that transactions performed in Daedalus Flight are real and your funds will be transferred because the Cardano blockchain will be validating all transactions on mainnet.", - "description": "flightDescription2 on network splash screen", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightDescription2", - "start": { - "column": 22, - "line": 27 - } - }, - { - "defaultMessage": "!!!This is a separate and secure installation, but you will be able to run both Flight and production versions of Daedalus at the same time. To help you differentiate between the two wallets, Daedalus Flight will have a different, dark-blue-and-yellow user interface theme.", - "description": "flightDescription3 on network splash screen", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightDescription3", - "start": { - "column": 22, - "line": 33 - } - }, - { - "defaultMessage": "!!!If you already have a production version of Daedalus installed on your computer, your wallets should be visible in this Flight version as well, and you should have access to your ada in both versions of Daedalus.", - "description": "flightDescription4 on network splash screen", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightDescription4", - "start": { - "column": 22, - "line": 39 - } - }, - { - "defaultMessage": "!!!If you do spot any bugs or inconsistencies in balances and transaction history when using Flight candidates, or want to suggest improvements, feed them directly back to the IOHK development team by submitting a support ticket from the wallet. Wherever relevant, please include your wallet logs so the team can properly assess any issues.", - "description": "flightDescription5 on network splash screen", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightDescription5", - "start": { - "column": 22, - "line": 45 - } - }, - { - "defaultMessage": "!!!I understand", - "description": "I understand", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.buttonLabel", - "start": { - "column": 15, - "line": 51 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Learn more", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.linkLabel", - "start": { - "column": 13, - "line": 56 - } - }, - { - "defaultMessage": "!!!https://daedaluswallet.io/flight", - "description": "\"Learn more\" link URL on the network splash screen", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/splash/SplashNetworkFlight.tsx", - "id": "static.splash.network.flightLinkUrl", - "start": { - "column": 11, - "line": 61 - } - } - ], - "path": "source/renderer/app/components/splash/SplashNetworkFlight.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Shelley upgrade", - "description": "Headline for the Decentralisation notification.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/staking/countdown/StakingCountdown.tsx", - "id": "staking.delegationCountdown.heading", - "start": { - "column": 11, - "line": 10 - } - }, - { - "defaultMessage": "!!!Cardano will soon start transitioning from a federated to a decentralized system. The first step is the activation of the Shelley upgrade. Once the upgrade is complete, stake pools will start registering and users will be able to delegate their wallets. Two epochs (10 days) later, stake pools will begin producing blocks and users could start earning rewards from delegating their stakes. The first rewards, where due, will be distributed two more epochs later (10 days).", - "description": "Info for the Decentralisation notification.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/staking/countdown/StakingCountdown.tsx", - "id": "staking.delegationCountdown.description", - "start": { - "column": 15, - "line": 15 - } - }, - { - "defaultMessage": "!!!Rewards begin in", - "description": "Description for the Decentralisation notification.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/staking/countdown/StakingCountdown.tsx", - "id": "staking.delegationCountdown.timeLeftDesc", - "start": { - "column": 16, - "line": 21 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Button Label for the Decentralisation notification.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/staking/countdown/StakingCountdown.tsx", - "id": "staking.delegationCountdown.buttonLabel", - "start": { - "column": 15, - "line": 26 - } - } - ], - "path": "source/renderer/app/components/staking/countdown/StakingCountdown.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallets", - "description": "Title for the Delegation center body section.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterBody.tsx", - "id": "staking.delegationCenter.bodyTitle", - "start": { - "column": 13, - "line": 13 - } - }, - { - "defaultMessage": "!!!Now", - "description": "Title for the Delegation current epoch.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterBody.tsx", - "id": "staking.delegationCenter.currentEpochTitle", - "start": { - "column": 21, - "line": 18 - } - }, - { - "defaultMessage": "!!!Loading stake pools", - "description": "Loading stake pool message for the Delegation center body section.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterBody.tsx", - "id": "staking.delegationCenter.loadingStakePoolsMessage", - "start": { - "column": 28, - "line": 23 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-center/DelegationCenterBody.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Epoch", - "description": "Headline for the Delegation center.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.tsx", - "id": "staking.delegationCenter.epoch", - "start": { - "column": 9, - "line": 17 - } - }, - { - "defaultMessage": "!!!Current slot", - "description": "Headline for the Delegation center.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.tsx", - "id": "staking.delegationCenter.currentSlot", - "start": { - "column": 15, - "line": 22 - } - }, - { - "defaultMessage": "!!!Total slots", - "description": "Headline for the Delegation center.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.tsx", - "id": "staking.delegationCenter.totalSlots", - "start": { - "column": 14, - "line": 27 - } - }, - { - "defaultMessage": "!!!Next Cardano epoch starts in", - "description": "Headline for the Delegation center.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.tsx", - "id": "staking.delegationCenter.headingLeft", - "start": { - "column": 15, - "line": 32 - } - }, - { - "defaultMessage": "!!!Current Cardano epoch", - "description": "Headline for the Delegation center.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.tsx", - "id": "staking.delegationCenter.headingRight", - "start": { - "column": 16, - "line": 37 - } - }, - { - "defaultMessage": "!!!Changes to delegation preferences will take effect after both the current and next Cardano epochs have completed. Epochs on the Incentivized Testnet last one day. Any changes made now will take effect in {timeUntilFutureEpoch}.", - "description": "Delegation description for the Delegation center.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.tsx", - "id": "staking.delegationCenter.description", - "start": { - "column": 15, - "line": 42 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-center/DelegationCenterHeader.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!The delegation center is not available because you currently do not have any Shelley-compatible wallets.", - "description": "\"No wallets\" headLine on the Delegation centre Page.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterNoWallets.tsx", - "id": "staking.delegationCenter.noWallets.headLine", - "start": { - "column": 12, - "line": 12 - } - }, - { - "defaultMessage": "!!!Create a new wallet and transfer in a minimum of {minDelegationFunds} ADA (or restore an existing wallet with funds), then return here to delegate your stake.", - "description": "\"No wallets\" instructions on the Delegation centre Page.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterNoWallets.tsx", - "id": "staking.delegationCenter.noWallets.instructions", - "start": { - "column": 16, - "line": 18 - } - }, - { - "defaultMessage": "!!!Create wallet", - "description": "Label for \"Create New Wallet\" button on the Delegation centre Page.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/staking/delegation-center/DelegationCenterNoWallets.tsx", - "id": "staking.delegationCenter.noWallets.createWalletButtonLabel", - "start": { - "column": 27, - "line": 24 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-center/DelegationCenterNoWallets.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!{amount} ADA", - "description": "Amount of each wallet for the Delegation center body section.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.walletAmount", - "start": { - "column": 16, - "line": 32 - } - }, - { - "defaultMessage": "!!!Undelegated", - "description": "Undelegated label for the Delegation center body section.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.notDelegated", - "start": { - "column": 16, - "line": 38 - } - }, - { - "defaultMessage": "!!!Undelegate", - "description": "Remove delegation label for the Delegation center body section.", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.removeDelegation", - "start": { - "column": 20, - "line": 43 - } - }, - { - "defaultMessage": "!!!From epoch {fromEpoch}", - "description": "Delegated stake pool tooltip ticker for the Delegation center body section.", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.stakePoolTooltipTickerEpoch", - "start": { - "column": 26, - "line": 49 - } - }, - { - "defaultMessage": "!!!Currently earning rewards", - "description": "Delegated stake pool tooltip ticker for the Delegation center body section.", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.stakePoolTooltipTickerEarningRewards", - "start": { - "column": 35, - "line": 55 - } - }, - { - "defaultMessage": "!!!Delegate", - "description": "Delegate label for the Delegation center body section.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.delegate", - "start": { - "column": 12, - "line": 61 - } - }, - { - "defaultMessage": "!!!Redelegate", - "description": "Redelegate label for the Delegation center body section.", - "end": { - "column": 3, - "line": 70 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.redelegate", - "start": { - "column": 14, - "line": 66 - } - }, - { - "defaultMessage": "!!!unknown", - "description": "unknown stake pool label for the Delegation center body section.", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.unknownStakePoolLabel", - "start": { - "column": 25, - "line": 71 - } - }, - { - "defaultMessage": "!!!Syncing {syncingProgress}%", - "description": "unknown stake pool label for the Delegation center body section.", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/staking/delegation-center/WalletRow.tsx", - "id": "staking.delegationCenter.syncingTooltipLabel", - "start": { - "column": 23, - "line": 77 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-center/WalletRow.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Choose a stake pool", - "description": "Title \"Choose a stake pool\" on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 12 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.title", - "start": { - "column": 11, - "line": 7 - } - }, - { - "defaultMessage": "!!!Currently selected stake pool:", - "description": "Description on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 18 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.description", - "start": { - "column": 17, - "line": 13 - } - }, - { - "defaultMessage": "!!!Select a stake pool to receive your delegated funds in the {selectedWalletName} wallet.", - "description": "Select / Selected pool section label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 26 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.selectStakePoolLabel", - "start": { - "column": 26, - "line": 19 - } - }, - { - "defaultMessage": "!!!You have selected [{selectedPoolTicker}] stake pool to delegate to for {selectedWalletName} wallet.", - "description": "\"Selected Pools\" Selected pool label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 34 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.selectedStakePoolLabel", - "start": { - "column": 28, - "line": 27 - } - }, - { - "defaultMessage": "!!!The [{selectedPoolTicker}] stake pool which you have selected to delegate your {selectedWalletName} wallet funds is about to retire.", - "description": "\"Selected Pools\" Selected pool label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 42 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.selectedStakePoolLabelRetiring", - "start": { - "column": 36, - "line": 35 - } - }, - { - "defaultMessage": "!!!You are already delegating {selectedWalletName} wallet to [{selectedPoolTicker}] stake pool. If you wish to re-delegate your stake, please select a different pool.", - "description": "\"You are already delegating to stake pool\" label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 50 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.delegatedStakePoolLabel", - "start": { - "column": 29, - "line": 43 - } - }, - { - "defaultMessage": "!!!You are already pending delegation {selectedWalletName} wallet to [{selectedPoolTicker}] stake pool. If you wish to re-delegate your stake, please select a different pool.", - "description": "\"You are already delegating to stake pool\" label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 58 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.delegatedStakePoolNextLabel", - "start": { - "column": 33, - "line": 51 - } - }, - { - "defaultMessage": "!!!Choose one of your recent stake pool choices:", - "description": "Recent \"Pool\" choice section label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 65 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.recentPoolsLabel", - "start": { - "column": 22, - "line": 59 - } - }, - { - "defaultMessage": "!!!Or select a stake pool from the list of all available stake pools:", - "description": "Search \"Pools\" input label on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 73 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.searchInput.label", - "start": { - "column": 22, - "line": 66 - } - }, - { - "defaultMessage": "!!!Search stake pools", - "description": "Search \"Pools\" input placeholder on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 80 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.searchInput.placeholder", - "start": { - "column": 28, - "line": 74 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for continue button on the delegation setup \"choose stake pool\" dialog.", - "end": { - "column": 5, - "line": 87 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.continueButtonLabel", - "start": { - "column": 25, - "line": 81 - } - }, - { - "defaultMessage": "!!!STEP {currentStep} OF {totalSteps}", - "description": "Step indicator label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 5, - "line": 94 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.stepIndicatorLabel", - "start": { - "column": 24, - "line": 88 - } - }, - { - "defaultMessage": "!!!The stake pool you have selected is about to be retired. If you continue the delegation process, you will need to delegate your stake to another pool at least one complete epoch before the current pool’s retirement date to avoid losing rewards.", - "description": "Retiring Pool Footer label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 5, - "line": 102 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.ts", - "id": "staking.delegationSetup.chooseStakePool.step.dialog.retiringPoolFooter", - "start": { - "column": 24, - "line": 95 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseStakePoolDialog.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delegate wallet", - "description": "Title \"Delegate wallet\" on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.title", - "start": { - "column": 9, - "line": 21 - } - }, - { - "defaultMessage": "!!!Choose a wallet that holds the funds you want to delegate. The selected wallet must contain a minimum amount of {minDelegationFunds} ADA for delegation to be an option.", - "description": "Description on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.description", - "start": { - "column": 15, - "line": 27 - } - }, - { - "defaultMessage": "!!!Wallet", - "description": "Label \"Wallet\" for select input on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.selectWalletInputLabel", - "start": { - "column": 26, - "line": 34 - } - }, - { - "defaultMessage": "!!!Select Wallet", - "description": "Placeholder \"Select Wallet\" for select input on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.selectWalletInputPlaceholder", - "start": { - "column": 32, - "line": 41 - } - }, - { - "defaultMessage": "!!!STEP {currentStep} OF {totalSteps}", - "description": "Step indicator label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.stepIndicatorLabel", - "start": { - "column": 22, - "line": 48 - } - }, - { - "defaultMessage": "!!!This wallet does not contain the minimum amount of {minDelegationFunds} ADA which is required for delegation to be available. Please select a wallet with a minimum amount of {minDelegationFunds} ADA and click continue.", - "description": "errorMinDelegationFunds Error Label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.errorMinDelegationFunds", - "start": { - "column": 27, - "line": 54 - } - }, - { - "defaultMessage": "!!!This wallet contains only rewards balances so it cannot be delegated.", - "description": "errorMinDelegationFundsRewardsOnly Error Label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.errorMinDelegationFundsRewardsOnly", - "start": { - "column": 38, - "line": 62 - } - }, - { - "defaultMessage": "!!!This wallet can’t be used for delegation while it’s being synced.", - "description": "RestoringWallet Error Label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.errorRestoringWallet", - "start": { - "column": 24, - "line": 70 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for continue button on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.tsx", - "id": "staking.delegationSetup.chooseWallet.step.dialog.continueButtonLabel", - "start": { - "column": 23, - "line": 77 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsChooseWalletDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Confirm Delegation", - "description": "Title \"Confirm Delegation\" on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 12 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.title", - "start": { - "column": 11, - "line": 7 - } - }, - { - "defaultMessage": "!!!STEP {currentStep} OF {totalSteps}", - "description": "Step indicator label on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 18 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.stepIndicatorLabel", - "start": { - "column": 24, - "line": 13 - } - }, - { - "defaultMessage": "!!!Confirm your delegation choice to [{selectedPoolTicker}] stake pool for your {selectedWalletName} wallet.", - "description": "Description on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 25 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.description", - "start": { - "column": 17, - "line": 19 - } - }, - { - "defaultMessage": "!!!Stake pool ID", - "description": "Stake pool ID label on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 31 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.stakePoolIdLabel", - "start": { - "column": 22, - "line": 26 - } - }, - { - "defaultMessage": "!!!Fees", - "description": "Fees label on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 37 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.feesLabel", - "start": { - "column": 15, - "line": 32 - } - }, - { - "defaultMessage": "!!!Deposit", - "description": "Deposit label on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 43 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.depositLabel", - "start": { - "column": 18, - "line": 38 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Placeholder for \"spending password\"", - "end": { - "column": 5, - "line": 49 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.spendingPasswordPlaceholder", - "start": { - "column": 33, - "line": 44 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Label for \"spending password\"", - "end": { - "column": 5, - "line": 55 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.spendingPasswordLabel", - "start": { - "column": 27, - "line": 50 - } - }, - { - "defaultMessage": "!!!Confirm", - "description": "Label for continue button on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 61 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.confirmButtonLabel", - "start": { - "column": 24, - "line": 56 - } - }, - { - "defaultMessage": "!!!Cancel", - "description": "Label for \"Cancel\" button on the delegation setup \"confirmation\" step dialog.", - "end": { - "column": 5, - "line": 67 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.cancelButtonLabel", - "start": { - "column": 23, - "line": 62 - } - }, - { - "defaultMessage": "!!!Calculating fees", - "description": "\"Calculating fees\" message in the \"confirmation\" dialog.", - "end": { - "column": 5, - "line": 72 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.calculatingFees", - "start": { - "column": 21, - "line": 68 - } - }, - { - "defaultMessage": "!!!Calculating deposit", - "description": "\"Calculating deposit\" message in the \"confirmation\" dialog.", - "end": { - "column": 5, - "line": 78 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.ts", - "id": "staking.delegationSetup.confirmation.step.dialog.calculatingDeposit", - "start": { - "column": 24, - "line": 73 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsConfirmationDialog.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delegate wallet", - "description": "Title \"Delegation Setup\" on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.title", - "start": { - "column": 9, - "line": 15 - } - }, - { - "defaultMessage": "!!!Follow these steps to configure delegation preferences for your wallet. Please be aware that the last step of delegation confirmation will incur transaction fees.", - "description": "Description on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.description", - "start": { - "column": 15, - "line": 21 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "\"Learn more\" button label on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.learnMore.buttonLabel", - "start": { - "column": 24, - "line": 27 - } - }, - { - "defaultMessage": "!!!Wallet selection", - "description": "Steps explanation list item 1 label on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.stepsExplanation.step1", - "start": { - "column": 26, - "line": 33 - } - }, - { - "defaultMessage": "!!!Stake pool selection", - "description": "Steps explanation list item 2 label on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.stepsExplanation.step2", - "start": { - "column": 26, - "line": 39 - } - }, - { - "defaultMessage": "!!!Delegation confirmation", - "description": "Steps explanation list item 3 label on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.stepsExplanation.step3", - "start": { - "column": 26, - "line": 45 - } - }, - { - "defaultMessage": "!!!Cancel", - "description": "Label for close button on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.cancelButtonLabel", - "start": { - "column": 21, - "line": 51 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for continue button on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.tsx", - "id": "staking.delegationSetup.intro.step.dialog.continueButtonLabel", - "start": { - "column": 23, - "line": 57 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsIntroDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delegation is currently unavailable", - "description": "Title \"Delegation Setup\" on the delegation setup not available dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsNotAvailableDialog.tsx", - "id": "staking.delegationSetup.notAvailable.dialog.title", - "start": { - "column": 9, - "line": 17 - } - }, - { - "defaultMessage": "!!!None of your Shelley wallets currently hold the minimum amount of {minDelegationFunds} ADA required for delegation.", - "description": "Description on the delegation setup not available dialog.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsNotAvailableDialog.tsx", - "id": "staking.delegationSetup.notAvailable.dialog.description", - "start": { - "column": 15, - "line": 23 - } - }, - { - "defaultMessage": "!!!Close", - "description": "Label for close button on the delegation setup not available dialog.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsNotAvailableDialog.tsx", - "id": "staking.delegationSetup.notAvailable.dialog.closeButtonLabel", - "start": { - "column": 20, - "line": 29 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsNotAvailableDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet Delegated", - "description": "Title \"Wallet Delegated\" on the delegation setup \"success\" step dialog.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsSuccessDialog.tsx", - "id": "staking.delegationSetup.success.step.dialog.title", - "start": { - "column": 9, - "line": 19 - } - }, - { - "defaultMessage": "!!!The stake from your wallet {delegatedWalletName} is now delegated to the [{delegatedStakePoolTicker}] {delegatedStakePoolName} stake pool.", - "description": "Description \"line 1\" on the delegation setup \"success\" step dialog.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsSuccessDialog.tsx", - "id": "staking.delegationSetup.success.step.dialog.description.line1", - "start": { - "column": 20, - "line": 25 - } - }, - { - "defaultMessage": "!!!Your new delegation preferences are now posted on the Cardano blockchain. These preferences will take effect after both the current and the next Cardano epochs have completed in {timeUntilNextEpochStart}. During this time, your previous delegation preferences remain active.", - "description": "Description \"line 2\" on the delegation setup \"success\" step dialog.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsSuccessDialog.tsx", - "id": "staking.delegationSetup.success.step.dialog.description.line2", - "start": { - "column": 20, - "line": 32 - } - }, - { - "defaultMessage": "!!!Close", - "description": "Label for Close button on the delegation setup \"success\" step dialog.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsSuccessDialog.tsx", - "id": "staking.delegationSetup.success.step.dialog.closeButtonLabel", - "start": { - "column": 20, - "line": 39 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/DelegationStepsSuccessDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!The selected stake pool will become oversaturated by {oversaturationPercentage}%, which will reduce future rewards for all delegators to that pool.", - "description": "Warning shown if pool is going to be saturated if delegation happens", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/staking/delegation-setup-wizard/OversaturationText.tsx", - "id": "staking.delegationSetup.confirmation.step.dialog.oversaturationWarning", - "start": { - "column": 25, - "line": 13 - } - } - ], - "path": "source/renderer/app/components/staking/delegation-setup-wizard/OversaturationText.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!current epoch", - "description": "Headline for the current epoch.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochs.tsx", - "id": "staking.epochs.currentHeading", - "start": { - "column": 23, - "line": 15 - } - }, - { - "defaultMessage": "!!!previous epoch", - "description": "Headline for the previous epoch.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochs.tsx", - "id": "staking.epochs.previousHeading", - "start": { - "column": 24, - "line": 20 - } - } - ], - "path": "source/renderer/app/components/staking/epochs/StakingEpochs.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Stake pool", - "description": "Table header \"Stake pool\" label on staking epochs page", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsCurrentEpochData.tsx", - "id": "staking.epochs.currentEpoch.tableHeader.pool", - "start": { - "column": 19, - "line": 17 - } - }, - { - "defaultMessage": "!!!Slots elected", - "description": "Table header \"Slots elected\" label on staking epochs page", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsCurrentEpochData.tsx", - "id": "staking.epochs.currentEpoch.tableHeader.slotsElected", - "start": { - "column": 27, - "line": 22 - } - } - ], - "path": "source/renderer/app/components/staking/epochs/StakingEpochsCurrentEpochData.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!No results", - "description": "\"No results\" results label on staking epochs page.", - "end": { - "column": 3, - "line": 11 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsNoData.tsx", - "id": "staking.epochs.no.results", - "start": { - "column": 13, - "line": 7 - } - } - ], - "path": "source/renderer/app/components/staking/epochs/StakingEpochsNoData.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Stake pool", - "description": "Table header \"Stake pool\" label on staking epochs page", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.tsx", - "id": "staking.epochs.previousEpoch.tableHeader.pool", - "start": { - "column": 19, - "line": 18 - } - }, - { - "defaultMessage": "!!!Slots elected", - "description": "Table header \"Slots elected\" label on staking epochs page", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.tsx", - "id": "staking.epochs.previousEpoch.tableHeader.slotsElected", - "start": { - "column": 27, - "line": 23 - } - }, - { - "defaultMessage": "!!!Performance", - "description": "Table header \"Performance\" label on staking epochs page", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.tsx", - "id": "staking.epochs.tableHeader.performance", - "start": { - "column": 26, - "line": 28 - } - }, - { - "defaultMessage": "!!!Shared rewards", - "description": "Table header \"Shared rewards\" label on staking epochs page", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.tsx", - "id": "staking.epochs.tableHeader.sharedRewards", - "start": { - "column": 28, - "line": 33 - } - }, - { - "defaultMessage": "!!!slots", - "description": "\"slots\" text in table body on staking epochs page", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.tsx", - "id": "staking.epochs.tableBody.slots", - "start": { - "column": 18, - "line": 38 - } - }, - { - "defaultMessage": "!!!of", - "description": "\"of\" text in table body on staking epochs page", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.tsx", - "id": "staking.epochs.tableBody.of", - "start": { - "column": 15, - "line": 43 - } - } - ], - "path": "source/renderer/app/components/staking/epochs/StakingEpochsPreviousEpochData.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Alonzo upgrade", - "description": "Headline for the \"Staking Info\" page screen.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/staking/info/StakingInfoCountdown.tsx", - "id": "staking.infoCountdown.heading", - "start": { - "column": 11, - "line": 11 - } - }, - { - "defaultMessage": "!!!The ‘Alonzo’ protocol upgrade will bring highly-anticipated new smart contract capabilities to Cardano, by integrating Plutus scripts onto the blockchain. This important milestone will open up a whole new world of smart contracts, DeFi capabilities, and dApp development on Cardano.", - "description": "Info description for the \"Staking Info\" page screen.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/staking/info/StakingInfoCountdown.tsx", - "id": "staking.infoCountdown.description.before", - "start": { - "column": 21, - "line": 16 - } - }, - { - "defaultMessage": "!!!The ‘Alonzo’ protocol upgrade is now live on Cardano, enabling highly-anticipated new smart contract capabilities, by integrating Plutus scripts onto the blockchain. This important milestone opens up a whole new world of smart contracts, DeFi capabilities, and dApp development on Cardano.", - "description": "Info description for the \"Staking Info\" page screen.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/staking/info/StakingInfoCountdown.tsx", - "id": "staking.infoCountdown.description.after", - "start": { - "column": 20, - "line": 22 - } - }, - { - "defaultMessage": "!!!Alonzo upgrade in", - "description": "Countdown Title for the \"Staking Info\" page screen.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/staking/info/StakingInfoCountdown.tsx", - "id": "staking.infoCountdown.countdownTitle", - "start": { - "column": 18, - "line": 28 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Button Label for the \"Staking Info\" page screen.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/info/StakingInfoCountdown.tsx", - "id": "staking.infoCountdown.buttonLabel", - "start": { - "column": 15, - "line": 33 - } - }, - { - "defaultMessage": "!!!https://iohk.io/en/blog/posts/2021/04/08/smart-contracts-%E2%80%93-here-we-come/", - "description": "\"Learn more\" link URL in the \"Staking Info\" screen.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/staking/info/StakingInfoCountdown.tsx", - "id": "staking.infoCountdown.learnMore.linkUrl", - "start": { - "column": 20, - "line": 38 - } - } - ], - "path": "source/renderer/app/components/staking/info/StakingInfoCountdown.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delegation center", - "description": "Label for the \"Delegation\" nav button in the staking navigation.", - "end": { - "column": 3, - "line": 12 - }, - "file": "source/renderer/app/components/staking/navigation/StakingNavigation.tsx", - "id": "staking.navigation.delegation_center", - "start": { - "column": 21, - "line": 7 - } - }, - { - "defaultMessage": "!!!Stake pools", - "description": "Label for the \"Stake\" nav button in the staking navigation.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/staking/navigation/StakingNavigation.tsx", - "id": "staking.navigation.stake_pools", - "start": { - "column": 15, - "line": 13 - } - }, - { - "defaultMessage": "!!!Rewards", - "description": "Label for the \"Rewards\" nav button in the staking navigation.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/staking/navigation/StakingNavigation.tsx", - "id": "staking.navigation.rewards", - "start": { - "column": 11, - "line": 18 - } - }, - { - "defaultMessage": "!!!Epochs", - "description": "Label for the \"Epochs\" nav button in the staking navigation.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/staking/navigation/StakingNavigation.tsx", - "id": "staking.navigation.epochs", - "start": { - "column": 10, - "line": 24 - } - }, - { - "defaultMessage": "!!!Info", - "description": "Label for the \"Info\" nav button in the staking navigation.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/staking/navigation/StakingNavigation.tsx", - "id": "staking.navigation.info", - "start": { - "column": 8, - "line": 29 - } - } - ], - "path": "source/renderer/app/components/staking/navigation/StakingNavigation.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Redemption of Incentivized Testnet rewards is not available as you currently do not have any Shelley-compatible wallets.", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/NoWalletsDialog.tsx", - "id": "staking.redeemItnRewards.noWallets.description", - "start": { - "column": 15, - "line": 14 - } - }, - { - "defaultMessage": "!!!Add wallet", - "description": "addWalletButtonLabel for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/NoWalletsDialog.tsx", - "id": "staking.redeemItnRewards.noWallets.addWalletButtonLabel", - "start": { - "column": 24, - "line": 20 - } - } - ], - "path": "source/renderer/app/components/staking/redeem-itn-rewards/NoWalletsDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Redeem Incentivized Testnet rewards", - "description": "Title for Redeem Incentivized Testnet - redemptionUnavailable", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/RedemptionUnavailableDialog.tsx", - "id": "staking.redeemItnRewards.redemptionUnavailable.title", - "start": { - "column": 9, - "line": 14 - } - }, - { - "defaultMessage": "!!!Close", - "description": "closeButtonLabel for Redeem Incentivized Testnet - redemptionUnavailable", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/RedemptionUnavailableDialog.tsx", - "id": "staking.redeemItnRewards.redemptionUnavailable.closeButton.label", - "start": { - "column": 20, - "line": 20 - } - } - ], - "path": "source/renderer/app/components/staking/redeem-itn-rewards/RedemptionUnavailableDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Redeem Incentivized Testnet rewards", - "description": "Title for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.title", - "start": { - "column": 9, - "line": 38 - } - }, - { - "defaultMessage": "!!!If you participated in the {itnLink} and earned rewards by running a stake pool or delegating your stake, you can use this feature to redeem your rewards as ada on the Cardano mainnet.", - "description": "description for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.description1", - "start": { - "column": 16, - "line": 43 - } - }, - { - "defaultMessage": "!!!You will need the wallet recovery phrase for the Incentivized Testnet wallet used to earn rewards and an existing mainnet wallet in Daedalus to which the rewards will be transferred. This wallet will also be used to pay any applicable transaction fees.", - "description": "description for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.description2", - "start": { - "column": 16, - "line": 49 - } - }, - { - "defaultMessage": "!!!Incentivized Testnet", - "description": "descriptionItnLinkLabel for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.descriptionItnLinkLabel", - "start": { - "column": 27, - "line": 55 - } - }, - { - "defaultMessage": "!!!https://staking.cardano.org/", - "description": "descriptionItnLinkUrl for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.descriptionItnLinkUrl", - "start": { - "column": 25, - "line": 61 - } - }, - { - "defaultMessage": "!!!Wallet recovery phrase:", - "description": "recoveryPhraseLabel for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.recoveryPhraseLabel", - "start": { - "column": 23, - "line": 67 - } - }, - { - "defaultMessage": "!!!Redeem rewards to:", - "description": "walletsDropdownLabel for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.walletsDropdownLabel", - "start": { - "column": 24, - "line": 72 - } - }, - { - "defaultMessage": "!!!I understand that redeeming rewards from the Incentivized Testnet requires paying transaction fees.", - "description": "checkbox1Label for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 83 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.checkbox1Label", - "start": { - "column": 18, - "line": 78 - } - }, - { - "defaultMessage": "!!!I understand that fees will be paid from the wallet I am redeeming my rewards to.", - "description": "checkbox2Label for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 89 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.checkbox2Label", - "start": { - "column": 18, - "line": 84 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "continueButtonLabel for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.continueButton.label", - "start": { - "column": 23, - "line": 90 - } - }, - { - "defaultMessage": "!!!Learn More", - "description": "learnMoreLinkLabel for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 99 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.learnMoreLink.label", - "start": { - "column": 22, - "line": 95 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/900001656586", - "description": "learnMoreLinkUrl for Redeem Incentivized Testnet - Step 1", - "end": { - "column": 3, - "line": 105 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.learnMoreLink.url", - "start": { - "column": 20, - "line": 100 - } - }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "Hint \"Enter recovery phrase\" for the recovery phrase input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 111 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.recoveryPhraseInputHint", - "start": { - "column": 27, - "line": 106 - } - }, - { - "defaultMessage": "!!!Select Wallet", - "description": "Placeholder \"Select Wallet\" for select input on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 117 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.selectWalletInputPlaceholder", - "start": { - "column": 32, - "line": 112 - } - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "end": { - "column": 3, - "line": 123 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.noResults", - "start": { - "column": 13, - "line": 118 - } - }, - { - "defaultMessage": "!!!Invalid recovery phrase", - "description": "Error message shown when invalid recovery phrase was entered.", - "end": { - "column": 3, - "line": 129 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.tsx", - "id": "staking.redeemItnRewards.step1.invalidRecoveryPhrase", - "start": { - "column": 25, - "line": 124 - } - } - ], - "path": "source/renderer/app/components/staking/redeem-itn-rewards/Step1ConfigurationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Confirm rewards redemption", - "description": "title for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.title", - "start": { - "column": 9, - "line": 24 - } - }, - { - "defaultMessage": "!!!To", - "description": "walletToLabel for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.walletToLabel", - "start": { - "column": 17, - "line": 29 - } - }, - { - "defaultMessage": "!!!{walletName} wallet", - "description": "walletToName for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.walletToName", - "start": { - "column": 16, - "line": 34 - } - }, - { - "defaultMessage": "!!!Transaction fees", - "description": "transactionFees for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.transactionFees", - "start": { - "column": 19, - "line": 39 - } - }, - { - "defaultMessage": "!!!Wallet spending password ({walletName} wallet)", - "description": "spendingPasswordLabel for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.spendingPasswordLabel", - "start": { - "column": 25, - "line": 44 - } - }, - { - "defaultMessage": "!!!Password", - "description": "spendingPasswordPlaceholder for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.spendingPasswordPlaceholder", - "start": { - "column": 31, - "line": 51 - } - }, - { - "defaultMessage": "!!!Confirm rewards redemption", - "description": "continueButtonLabel for Redeem Incentivized Testnet - Step 2", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.continueButtonLabel", - "start": { - "column": 23, - "line": 57 - } - }, - { - "defaultMessage": "!!!Back", - "description": "Label for the back button in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 67 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.tsx", - "id": "staking.redeemItnRewards.step2.backButtonLabel", - "start": { - "column": 19, - "line": 62 - } - } - ], - "path": "source/renderer/app/components/staking/redeem-itn-rewards/Step2ConfirmationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!No rewards were found in your Incentivized Testnet Rewards wallet. Please make sure that you have entered the correct wallet recovery phrase.", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3FailureDialog.tsx", - "id": "staking.redeemItnRewards.step3.failure.description1NoRewards", - "start": { - "column": 25, - "line": 14 - } - }, - { - "defaultMessage": "!!!Rewards from the wallet corresponding to the recovery phrase you have provided have already been redeemed.", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3FailureDialog.tsx", - "id": "staking.redeemItnRewards.step3.failure.description2InvalidWallet", - "start": { - "column": 29, - "line": 20 - } - }, - { - "defaultMessage": "!!!No rewards were found in your Incentivized Testnet Rewards wallet. Please make sure that you have entered the correct wallet recovery phrase and that rewards have not already been redeemed.", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3FailureDialog.tsx", - "id": "staking.redeemItnRewards.step3.failure.description3Generic", - "start": { - "column": 23, - "line": 26 - } - }, - { - "defaultMessage": "!!!Back", - "description": "backButtonLabel for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3FailureDialog.tsx", - "id": "staking.redeemItnRewards.step3.failure.backButtonLabel", - "start": { - "column": 19, - "line": 32 - } - }, - { - "defaultMessage": "!!!Close window", - "description": "closeWindowLinkLabel for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3FailureDialog.tsx", - "id": "staking.redeemItnRewards.step3.failure.closeWindowLinkLabel", - "start": { - "column": 24, - "line": 37 - } - } - ], - "path": "source/renderer/app/components/staking/redeem-itn-rewards/Step3FailureDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Incentivized Testnet rewards redeemed!", - "description": "title for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3SuccessDialog.tsx", - "id": "staking.redeemItnRewards.step3.success.title", - "start": { - "column": 9, - "line": 17 - } - }, - { - "defaultMessage": "!!!You have successfully redeemed {redeemedRewards} to your {walletName} wallet. This transaction incurred {transactionFees} in transaction fees", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3SuccessDialog.tsx", - "id": "staking.redeemItnRewards.step3.success.description", - "start": { - "column": 15, - "line": 22 - } - }, - { - "defaultMessage": "!!!Open the wallet", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3SuccessDialog.tsx", - "id": "staking.redeemItnRewards.step3.success.openWalletButtonLabel", - "start": { - "column": 25, - "line": 28 - } - }, - { - "defaultMessage": "!!!Download PDF certificate", - "description": "description for Redeem Incentivized Testnet - Step 3", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/redeem-itn-rewards/Step3SuccessDialog.tsx", - "id": "staking.redeemItnRewards.step3.success.downloadPDFButtonLabel", - "start": { - "column": 26, - "line": 33 - } - } - ], - "path": "source/renderer/app/components/staking/redeem-itn-rewards/Step3SuccessDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Earned delegation rewards", - "description": "Title \"Earned delegation rewards\" label on the staking rewards page.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.title", - "start": { - "column": 9, - "line": 32 - } - }, - { - "defaultMessage": "!!!Rewards", - "description": "Filename prefix for the \"Export CSV\" on the staking rewards page.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.csvFilenamePrefix", - "start": { - "column": 21, - "line": 38 - } - }, - { - "defaultMessage": "!!!Export CSV", - "description": "Label for the \"Export CSV\" button on the staking rewards page.", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.exportButtonLabel", - "start": { - "column": 21, - "line": 44 - } - }, - { - "defaultMessage": "!!!No rewards", - "description": "\"No rewards\" rewards label on staking rewards page.", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.no.rewards", - "start": { - "column": 13, - "line": 50 - } - }, - { - "defaultMessage": "!!!Wallet", - "description": "Table header \"Wallet\" label on staking rewards page", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.tableHeader.wallet", - "start": { - "column": 21, - "line": 55 - } - }, - { - "defaultMessage": "!!!Total rewards earned (ADA)", - "description": "Table header \"Total Reward\" label on staking rewards page", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.tableHeader.total", - "start": { - "column": 26, - "line": 60 - } - }, - { - "defaultMessage": "!!!Unspent (ADA)", - "description": "Table header \"Unspent\" label on staking rewards page", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.tableHeader.unspent", - "start": { - "column": 28, - "line": 65 - } - }, - { - "defaultMessage": "!!!Rewards address", - "description": "Table header \"Rewards address\" label on staking rewards page", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.tableHeader.rewardsAddress", - "start": { - "column": 29, - "line": 70 - } - }, - { - "defaultMessage": "!!!Date", - "description": "Table header \"Date\" label in exported csv file", - "end": { - "column": 3, - "line": 79 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.tableHeader.date", - "start": { - "column": 19, - "line": 75 - } - }, - { - "defaultMessage": "!!!

Rewards earned by delegating your stake are automatically collected into your reward account.

Rewards earned on the Incentivized Testnet are not added to your Rewards wallet balance. They will be paid to you in real ada on the Cardano mainnet after the end of the Incentivized Testnet.

If you are using funds from this wallet to operate a stake pool, the rewards displayed here may include your pledged stake, which will not be counted when reward balances are paid out on the Cardano mainnet.

", - "description": "Rewards description text on staking rewards page", - "end": { - "column": 3, - "line": 85 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.note", - "start": { - "column": 8, - "line": 80 - } - }, - { - "defaultMessage": "!!!Syncing {syncingProgress}%", - "description": "unknown stake pool label on staking rewards page.", - "end": { - "column": 3, - "line": 90 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.delegationCenter.syncingTooltipLabel", - "start": { - "column": 23, - "line": 86 - } - }, - { - "defaultMessage": "!!!View in explorer", - "description": "View in explorer button label on staking rewards page.", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/staking/rewards/StakingRewards.tsx", - "id": "staking.rewards.actionViewInExplorer", - "start": { - "column": 24, - "line": 91 - } - } - ], - "path": "source/renderer/app/components/staking/rewards/StakingRewards.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Stake pools to which you are delegating", - "description": "\"delegatingListTitle\" for the Stake Pools page.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.delegatingListTitle", - "start": { - "column": 23, - "line": 28 - } - }, - { - "defaultMessage": "!!!Stake pools", - "description": "\"listTitle\" for the Stake Pools page.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.listTitle", - "start": { - "column": 13, - "line": 33 - } - }, - { - "defaultMessage": "!!!Loading stake pools", - "description": "\"listTitleLoading\" for the Stake Pools page.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.listTitleLoading", - "start": { - "column": 20, - "line": 38 - } - }, - { - "defaultMessage": "!!!Stake pools. Search results:", - "description": "\"listTitleSearch\" for the Stake Pools page.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.listTitleSearch", - "start": { - "column": 19, - "line": 43 - } - }, - { - "defaultMessage": "!!!({pools})", - "description": "\"listTitleStakePools\" for the Stake Pools page.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.listTitleStakePools", - "start": { - "column": 23, - "line": 48 - } - }, - { - "defaultMessage": "!!!Loading stake pools", - "description": "Loading stake pool message for the Delegation center body section.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.loadingStakePoolsMessage", - "start": { - "column": 28, - "line": 53 - } - }, - { - "defaultMessage": "!!!Moderated by", - "description": "moderatedBy message for the Delegation center body section.", - "end": { - "column": 3, - "line": 63 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.moderatedBy", - "start": { - "column": 15, - "line": 59 - } - }, - { - "defaultMessage": "!!!Unmoderated", - "description": "unmoderated message for the Delegation center body section.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePools.tsx", - "id": "staking.stakePools.unmoderated", - "start": { - "column": 15, - "line": 64 - } - } - ], - "path": "source/renderer/app/components/staking/stake-pools/StakePools.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!all your wallets", - "description": "All wallets item of dropdown.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingAllWallets", - "start": { - "column": 21, - "line": 40 - } - }, - { - "defaultMessage": "!!!.", - "description": "All wallets description after dropdown.", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingAllWalletsEnd", - "start": { - "column": 24, - "line": 45 - } - }, - { - "defaultMessage": "!!!Stake pools are currently ranked based on the combined amount in", - "description": "All wallets description before dropdown.", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingAllWalletsStart", - "start": { - "column": 26, - "line": 50 - } - }, - { - "defaultMessage": "!!!Use the slider to rank the stake pools and check the potential rewards based on the amount of stake you intend to delegate.", - "description": "Ranking description.", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingDescription", - "start": { - "column": 22, - "line": 56 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us", - "description": "Ranking learn more url.", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingLearnMoreUrl", - "start": { - "column": 23, - "line": 62 - } - }, - { - "defaultMessage": "!!!wallet.", - "description": "One wallet description after dropdown.", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingOneWalletEnd", - "start": { - "column": 23, - "line": 67 - } - }, - { - "defaultMessage": "!!!Stake pools are currently ranked based on the amount in", - "description": "One wallet description before dropdown.", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingOneWalletStart", - "start": { - "column": 25, - "line": 72 - } - }, - { - "defaultMessage": "!!!select a wallet", - "description": "Select wallet item of dropdown.", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingSelectWallet", - "start": { - "column": 23, - "line": 78 - } - }, - { - "defaultMessage": "!!!to set the amount you intend to delegate.", - "description": "Select wallet description after dropdown.", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingSelectWalletEnd", - "start": { - "column": 26, - "line": 83 - } - }, - { - "defaultMessage": "!!!Or", - "description": "Select wallet description before dropdown.", - "end": { - "column": 3, - "line": 92 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingSelectWalletStart", - "start": { - "column": 28, - "line": 88 - } - }, - { - "defaultMessage": "!!!Circulating supply", - "description": "Circulating supply slider tooltip.", - "end": { - "column": 3, - "line": 97 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingExtraTooltip", - "start": { - "column": 23, - "line": 93 - } - }, - { - "defaultMessage": "!!!Saturation point", - "description": "Saturation point slider tooltip.", - "end": { - "column": 3, - "line": 102 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingMaxTooltip", - "start": { - "column": 21, - "line": 98 - } - }, - { - "defaultMessage": "!!!Minimum ADA required for staking", - "description": "Minimum ADA required for staking slider tooltip.", - "end": { - "column": 3, - "line": 107 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.rankingMinTooltip", - "start": { - "column": 21, - "line": 103 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Learn more action of ranking panel.", - "end": { - "column": 3, - "line": 112 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.tsx", - "id": "staking.stakePools.learnMore", - "start": { - "column": 19, - "line": 108 - } - } - ], - "path": "source/renderer/app/components/staking/stake-pools/StakePoolsRanking.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Search stake pools", - "description": "\"Delegating List Title\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.searchInputPlaceholder", - "start": { - "column": 26, - "line": 4 - } - }, - { - "defaultMessage": "!!!Stake pools to which you are delegating", - "description": "\"delegatingListTitle\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.delegatingListTitle", - "start": { - "column": 23, - "line": 9 - } - }, - { - "defaultMessage": "!!!Stake pools ({pools})", - "description": "\"listTitle\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.listTitle", - "start": { - "column": 13, - "line": 14 - } - }, - { - "defaultMessage": "!!!Grid View", - "description": "\"gridIconTooltip\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.gridIconTooltip", - "start": { - "column": 19, - "line": 19 - } - }, - { - "defaultMessage": "!!!Grid Rewards View", - "description": "\"gridRewardsIconTooltip\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.gridRewardsIconTooltip", - "start": { - "column": 26, - "line": 24 - } - }, - { - "defaultMessage": "!!!List View", - "description": "\"listIconTooltip\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.listIconTooltip", - "start": { - "column": 19, - "line": 29 - } - }, - { - "defaultMessage": "!!!Clear", - "description": "\"clearTooltip\" for the Stake Pools search.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.ts", - "id": "staking.stakePools.search.clearTooltip", - "start": { - "column": 16, - "line": 34 - } - } - ], - "path": "source/renderer/app/components/staking/stake-pools/StakePoolsSearch.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Rank", - "description": "Table header \"Rank\" label on stake pools list view page", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.rank", - "start": { - "column": 19, - "line": 4 - } - }, - { - "defaultMessage": "!!!

A hierarchical ranking based on the potential rewards you will earn if you delegate the intended amount of stake to this pool, assuming that it reaches saturation.

*Stake pools with the potential rewards estimated at zero have the same ranking. Please set the stake slider to a higher value for more pools to get potential rewards estimated at more than zero.

", - "description": "\"Rank\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.rankingTooltip", - "start": { - "column": 26, - "line": 9 - } - }, - { - "defaultMessage": "!!!Ticker", - "description": "Table header \"Ticker\" label on stake pools list view page", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.ticker", - "start": { - "column": 21, - "line": 15 - } - }, - { - "defaultMessage": "!!!Saturation", - "description": "Table header \"Saturation\" label on stake pools list view page", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.saturation", - "start": { - "column": 25, - "line": 20 - } - }, - { - "defaultMessage": "!!!Saturation measures the stake in the pool and indicates the point at which rewards stop increasing with increases in stake. This capping mechanism encourages decentralization by discouraging users from delegating to oversaturated stake pools.", - "description": "\"Saturation\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.saturationTooltip", - "start": { - "column": 32, - "line": 26 - } - }, - { - "defaultMessage": "!!!Performance", - "description": "Table header \"Performance\" label on stake pools list view page", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.performance", - "start": { - "column": 26, - "line": 32 - } - }, - { - "defaultMessage": "!!!Uptime (days)", - "description": "Table header \"Uptime\" label on stake pools list view page", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.uptime", - "start": { - "column": 21, - "line": 38 - } - }, - { - "defaultMessage": "!!!Margin", - "description": "Table header \"Margin\" label on stake pools list view page", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.margin", - "start": { - "column": 21, - "line": 43 - } - }, - { - "defaultMessage": "!!!The pool's profit, defined as the rewards percentage kept by the pool from the stake that was delegated to it.", - "description": "\"Pool margin\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.profitMarginTooltip", - "start": { - "column": 28, - "line": 48 - } - }, - { - "defaultMessage": "!!!Roi", - "description": "Table header \"Roi\" label on stake pools list view page", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.roi", - "start": { - "column": 18, - "line": 54 - } - }, - { - "defaultMessage": "!!!Cost (ADA)", - "description": "Table header \"Cost\" label on stake pools list view page", - "end": { - "column": 3, - "line": 63 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.cost", - "start": { - "column": 19, - "line": 59 - } - }, - { - "defaultMessage": "!!!Fixed operational costs that the stake pool retains from any rewards earned during each epoch.", - "description": "\"Cost per epoch\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.costPerEpochTooltip", - "start": { - "column": 26, - "line": 64 - } - }, - { - "defaultMessage": "!!!Produced Blocks", - "description": "Table header \"Produced Blocks\" label on stake pools list view page", - "end": { - "column": 3, - "line": 75 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.producedBlocks", - "start": { - "column": 29, - "line": 70 - } - }, - { - "defaultMessage": "!!!The total number of blocks the stake pool has produced.", - "description": "\"Blocks\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.producedBlocksTooltip", - "start": { - "column": 36, - "line": 76 - } - }, - { - "defaultMessage": "!!!Potential rewards", - "description": "Table header \"Potential rewards\" label on stake pools list view page", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.potentialRewards", - "start": { - "column": 31, - "line": 82 - } - }, - { - "defaultMessage": "!!!An estimation of the potential rewards you will earn per epoch if you delegate the intended amount of stake. The system looks at the pool's parameters and historical performance data to calculate potential rewards, assuming that the pool reaches optimal saturation.", - "description": "\"Rewards\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 93 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.potentialRewardsTooltip", - "start": { - "column": 38, - "line": 88 - } - }, - { - "defaultMessage": "!!!Pledge (ADA)", - "description": "Table header \"Pledge\" label on stake pools list view page", - "end": { - "column": 3, - "line": 98 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.pledge", - "start": { - "column": 21, - "line": 94 - } - }, - { - "defaultMessage": "!!!The amount of stake that a pool operator contributes to a pool. Pools with higher pledge amounts earn more rewards for themselves and their delegators. Pools that do not honor their pledge earn zero rewards and accrue low ranking.", - "description": "\"Pledge\" tooltip for the Stake Pools Table.", - "end": { - "column": 3, - "line": 104 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tooltip.pledgeTooltip", - "start": { - "column": 28, - "line": 99 - } - }, - { - "defaultMessage": "!!!Retiring in", - "description": "Table header \"Retiring\" label on stake pools list view page", - "end": { - "column": 3, - "line": 109 - }, - "file": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.tsx", - "id": "staking.stakePools.tableHeader.retiring", - "start": { - "column": 23, - "line": 105 - } - } - ], - "path": "source/renderer/app/components/staking/stake-pools/StakePoolsTable.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Rank:", - "description": "\"Rank\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.ranking", - "start": { - "column": 11, - "line": 44 - } - }, - { - "defaultMessage": "!!!

A hierarchical ranking based on the potential rewards you will earn if you delegate the intended amount of stake to this pool, assuming that it reaches saturation.

*Stake pools with the potential rewards estimated at zero have the same ranking. Please set the stake slider to a higher value for more pools to get potential rewards estimated at more than zero.

", - "description": "\"Rank\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.rankingTooltip", - "start": { - "column": 18, - "line": 49 - } - }, - { - "defaultMessage": "!!!Live stake:", - "description": "\"Live stake\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.relativeStake", - "start": { - "column": 17, - "line": 55 - } - }, - { - "defaultMessage": "!!!Measures the amount of stake pledged by the pool plus the amount of stake currently delegated to the pool, versus the total amount in the system.", - "description": "\"Live stake\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.relativeStakeTooltip", - "start": { - "column": 24, - "line": 60 - } - }, - { - "defaultMessage": "!!!Pool margin:", - "description": "\"Pool margin\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 70 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.profitMargin", - "start": { - "column": 16, - "line": 66 - } - }, - { - "defaultMessage": "!!!The pool's profit, defined as the rewards percentage kept by the pool from the stake that was delegated to it.", - "description": "\"Pool margin\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.profitMarginTooltip", - "start": { - "column": 23, - "line": 71 - } - }, - { - "defaultMessage": "!!!Cost per epoch:", - "description": "\"Cost per epoch\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.costPerEpoch", - "start": { - "column": 16, - "line": 77 - } - }, - { - "defaultMessage": "!!!Fixed operational costs that the stake pool retains from any rewards earned during each epoch.", - "description": "\"Cost per epoch\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.costPerEpochTooltip", - "start": { - "column": 23, - "line": 82 - } - }, - { - "defaultMessage": "!!!Produced blocks:", - "description": "\"Blocks\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 92 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.producedBlocks", - "start": { - "column": 18, - "line": 88 - } - }, - { - "defaultMessage": "!!!The total number of blocks the stake pool has produced.", - "description": "\"Blocks\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 98 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.producedBlocksTooltip", - "start": { - "column": 25, - "line": 93 - } - }, - { - "defaultMessage": "!!!Potential rewards:", - "description": "\"Rewards\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 103 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.potentialRewards", - "start": { - "column": 20, - "line": 99 - } - }, - { - "defaultMessage": "!!!An estimation of the potential rewards you will earn per epoch if you delegate the intended amount of stake. The system looks at the pool's parameters and historical performance data to calculate potential rewards, assuming that the pool reaches optimal saturation.", - "description": "\"Rewards\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 109 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.potentialRewardsTooltip", - "start": { - "column": 27, - "line": 104 - } - }, - { - "defaultMessage": "!!!Retirement in {retirementFromNow}", - "description": "\"Retirement\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 114 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.retirement", - "start": { - "column": 14, - "line": 110 - } - }, - { - "defaultMessage": "!!!Saturation:", - "description": "\"Saturation\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 119 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.saturation", - "start": { - "column": 14, - "line": 115 - } - }, - { - "defaultMessage": "!!!Saturation measures the stake in the pool and indicates the point at which rewards stop increasing with increases in stake. This capping mechanism encourages decentralization by discouraging users from delegating to oversaturated stake pools.", - "description": "\"Saturation\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 125 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.saturationTooltip", - "start": { - "column": 21, - "line": 120 - } - }, - { - "defaultMessage": "!!!Pledge:", - "description": "\"Pledge\" for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 130 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.pledge", - "start": { - "column": 10, - "line": 126 - } - }, - { - "defaultMessage": "!!!The amount of stake that a pool operator contributes to a pool. Pools with higher pledge amounts earn more rewards for themselves and their delegators. Pools that do not honor their pledge earn zero rewards and accrue low ranking.", - "description": "\"Pledge\" tooltip for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 136 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.pledgeTooltip", - "start": { - "column": 17, - "line": 131 - } - }, - { - "defaultMessage": "!!!Delegate to this pool", - "description": "\"Delegate to this pool\" Button for the Stake Pools Tooltip page.", - "end": { - "column": 3, - "line": 142 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.delegateButton", - "start": { - "column": 18, - "line": 137 - } - }, - { - "defaultMessage": "!!!Copy the stake pool ID", - "description": "copyId tooltip label", - "end": { - "column": 3, - "line": 147 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.copyIdTooltipLabel", - "start": { - "column": 22, - "line": 143 - } - }, - { - "defaultMessage": "!!!Copied", - "description": "copyId tooltip label copied", - "end": { - "column": 3, - "line": 152 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.tooltip.copiedIdTooltipLabel", - "start": { - "column": 24, - "line": 148 - } - }, - { - "defaultMessage": "!!!Data not available yet", - "description": "Data not available yet label", - "end": { - "column": 3, - "line": 157 - }, - "file": "source/renderer/app/components/staking/widgets/TooltipPool.tsx", - "id": "staking.stakePools.noDataDashTooltip", - "start": { - "column": 26, - "line": 153 - } - } - ], - "path": "source/renderer/app/components/staking/widgets/TooltipPool.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Daedalus", - "description": "About \"title\"", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.title", - "start": { - "column": 14, - "line": 14 - } - }, - { - "defaultMessage": "!!!Daedalus Team:", - "description": "About page daedalus team headline", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.content.daedalus.headline", - "start": { - "column": 32, - "line": 19 - } - }, - { - "defaultMessage": "!!!Cardano Team:", - "description": "About page cardano team headline", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.content.cardano.headline", - "start": { - "column": 31, - "line": 24 - } - }, - { - "defaultMessage": "!!!Alan McNicholas, Aleksandar Djordjevic, Alexander Rukin, Brian McKenna, Charles Hoskinson, Daniel Main, Danilo Prates, Darko Mijić, Dmitrii Gaico, Dominik Guzei, Elin Liu, Gabriela Ponce, Jane Wild, Jeremy Wood, Juli Sudi, Junko Oda, Laurie Wang, Lucas Araujo, Manus McCole, Marcin Mazurek, Michael Bishop, Michael Chappell, Mior Sufian, Nikola Glumac, Piotr Stachyra, Przemysław Włodek, Renan Ferreira, Rhys Bartels-Waller, Richard Wild, Robert Moore, Rodney Lorrimar, Sam Jeston, Samuel Leathers, Serge Kosyrev, Szymon Masłowski, Tatyana Valkevych, Tomas Vrana, Tomislav Horaček, Yakov Karavelov", - "description": "About page daedalus team members", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.content.daedalus.members", - "start": { - "column": 31, - "line": 29 - } - }, - { - "defaultMessage": "!!!Alan McNicholas, Alejandro Garcia, Alexander Diemand, Alexander Vieth, Anatoli Ivanou, Andreas Triantafyllos, Ante Kegalj, Armando Santos, Ben Ford, Charles Hoskinson, Dan Friedman, Deepak Kapiswe, Denis Shevchenko, Dorin Solomon, Duncan Coutts, Edsko de Vries, Erik de Castro Lopo, Gerard Moroney, Hiroto Shioi, Jane Wild, Jean-Christophe Mincke, Jeremy Wood, Johannes Lund, Jordan Millar, Karl Knutsson, Kristijan Šarić, Lars Brünjes, Laurie Wang, Liz Bancroft, Luke Nadur, Marc Fontaine, Marcin Szamotulski, Matt Parsons, Matthias Benkort, Michael Bishop, Michael Hueschen, Moritz Angermann, Neil Davis, Niamh Ahern, Nicholas Clarke, Nicolas Di Prima, Noel Rimbert, Patrick Kelly, Pawel Jakubas, Peter Gaži, Peter Thompson, Philipp Kant, Piotr Stachyra, Ravi Patel, Richard Wild, Rob Cohen, Rodney Lorrimar, Ryan Lemmer, Samuel Leathers, Serge Kosyrev, Tatyana Valkevych, Tom Flynn, Vasileios Gkoumas, Vincent Hanquez", - "description": "About page cardano team members", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.content.cardano.members", - "start": { - "column": 30, - "line": 35 - } - }, - { - "defaultMessage": "!!!Input Output HK Limited. Licensed under", - "description": "About \"copyright\"", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.copyright", - "start": { - "column": 18, - "line": 41 - } - }, - { - "defaultMessage": "!!!Apache 2.0 license", - "description": "About page license name", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.license", - "start": { - "column": 15, - "line": 46 - } - }, - { - "defaultMessage": "!!!MacOS build 3769, with Cardano 1.0.4", - "description": "About page build information", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/static/About.tsx", - "id": "static.about.buildInfo", - "start": { - "column": 18, - "line": 51 - } - } - ], - "path": "source/renderer/app/components/static/About.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!SYSTEM INFO", - "description": "System info", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.system.info", - "start": { - "column": 14, - "line": 30 - } - }, - { - "defaultMessage": "!!!Platform", - "description": "Platform", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.platform", - "start": { - "column": 12, - "line": 35 - } - }, - { - "defaultMessage": "!!!Platform version", - "description": "Platform version", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.platform.version", - "start": { - "column": 19, - "line": 40 - } - }, - { - "defaultMessage": "!!!CPU", - "description": "CPU", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cpu", - "start": { - "column": 7, - "line": 45 - } - }, - { - "defaultMessage": "!!!RAM", - "description": "RAM", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.ram", - "start": { - "column": 7, - "line": 50 - } - }, - { - "defaultMessage": "!!!Available disk space", - "description": "Available disk space", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.availableDiskSpace", - "start": { - "column": 22, - "line": 55 - } - }, - { - "defaultMessage": "!!!Unknown", - "description": "Unknown amount of disk space", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.unknownDiskSpace", - "start": { - "column": 20, - "line": 60 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc", - "description": "\"Support\" link URL while disk space is unknown", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.unknownDiskSpaceSupportUrl", - "start": { - "column": 30, - "line": 65 - } - }, - { - "defaultMessage": "!!!Recommended system requirements status", - "description": "Displayed on the left of the Recommended system requirements status row", - "end": { - "column": 3, - "line": 75 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.hasMetHardwareRequirementsStatus", - "start": { - "column": 35, - "line": 70 - } - }, - { - "defaultMessage": "!!!Low", - "description": "Displayed on the right of the Recommended system requirements status row when hardware requirements are insufficient", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.hasMetHardwareRequirementsStatusLowValue", - "start": { - "column": 44, - "line": 76 - } - }, - { - "defaultMessage": "!!!Good", - "description": "Displayed on the right of the Recommended system requirements status row when hardware requirements are ok", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.hasMetHardwareRequirementsStatusGoodValue", - "start": { - "column": 45, - "line": 82 - } - }, - { - "defaultMessage": "!!!Your system specifications do not meet Daedalus’ recommended hardware requirements. We suggest using a machine with at least 16 GB of RAM", - "description": "Visible on hovering over Recommended system requirement status when status is Low", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.hasMetHardwareRequirementsStatusLowTooltip", - "start": { - "column": 46, - "line": 88 - } - }, - { - "defaultMessage": "!!!Your system specifications meet Daedalus’ recommended hardware requirements", - "description": "Visible on hovering over Recommended system requirement status when status is Good", - "end": { - "column": 3, - "line": 103 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.hasMetHardwareRequirementsStatusGoodTooltip", - "start": { - "column": 47, - "line": 96 - } - }, - { - "defaultMessage": "!!!RTS Flags Mode", - "description": "Indicates whether RTS Flags Mode is enabled or not", - "end": { - "column": 3, - "line": 108 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.isRTSFlagsModeEnabled", - "start": { - "column": 25, - "line": 104 - } - }, - { - "defaultMessage": "!!!CORE INFO", - "description": "CORE INFO", - "end": { - "column": 3, - "line": 113 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.coreInfo", - "start": { - "column": 12, - "line": 109 - } - }, - { - "defaultMessage": "!!!Daedalus version", - "description": "Daedalus version", - "end": { - "column": 3, - "line": 118 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.daedalusVersion", - "start": { - "column": 19, - "line": 114 - } - }, - { - "defaultMessage": "!!!Daedalus build number", - "description": "Daedalus build number", - "end": { - "column": 3, - "line": 123 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.daedalusBuildNumber", - "start": { - "column": 23, - "line": 119 - } - }, - { - "defaultMessage": "!!!Daedalus main process ID", - "description": "Daedalus main process ID", - "end": { - "column": 3, - "line": 128 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.daedalusMainProcessID", - "start": { - "column": 25, - "line": 124 - } - }, - { - "defaultMessage": "!!!Daedalus renderer process ID", - "description": "Daedalus renderer process ID", - "end": { - "column": 3, - "line": 133 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.daedalusProcessID", - "start": { - "column": 21, - "line": 129 - } - }, - { - "defaultMessage": "!!!Daedalus 'Blank Screen Fix' active", - "description": "Daedalus 'Blank Screen Fix' active", - "end": { - "column": 3, - "line": 138 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.blankScreenFix", - "start": { - "column": 18, - "line": 134 - } - }, - { - "defaultMessage": "!!!Cardano node version", - "description": "Cardano node version", - "end": { - "column": 3, - "line": 143 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeVersion", - "start": { - "column": 22, - "line": 139 - } - }, - { - "defaultMessage": "!!!Cardano node process ID", - "description": "Cardano node process ID", - "end": { - "column": 3, - "line": 148 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodePID", - "start": { - "column": 18, - "line": 144 - } - }, - { - "defaultMessage": "!!!Cardano node port", - "description": "Cardano node port", - "end": { - "column": 3, - "line": 153 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeApiPort", - "start": { - "column": 22, - "line": 149 - } - }, - { - "defaultMessage": "!!!Cardano wallet process ID", - "description": "Cardano wallet process ID", - "end": { - "column": 3, - "line": 158 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoWalletPID", - "start": { - "column": 20, - "line": 154 - } - }, - { - "defaultMessage": "!!!Cardano wallet version", - "description": "Cardano wallet version", - "end": { - "column": 3, - "line": 163 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoWalletVersion", - "start": { - "column": 24, - "line": 159 - } - }, - { - "defaultMessage": "!!!Cardano wallet port", - "description": "Cardano wallet port", - "end": { - "column": 3, - "line": 168 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoWalletApiPort", - "start": { - "column": 24, - "line": 164 - } - }, - { - "defaultMessage": "!!!Cardano network", - "description": "Cardano network", - "end": { - "column": 3, - "line": 173 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNetwork", - "start": { - "column": 18, - "line": 169 - } - }, - { - "defaultMessage": "!!!Daedalus state directory", - "description": "Daedalus state directory", - "end": { - "column": 3, - "line": 178 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.stateDirectory", - "start": { - "column": 22, - "line": 174 - } - }, - { - "defaultMessage": "!!!Open", - "description": "Open", - "end": { - "column": 3, - "line": 183 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.stateDirectoryPathOpenBtn", - "start": { - "column": 29, - "line": 179 - } - }, - { - "defaultMessage": "!!!CONNECTION ERROR", - "description": "CONNECTION ERROR", - "end": { - "column": 3, - "line": 188 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.connectionError", - "start": { - "column": 19, - "line": 184 - } - }, - { - "defaultMessage": "!!!DAEDALUS STATUS", - "description": "DAEDALUS STATUS", - "end": { - "column": 3, - "line": 193 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.daedalusStatus", - "start": { - "column": 18, - "line": 189 - } - }, - { - "defaultMessage": "!!!Connected", - "description": "Connected", - "end": { - "column": 3, - "line": 198 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.connected", - "start": { - "column": 13, - "line": 194 - } - }, - { - "defaultMessage": "!!!Synced", - "description": "Synced", - "end": { - "column": 3, - "line": 203 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.synced", - "start": { - "column": 10, - "line": 199 - } - }, - { - "defaultMessage": "!!!Sync percentage", - "description": "Sync percentage", - "end": { - "column": 3, - "line": 208 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.syncPercentage", - "start": { - "column": 18, - "line": 204 - } - }, - { - "defaultMessage": "!!!Local time difference", - "description": "Local time difference", - "end": { - "column": 3, - "line": 213 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.localTimeDifference", - "start": { - "column": 23, - "line": 209 - } - }, - { - "defaultMessage": "!!!System time correct", - "description": "System time correct", - "end": { - "column": 3, - "line": 218 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.systemTimeCorrect", - "start": { - "column": 21, - "line": 214 - } - }, - { - "defaultMessage": "!!!System time ignored", - "description": "System time ignored", - "end": { - "column": 3, - "line": 223 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.systemTimeIgnored", - "start": { - "column": 21, - "line": 219 - } - }, - { - "defaultMessage": "!!!Checking system time", - "description": "Checking system time", - "end": { - "column": 3, - "line": 228 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.checkingNodeTime", - "start": { - "column": 20, - "line": 224 - } - }, - { - "defaultMessage": "!!!CARDANO NODE STATUS", - "description": "CARDANO NODE STATUS", - "end": { - "column": 3, - "line": 233 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeStatus", - "start": { - "column": 21, - "line": 229 - } - }, - { - "defaultMessage": "!!!Restarting Cardano node...", - "description": "Restarting Cardano node...", - "end": { - "column": 3, - "line": 238 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeStatusRestarting", - "start": { - "column": 31, - "line": 234 - } - }, - { - "defaultMessage": "!!!Restart Cardano node", - "description": "Restart Cardano node", - "end": { - "column": 3, - "line": 243 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeStatusRestart", - "start": { - "column": 28, - "line": 239 - } - }, - { - "defaultMessage": "!!!Cardano node state", - "description": "Cardano node state", - "end": { - "column": 3, - "line": 248 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeState", - "start": { - "column": 20, - "line": 244 - } - }, - { - "defaultMessage": "!!!Updated", - "description": "Updated", - "end": { - "column": 3, - "line": 253 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeHasBeenUpdated", - "start": { - "column": 22, - "line": 249 - } - }, - { - "defaultMessage": "!!!Crashed", - "description": "Crashed", - "end": { - "column": 3, - "line": 258 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeHasCrashed", - "start": { - "column": 18, - "line": 254 - } - }, - { - "defaultMessage": "!!!Errored", - "description": "Errored", - "end": { - "column": 3, - "line": 263 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeHasErrored", - "start": { - "column": 18, - "line": 259 - } - }, - { - "defaultMessage": "!!!Stopped", - "description": "Stopped", - "end": { - "column": 3, - "line": 268 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeHasStopped", - "start": { - "column": 18, - "line": 264 - } - }, - { - "defaultMessage": "!!!Exiting", - "description": "Exiting", - "end": { - "column": 3, - "line": 273 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeIsExiting", - "start": { - "column": 17, - "line": 269 - } - }, - { - "defaultMessage": "!!!Running", - "description": "Running", - "end": { - "column": 3, - "line": 278 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeIsRunning", - "start": { - "column": 17, - "line": 274 - } - }, - { - "defaultMessage": "!!!Starting", - "description": "Starting", - "end": { - "column": 3, - "line": 283 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeIsStarting", - "start": { - "column": 18, - "line": 279 - } - }, - { - "defaultMessage": "!!!Stopping", - "description": "Stopping", - "end": { - "column": 3, - "line": 288 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeIsStopping", - "start": { - "column": 18, - "line": 284 - } - }, - { - "defaultMessage": "!!!Unrecoverable", - "description": "Unrecoverable", - "end": { - "column": 3, - "line": 293 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeIsUnrecoverable", - "start": { - "column": 23, - "line": 289 - } - }, - { - "defaultMessage": "!!!Updating", - "description": "Updating", - "end": { - "column": 3, - "line": 298 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.nodeIsUpdating", - "start": { - "column": 18, - "line": 294 - } - }, - { - "defaultMessage": "!!!Cardano node responding", - "description": "Cardano node responding", - "end": { - "column": 3, - "line": 303 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeResponding", - "start": { - "column": 25, - "line": 299 - } - }, - { - "defaultMessage": "!!!Cardano node subscribed", - "description": "Cardano node subscribed", - "end": { - "column": 3, - "line": 308 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeSubscribed", - "start": { - "column": 25, - "line": 304 - } - }, - { - "defaultMessage": "!!!Cardano node time correct", - "description": "Cardano node time correct", - "end": { - "column": 3, - "line": 313 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeTimeCorrect", - "start": { - "column": 26, - "line": 309 - } - }, - { - "defaultMessage": "!!!Cardano node syncing", - "description": "Cardano node syncing", - "end": { - "column": 3, - "line": 318 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeSyncing", - "start": { - "column": 22, - "line": 314 - } - }, - { - "defaultMessage": "!!!Cardano node in sync", - "description": "Cardano node in sync", - "end": { - "column": 3, - "line": 323 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.cardanoNodeInSync", - "start": { - "column": 21, - "line": 319 - } - }, - { - "defaultMessage": "!!!Checking...", - "description": "Checking...", - "end": { - "column": 3, - "line": 328 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.localTimeDifferenceChecking", - "start": { - "column": 31, - "line": 324 - } - }, - { - "defaultMessage": "!!!Check time", - "description": "Check time", - "end": { - "column": 3, - "line": 333 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.localTimeDifferenceCheckTime", - "start": { - "column": 32, - "line": 329 - } - }, - { - "defaultMessage": "!!!Yes", - "description": "Yes", - "end": { - "column": 3, - "line": 338 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.statusOn", - "start": { - "column": 12, - "line": 334 - } - }, - { - "defaultMessage": "!!!No", - "description": "No", - "end": { - "column": 3, - "line": 343 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.statusOff", - "start": { - "column": 13, - "line": 339 - } - }, - { - "defaultMessage": "!!!On", - "description": "On", - "end": { - "column": 3, - "line": 348 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.statusOnForUserSettings", - "start": { - "column": 27, - "line": 344 - } - }, - { - "defaultMessage": "!!!Off", - "description": "Off", - "end": { - "column": 3, - "line": 353 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.statusOffForUserSettings", - "start": { - "column": 28, - "line": 349 - } - }, - { - "defaultMessage": "!!!NTP service unreachable", - "description": "NTP service unreachable", - "end": { - "column": 3, - "line": 358 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.serviceUnreachable", - "start": { - "column": 22, - "line": 354 - } - }, - { - "defaultMessage": "!!!message", - "description": "message", - "end": { - "column": 3, - "line": 363 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.message", - "start": { - "column": 11, - "line": 359 - } - }, - { - "defaultMessage": "!!!code", - "description": "code", - "end": { - "column": 3, - "line": 368 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.code", - "start": { - "column": 8, - "line": 364 - } - }, - { - "defaultMessage": "!!!Last network block", - "description": "Last network block", - "end": { - "column": 3, - "line": 373 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.lastNetworkBlock", - "start": { - "column": 20, - "line": 369 - } - }, - { - "defaultMessage": "!!!Last synchronized block", - "description": "Last synchronized block", - "end": { - "column": 3, - "line": 378 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.lastSynchronizedBlock", - "start": { - "column": 25, - "line": 374 - } - }, - { - "defaultMessage": "!!!epoch", - "description": "epoch", - "end": { - "column": 3, - "line": 383 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.epoch", - "start": { - "column": 9, - "line": 379 - } - }, - { - "defaultMessage": "!!!slot", - "description": "slot", - "end": { - "column": 3, - "line": 388 - }, - "file": "source/renderer/app/components/status/DaedalusDiagnostics.tsx", - "id": "daedalus.diagnostics.dialog.slot", - "start": { - "column": 8, - "line": 384 - } - } - ], - "path": "source/renderer/app/components/status/DaedalusDiagnostics.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Catalyst API unavailable", - "description": "Title", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/ApiError.messages.ts", - "id": "voting.apiError.title", - "start": { - "column": 9, - "line": 4 - } - }, - { - "defaultMessage": "!!!Unable to communicate with the API that retrieves the Catalyst date information.", - "description": "Description 1", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/voting/voting-info/ApiError.messages.ts", - "id": "voting.apiError.description1", - "start": { - "column": 16, - "line": 9 - } - }, - { - "defaultMessage": "!!!Please, try again later.", - "description": "Description 2", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/voting/voting-info/ApiError.messages.ts", - "id": "voting.apiError.description2", - "start": { - "column": 16, - "line": 15 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/ApiError.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!https://play.google.com/store/apps/details?id=io.iohk.vitvoting", - "description": "\"androidAppButtonUrl\" for the Catalyst voting app", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/components/voting/voting-info/AppStore.messages.ts", - "id": "voting.info.androidAppButtonUrl", - "start": { - "column": 23, - "line": 4 - } - }, - { - "defaultMessage": "!!!https://apps.apple.com/in/app/catalyst-voting/id1517473397", - "description": "\"appleAppButtonUrl\" for the Catalyst voting app", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/voting/voting-info/AppStore.messages.ts", - "id": "voting.info.appleAppButtonUrl", - "start": { - "column": 21, - "line": 10 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/AppStore.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Project Catalyst", - "description": "Headline Project Catalyst", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/Headline.messages.ts", - "id": "voting.catalyst.heading", - "start": { - "column": 11, - "line": 4 - } - }, - { - "defaultMessage": "!!!Decide which innovative ideas for Cardano will receive funding.", - "description": "Description Project Catalyst", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/voting/voting-info/Headline.messages.ts", - "id": "voting.catalyst.descriptionRow1", - "start": { - "column": 19, - "line": 9 - } - }, - { - "defaultMessage": "!!!{reward} worth of ada rewards will be distributed between ada holders who register their vote.", - "description": "Description Project Catalyst", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/voting/voting-info/Headline.messages.ts", - "id": "voting.catalyst.descriptionRow2", - "start": { - "column": 19, - "line": 15 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Learn more link label for registration steps", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/voting/voting-info/Headline.messages.ts", - "id": "voting.info.learnMoreLinkLabel", - "start": { - "column": 22, - "line": 21 - } - }, - { - "defaultMessage": "!!!https://cardano.ideascale.com/a/index", - "description": "Learn more link url for registration steps", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/voting/voting-info/Headline.messages.ts", - "id": "voting.info.learnMoreLinkUrl", - "start": { - "column": 20, - "line": 26 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/Headline.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Snapshot date:", - "description": "Voting info snapshot date label", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/RegisterToVote.messages.ts", - "id": "voting.registerToVote.dateLabel", - "start": { - "column": 13, - "line": 4 - } - }, - { - "defaultMessage": "!!!Follow these steps to vote:", - "description": "Steps to follow title", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/voting/voting-info/RegisterToVote.messages.ts", - "id": "voting.registerToVote.stepsTitle", - "start": { - "column": 14, - "line": 9 - } - }, - { - "defaultMessage": "!!!Download the Catalyst Voting app on your smartphone", - "description": "First step to follow in order to vote", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/voting/voting-info/RegisterToVote.messages.ts", - "id": "voting.registerToVote.step1CheckBoxLabel", - "start": { - "column": 22, - "line": 14 - } - }, - { - "defaultMessage": "!!!Ensure that you register and hold the necessary 500 ADA at the time of the snapshot.", - "description": "Second step to follow in order to vote", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/voting/voting-info/RegisterToVote.messages.ts", - "id": "voting.registerToVote.step2CheckBoxLabel", - "start": { - "column": 22, - "line": 19 - } - }, - { - "defaultMessage": "!!!Register to vote", - "description": "Button Label for voting registration steps", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/voting/voting-info/RegisterToVote.messages.ts", - "id": "voting.registerToVote.registerToVoteButtonLabel", - "start": { - "column": 15, - "line": 25 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/RegisterToVote.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!End of voting:", - "description": "Headline for end date", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/ResultsPhase.messages.ts", - "id": "voting.resultsPhase.endDateLabel", - "start": { - "column": 16, - "line": 4 - } - }, - { - "defaultMessage": "!!!View results", - "description": "View results link label", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/voting/voting-info/ResultsPhase.messages.ts", - "id": "voting.resultsPhase.viewResultsLinkLabel", - "start": { - "column": 24, - "line": 9 - } - }, - { - "defaultMessage": "https://cardano.ideascale.com/a/pages/results", - "description": "View results link", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/voting/voting-info/ResultsPhase.messages.ts", - "id": "voting.resultsPhase.viewResultsLinkURL", - "start": { - "column": 22, - "line": 14 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/ResultsPhase.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Snapshot date:", - "description": "Snapshot date label", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/SnapshotPhase.messages.ts", - "id": "voting.snapshotPhase.snapshotDateLabel", - "start": { - "column": 21, - "line": 4 - } - }, - { - "defaultMessage": "!!!Next voting period:", - "description": "Next voting date label", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/voting/voting-info/SnapshotPhase.messages.ts", - "id": "voting.snapshotPhase.votingDateLabel", - "start": { - "column": 19, - "line": 9 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/SnapshotPhase.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Voting ended:", - "description": "Voting end date label", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/TallyingPhase.messages.ts", - "id": "voting.tallyingPhase.endDateLabel", - "start": { - "column": 16, - "line": 4 - } - }, - { - "defaultMessage": "!!!Check back for results on:", - "description": "Results date label", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/voting/voting-info/TallyingPhase.messages.ts", - "id": "voting.tallyingPhase.resultsLabel", - "start": { - "column": 16, - "line": 9 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/TallyingPhase.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Fund{votingFundNumber}", - "description": "Current fund name", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/VotingInfo.messages.ts", - "id": "voting.fundName", - "start": { - "column": 12, - "line": 4 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/VotingInfo.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Voting period open between:", - "description": "Voting date label", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/voting/voting-info/VotingPhase.messages.ts", - "id": "voting.votingOpenPhase.dateLabel", - "start": { - "column": 13, - "line": 4 - } - }, - { - "defaultMessage": "!!!Use mobile app to vote", - "description": "Voting instruction", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/voting/voting-info/VotingPhase.messages.ts", - "id": "voting.votingOpenPhase.instruction", - "start": { - "column": 15, - "line": 9 - } - } - ], - "path": "source/renderer/app/components/voting/voting-info/VotingPhase.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!You can only use one wallet when registering. To maximize rewards and voting power, choose the wallet with the largest balance.", - "description": "Description on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.description", - "start": { - "column": 15, - "line": 11 - } - }, - { - "defaultMessage": "!!!Select a wallet", - "description": "Label \"Wallet\" for select input on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.selectWalletInputLabel", - "start": { - "column": 26, - "line": 17 - } - }, - { - "defaultMessage": "!!!Select a wallet", - "description": "Placeholder \"Select Wallet\" for select input on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.selectWalletInputPlaceholder", - "start": { - "column": 32, - "line": 23 - } - }, - { - "defaultMessage": "!!!This wallet does not contain the minimum required amount of {minVotingRegistrationFunds} ADA. Please select a different wallet with a minimum balance of {minVotingRegistrationFunds} ADA.", - "description": "errorMinVotingFunds Error Label on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.errorMinVotingFunds", - "start": { - "column": 23, - "line": 30 - } - }, - { - "defaultMessage": "!!!This wallet cannot be registered for voting as it contains rewards balance only.", - "description": "errorMinVotingFundsRewardsOnly Error Label on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.errorMinVotingFundsRewardsOnly", - "start": { - "column": 34, - "line": 37 - } - }, - { - "defaultMessage": "!!!This wallet cannot be registered for voting as it is a legacy Byron wallet.", - "description": "Byron wallet error message on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.errorLegacyWallet", - "start": { - "column": 21, - "line": 45 - } - }, - { - "defaultMessage": "!!!The wallet cannot be registered for voting while it is being synced with the blockchain.", - "description": "Restoring wallet error message on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.errorRestoringWallet", - "start": { - "column": 24, - "line": 52 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for continue button on the voting registration \"choose wallet\" step.", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.tsx", - "id": "voting.votingRegistration.chooseWallet.step.continueButtonLabel", - "start": { - "column": 23, - "line": 59 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsChooseWallet.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Confirmation of voting registration requires approximately 5 minutes. Please leave Daedalus running.", - "description": "Description voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.description", - "start": { - "column": 15, - "line": 15 - } - }, - { - "defaultMessage": "!!!Please restart the voting registration process by clicking Restart voting registration.", - "description": "Message for restart voting registration on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.descriptionRestart", - "start": { - "column": 22, - "line": 21 - } - }, - { - "defaultMessage": "!!!The voting registration process was not completed correctly.", - "description": "Error message on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.errorMessage", - "start": { - "column": 16, - "line": 28 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for continue button on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.continueButtonLabel", - "start": { - "column": 23, - "line": 34 - } - }, - { - "defaultMessage": "!!!Restart voting registration", - "description": "Label for restart button on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.restartButtonLabel", - "start": { - "column": 22, - "line": 40 - } - }, - { - "defaultMessage": "!!!Transaction pending...", - "description": "Label for pending transaction state on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.transactionPendingLabel", - "start": { - "column": 27, - "line": 46 - } - }, - { - "defaultMessage": "!!!Transaction confirmed", - "description": "Label for confirmed transaction state on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.transactionConfirmedLabel", - "start": { - "column": 29, - "line": 52 - } - }, - { - "defaultMessage": "!!!Waiting for confirmation...", - "description": "Label for confirming transaction state on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 63 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.waitingForConfirmationsLabel", - "start": { - "column": 32, - "line": 58 - } - }, - { - "defaultMessage": "!!!{currentCount} of {expectedCount}", - "description": "Label for number of confirmations on the voting registration \"confirm\" step.", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.tsx", - "id": "voting.votingRegistration.confirm.step.confirmationsCountLabel", - "start": { - "column": 27, - "line": 64 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsConfirm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Please enter a PIN for your Fund{nextVotingFundNumber} voting registration. The PIN you set here, and the QR code which you will get in the next step, will be required for you to vote using the Catalyst Voting app on your smartphone.", - "description": "Description on the voting registration \"enter pin code\" step.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.description", - "start": { - "column": 15, - "line": 17 - } - }, - { - "defaultMessage": "!!!It is important to remember your PIN. If you forget your PIN, you will not be able to use this registration for voting, and you will need to repeat the registration process.", - "description": "Reminder on the voting registration \"enter pin code\" step.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.reminder", - "start": { - "column": 12, - "line": 24 - } - }, - { - "defaultMessage": "!!!Enter PIN", - "description": "Label for pin code input on the voting registration \"enter pin code\" step.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.enterPinCodeLabel", - "start": { - "column": 21, - "line": 30 - } - }, - { - "defaultMessage": "!!!Repeat PIN", - "description": "Label for repeat pin code on the voting registration \"enter pin code\" step.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.repeatPinCodeLabel", - "start": { - "column": 22, - "line": 36 - } - }, - { - "defaultMessage": "!!!Invalid PIN", - "description": "Error message shown when repeat pin code is invalid.", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.errors.invalidPinCode", - "start": { - "column": 18, - "line": 42 - } - }, - { - "defaultMessage": "!!!PIN doesn’t match", - "description": "Error message shown when repeat pin code is invalid.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.errors.invalidRepeatPinCode", - "start": { - "column": 24, - "line": 47 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for continue button on the voting registration \"enter pin code\" step.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.tsx", - "id": "voting.votingRegistration.enterPinCode.step.continueButtonLabel", - "start": { - "column": 23, - "line": 53 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsEnterPinCode.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Please complete your registration now.", - "description": "Qr code title on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.qrCodeTitle", - "start": { - "column": 15, - "line": 12 - } - }, - { - "defaultMessage": "!!!Open the Catalyst Voting app on your smartphone, scan the QR code, and enter your PIN to complete the voting registration process.", - "description": "Part 1 of Qr code description of use on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.qrCodeDescription1", - "start": { - "column": 22, - "line": 17 - } - }, - { - "defaultMessage": "!!!Your registration remains valid across all Catalyst funding rounds. Ensure that you save your QR code and PIN so you can reconnect your wallet to the voting app if you are logged out, or if you want to connect a new device.", - "description": "Part 2 of Qr code description of use on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.qrCodeDescription2", - "start": { - "column": 22, - "line": 24 - } - }, - { - "defaultMessage": "!!!Warning: After closing this window the QR code will no longer be available. If you do not keep a PDF copy of the QR code, you might not be able to participate in voting.", - "description": "Qr code warning on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.qrCodeWarning", - "start": { - "column": 17, - "line": 31 - } - }, - { - "defaultMessage": "!!!I understand that I will not be able to retrieve this QR code again after closing this window.", - "description": "First checkbox label on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.checkbox1Label", - "start": { - "column": 18, - "line": 37 - } - }, - { - "defaultMessage": "!!!I acknowledge that I must have the downloaded PDF with the QR code, to vote with Fund{nextVotingFundNumber}.", - "description": "Second checkbox label on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.checkbox2Label", - "start": { - "column": 18, - "line": 44 - } - }, - { - "defaultMessage": "!!!Close", - "description": "\"Close\" button label on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.closeButtonLabel", - "start": { - "column": 20, - "line": 51 - } - }, - { - "defaultMessage": "!!!Save as PDF", - "description": "\"Save as PDF\" button label on the voting registration \"qr code\" step.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.tsx", - "id": "voting.votingRegistration.qrCode.step.saveAsPdfButtonLabel", - "start": { - "column": 24, - "line": 57 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsQrCode.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Please sign the voting registration transaction. This transaction links your wallet balance with your Fund{nextVotingFundNumber} voting registration, as a proof of your voting power. Funds will not leave your wallet, but registration requires paying transaction fees, as displayed on-screen.", - "description": "Description on the voting registration \"sign\" step.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.description", - "start": { - "column": 15, - "line": 26 - } - }, - { - "defaultMessage": "!!!Submit registration transaction", - "description": "Label for continue button on the voting registration \"sign\" step.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.continueButtonLabel", - "start": { - "column": 23, - "line": 32 - } - }, - { - "defaultMessage": "!!!Fees", - "description": "Fees label on the voting registration \"sign\" step.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.feesLabel", - "start": { - "column": 13, - "line": 38 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Placeholder for \"spending password\"", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.spendingPasswordPlaceholder", - "start": { - "column": 31, - "line": 43 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Label for \"spending password\"", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.spendingPasswordLabel", - "start": { - "column": 25, - "line": 48 - } - }, - { - "defaultMessage": "!!!Calculating fees", - "description": "\"Calculating fees\" message in the \"sign\" step.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.calculatingFees", - "start": { - "column": 19, - "line": 53 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "\"Learn more\" link on the \"sign\" step.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.learnMoreLink", - "start": { - "column": 17, - "line": 58 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/900006490763", - "description": "Learn more\" link URL on the \"sign\" step.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.tsx", - "id": "voting.votingRegistration.register.step.learntMoreLinkUrl", - "start": { - "column": 21, - "line": 63 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/VotingRegistrationStepsRegister.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Cancel Fund{nextVotingFundNumber} voting registration?", - "description": "Headline for the voting registration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/ConfirmationDialog.tsx", - "id": "voting.votingRegistration.dialog.confirmation.headline", - "start": { - "column": 12, - "line": 10 - } - }, - { - "defaultMessage": "!!!Are you sure that you want to cancel Fund{nextVotingFundNumber} voting registration? The transaction fee you paid for the voting registration transaction will be lost and you will need to repeat the registration from the beginning.", - "description": "Content for the voting registration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/ConfirmationDialog.tsx", - "id": "voting.votingRegistration.dialog.confirmation.content", - "start": { - "column": 11, - "line": 16 - } - }, - { - "defaultMessage": "!!!Cancel registration", - "description": "\"Cancel registration\" button label for the voting registration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/ConfirmationDialog.tsx", - "id": "voting.votingRegistration.dialog.confirmation.button.cancelButtonLabel", - "start": { - "column": 21, - "line": 23 - } - }, - { - "defaultMessage": "!!!Continue registration", - "description": "\"Continue registration\" button label for the voting registration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/ConfirmationDialog.tsx", - "id": "voting.votingRegistration.dialog.confirmation.button.confirmButtonLabel", - "start": { - "column": 22, - "line": 30 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/ConfirmationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Register for Fund{nextVotingFundNumber} voting", - "description": "Tile \"Register to vote\" for voting registration", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/VotingRegistrationDialog.tsx", - "id": "voting.votingRegistration.dialog.dialogTitle", - "start": { - "column": 15, - "line": 17 - } - }, - { - "defaultMessage": "!!!Step {step} of {stepCount}", - "description": "Sub title for voting registration", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/VotingRegistrationDialog.tsx", - "id": "voting.votingRegistration.dialog.subtitle", - "start": { - "column": 12, - "line": 22 - } - } - ], - "path": "source/renderer/app/components/voting/voting-registration-wizard-steps/widgets/VotingRegistrationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "Newsletter", - "description": "\"Newsletter\" link for Project Catalyst footer", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/voting/VotingFooterLinks.tsx", - "id": "voting.catalystFooterLinks.newsletter", - "start": { - "column": 14, - "line": 16 - } - }, - { - "defaultMessage": "Announcements Channel", - "description": "\"Announcements Channel\" link for Project Catalyst footer", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/voting/VotingFooterLinks.tsx", - "id": "voting.catalystFooterLinks.announcements", - "start": { - "column": 17, - "line": 21 - } - }, - { - "defaultMessage": "Community Chat", - "description": "\"Community Chat\" link for Project Catalyst footer", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/voting/VotingFooterLinks.tsx", - "id": "voting.catalystFooterLinks.community", - "start": { - "column": 13, - "line": 26 - } - }, - { - "defaultMessage": "Projects", - "description": "\"Projects\" link for Project Catalyst footer", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/voting/VotingFooterLinks.tsx", - "id": "voting.catalystFooterLinks.projects", - "start": { - "column": 12, - "line": 31 - } - } - ], - "path": "source/renderer/app/components/voting/VotingFooterLinks.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Voting registration for Fund{nextVotingFundNumber} is not available as you currently do not have any Shelley-compatible wallets.", - "description": "\"No wallets\" headLine on the voting info page.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/voting/VotingNoWallets.tsx", - "id": "voting.info.noWallets.headLine", - "start": { - "column": 12, - "line": 11 - } - }, - { - "defaultMessage": "!!!Create a new wallet and transfer a minimum of {minVotingFunds} ADA (or restore an existing wallet with funds), then return here to register for voting.", - "description": "\"No wallets\" instructions on the voting info page.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/voting/VotingNoWallets.tsx", - "id": "voting.info.noWallets.instructions", - "start": { - "column": 16, - "line": 17 - } - }, - { - "defaultMessage": "!!!Create wallet", - "description": "Label for \"Create New Wallet\" button on the voting info page.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/voting/VotingNoWallets.tsx", - "id": "voting.info.noWallets.createWalletButtonLabel", - "start": { - "column": 27, - "line": 23 - } - } - ], - "path": "source/renderer/app/components/voting/VotingNoWallets.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!On the following screen, you will be given a list of {walletRecoveryPhraseWordCount} words to write down on paper and keep in a safe place. This list of words is the wallet recovery phrase for the wallet you are creating.", - "description": "Instructions for backing up wallet recovery phrase on dialog that displays wallet recovery phrase.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletBackupPrivacyWarningDialog.tsx", - "id": "wallet.backup.privacy.warning.dialog.recoveryPhraseInstructions1", - "start": { - "column": 31, - "line": 15 - } - }, - { - "defaultMessage": "!!!The simplest way to keep your wallet recovery phrase secure is to never store it digitally or online. If you decide to use an online service, such as a password manager with an encrypted database, it is your responsibility to make sure that you use it correctly.", - "description": "Instructions for backing up wallet recovery phrase on dialog that displays wallet recovery phrase.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletBackupPrivacyWarningDialog.tsx", - "id": "wallet.backup.privacy.warning.dialog.recoveryPhraseInstructions2", - "start": { - "column": 31, - "line": 22 - } - }, - { - "defaultMessage": "!!!Using your recovery phrase is the only way to recover your wallet if your computer is lost, broken, stolen, or stops working.", - "description": "Instructions for backing up wallet recovery phrase on dialog that displays wallet recovery phrase.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletBackupPrivacyWarningDialog.tsx", - "id": "wallet.backup.privacy.warning.dialog.recoveryPhraseInstructions3", - "start": { - "column": 31, - "line": 29 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for button \"Continue\" on wallet backup dialog", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletBackupPrivacyWarningDialog.tsx", - "id": "wallet.backup.privacy.warning.dialog.button.labelContinue", - "start": { - "column": 23, - "line": 36 - } - }, - { - "defaultMessage": "!!!I confirm that nobody can see my screen, because anyone who knows my recovery phrase will be able to spend the ada in my new wallet.", - "description": "Label for the checkbox on wallet backup dialog describing that nobody should be watching when recovery phrase is shown", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletBackupPrivacyWarningDialog.tsx", - "id": "wallet.backup.privacy.warning.dialog.checkbox.label.nobodyWatching", - "start": { - "column": 22, - "line": 41 - } - } - ], - "path": "source/renderer/app/components/wallet/backup-recovery/WalletBackupPrivacyWarningDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Please make sure you write down the {walletRecoveryPhraseWordCount} words of your wallet recovery phrase on a piece of paper in the exact order shown here.", - "description": "Instructions for backing up wallet recovery phrase on dialog that displays wallet recovery phrase.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.tsx", - "id": "wallet.backup.recovery.phrase.display.dialog.backup.instructions", - "start": { - "column": 22, - "line": 15 - } - }, - { - "defaultMessage": "!!!Yes, I have written down my wallet recovery phrase.", - "description": "Label for button \"Yes, I have written down my wallet recovery phrase.\" on wallet backup dialog", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.tsx", - "id": "wallet.backup.recovery.phrase.display.dialog.button.label.iHaveWrittenItDown", - "start": { - "column": 33, - "line": 22 - } - } - ], - "path": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseDisplayDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Please enter your {wordCount}-word wallet recovery phrase. Make sure you enter the words in the correct order.", - "description": "Instructions for verifying wallet recovery phrase on dialog for entering wallet recovery phrase.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.verification.instructions", - "start": { - "column": 28, - "line": 28 - } - }, - { - "defaultMessage": "!!!Verify your recovery phrase", - "description": "Label for the recovery phrase input on dialog for entering wallet recovery phrase.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputLabel", - "start": { - "column": 28, - "line": 35 - } - }, - { - "defaultMessage": "!!!Enter your {numberOfWords}-word recovery phrase", - "description": "Placeholder hint for the mnemonics autocomplete.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputHint", - "start": { - "column": 27, - "line": 41 - } - }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder for the mnemonics autocomplete.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputPlaceholder", - "start": { - "column": 34, - "line": 46 - } - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInputNoResults", - "start": { - "column": 27, - "line": 52 - } - }, - { - "defaultMessage": "!!!Invalid recovery phrase", - "description": "Error message shown when invalid recovery phrase was entered.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.recoveryPhraseInvalidMnemonics", - "start": { - "column": 34, - "line": 59 - } - }, - { - "defaultMessage": "!!!Confirm", - "description": "Label for button \"Confirm\" on wallet backup dialog", - "end": { - "column": 3, - "line": 70 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.recovery.phrase.show.entry.dialog.button.labelConfirm", - "start": { - "column": 22, - "line": 66 - } - }, - { - "defaultMessage": "!!!I understand that the simplest way to keep my wallet recovery phrase secure is to never store it digitally or online. If I decide to use an online service, such as a password manager with an encrypted database, it is my responsibility to make sure that I use it correctly.", - "description": "Term on wallet creation to store recovery phrase offline", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.terms.and.condition.offline", - "start": { - "column": 15, - "line": 71 - } - }, - { - "defaultMessage": "!!!I understand that the only way to recover my wallet if my computer is lost, broken, stolen, or stops working is to use my wallet recovery phrase.", - "description": "Term and condition on wallet backup dialog describing that wallet can only be recovered with a security phrase", - "end": { - "column": 3, - "line": 85 - }, - "file": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.tsx", - "id": "wallet.backup.recovery.phrase.entry.dialog.terms.and.condition.recovery", - "start": { - "column": 16, - "line": 78 - } - } - ], - "path": "source/renderer/app/components/wallet/backup-recovery/WalletRecoveryPhraseEntryDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Summary", - "description": "Label for the \"Summary\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.summary", - "start": { - "column": 11, - "line": 16 - } - }, - { - "defaultMessage": "!!!Send", - "description": "Label for the \"Send\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.send", - "start": { - "column": 8, - "line": 21 - } - }, - { - "defaultMessage": "!!!Receive", - "description": "Label for the \"Receive\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.receive", - "start": { - "column": 11, - "line": 26 - } - }, - { - "defaultMessage": "!!!Transactions", - "description": "Label for the \"Transactions\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.transactions", - "start": { - "column": 16, - "line": 31 - } - }, - { - "defaultMessage": "!!!Tokens", - "description": "Label for the \"Tokens\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.tokens", - "start": { - "column": 10, - "line": 37 - } - }, - { - "defaultMessage": "!!!Settings", - "description": "Label for the \"Settings\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.settings", - "start": { - "column": 12, - "line": 42 - } - }, - { - "defaultMessage": "!!!Wallet UTXO distribution", - "description": "Label for the \"Wallet UTXO distribution\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.utxo", - "start": { - "column": 8, - "line": 48 - } - }, - { - "defaultMessage": "!!!More", - "description": "Label for the \"More\" nav button in the wallet navigation.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/wallet/navigation/WalletNavigation.tsx", - "id": "wallet.navigation.more", - "start": { - "column": 8, - "line": 54 - } - } - ], - "path": "source/renderer/app/components/wallet/navigation/WalletNavigation.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!The wallet is not responding.", - "description": "Title on the NotResponding dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/not-responding/NotResponding.tsx", - "id": "wallet.notResponding.title", - "start": { - "column": 9, - "line": 18 - } - }, - { - "defaultMessage": "!!!The {walletName} wallet is not responding. This is caused by a known but rare issue, which is currently being fixed. Please restart the Cardano node by clicking the button below, which should resolve the issue. If the issue persists, or if it happens again, please submit a support request.", - "description": "Description on the NotResponding dialog.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/not-responding/NotResponding.tsx", - "id": "wallet.notResponding.description", - "start": { - "column": 15, - "line": 23 - } - }, - { - "defaultMessage": "!!!Restart Cardano Node", - "description": "Restart Node Button Label on the NotResponding dialog.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/not-responding/NotResponding.tsx", - "id": "wallet.notResponding.restartNodeButtonLabel", - "start": { - "column": 26, - "line": 29 - } - }, - { - "defaultMessage": "!!!Submit a support request", - "description": "Submit Support Request Label on the NotResponding dialog", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/wallet/not-responding/NotResponding.tsx", - "id": "wallet.notResponding.submitSupportRequestLabel", - "start": { - "column": 29, - "line": 34 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/requests/new/", - "description": "Submit Support Request Url on the NotResponding dialog", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/not-responding/NotResponding.tsx", - "id": "wallet.notResponding.submitSupportRequestUrl", - "start": { - "column": 27, - "line": 39 - } - } - ], - "path": "source/renderer/app/components/wallet/not-responding/NotResponding.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Paper wallet certificate", - "description": "Headline for the \"Paper wallet create certificate completion dialog\" headline.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.headline", - "start": { - "column": 12, - "line": 18 - } - }, - { - "defaultMessage": "!!!You may wish to fold your paper wallet certificate and glue together the edges to store it securely. Please keep your certificate safe.", - "description": "Headline for the \"Paper wallet create certificate completion dialog\" subtitle.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.subtitle", - "start": { - "column": 12, - "line": 24 - } - }, - { - "defaultMessage": "!!!When you wish to import your wallet back into Daedalus crop any glued edges of the certificate to open it.\n To check your balance on the paper wallet at any time, you may use the link below. Copy or save the URL to your browser bookmarks to do this easily", - "description": "Headline for the \"Paper wallet create certificate completion dialog\" link instructions.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.linkInstructions", - "start": { - "column": 20, - "line": 31 - } - }, - { - "defaultMessage": "!!!To receive funds to your paper wallet simply share your wallet address with others.", - "description": "Headline for the \"Paper wallet create certificate completion dialog\" address instructions.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.addressInstructions", - "start": { - "column": 23, - "line": 38 - } - }, - { - "defaultMessage": "!!!Cardano explorer link", - "description": "\"Paper wallet create certificate completion dialog\" cardano link label.", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.cardanoLinkLabel", - "start": { - "column": 20, - "line": 45 - } - }, - { - "defaultMessage": "!!!copied", - "description": "\"Paper wallet create certificate completion dialog\" address copied.", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.addressCopiedLabel", - "start": { - "column": 22, - "line": 51 - } - }, - { - "defaultMessage": "!!!Wallet address", - "description": "\"Paper wallet create certificate completion dialog\" wallet address label.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.addressLabel", - "start": { - "column": 16, - "line": 57 - } - }, - { - "defaultMessage": "!!!Finish", - "description": "\"Paper wallet create certificate completion dialog\" finish button label.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.tsx", - "id": "paper.wallet.create.certificate.completion.dialog.finishButtonLabel", - "start": { - "column": 21, - "line": 63 - } - } - ], - "path": "source/renderer/app/components/wallet/paper-wallet-certificate/CompletionDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Abort paper wallet certificate creation?", - "description": "Headline for the paper wallet certificate cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/ConfirmationDialog.tsx", - "id": "paper.wallet.create.certificate.confirmation.dialog.headline", - "start": { - "column": 12, - "line": 9 - } - }, - { - "defaultMessage": "!!!At this point, your paper wallet certificate is not complete and verifications steps are not yet done.", - "description": "Content for the paper wallet certificate cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/ConfirmationDialog.tsx", - "id": "paper.wallet.create.certificate.confirmation.dialog.contentPart1", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!At this point, your paper wallet certificate is not complete and verifications steps are not yet done.", - "description": "Content for the paper wallet certificate cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/ConfirmationDialog.tsx", - "id": "paper.wallet.create.certificate.confirmation.dialog.contentPart2", - "start": { - "column": 12, - "line": 22 - } - }, - { - "defaultMessage": "!!!Back", - "description": "\"Cancel\" button label for the paper wallet certificate cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/ConfirmationDialog.tsx", - "id": "paper.wallet.create.certificate.confirmation.dialog.button.backLabel", - "start": { - "column": 21, - "line": 29 - } - }, - { - "defaultMessage": "!!!Abort", - "description": "\"Abort\" button label for the paper wallet certificate cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/ConfirmationDialog.tsx", - "id": "paper.wallet.create.certificate.confirmation.dialog.button.abortLabel", - "start": { - "column": 22, - "line": 35 - } - } - ], - "path": "source/renderer/app/components/wallet/paper-wallet-certificate/ConfirmationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Create a paper wallet certificate", - "description": "Headline for the \"Paper wallet create certificate instructions dialog\".", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.headline", - "start": { - "column": 12, - "line": 21 - } - }, - { - "defaultMessage": "!!!Create a paper wallet certificate to store funds offline.", - "description": "Subtitle for the \"Paper wallet create certificate instructions dialog\".", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.subtitle", - "start": { - "column": 12, - "line": 27 - } - }, - { - "defaultMessage": "!!!The paper wallet certificate will not be associated with any of your existing wallets. A new, empty wallet will be created.", - "description": "subtitle2 for the \"Paper wallet create certificate instructions dialog\".", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.subtitle2", - "start": { - "column": 13, - "line": 34 - } - }, - { - "defaultMessage": "!!!Instructions", - "description": "Instructions list label for the \"Paper wallet create certificate instructions dialog\".", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.instructionsList.label", - "start": { - "column": 25, - "line": 41 - } - }, - { - "defaultMessage": "!!!Your printed certificate will include your paper wallet recovery phrase\n of {paperWalletRecoveryPhraseWordCount} words. Note that your paper wallet recovery phrase is\n different to the {walletRecoveryPhraseWordCount}-word recovery phrases used to restore your\n regular Daedalus wallet.", - "description": "Wallet certificate create instructions dialog definition 1.", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.instructionsList.definition1", - "start": { - "column": 31, - "line": 48 - } - }, - { - "defaultMessage": "!!!For security reasons, the last {paperWalletWrittenWordsCount} words of your\n paper wallet recovery phrase will not be printed on the paper wallet certificate itself. You\n will need to write them on your certificate by hand in a moment.", - "description": "Wallet certificate create instructions dialog definition 2.", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.instructionsList.definition2", - "start": { - "column": 31, - "line": 57 - } - }, - { - "defaultMessage": "!!!Use the address on your certificate to send funds to your paper wallet.", - "description": "Wallet certificate create instructions dialog definition 3.", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.instructionsList.definition3", - "start": { - "column": 31, - "line": 65 - } - }, - { - "defaultMessage": "!!!Your paper wallet will be offline so will not be held in Daedalus.\n To check the balance of the wallet, input the address on the certificate into", - "description": "Wallet certificate create instructions dialog definition 4.", - "end": { - "column": 3, - "line": 78 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.instructionsList.definition4", - "start": { - "column": 31, - "line": 72 - } - }, - { - "defaultMessage": "!!!Store your certificate containing your paper wallet recovery phrase in a safe place.", - "description": "Wallet certificate create instructions dialog definition 5.", - "end": { - "column": 3, - "line": 85 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.instructionsList.definition5", - "start": { - "column": 31, - "line": 79 - } - }, - { - "defaultMessage": "!!!When you click “Save PDF file for printing” you will be prompted\n to choose a location on your computer where the PDF file will be saved. After that\n open the saved PDF file and print it.", - "description": "Wallet certificate create instructions dialog - printing instructions.", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.printingInstructions", - "start": { - "column": 24, - "line": 86 - } - }, - { - "defaultMessage": "!!!Cardano Explorer", - "description": "Wallet certificate create instructions dialog \"Cardano Explorer\" label", - "end": { - "column": 3, - "line": 100 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.cardanoExplorer", - "start": { - "column": 19, - "line": 95 - } - }, - { - "defaultMessage": "!!!Save PDF file for printing", - "description": "\"Wallet certificate create instructions dialog\" print button label.", - "end": { - "column": 3, - "line": 106 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.tsx", - "id": "paper.wallet.create.certificate.instructions.dialog.button.printLabel", - "start": { - "column": 20, - "line": 101 - } - } - ], - "path": "source/renderer/app/components/wallet/paper-wallet-certificate/InstructionsDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Verify printed certificate", - "description": "Headline for the \"Paper wallet create certificate print dialog\".", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.tsx", - "id": "paper.wallet.create.certificate.print.dialog.headline", - "start": { - "column": 12, - "line": 17 - } - }, - { - "defaultMessage": "!!!Check your paper wallet certificate and make sure everything\n is readable and correctly printed. You can test this by scanning the QR code with\n a QR scanner application on your mobile phone.", - "description": "\"Paper wallet create certificate print dialog\" subtitle.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.tsx", - "id": "paper.wallet.create.certificate.print.dialog.subtitle", - "start": { - "column": 12, - "line": 23 - } - }, - { - "defaultMessage": "!!!Your certificate is not yet complete and does not contain all\n the data needed to restore your paper wallet. In the next step, you will need to\n write down an additional {paperWalletWrittenWordsCount} words to your paper wallet recovery phrase.", - "description": "\"Paper wallet create certificate print dialog\" info.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.tsx", - "id": "paper.wallet.create.certificate.print.dialog.info", - "start": { - "column": 8, - "line": 30 - } - }, - { - "defaultMessage": "!!!Yes, the paper wallet certificate printed successfully.", - "description": "\"Paper wallet create certificate print dialog\" certificate printed confirmation.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.tsx", - "id": "paper.wallet.create.certificate.print.dialog.certificatePrintedConfirmation", - "start": { - "column": 39, - "line": 37 - } - }, - { - "defaultMessage": "!!!Yes, first {paperWalletPrintedWordsCount} words of the paper wallet recovery phrase are readable.", - "description": "\"Paper wallet create certificate print dialog\" certificate readable confirmation.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.tsx", - "id": "paper.wallet.create.certificate.print.dialog.certificateReadableConfirmation", - "start": { - "column": 40, - "line": 45 - } - }, - { - "defaultMessage": "!!!Yes, the QR code is scannable.", - "description": "\"Paper wallet create certificate print dialog\" QR scannable confirmation.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.tsx", - "id": "paper.wallet.create.certificate.print.dialog.qrScannableConfirmation", - "start": { - "column": 32, - "line": 53 - } - } - ], - "path": "source/renderer/app/components/wallet/paper-wallet-certificate/PrintDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Complete your certificate", - "description": "Headline for the \"Paper wallet create certificate securing password dialog\".", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/SecuringPasswordDialog.tsx", - "id": "paper.wallet.create.certificate.securingPassword.dialog.headline", - "start": { - "column": 12, - "line": 16 - } - }, - { - "defaultMessage": "!!!To complete your paper wallet certificate you will need to\n write the remaining {paperWalletWrittenWordsCount} words of your paper wallet recovery\n phrase on your certificate.", - "description": "\"Paper wallet create certificate securing password dialog\" first info label.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/SecuringPasswordDialog.tsx", - "id": "paper.wallet.create.certificate.securingPassword.dialog.infoLabel1", - "start": { - "column": 14, - "line": 22 - } - }, - { - "defaultMessage": "!!!The password can optionally be written on the certificate or kept securely in other location. Here is the placeholder on the certificate intended for your password.", - "description": "You may write the remaining words here:", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/SecuringPasswordDialog.tsx", - "id": "paper.wallet.create.certificate.securingPassword.dialog.infoLabel2", - "start": { - "column": 14, - "line": 30 - } - }, - { - "defaultMessage": "!!!I have written the remaining {paperWalletWrittenWordsCount} words on the certificate.", - "description": "\"Paper wallet create certificate securing password dialog\" secure password confirmation.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/SecuringPasswordDialog.tsx", - "id": "paper.wallet.create.certificate.securingPassword.dialog.securingPasswordConfirmation", - "start": { - "column": 32, - "line": 36 - } - } - ], - "path": "source/renderer/app/components/wallet/paper-wallet-certificate/SecuringPasswordDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Verify certificate", - "description": "Headline for the \"Paper wallet create certificate verification dialog\".", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.headline", - "start": { - "column": 12, - "line": 25 - } - }, - { - "defaultMessage": "!!!Enter your paper wallet recovery phrase to verify your paper wallet certificate.", - "description": "\"Paper wallet create certificate verification dialog\" subtitle.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.subtitle", - "start": { - "column": 12, - "line": 31 - } - }, - { - "defaultMessage": "!!!Make sure you enter all {fullPhraseWordCount} words for the paper wallet recovery phrase,\n first {printedWordCount} words printed on the certificate followed by the {writtenWordCount} words you wrote by hand.", - "description": "\"Paper wallet create certificate verification dialog\" subtitle.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.instructions", - "start": { - "column": 16, - "line": 38 - } - }, - { - "defaultMessage": "!!!Paper wallet recovery phrase", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase label.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.label", - "start": { - "column": 23, - "line": 45 - } - }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase hint.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.hint", - "start": { - "column": 22, - "line": 52 - } - }, - { - "defaultMessage": "!!!No results", - "description": "\"Paper wallet create certificate verification dialog\" recovery phrase no results label.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.recoveryPhrase.noResults", - "start": { - "column": 27, - "line": 59 - } - }, - { - "defaultMessage": "!!!Clear", - "description": "\"Paper wallet create certificate verification dialog\" button clear label.", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.button.clearLabel", - "start": { - "column": 20, - "line": 66 - } - }, - { - "defaultMessage": "!!!I understand that the paper wallet I create will not be stored in Daedalus.", - "description": "\"Paper wallet create certificate verification dialog\" storing understandance confirmation.", - "end": { - "column": 3, - "line": 79 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.storingUnderstandanceConfirmationLabel", - "start": { - "column": 30, - "line": 72 - } - }, - { - "defaultMessage": "!!!I understand that my paper wallet can be recovered only by using my paper wallet certificate.", - "description": "\"Paper wallet create certificate verification dialog\" recovering understandance confirmation.", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.tsx", - "id": "paper.wallet.create.certificate.verification.dialog.recoveringUnderstandanceConfirmationLabel", - "start": { - "column": 33, - "line": 80 - } - } - ], - "path": "source/renderer/app/components/wallet/paper-wallet-certificate/VerificationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Available wallet addresses", - "description": "Instructions Title on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/receive/AddressActions.tsx", - "id": "wallet.receive.page.instructions.instructionsTitle", - "start": { - "column": 21, - "line": 15 - } - }, - { - "defaultMessage": "!!!Share this wallet address to receive payments. To protect your privacy, new addresses are generated automatically once you use them.", - "description": "Instructions Description on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/wallet/receive/AddressActions.tsx", - "id": "wallet.receive.page.instructions.instructionsDescription", - "start": { - "column": 27, - "line": 20 - } - }, - { - "defaultMessage": "!!!Addresses", - "description": "Addresses Title on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/receive/AddressActions.tsx", - "id": "wallet.receive.page.addresses.addressesTitle", - "start": { - "column": 18, - "line": 26 - } - }, - { - "defaultMessage": "!!!Show used", - "description": "Label for \"show used\" wallet addresses link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/receive/AddressActions.tsx", - "id": "wallet.receive.page.showUsedLabel", - "start": { - "column": 17, - "line": 31 - } - }, - { - "defaultMessage": "!!!Share", - "description": "Label for \"Share\" link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/wallet/receive/AddressActions.tsx", - "id": "wallet.receive.page.shareAddressLabel", - "start": { - "column": 21, - "line": 37 - } - }, - { - "defaultMessage": "!!!Copy address", - "description": "Label for \"Copy address\" link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/wallet/receive/AddressActions.tsx", - "id": "wallet.receive.page.copyAddressLabel", - "start": { - "column": 20, - "line": 42 - } - } - ], - "path": "source/renderer/app/components/wallet/receive/AddressActions.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!PDF note", - "description": "placeholder on the wallet \"Share Address\" dialog", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.inputLabel", - "start": { - "column": 14, - "line": 32 - } - }, - { - "defaultMessage": "!!!Add a note to the sender", - "description": "inputPlaceholder on the wallet \"Share Address\" dialog", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.inputPlaceholder", - "start": { - "column": 20, - "line": 37 - } - }, - { - "defaultMessage": "!!!Save QR code image", - "description": "saveQRCodeImage on the wallet \"Share Address\" dialog", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.saveQRCodeImage", - "start": { - "column": 19, - "line": 42 - } - }, - { - "defaultMessage": "!!!Download as PDF", - "description": "downloadPDFButton on the wallet \"Share Address\" dialog", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.downloadPDFButton", - "start": { - "column": 21, - "line": 47 - } - }, - { - "defaultMessage": "!!!Share wallet address", - "description": "dialogTitle on the wallet \"Share Address\" dialog", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.dialogTitle", - "start": { - "column": 15, - "line": 52 - } - }, - { - "defaultMessage": "!!!Copy address", - "description": "Label for \"Copy address\" link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.copyAddressLabel", - "start": { - "column": 20, - "line": 57 - } - }, - { - "defaultMessage": "!!!Receiving address path", - "description": "Tooltip for the receiving address path", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.spendingPathTooltip", - "start": { - "column": 23, - "line": 62 - } - }, - { - "defaultMessage": "!!!Rewards address path", - "description": "Tooltip for the rewards address path", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.stakingPathTooltip", - "start": { - "column": 22, - "line": 67 - } - }, - { - "defaultMessage": "!!!Submit a request to IOHK Support", - "description": "Support request button label", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.supportRequestButtonLabel", - "start": { - "column": 29, - "line": 72 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/requests/new/", - "description": "Support request link URL", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.supportRequestLinkUrl", - "start": { - "column": 25, - "line": 77 - } - }, - { - "defaultMessage": "!!!Yes, I am sure I have compared the address displayed in Daedalus with the address displayed on the {deviceType} device by comparing the beginning and ending of the address.", - "description": "Invalid address confirmation checkbox label", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.invalidAddressConfirmationLabel", - "start": { - "column": 35, - "line": 82 - } - }, - { - "defaultMessage": "!!!Is the address you have verified correct?", - "description": "Verification options section label", - "end": { - "column": 3, - "line": 92 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.verificationCheckOptionsLabel", - "start": { - "column": 33, - "line": 88 - } - }, - { - "defaultMessage": "!!!Yes", - "description": "Verification option \"Valid\" label", - "end": { - "column": 3, - "line": 97 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.verificationCheckOptionValid", - "start": { - "column": 32, - "line": 93 - } - }, - { - "defaultMessage": "!!!No, I am sure that address displayed in Daedalus is different from the address displayed on my {deviceType} device", - "description": "Verification option \"Invalid\" label", - "end": { - "column": 3, - "line": 103 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.verificationCheckOptionInvalid", - "start": { - "column": 34, - "line": 98 - } - }, - { - "defaultMessage": "!!!No, reverify", - "description": "Verification option \"Reverify\" label", - "end": { - "column": 3, - "line": 108 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.verificationCheckOptionReverify", - "start": { - "column": 35, - "line": 104 - } - }, - { - "defaultMessage": "!!!Daedalus verified the address", - "description": "Daedalus verification status check label", - "end": { - "column": 3, - "line": 113 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.softwareCheckLabel", - "start": { - "column": 22, - "line": 109 - } - }, - { - "defaultMessage": "!!!You have verified the address", - "description": "User verification status check label", - "end": { - "column": 3, - "line": 118 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.confirmationCheckLabel", - "start": { - "column": 26, - "line": 114 - } - }, - { - "defaultMessage": "!!!Please compare the address displayed here on the screen with the address displayed on the {deviceType} device by comparing at least the first 5 characters at the start of the address after the \"addr\" part and at least 5 characters at the end of the address.", - "description": "Address verification instructions", - "end": { - "column": 3, - "line": 124 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.addressVerificationInstructions", - "start": { - "column": 35, - "line": 119 - } - }, - { - "defaultMessage": "!!!Warning, your copy of Daedalus may be hacked!", - "description": "Invalid address \"Warning\" title", - "end": { - "column": 3, - "line": 129 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.invalidAddressWarningTitle", - "start": { - "column": 30, - "line": 125 - } - }, - { - "defaultMessage": "!!!You have manually compared the address shown in Daedalus with the address shown on the hardware wallet device and reported that they are different. If this is the case, please contact support and make sure you download and attach logs.", - "description": "Invalid address \"Warning\" description", - "end": { - "column": 3, - "line": 135 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.tsx", - "id": "wallet.receive.dialog.invalidAddressWarningDescription", - "start": { - "column": 36, - "line": 130 - } - } - ], - "path": "source/renderer/app/components/wallet/receive/WalletReceiveDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Your wallet address", - "description": "Label for wallet address on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.walletAddressLabel", - "start": { - "column": 22, - "line": 26 - } - }, - { - "defaultMessage": "!!!Share this wallet address to receive payments. To protect your privacy, always use a new address when requesting funds. To generate a new address please enter your spending password and press the ‘Generate a new address’ button.", - "description": "Wallet receive payments instructions on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.walletReceiveInstructions", - "start": { - "column": 29, - "line": 31 - } - }, - { - "defaultMessage": "!!!Generate a new address", - "description": "Label for \"Generate new address\" button on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.generateNewAddressButtonLabel", - "start": { - "column": 33, - "line": 38 - } - }, - { - "defaultMessage": "!!!Receiving addresses", - "description": "\"Generated addresses\" section title on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.receivingAddressesSectionTitle", - "start": { - "column": 34, - "line": 44 - } - }, - { - "defaultMessage": "!!!Show used", - "description": "Label for \"show used\" wallet addresses link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.showUsedLabel", - "start": { - "column": 17, - "line": 50 - } - }, - { - "defaultMessage": "!!!Password", - "description": "Placeholder for \"spending password\" on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.spendingPasswordPlaceholder", - "start": { - "column": 31, - "line": 56 - } - }, - { - "defaultMessage": "!!!Copy address", - "description": "Label for \"Copy address\" link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.tsx", - "id": "wallet.receive.page.copyAddressLabel", - "start": { - "column": 20, - "line": 62 - } - } - ], - "path": "source/renderer/app/components/wallet/receive/WalletReceiveRandom.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Available wallet addresses", - "description": "Instructions Title on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveSequential.tsx", - "id": "wallet.receive.page.instructions.instructionsTitle", - "start": { - "column": 21, - "line": 14 - } - }, - { - "defaultMessage": "!!!Share any of these wallet addresses to receive payments in ada or a native Cardano token.", - "description": "Instructions Description on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveSequential.tsx", - "id": "wallet.receive.page.instructions.instructionsDescription", - "start": { - "column": 27, - "line": 19 - } - }, - { - "defaultMessage": "!!!Privacy warning: Please note that all of your receiving addresses include your stake key. When you share a receiving address, the recipient can search the blockchain using your stake key to locate all addresses associated with your wallet, and also discover your wallet balance and transaction history.", - "description": "Privacy warning on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveSequential.tsx", - "id": "wallet.receive.page.instructions.privacyWarning", - "start": { - "column": 18, - "line": 25 - } - }, - { - "defaultMessage": "!!!Receiving addresses", - "description": "Addresses Title on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveSequential.tsx", - "id": "wallet.receive.page.addresses.addressesTitle", - "start": { - "column": 18, - "line": 31 - } - }, - { - "defaultMessage": "!!!Show used", - "description": "Label for \"show used\" wallet addresses link on the wallet \"Receive page\"", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/wallet/receive/WalletReceiveSequential.tsx", - "id": "wallet.receive.page.showUsedLabel", - "start": { - "column": 17, - "line": 36 - } - } - ], - "path": "source/renderer/app/components/wallet/receive/WalletReceiveSequential.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Title", - "description": "Label for the \"Title\" text input in the wallet send form.", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.title.label", - "start": { - "column": 14, - "line": 4 - } - }, - { - "defaultMessage": "!!!E.g: Money for Frank", - "description": "Hint inside the \"Receiver\" text input in the wallet send form.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.title.hint", - "start": { - "column": 13, - "line": 9 - } - }, - { - "defaultMessage": "!!!Receiver", - "description": "Label for the \"Receiver\" text input in the wallet send form.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.receiver.label", - "start": { - "column": 17, - "line": 15 - } - }, - { - "defaultMessage": "!!!Paste an address", - "description": "Hint inside the \"Receiver\" text input in the wallet send form.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.receiver.placeholder", - "start": { - "column": 16, - "line": 20 - } - }, - { - "defaultMessage": "!!!Token", - "description": "Label for the \"Token\" number input in the wallet send form.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.asset.label", - "start": { - "column": 14, - "line": 26 - } - }, - { - "defaultMessage": "!!!Ada", - "description": "Label for the \"Ada\" input in the wallet send form.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.asset.adaLabel", - "start": { - "column": 18, - "line": 31 - } - }, - { - "defaultMessage": "!!!Remove", - "description": "Label for the \"Remove\" button in the wallet send form.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.button.removeLabel", - "start": { - "column": 15, - "line": 36 - } - }, - { - "defaultMessage": "!!!Clear", - "description": "Label for the \"Clear\" button in the wallet send form.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.button.clearLabel", - "start": { - "column": 14, - "line": 41 - } - }, - { - "defaultMessage": "!!!This receiver address belongs to the same wallet from which you are sending funds. If you proceed with this transaction, the transferred funds will remain in this wallet, and you will incur transaction fees, as outlined in Estimated fees.", - "description": "Label for the same wallet tooltip in the wallet send form.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.sameWalletLabel", - "start": { - "column": 19, - "line": 46 - } - }, - { - "defaultMessage": "!!!+ Add a token", - "description": "Label for the \"+ Add a token\" button in the wallet send form.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.button.addAssetButtonLabel", - "start": { - "column": 23, - "line": 52 - } - }, - { - "defaultMessage": "!!!Estimated fees", - "description": "Label for the \"Estimated fees\" number input in the wallet send form.", - "end": { - "column": 3, - "line": 63 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.estimatedFee.label", - "start": { - "column": 21, - "line": 58 - } - }, - { - "defaultMessage": "!!!of", - "description": "Label for the \"of\" max ADA value in the wallet send form.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.of.label", - "start": { - "column": 11, - "line": 64 - } - }, - { - "defaultMessage": "!!!a minimum of {minimumAda} ADA required", - "description": "Label for the min ADA required value in the wallet send form.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.minAdaRequired", - "start": { - "column": 18, - "line": 69 - } - }, - { - "defaultMessage": "!!!This transaction requires a minimum of {minimumAda} ADA to be sent.", - "description": "Tooltip for the min ADA required value in the wallet send form.", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.minAdaRequiredWithAssetTooltip", - "start": { - "column": 34, - "line": 75 - } - }, - { - "defaultMessage": "!!!A minimum of {minimumAda} ADA needs to be sent with every transaction.", - "description": "Tooltip for the min ADA required value in the wallet send form.", - "end": { - "column": 3, - "line": 88 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.minAdaRequiredWithNoAssetTooltip", - "start": { - "column": 36, - "line": 82 - } - }, - { - "defaultMessage": "!!!Description", - "description": "Label for the \"description\" text area in the wallet send form.", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.description.label", - "start": { - "column": 20, - "line": 89 - } - }, - { - "defaultMessage": "!!!You can add a message if you want", - "description": "Hint in the \"description\" text area in the wallet send form.", - "end": { - "column": 3, - "line": 99 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.description.hint", - "start": { - "column": 19, - "line": 95 - } - }, - { - "defaultMessage": "!!!Reset", - "description": "Label for the reset button on the wallet send form.", - "end": { - "column": 3, - "line": 104 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.reset", - "start": { - "column": 20, - "line": 100 - } - }, - { - "defaultMessage": "!!!Send", - "description": "Label for the send button on the wallet send form.", - "end": { - "column": 3, - "line": 109 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.send", - "start": { - "column": 19, - "line": 105 - } - }, - { - "defaultMessage": "!!!Please enter a valid amount.", - "description": "Error message shown when invalid amount was entered.", - "end": { - "column": 3, - "line": 114 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.errors.invalidAmount", - "start": { - "column": 17, - "line": 110 - } - }, - { - "defaultMessage": "!!!Please enter a title with at least 3 characters.", - "description": "Error message shown when invalid transaction title was entered.", - "end": { - "column": 3, - "line": 120 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.errors.invalidTitle", - "start": { - "column": 16, - "line": 115 - } - }, - { - "defaultMessage": "!!!The balance and transaction history of this wallet is being synced with the blockchain.", - "description": "Syncing transactions message shown during async wallet restore in the wallet send form.", - "end": { - "column": 3, - "line": 127 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.syncingTransactionsMessage", - "start": { - "column": 30, - "line": 121 - } - }, - { - "defaultMessage": "!!!Calculating fees", - "description": "Label for the \"Calculating fees\" message for amount input field.", - "end": { - "column": 3, - "line": 133 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.calculatingFeesLabel", - "start": { - "column": 24, - "line": 128 - } - }, - { - "defaultMessage": "!!!UPDATE", - "description": "Label for the \"UPDATE\" button responsible to set minimum amount required for transaction .", - "end": { - "column": 3, - "line": 139 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.asset.updateAdaAmountButton", - "start": { - "column": 25, - "line": 134 - } - }, - { - "defaultMessage": "!!!to the minimum of {minimumAda} ADA required", - "description": "Description for the \"UPDATE\" button when ADA amount is less than required", - "end": { - "column": 3, - "line": 145 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.updateAdaAmountDescription", - "start": { - "column": 30, - "line": 140 - } - }, - { - "defaultMessage": "!!!Note: the ada field was automatically updated because this transaction requires a minimum of {minimumAda} ADA.", - "description": "Minimum amount update notice", - "end": { - "column": 3, - "line": 151 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.minimumAmountNote", - "start": { - "column": 23, - "line": 146 - } - }, - { - "defaultMessage": "!!!Note: the ada field was automatically updated to {adaAmount} ADA because now it fulfills the minimum amount of {minimumAda} ADA for the transaction.", - "description": "Restored ada amount to original user input", - "end": { - "column": 3, - "line": 157 - }, - "file": "source/renderer/app/components/wallet/send-form/messages.ts", - "id": "wallet.send.form.restoredAdaAmount", - "start": { - "column": 21, - "line": 152 - } - } - ], - "path": "source/renderer/app/components/wallet/send-form/messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Set a password for {walletName} wallet", - "description": "Title for the \"Change wallet password\" dialog when there is no password set.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.title.setPassword", - "start": { - "column": 26, - "line": 26 - } - }, - { - "defaultMessage": "!!!Change password", - "description": "Title for the \"Change wallet password\" dialog when there is already password set.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.title.changePassword", - "start": { - "column": 29, - "line": 32 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Label for the \"Spending password\" input in the change wallet password dialog.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.spendingPasswordLabel", - "start": { - "column": 25, - "line": 38 - } - }, - { - "defaultMessage": "!!!Current password", - "description": "Label for the \"Current password\" input in the change wallet password dialog.", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.currentPasswordLabel", - "start": { - "column": 24, - "line": 44 - } - }, - { - "defaultMessage": "!!!New password", - "description": "Label for the \"New password\" input in the change wallet password dialog.", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.newPasswordLabel", - "start": { - "column": 20, - "line": 50 - } - }, - { - "defaultMessage": "!!!Repeat password", - "description": "Label for the \"Repeat password\" input in the change wallet password dialog.", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.repeatPasswordLabel", - "start": { - "column": 23, - "line": 56 - } - }, - { - "defaultMessage": "!!!Type current password", - "description": "Placeholder for the \"Current password\" inputs in the change wallet password dialog.", - "end": { - "column": 3, - "line": 67 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.currentPasswordFieldPlaceholder", - "start": { - "column": 35, - "line": 62 - } - }, - { - "defaultMessage": "!!!Type new password", - "description": "Placeholder for the \"New password\" inputs in the change wallet password dialog.", - "end": { - "column": 3, - "line": 73 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.newPasswordFieldPlaceholder", - "start": { - "column": 31, - "line": 68 - } - }, - { - "defaultMessage": "!!!Repeat new password", - "description": "Placeholder for the \"Repeat password\" inputs in the change wallet password dialog.", - "end": { - "column": 3, - "line": 79 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.settings.changePassword.dialog.repeatPasswordFieldPlaceholder", - "start": { - "column": 34, - "line": 74 - } - }, - { - "defaultMessage": "We recommend using a password manager app to manage and store your spending password. Generate a unique password using a password manager and paste it here. Passwords should never be reused.", - "description": "Tooltip for the password input in the wallet dialog.", - "end": { - "column": 3, - "line": 85 - }, - "file": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.tsx", - "id": "wallet.dialog.passwordTooltip", - "start": { - "column": 19, - "line": 80 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/ChangeSpendingPasswordDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delegate", - "description": "Label for the delegate button on wallet settings", - "end": { - "column": 3, - "line": 11 - }, - "file": "source/renderer/app/components/wallet/settings/DelegateWalletButton.tsx", - "id": "wallet.settings.delegateWalletButtonLabel", - "start": { - "column": 9, - "line": 7 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/DelegateWalletButton.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delete wallet", - "description": "Delete wallet header on the wallet settings page.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/wallet/settings/DeleteWallet.tsx", - "id": "wallet.settings.deleteWallet.header", - "start": { - "column": 22, - "line": 13 - } - }, - { - "defaultMessage": "!!!Once you delete this wallet it will be removed from the Daedalus interface and you will lose access to any remaining funds in the wallet. The only way to regain access after deletion is by restoring it using your wallet recovery phrase.", - "description": "Delete wallet warning explaining the consequences.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/settings/DeleteWallet.tsx", - "id": "wallet.settings.deleteWallet.warning1", - "start": { - "column": 24, - "line": 18 - } - }, - { - "defaultMessage": "!!!You may wish to verify your recovery phrase before deletion to ensure that you can restore this wallet in the future, if desired.", - "description": "Delete wallet warning explaining the consequences.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/settings/DeleteWallet.tsx", - "id": "wallet.settings.deleteWallet.warning2", - "start": { - "column": 24, - "line": 24 - } - }, - { - "defaultMessage": "!!!Delete wallet", - "description": "Label for the delete button on wallet settings", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/settings/DeleteWallet.tsx", - "id": "wallet.settings.deleteWalletButtonLabel", - "start": { - "column": 16, - "line": 30 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/DeleteWallet.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Export Wallet", - "description": "headline for \"export wallet to file\" dialog.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/wallet/settings/ExportWalletToFileDialog.tsx", - "id": "wallet.settings.exportToFile.dialog.headline", - "start": { - "column": 12, - "line": 21 - } - }, - { - "defaultMessage": "!!!You are exporting {walletName} to a file.", - "description": "headline for \"export wallet to file\" dialog.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/wallet/settings/ExportWalletToFileDialog.tsx", - "id": "wallet.settings.exportToFile.dialog.introduction", - "start": { - "column": 16, - "line": 26 - } - }, - { - "defaultMessage": "!!!Export", - "description": "Label for export wallet to file submit button.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/settings/ExportWalletToFileDialog.tsx", - "id": "wallet.settings.exportToFile.dialog.submit.label", - "start": { - "column": 21, - "line": 32 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/ExportWalletToFileDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!ICO public key", - "description": "Wallet public key label.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyBox.tsx", - "id": "wallet.settings.icoPublicKey", - "start": { - "column": 13, - "line": 12 - } - }, - { - "defaultMessage": "!!!Your wallet's ICO public key enables participation in the initial coin offering presales.", - "description": "ICO public key header on the wallet settings page.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyBox.tsx", - "id": "wallet.settings.icoPublicKey.description", - "start": { - "column": 24, - "line": 17 - } - }, - { - "defaultMessage": "!!!Click the icon on the right to view your ICO public key.", - "description": "ICO public key show instruction.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyBox.tsx", - "id": "wallet.settings.icoPublicKeyShowInstruction", - "start": { - "column": 28, - "line": 23 - } - }, - { - "defaultMessage": "!!!Show QR code", - "description": "Show QR code tooltip.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyBox.tsx", - "id": "wallet.settings.showQRCode", - "start": { - "column": 14, - "line": 29 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/ICOPublicKeyBox.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Reveal ICO public key", - "description": "Title \"Choose a stake pool\" on the reveal Wallet Id dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyDialog.tsx", - "id": "wallet.settings.icoPublicKeyDialog.title", - "start": { - "column": 9, - "line": 18 - } - }, - { - "defaultMessage": "!!!Please enter your spending password to reveal your ICO’s public key.", - "description": "Description on the reveal Wallet Id dialog.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyDialog.tsx", - "id": "wallet.settings.icoPublicKeyDialog.description", - "start": { - "column": 15, - "line": 23 - } - }, - { - "defaultMessage": "!!!Reveal ICO public key", - "description": "Description on the reveal ICO Id dialog.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyDialog.tsx", - "id": "wallet.settings.icoPublicKeyDialog.button", - "start": { - "column": 15, - "line": 29 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/ICOPublicKeyDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!ICO Public Key", - "description": "Title for the \"ICO Public Key QR Code\" dialog.", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyQRCodeDialog.messages.ts", - "id": "wallet.settings.icoPublicKey", - "start": { - "column": 15, - "line": 5 - } - }, - { - "defaultMessage": "!!!Copy ICO public key", - "description": "Copy ICO public key label.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyQRCodeDialog.messages.ts", - "id": "wallet.settings.copyICOPublicKey", - "start": { - "column": 22, - "line": 10 - } - }, - { - "defaultMessage": "!!!Derivation path", - "description": "Tooltip for the derivation path", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/settings/ICOPublicKeyQRCodeDialog.messages.ts", - "id": "wallet.settings.dialog.derivationPathTooltip", - "start": { - "column": 25, - "line": 15 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/ICOPublicKeyQRCodeDialog.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Set a password", - "description": "Label for the \"Set a password\" button in the set wallet password dialog.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/wallet/settings/SetWalletPassword.tsx", - "id": "wallet.settings.setWalletPassword.dialog.setPasswordButton", - "start": { - "column": 21, - "line": 11 - } - }, - { - "defaultMessage": "!!!To keep your wallet secure and start using it in Daedalus, you need to set a spending password.", - "description": "Message for the \"Set a password\" button in the set wallet password dialog.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/settings/SetWalletPassword.tsx", - "id": "wallet.settings.setWalletPassword.dialog.setPasswordMessage", - "start": { - "column": 22, - "line": 17 - } - }, - { - "defaultMessage": "!!!Your wallet is not protected with a password", - "description": "Title for the \"Set wallet password\" dialog when there is not password set.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/settings/SetWalletPassword.tsx", - "id": "wallet.settings.setWalletPassword.dialog.setPasswordTitle", - "start": { - "column": 20, - "line": 24 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/SetWalletPassword.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Undelegate", - "description": "Label for the undelegate button on wallet settings", - "end": { - "column": 3, - "line": 11 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletButton.tsx", - "id": "wallet.settings.undelegateWalletButtonLabel", - "start": { - "column": 9, - "line": 7 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/UndelegateWalletButton.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Undelegate", - "description": "Title for the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.title", - "start": { - "column": 9, - "line": 26 - } - }, - { - "defaultMessage": "!!!Undelegate", - "description": "Label for the \"Undelegate\" button in the undelegate wallet dialog.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.confirmButtonLabel", - "start": { - "column": 22, - "line": 31 - } - }, - { - "defaultMessage": "!!!

The stake from your wallet {walletName} is currently delegated to the [{stakePoolTicker}] {stakePoolName} stake pool.

Do you want to undelegate your stake and stop earning rewards?

", - "description": "Description of current delegation of wallet in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.descriptionWithTicker", - "start": { - "column": 25, - "line": 37 - } - }, - { - "defaultMessage": "!!!

The stake from your wallet {walletName} is currently delegated to the {stakePoolTicker} stake pool.

Do you want to undelegate your stake and stop earning rewards?

", - "description": "Description of current delegation of wallet in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.descriptionWithUnknownTicker", - "start": { - "column": 32, - "line": 44 - } - }, - { - "defaultMessage": "!!!unknown", - "description": "unknown stake pool label in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.unknownStakePoolLabel", - "start": { - "column": 25, - "line": 51 - } - }, - { - "defaultMessage": "!!!I understand that I am not supporting the Cardano network when my stake is undelegated.", - "description": "Notice to confirm if the user understands unsupporting Cardano network after undelegation", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.confirmUnsupportNotice", - "start": { - "column": 26, - "line": 56 - } - }, - { - "defaultMessage": "!!!I understand that I will not be eligible to earn rewards when my stake is undelegated.", - "description": "Notice to confirm if the user understands non-earning rewards after undelegation", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.confirmIneligibleNotice", - "start": { - "column": 27, - "line": 63 - } - }, - { - "defaultMessage": "!!!Fees", - "description": "Fees label in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.feesLabel", - "start": { - "column": 13, - "line": 70 - } - }, - { - "defaultMessage": "!!!Deposits reclaimed", - "description": "Deposits reclaimed label in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 79 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.depositLabel", - "start": { - "column": 16, - "line": 75 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Spending password label in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 84 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.spendingPasswordLabel", - "start": { - "column": 25, - "line": 80 - } - }, - { - "defaultMessage": "!!!Type your spending password here", - "description": "Spending password placeholder in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 90 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.spendingPasswordPlaceholder", - "start": { - "column": 31, - "line": 85 - } - }, - { - "defaultMessage": "!!!Incorrect spending password.", - "description": "Label for password error in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.passwordError", - "start": { - "column": 24, - "line": 91 - } - }, - { - "defaultMessage": "!!!Calculating fees", - "description": "\"Calculating fees\" message in the \"Undelegate wallet\" dialog.", - "end": { - "column": 3, - "line": 101 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.tsx", - "id": "wallet.settings.undelegate.dialog.calculatingFees", - "start": { - "column": 19, - "line": 96 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/UndelegateWalletConfirmationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet undelegated", - "description": "Title for the \"Undelegate Result\" dialog.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletSuccessDialog.tsx", - "id": "wallet.settings.undelegate.result.dialog.title", - "start": { - "column": 9, - "line": 15 - } - }, - { - "defaultMessage": "!!!The stake from your wallet {walletName} is no longer delegated and you will soon stop earning rewards for this wallet.", - "description": "Description 1 for the \"Undelegate Result\" dialog.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletSuccessDialog.tsx", - "id": "wallet.settings.undelegate.result.dialog.description1", - "start": { - "column": 16, - "line": 20 - } - }, - { - "defaultMessage": "!!!Your new delegation preferences are now posted on the blockchain and will take effect after both the current and next Cardano epochs have completed in {timeUntilNextEpochStart}. During this time, your previous delegation preferences are still active.", - "description": "Description 2 for the \"Undelegate Result\" dialog.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/wallet/settings/UndelegateWalletSuccessDialog.tsx", - "id": "wallet.settings.undelegate.result.dialog.description2", - "start": { - "column": 16, - "line": 26 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/UndelegateWalletSuccessDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Unpair wallet", - "description": "Unpair wallet header on the wallet settings page.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/settings/UnpairWallet.tsx", - "id": "wallet.settings.unpairWallet.header", - "start": { - "column": 22, - "line": 18 - } - }, - { - "defaultMessage": "!!!Once you unpair this wallet it will be removed from the Daedalus interface and you will lose access to any remaining funds in the wallet. The only way to regain access after deletion is by restoring it using your wallet recovery phrase.", - "description": "Unpair wallet warning explaining the consequences.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/settings/UnpairWallet.tsx", - "id": "wallet.settings.unpairWallet.warning", - "start": { - "column": 23, - "line": 23 - } - }, - { - "defaultMessage": "!!!Unpair wallet", - "description": "Label for the unpair button on wallet settings", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/settings/UnpairWallet.tsx", - "id": "wallet.settings.unpairWalletButtonLabel", - "start": { - "column": 16, - "line": 29 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/UnpairWallet.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet public key", - "description": "Wallet public key label.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/wallet/settings/WalletPublicKeyBox.tsx", - "id": "wallet.settings.walletPublicKey", - "start": { - "column": 13, - "line": 12 - } - }, - { - "defaultMessage": "!!!Click Reveal on the right-hand side to display the public key of the wallet.", - "description": "Wallet public key show instruction.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/settings/WalletPublicKeyBox.tsx", - "id": "wallet.settings.walletPublicKeyShowInstruction", - "start": { - "column": 28, - "line": 17 - } - }, - { - "defaultMessage": "!!!Show QR code", - "description": "Show QR code tooltip.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/settings/WalletPublicKeyBox.tsx", - "id": "wallet.settings.showQRCode", - "start": { - "column": 14, - "line": 23 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletPublicKeyBox.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Reveal wallet public key", - "description": "Title \"Choose a stake pool\" on the reveal Wallet Id dialog.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/settings/WalletPublicKeyDialog.tsx", - "id": "wallet.settings.walletPublicKeyDialog.title", - "start": { - "column": 9, - "line": 17 - } - }, - { - "defaultMessage": "!!!Please enter your spending password to reveal your wallet’s public key.", - "description": "Description on the reveal Wallet Id dialog.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/settings/WalletPublicKeyDialog.tsx", - "id": "wallet.settings.walletPublicKeyDialog.description", - "start": { - "column": 15, - "line": 22 - } - }, - { - "defaultMessage": "!!!Reveal wallet public key", - "description": "Description on the reveal Wallet Id dialog.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/wallet/settings/WalletPublicKeyDialog.tsx", - "id": "wallet.settings.walletPublicKeyDialog.button", - "start": { - "column": 15, - "line": 28 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletPublicKeyDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet recovery phrase verification", - "description": "Label for the recoveryPhraseStep1Title on wallet settings.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep1Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep1Title", - "start": { - "column": 28, - "line": 11 - } - }, - { - "defaultMessage": "!!!To verify that you have the correct recovery phrase for this wallet, you can enter it on the following screen.", - "description": "Label for the recoveryPhraseStep1Paragraph1 on wallet settings.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep1Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep1Paragraph1", - "start": { - "column": 33, - "line": 16 - } - }, - { - "defaultMessage": "!!!Are you being watched? Please make sure that nobody can see your screen while you are entering your wallet recovery phrase.", - "description": "Label for the recoveryPhraseStep1Paragraph2 on wallet settings.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep1Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep1Paragraph2", - "start": { - "column": 33, - "line": 23 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for the recoveryPhraseStep1Button on wallet settings.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep1Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep1Button", - "start": { - "column": 29, - "line": 30 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep1Dialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet recovery phrase verification", - "description": "Label for the recoveryPhraseStep2Title on wallet settings.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep2Title", - "start": { - "column": 28, - "line": 20 - } - }, - { - "defaultMessage": "!!!Please enter your wallet recovery phrase. Make sure you enter the words in the correct order.", - "description": "Label for the recoveryPhraseStep2Description on wallet settings.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep2Description", - "start": { - "column": 34, - "line": 25 - } - }, - { - "defaultMessage": "!!!Recovery phrase", - "description": "Label for the recoveryPhraseStep2Subtitle on wallet settings.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep2Subtitle", - "start": { - "column": 31, - "line": 32 - } - }, - { - "defaultMessage": "!!!Verify", - "description": "Label for the recoveryPhraseStep2Button on wallet settings.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep2Button", - "start": { - "column": 29, - "line": 38 - } - }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder \"Enter word #{wordNumber}\" for the recovery phrase input on the verification dialog.", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseInputPlaceholder", - "start": { - "column": 34, - "line": 43 - } - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseInputNoResults", - "start": { - "column": 27, - "line": 49 - } - }, - { - "defaultMessage": "!!!Invalid recovery phrase", - "description": "Error message shown when invalid recovery phrase was entered.", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep2InvalidMnemonics", - "start": { - "column": 39, - "line": 55 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep2Dialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!verification successful", - "description": "Label for the recoveryPhraseStep3Title on wallet settings.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep3Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep3Title", - "start": { - "column": 28, - "line": 13 - } - }, - { - "defaultMessage": "!!!You have verified the recovery phrase for this wallet. You can use it at any time to recover the funds in this wallet on another computer, even if using a different version of Daedalus.", - "description": "Label for the recoveryPhraseStep3Paragraph1 on wallet settings.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep3Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep3Paragraph1", - "start": { - "column": 33, - "line": 18 - } - }, - { - "defaultMessage": "!!!Please make sure to return your wallet recovery phrase to a secure place for safekeeping. Anyone with access to your wallet recovery phrase can take control of your funds.", - "description": "Label for the recoveryPhraseStep3Paragraph2 on wallet settings.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep3Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep3Paragraph2", - "start": { - "column": 33, - "line": 25 - } - }, - { - "defaultMessage": "!!!Finish", - "description": "Label for the recoveryPhraseStep3Button on wallet settings.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep3Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep3Button", - "start": { - "column": 29, - "line": 32 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep3Dialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!verification failure", - "description": "Label for the recoveryPhraseStep4Title on wallet settings.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep4Title", - "start": { - "column": 28, - "line": 12 - } - }, - { - "defaultMessage": "!!!The wallet recovery phrase you have entered does not match the recovery phrase of this wallet. Make sure you have entered the wallet recovery phrase which was written down during the wallet creation process for this wallet and make sure the words are in the correct order.", - "description": "Label for the recoveryPhraseStep4Paragraph1 on wallet settings.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep4Paragraph1", - "start": { - "column": 33, - "line": 17 - } - }, - { - "defaultMessage": "!!!If you are unable to verify your wallet recovery phrase, you should create a new wallet and move all of the funds from this wallet to the new wallet. If you do this, make sure you keep the wallet recovery phrase for the new wallet safe and secure.", - "description": "Label for the recoveryPhraseStep4Paragraph2 on wallet settings.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep4Paragraph2", - "start": { - "column": 33, - "line": 24 - } - }, - { - "defaultMessage": "!!!Verify recovery phrase again", - "description": "Label for the recoveryPhraseStep4Button on wallet settings.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep4Button", - "start": { - "column": 29, - "line": 31 - } - }, - { - "defaultMessage": "!!!Read support portal article", - "description": "Label for the recoveryPhraseStep4SupportTitle on wallet settings.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep4SupportTitle", - "start": { - "column": 35, - "line": 36 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360035341914", - "description": "Label for the recoveryPhraseStep4SupportUrl on wallet settings.", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.tsx", - "id": "wallet.settings.recoveryPhraseStep4SupportUrl", - "start": { - "column": 33, - "line": 42 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseStep4Dialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Do you have your wallet recovery phrase?", - "description": "Label for the recoveryPhraseVerificationTitle on wallet settings.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.title", - "start": { - "column": 9, - "line": 26 - } - }, - { - "defaultMessage": "!!!Funds in this wallet can only be recovered using the correct wallet recovery phrase, which is a unique {wordCount}-word string you were shown and asked to write down when creating this wallet. You can re-enter your wallet recovery phrase to verify that you have the correct recovery phrase for this wallet.", - "description": "Label for the recoveryPhraseVerificationDescription on wallet settings.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.description", - "start": { - "column": 15, - "line": 32 - } - }, - { - "defaultMessage": "!!!We recommend that you verify your wallet recovery phrase in {timeUntilWarning}.", - "description": "Label for the recoveryPhraseVerificationNeverOk on wallet settings.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.neverOkTimeUntil", - "start": { - "column": 20, - "line": 39 - } - }, - { - "defaultMessage": "!!!We recommend that you verify your wallet recovery phrase in a few months.", - "description": "Label for the recoveryPhraseVerificationNeverOk on wallet settings.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.neverOkFewMonths", - "start": { - "column": 20, - "line": 46 - } - }, - { - "defaultMessage": "!!!We recommend that you verify your wallet recovery phrase in a few weeks.", - "description": "Label for the recoveryPhraseVerificationNeverOk on wallet settings.", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.neverOkFewWeeks", - "start": { - "column": 19, - "line": 53 - } - }, - { - "defaultMessage": "!!!We recommend that you verify your wallet recovery phrase in a few days.", - "description": "Label for the recoveryPhraseVerificationNeverOk on wallet settings.", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.neverOkFewDays", - "start": { - "column": 18, - "line": 60 - } - }, - { - "defaultMessage": "!!!We recommend that you verify your wallet recovery phrase.", - "description": "Label for the recoveryPhraseVerificationNeverWarning on wallet settings.", - "end": { - "column": 3, - "line": 73 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.neverWarning", - "start": { - "column": 16, - "line": 67 - } - }, - { - "defaultMessage": "!!!We recommend that you verify your wallet recovery phrase.", - "description": "Label for the recoveryPhraseVerificationNeverNotification on wallet settings.", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.neverNotification", - "start": { - "column": 21, - "line": 74 - } - }, - { - "defaultMessage": "!!!You verified the recovery phrase for this wallet {timeAgo}.", - "description": "Label for the recoveryPhraseVerificationCheckedOk on wallet settings.", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.checkedOk", - "start": { - "column": 13, - "line": 81 - } - }, - { - "defaultMessage": "!!!You verified the recovery phrase for this wallet {timeAgo}.", - "description": "Label for the recoveryPhraseVerificationCheckedWarning on wallet settings.", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.checkedWarning", - "start": { - "column": 18, - "line": 88 - } - }, - { - "defaultMessage": "!!!You verified the recovery phrase for this wallet {timeAgo}. We recommend that you verify your wallet recovery phrase again.", - "description": "Label for the recoveryPhraseVerificationCheckedNotification on wallet settings.", - "end": { - "column": 3, - "line": 101 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.checkedNotification", - "start": { - "column": 23, - "line": 95 - } - }, - { - "defaultMessage": "!!!If this wallet was restored from a paper wallet certificate, you cannot use this feature to verify your wallet recovery phrase. Paper wallet recovery phrase to regular wallet recovery phrase conversion will be available in Daedalus soon.", - "description": "Description for the paperWallet instructions on wallet settings.", - "end": { - "column": 3, - "line": 108 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.paperWalletDescription", - "start": { - "column": 26, - "line": 102 - } - }, - { - "defaultMessage": "!!!Paper wallet", - "description": "Title for the paperWallet instructions on wallet settings.", - "end": { - "column": 3, - "line": 113 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.paperWalletTitle", - "start": { - "column": 20, - "line": 109 - } - }, - { - "defaultMessage": "!!!Verify wallet recovery phrase", - "description": "Label for the recoveryPhraseVerificationButton on wallet settings.", - "end": { - "column": 3, - "line": 119 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.button", - "start": { - "column": 10, - "line": 114 - } - }, - { - "defaultMessage": "!!!ヶ月,か月", - "description": "Label for the recoveryPhraseVerificationButton on wallet settings.", - "end": { - "column": 3, - "line": 126 - }, - "file": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.tsx", - "id": "wallet.settings.recoveryPhraseVerification.timeUntilWarningReplacement", - "start": { - "column": 31, - "line": 120 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletRecoveryPhraseVerificationWidget.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Transaction assurance security level", - "description": "Label for the \"Transaction assurance security level\" dropdown.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.assurance", - "start": { - "column": 23, - "line": 37 - } - }, - { - "defaultMessage": "!!!Undelegating your wallet", - "description": "Undelegate wallet header on the wallet settings page.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.undelegateWallet.header", - "start": { - "column": 26, - "line": 43 - } - }, - { - "defaultMessage": "!!!If you are planning to stop using this wallet and remove all funds, you should first undelegate it to recover your 2 ada deposit. You will continue getting delegation rewards during the three Cardano epochs after undelegating your wallet.", - "description": "Undelegate wallet warning explaining the consequences.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.undelegateWallet.warning", - "start": { - "column": 27, - "line": 48 - } - }, - { - "defaultMessage": "!!!This wallet is synchronizing with the blockchain, so this wallet's delegation status is currently unknown, and undelegation is not possible.", - "description": "Undelegate wallet disabled warning explaining why it is disabled.", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.undelegateWallet.disabledWarning", - "start": { - "column": 35, - "line": 54 - } - }, - { - "defaultMessage": "!!!Delegate your wallet", - "description": "Delegate wallet header on the wallet settings page.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.delegateWallet.header", - "start": { - "column": 24, - "line": 61 - } - }, - { - "defaultMessage": "!!!This wallet is not delegated. Please, delegate the stake from this wallet to earn rewards and support the Cardano network's security.", - "description": "Delegate wallet warning.", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.delegateWallet.warning", - "start": { - "column": 25, - "line": 66 - } - }, - { - "defaultMessage": "!!!This wallet is synchronizing with the blockchain, so this wallet's delegation status is currently unknown, and delegation is not possible.", - "description": "Delegate wallet disabled warning explaining why it is disabled.", - "end": { - "column": 3, - "line": 78 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.delegateWallet.disabledWarning", - "start": { - "column": 33, - "line": 72 - } - }, - { - "defaultMessage": "!!!Name", - "description": "Label for the \"Name\" text input on the wallet settings page.", - "end": { - "column": 3, - "line": 83 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.name.label", - "start": { - "column": 8, - "line": 79 - } - }, - { - "defaultMessage": "!!!Password", - "description": "Label for the \"Password\" field.", - "end": { - "column": 3, - "line": 88 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.password", - "start": { - "column": 17, - "line": 84 - } - }, - { - "defaultMessage": "!!!Last updated", - "description": "Last updated X time ago message.", - "end": { - "column": 3, - "line": 93 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.passwordLastUpdated", - "start": { - "column": 23, - "line": 89 - } - }, - { - "defaultMessage": "!!!You still don't have password", - "description": "You still don't have password set message.", - "end": { - "column": 3, - "line": 98 - }, - "file": "source/renderer/app/components/wallet/settings/WalletSettings.tsx", - "id": "wallet.settings.passwordNotSet", - "start": { - "column": 18, - "line": 94 - } - } - ], - "path": "source/renderer/app/components/wallet/settings/WalletSettings.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!+ {amount} of fees", - "description": "Label for the \"+ 12.042481 of fees\" message above amount input field.", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/wallet/skins/AmountInputSkin.tsx", - "id": "wallet.amountInput.feesLabel", - "start": { - "column": 13, - "line": 8 - } - }, - { - "defaultMessage": "!!!Calculating fees", - "description": "Label for the \"Calculating fees\" message above amount input field.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/skins/AmountInputSkin.tsx", - "id": "wallet.amountInput.calculatingFeesLabel", - "start": { - "column": 24, - "line": 14 - } - } - ], - "path": "source/renderer/app/components/wallet/skins/AmountInputSkin.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Tokens", - "description": "Tokens title in the wallet summary", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummary.tsx", - "id": "wallet.summary.assets.tokensTitle", - "start": { - "column": 19, - "line": 14 - } - } - ], - "path": "source/renderer/app/components/wallet/summary/WalletSummary.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Converts as", - "description": "\"Currency - title\" label on Wallet summary currency page", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummaryCurrency.tsx", - "id": "wallet.summary.currency.title", - "start": { - "column": 17, - "line": 17 - } - }, - { - "defaultMessage": "!!!converted {fetchedTimeAgo}", - "description": "\"Currency - last fetched\" label on Wallet summary currency page", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummaryCurrency.tsx", - "id": "wallet.summary.currency.lastFetched", - "start": { - "column": 23, - "line": 22 - } - }, - { - "defaultMessage": "!!!fetching conversion rates", - "description": "\"Currency - Fetching\" label on Wallet summary currency page", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummaryCurrency.tsx", - "id": "wallet.summary.currency.isFetchingRate", - "start": { - "column": 26, - "line": 28 - } - } - ], - "path": "source/renderer/app/components/wallet/summary/WalletSummaryCurrency.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!{total} transactions, {pending} pending", - "description": "\"Number of transactions\" label on Wallet summary header page", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummaryHeader.tsx", - "id": "wallet.summary.header.transactionsLabel", - "start": { - "column": 21, - "line": 17 - } - } - ], - "path": "source/renderer/app/components/wallet/summary/WalletSummaryHeader.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!{total} rewards earned, {unspent} unspent rewards", - "description": "Headline for the Decentralisation notification.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummaryHeaderRewards.tsx", - "id": "wallet.summary.header.rewardsSummary", - "start": { - "column": 11, - "line": 20 - } - }, - { - "defaultMessage": "!!!All the ada in this wallet is in the rewards account.\n Since transaction fees cannot be paid with rewards, please send 2 or\n more ada to this wallet to cover transaction fees.", - "description": "Tooltip describing that rewards are unspendable on the Wallet summary header", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/wallet/summary/WalletSummaryHeaderRewards.tsx", - "id": "wallet.summary.header.unspendableTooltip", - "start": { - "column": 22, - "line": 25 - } - } - ], - "path": "source/renderer/app/components/wallet/summary/WalletSummaryHeaderRewards.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Tokens", - "description": "Number of tokens title on Wallet summary assets page", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-no-tokens/WalletNoTokens.tsx", - "id": "wallet.summary.assets.tokensTitle", - "start": { - "column": 15, - "line": 9 - } - }, - { - "defaultMessage": "!!!Want to find out more about native tokens?", - "description": "\"Learn more\" text in the Wallets Summary No Tokens component", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-no-tokens/WalletNoTokens.tsx", - "id": "wallet.summary.noTokens.learnMore.textTop", - "start": { - "column": 20, - "line": 14 - } - }, - { - "defaultMessage": "!!!Start by visiting the IOHK blog for a useful primer.", - "description": "\"Learn more\" text in the Wallets Summary No Tokens component", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-no-tokens/WalletNoTokens.tsx", - "id": "wallet.summary.noTokens.learnMore.textBottom", - "start": { - "column": 23, - "line": 19 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "\"Learn more\" label or button in the Wallets Summary No Tokens component", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-no-tokens/WalletNoTokens.tsx", - "id": "wallet.summary.noTokens.learnMore.linkLabel", - "start": { - "column": 22, - "line": 24 - } - }, - { - "defaultMessage": "!!!https://iohk.io/en/blog/posts/2021/02/04/native-tokens-to-bring-new-utility-to-life-on-cardano/", - "description": "\"Learn more\" link URL in the Wallets Summary No Tokens component", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-no-tokens/WalletNoTokens.tsx", - "id": "wallet.summary.noTokens.learnMore.linkUrl", - "start": { - "column": 20, - "line": 30 - } - } - ], - "path": "source/renderer/app/components/wallet/tokens/wallet-no-tokens/WalletNoTokens.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Add tokens", - "description": "Token picker title", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.title", - "start": { - "column": 9, - "line": 4 - } - }, - { - "defaultMessage": "!!!All tokens", - "description": "Label for all tokens option", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.allTokensLabel", - "start": { - "column": 18, - "line": 9 - } - }, - { - "defaultMessage": "!!!Favorites", - "description": "Label for favorite tokens option", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.favoriteTokensLabel", - "start": { - "column": 23, - "line": 14 - } - }, - { - "defaultMessage": "!!!Select all", - "description": "Label for select all button label", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.checkAllLabel", - "start": { - "column": 17, - "line": 19 - } - }, - { - "defaultMessage": "!!!{checkedCount} out of {maxTokens} tokens.", - "description": "Label of selected tokens count", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.checkedCountLabel", - "start": { - "column": 21, - "line": 24 - } - }, - { - "defaultMessage": "!!!Cancel", - "description": "Label of cancel button", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.cancelButtonLabel", - "start": { - "column": 21, - "line": 29 - } - }, - { - "defaultMessage": "!!!Add", - "description": "Label of add button", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.addButtonLabel", - "start": { - "column": 18, - "line": 34 - } - }, - { - "defaultMessage": "!!!Clear selection", - "description": "Label of clear selection button", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.clearAll", - "start": { - "column": 12, - "line": 39 - } - }, - { - "defaultMessage": "!!!Results do not match search query", - "description": "Text for no results", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.noResults", - "start": { - "column": 13, - "line": 44 - } - }, - { - "defaultMessage": "!!!You have already reached a maximum of {maxTokens} tokens for your transaction. To add another token you need to remove one from a list.", - "description": "Max tokens warning", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.ts", - "id": "wallet.token.picker.maxTokensWarning", - "start": { - "column": 20, - "line": 49 - } - } - ], - "path": "source/renderer/app/components/wallet/tokens/wallet-token-picker/WalletTokenPicker.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Send", - "description": "Send button on Wallet summary assets page", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token/WalletToken.messages.ts", - "id": "wallet.summary.asset.tokenSendButton", - "start": { - "column": 19, - "line": 4 - } - }, - { - "defaultMessage": "!!!Amount", - "description": "Amount label on Wallet summary assets page", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token/WalletToken.messages.ts", - "id": "wallet.summary.asset.amountLabel", - "start": { - "column": 15, - "line": 9 - } - }, - { - "defaultMessage": "!!!Settings", - "description": "Settings label on Wallet summary assets page", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token/WalletToken.messages.ts", - "id": "wallet.summary.asset.settings.button.label", - "start": { - "column": 23, - "line": 14 - } - }, - { - "defaultMessage": "!!!Recommended configuration for decimal places for this native token is available.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token/WalletToken.messages.ts", - "id": "assets.warning.available", - "start": { - "column": 35, - "line": 19 - } - }, - { - "defaultMessage": "!!!You are not using the recommended decimal place configuration for this native token.", - "description": "Asset settings recommended pop over content", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-token/WalletToken.messages.ts", - "id": "assets.warning.notUsing", - "start": { - "column": 34, - "line": 25 - } - } - ], - "path": "source/renderer/app/components/wallet/tokens/wallet-token/WalletToken.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!No results matching your query", - "description": "No results on the WalletTokensList", - "end": { - "column": 3, - "line": 8 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens-list/WalletTokensList.messages.ts", - "id": "wallet.tokens.list.search.noResults", - "start": { - "column": 13, - "line": 4 - } - }, - { - "defaultMessage": "!!!Search Results", - "description": "Search Results on the WalletTokensList", - "end": { - "column": 3, - "line": 13 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens-list/WalletTokensList.messages.ts", - "id": "wallet.tokens.list.search.searchResults", - "start": { - "column": 17, - "line": 9 - } - }, - { - "defaultMessage": "!!!Amount", - "description": "Amount header on the WalletTokensList", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens-list/WalletTokensList.messages.ts", - "id": "wallet.tokens.list.column.amount", - "start": { - "column": 16, - "line": 14 - } - }, - { - "defaultMessage": "!!!Token", - "description": "Token header on the WalletTokensList", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens-list/WalletTokensList.messages.ts", - "id": "wallet.tokens.list.column.token", - "start": { - "column": 15, - "line": 19 - } - }, - { - "defaultMessage": "!!!View all tokens", - "description": "View all button label on the WalletTokensList", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens-list/WalletTokensList.messages.ts", - "id": "wallet.tokens.list.viewAllButton.label", - "start": { - "column": 22, - "line": 24 - } - } - ], - "path": "source/renderer/app/components/wallet/tokens/wallet-tokens-list/WalletTokensList.messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Search tokens", - "description": "Search placeholder for the Wallet Tokens search", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens-search/WalletTokensSearch.tsx", - "id": "wallet.tokens.search.placeholder", - "start": { - "column": 15, - "line": 14 - } - } - ], - "path": "source/renderer/app/components/wallet/tokens/wallet-tokens-search/WalletTokensSearch.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Favorites", - "description": "Favorites list title label", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens/WalletTokens.tsx", - "id": "wallet.tokens.list.favorites.title", - "start": { - "column": 22, - "line": 13 - } - }, - { - "defaultMessage": "!!!Tokens", - "description": "Favorites list title label", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens/WalletTokens.tsx", - "id": "wallet.tokens.list.tokens.title", - "start": { - "column": 19, - "line": 18 - } - }, - { - "defaultMessage": "!!!The balance and transaction history of this wallet is being synced with the blockchain.", - "description": "Syncing transactions message shown during async wallet restore in the wallet send form.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/tokens/wallet-tokens/WalletTokens.tsx", - "id": "wallet.send.form.syncingTransactionsMessage", - "start": { - "column": 18, - "line": 23 - } - } - ], - "path": "source/renderer/app/components/wallet/tokens/wallet-tokens/WalletTokens.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Cancel pending transaction", - "description": "Label for the cancel pending transaction button", - "end": { - "column": 3, - "line": 12 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionButton.tsx", - "id": "wallet.transaction.pending.cancelTransactionButton", - "start": { - "column": 15, - "line": 8 - } - }, - { - "defaultMessage": "!!!Remove failed transaction", - "description": "Label for the remove failed transaction button", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionButton.tsx", - "id": "wallet.transaction.failed.removeTransactionButton", - "start": { - "column": 15, - "line": 13 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/CancelTransactionButton.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Confirm transaction cancellation?", - "description": "Headline for the pending transaction cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionConfirmationDialog.tsx", - "id": "cancel.transaction.confirmation.dialog.headline", - "start": { - "column": 12, - "line": 9 - } - }, - { - "defaultMessage": "!!!This transaction was submitted to the Cardano network some time ago, but has not been finalized yet. You can try to cancel the transaction now to release the pending funds, but there is a chance that the transaction will be finalized regardless. In this case, the transaction will reappear in your wallet as a completed transaction.", - "description": "Content for the pending transaction cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionConfirmationDialog.tsx", - "id": "cancel.transaction.confirmation.dialog.content1", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!To ensure that this transfer of funds is processed as soon as possible, we recommend that you cancel this transaction and submit a new one to the network.", - "description": "Content for the pending transaction cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionConfirmationDialog.tsx", - "id": "cancel.transaction.confirmation.dialog.content2", - "start": { - "column": 12, - "line": 22 - } - }, - { - "defaultMessage": "!!!No, keep the transaction pending", - "description": "\"Cancel\" button label for the pending transaction cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionConfirmationDialog.tsx", - "id": "cancel.transaction.confirmation.dialog.button.backLabel", - "start": { - "column": 21, - "line": 29 - } - }, - { - "defaultMessage": "!!!Yes, cancel the transaction", - "description": "\"Confirm\" button label for the pending transaction cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/transactions/CancelTransactionConfirmationDialog.tsx", - "id": "cancel.transaction.confirmation.dialog.button.confirmLabel", - "start": { - "column": 22, - "line": 35 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/CancelTransactionConfirmationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!All Transactions", - "description": "All Transactions button label.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.allTransactions", - "start": { - "column": 19, - "line": 38 - } - }, - { - "defaultMessage": "!!!Reset Filter", - "description": "Reset Filter button label.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.resetFilter", - "start": { - "column": 15, - "line": 43 - } - }, - { - "defaultMessage": "!!!Received", - "description": "Incoming filter type.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.incoming", - "start": { - "column": 12, - "line": 48 - } - }, - { - "defaultMessage": "!!!Sent", - "description": "Outgoing filter type.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.outgoing", - "start": { - "column": 12, - "line": 53 - } - }, - { - "defaultMessage": "!!!Time", - "description": "Date range of filter.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.dateRange", - "start": { - "column": 13, - "line": 58 - } - }, - { - "defaultMessage": "!!!Select time range", - "description": "Select time range indication of filter.", - "end": { - "column": 3, - "line": 67 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.selectTimeRange", - "start": { - "column": 19, - "line": 63 - } - }, - { - "defaultMessage": "!!!Last 7 days", - "description": "Last 7 days range of filter.", - "end": { - "column": 3, - "line": 72 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.last7Days", - "start": { - "column": 13, - "line": 68 - } - }, - { - "defaultMessage": "!!!Last 30 days", - "description": "Last 30 days range of filter.", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.last30Days", - "start": { - "column": 14, - "line": 73 - } - }, - { - "defaultMessage": "!!!Last 90 days", - "description": "Last 90 days range of filter.", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.last90Days", - "start": { - "column": 14, - "line": 78 - } - }, - { - "defaultMessage": "!!!This year", - "description": "This year date range of filter.", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.thisYear", - "start": { - "column": 12, - "line": 83 - } - }, - { - "defaultMessage": "!!!Custom", - "description": "Custom date range of filter.", - "end": { - "column": 3, - "line": 92 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.custom", - "start": { - "column": 10, - "line": 88 - } - }, - { - "defaultMessage": "!!!Amount of ada", - "description": "Amount range of filter.", - "end": { - "column": 3, - "line": 97 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.amountRange", - "start": { - "column": 15, - "line": 93 - } - }, - { - "defaultMessage": "!!!Apply", - "description": "Filter button label.", - "end": { - "column": 3, - "line": 102 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterDialog.tsx", - "id": "wallet.transaction.filter.apply", - "start": { - "column": 9, - "line": 98 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/FilterDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!{filtered} out of {total} transactions match your filter.", - "description": "Filter result info.", - "end": { - "column": 3, - "line": 12 - }, - "file": "source/renderer/app/components/wallet/transactions/FilterResultInfo.tsx", - "id": "wallet.transaction.filter.resultInfo", - "start": { - "column": 14, - "line": 7 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/FilterResultInfo.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Card payment", - "description": "Transaction type shown for credit card payments.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.type.card", - "start": { - "column": 8, - "line": 33 - } - }, - { - "defaultMessage": "!!!{typeOfTransaction} transaction", - "description": "Transaction type shown for {currency} transactions.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.type", - "start": { - "column": 8, - "line": 38 - } - }, - { - "defaultMessage": "!!!Exchange", - "description": "Transaction type shown for money exchanges between currencies.", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.type.exchange", - "start": { - "column": 12, - "line": 43 - } - }, - { - "defaultMessage": "!!!Transaction ID", - "description": "Transaction ID.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.transactionId", - "start": { - "column": 17, - "line": 49 - } - }, - { - "defaultMessage": "!!!Transaction Metadata", - "description": "Transaction Metadata.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.transactionMetadata", - "start": { - "column": 23, - "line": 54 - } - }, - { - "defaultMessage": "Transaction metadata is not moderated and may contain inappropriate content. Show unmoderated content.", - "description": "", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.transactionMetadataDescription", - "start": { - "column": 34, - "line": 59 - } - }, - { - "defaultMessage": "!!!Transaction metadata", - "description": "Transaction metadata label", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.metadataLabel", - "start": { - "column": 17, - "line": 65 - } - }, - { - "defaultMessage": "!!!Transaction metadata is not moderated and may contain inappropriate content.", - "description": "Transaction metadata disclaimer", - "end": { - "column": 3, - "line": 75 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.metadataDisclaimer", - "start": { - "column": 22, - "line": 70 - } - }, - { - "defaultMessage": "!!!Show unmoderated content", - "description": "Transaction metadata confirmation toggle", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.metadataConfirmationLabel", - "start": { - "column": 29, - "line": 76 - } - }, - { - "defaultMessage": "!!!Conversion rate", - "description": "Conversion rate.", - "end": { - "column": 3, - "line": 85 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.conversion.rate", - "start": { - "column": 18, - "line": 81 - } - }, - { - "defaultMessage": "!!!{transactionsType} sent", - "description": "Label \"{transactionsType} sent\" for the transaction.", - "end": { - "column": 3, - "line": 90 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.sent", - "start": { - "column": 8, - "line": 86 - } - }, - { - "defaultMessage": "!!!{transactionsType} received", - "description": "Label \"{transactionsType} received\" for the transaction.", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.received", - "start": { - "column": 12, - "line": 91 - } - }, - { - "defaultMessage": "!!!From address", - "description": "From address", - "end": { - "column": 3, - "line": 100 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.address.from", - "start": { - "column": 15, - "line": 96 - } - }, - { - "defaultMessage": "!!!From addresses", - "description": "From addresses", - "end": { - "column": 3, - "line": 105 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.addresses.from", - "start": { - "column": 17, - "line": 101 - } - }, - { - "defaultMessage": "!!!From rewards", - "description": "From rewards", - "end": { - "column": 3, - "line": 110 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.rewards.from", - "start": { - "column": 15, - "line": 106 - } - }, - { - "defaultMessage": "!!!To address", - "description": "To address", - "end": { - "column": 3, - "line": 115 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.address.to", - "start": { - "column": 13, - "line": 111 - } - }, - { - "defaultMessage": "!!!To addresses", - "description": "To addresses", - "end": { - "column": 3, - "line": 120 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.addresses.to", - "start": { - "column": 15, - "line": 116 - } - }, - { - "defaultMessage": "!!!Receiver", - "description": "Receiver", - "end": { - "column": 3, - "line": 125 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.receiverLabel", - "start": { - "column": 17, - "line": 121 - } - }, - { - "defaultMessage": "!!!Token", - "description": "Token label", - "end": { - "column": 3, - "line": 130 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.assetLabel", - "start": { - "column": 14, - "line": 126 - } - }, - { - "defaultMessage": "!!!Transaction fee", - "description": "Transaction fee", - "end": { - "column": 3, - "line": 135 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.transactionFee", - "start": { - "column": 18, - "line": 131 - } - }, - { - "defaultMessage": "!!!Deposit", - "description": "Deposit", - "end": { - "column": 3, - "line": 140 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.deposit", - "start": { - "column": 11, - "line": 136 - } - }, - { - "defaultMessage": "!!!Transaction amount", - "description": "Transaction amount.", - "end": { - "column": 3, - "line": 145 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.transactionAmount", - "start": { - "column": 21, - "line": 141 - } - }, - { - "defaultMessage": "!!!Multiple tokens", - "description": "Multiple tokens.", - "end": { - "column": 3, - "line": 150 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.multipleTokens", - "start": { - "column": 18, - "line": 146 - } - }, - { - "defaultMessage": "!!!Tokens sent", - "description": "Tokens sent.", - "end": { - "column": 3, - "line": 155 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.tokensSent", - "start": { - "column": 14, - "line": 151 - } - }, - { - "defaultMessage": "!!!Tokens received", - "description": "Tokens received.", - "end": { - "column": 3, - "line": 160 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.tokensReceived", - "start": { - "column": 18, - "line": 156 - } - }, - { - "defaultMessage": "!!!Fetching token data", - "description": "\"Fetching token data...\" message.", - "end": { - "column": 3, - "line": 165 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.fetchingTokenData", - "start": { - "column": 21, - "line": 161 - } - }, - { - "defaultMessage": "!!!This transaction has been pending for a long time. To release the funds used by this transaction, you can try canceling it.", - "description": "Note to cancel a transaction that has been pending too long", - "end": { - "column": 3, - "line": 171 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.pending.cancelPendingTxnNote", - "start": { - "column": 24, - "line": 166 - } - }, - { - "defaultMessage": "!!!Why should I cancel this transaction?", - "description": "Link to support article for canceling a pending transaction", - "end": { - "column": 3, - "line": 176 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.pending.cancelPendingTxnSupportArticle", - "start": { - "column": 34, - "line": 172 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360038113814", - "description": "Url to support article for canceling a pending transaction", - "end": { - "column": 3, - "line": 182 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.pending.supportArticleUrl", - "start": { - "column": 21, - "line": 177 - } - }, - { - "defaultMessage": "!!!No addresses", - "description": "Input Addresses label.", - "end": { - "column": 3, - "line": 187 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.noInputAddressesLabel", - "start": { - "column": 25, - "line": 183 - } - }, - { - "defaultMessage": "!!!Open this transaction in Cardano explorer", - "description": "Unresolved Input Addresses link label.", - "end": { - "column": 3, - "line": 192 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.unresolvedInputAddressesLinkLabel", - "start": { - "column": 37, - "line": 188 - } - }, - { - "defaultMessage": "!!!to see these addresses.", - "description": "Unresolved Input Addresses additional label.", - "end": { - "column": 3, - "line": 197 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.unresolvedInputAddressesAdditionalLabel", - "start": { - "column": 43, - "line": 193 - } - }, - { - "defaultMessage": "!!!This transaction was submitted to the Cardano network, but it expired, so it failed. Transactions on the Cardano network have a ‘time to live’ attribute, which passed before the network processed the transaction. Please, remove it to release the funds (UTXOs) used by this transaction to use those funds in another transaction.", - "description": "Note to cancel a transaction that has been failed", - "end": { - "column": 3, - "line": 203 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.failed.cancelFailedTxnNote", - "start": { - "column": 23, - "line": 198 - } - }, - { - "defaultMessage": "!!!Why should I cancel failed transactions?", - "description": "Link to support article for removing a failed transaction", - "end": { - "column": 3, - "line": 208 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.failed.cancelFailedTxnSupportArticle", - "start": { - "column": 33, - "line": 204 - } - }, - { - "defaultMessage": "!!!Transaction confirmed", - "description": "Transaction state \"confirmed\"", - "end": { - "column": 3, - "line": 215 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.state.confirmed", - "start": { - "column": 26, - "line": 211 - } - }, - { - "defaultMessage": "!!!Transaction pending", - "description": "Transaction state \"pending\"", - "end": { - "column": 3, - "line": 220 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.state.pending", - "start": { - "column": 31, - "line": 216 - } - }, - { - "defaultMessage": "!!!Transaction failed", - "description": "Transaction state \"failed\"", - "end": { - "column": 3, - "line": 225 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.state.failed", - "start": { - "column": 30, - "line": 221 - } - }, - { - "defaultMessage": "!!!Confirmed", - "description": "Transaction state \"confirmed\"", - "end": { - "column": 3, - "line": 232 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.state.confirmedHeading", - "start": { - "column": 26, - "line": 228 - } - }, - { - "defaultMessage": "!!!Pending", - "description": "Transaction state \"pending\"", - "end": { - "column": 3, - "line": 237 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.state.pendingHeading", - "start": { - "column": 31, - "line": 233 - } - }, - { - "defaultMessage": "!!!Failed", - "description": "Transaction state \"failed\"", - "end": { - "column": 3, - "line": 242 - }, - "file": "source/renderer/app/components/wallet/transactions/Transaction.tsx", - "id": "wallet.transaction.state.failedHeading", - "start": { - "column": 30, - "line": 238 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/Transaction.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!No transactions", - "description": "Message shown when wallet has no transactions yet.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactions.tsx", - "id": "wallet.transactions.no.transactions", - "start": { - "column": 18, - "line": 18 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/WalletTransactions.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Transactions", - "description": "Label for the \"Transactions\" header.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsHeader.tsx", - "id": "wallet.transactions.header.transactions", - "start": { - "column": 16, - "line": 15 - } - }, - { - "defaultMessage": "!!!Export CSV", - "description": "Label for the \"Export CSV\" button.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsHeader.tsx", - "id": "wallet.transactions.header.exportCSV.button.label", - "start": { - "column": 24, - "line": 20 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/WalletTransactionsHeader.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Today", - "description": "Label for the \"Today\" label on the wallet summary page.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", - "id": "wallet.summary.transactionsList.todayLabel", - "start": { - "column": 9, - "line": 21 - } - }, - { - "defaultMessage": "!!!Yesterday", - "description": "Label for the \"Yesterday\" label on the wallet summary page.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", - "id": "wallet.summary.transactionsList.yesterdayLabel", - "start": { - "column": 13, - "line": 26 - } - }, - { - "defaultMessage": "!!!Show more transactions", - "description": "Label for the \"Show more transactions\" button on the wallet summary page.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", - "id": "wallet.summary.transactionsList.showMoreTransactionsButtonLabel", - "start": { - "column": 35, - "line": 31 - } - }, - { - "defaultMessage": "!!!Your transaction history for this wallet is being synced with the blockchain.", - "description": "Syncing transactions message on async wallet restore.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx", - "id": "wallet.summary.transactionsList.syncingTransactionsMessage", - "start": { - "column": 30, - "line": 37 - } - } - ], - "path": "source/renderer/app/components/wallet/transactions/WalletTransactionsList.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Transfer funds", - "description": "Title in the transfer funds form.", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep1Dialog.tsx", - "id": "wallet.transferFunds.dialog1.title", - "start": { - "column": 15, - "line": 14 - } - }, - { - "defaultMessage": "!!!From Byron legacy wallet", - "description": "sourceWallet in the transfer funds form.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep1Dialog.tsx", - "id": "wallet.transferFunds.dialog1.sourceWallet", - "start": { - "column": 16, - "line": 19 - } - }, - { - "defaultMessage": "!!!To Shelley-compatible wallet", - "description": "targetWallet in the transfer funds form.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep1Dialog.tsx", - "id": "wallet.transferFunds.dialog1.targetWallet", - "start": { - "column": 16, - "line": 24 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "buttonLabel in the transfer funds form.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep1Dialog.tsx", - "id": "wallet.transferFunds.dialog1.continueLabel", - "start": { - "column": 15, - "line": 29 - } - } - ], - "path": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep1Dialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Transfer funds from the legacy wallet", - "description": "Title in the transfer funds form.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.title", - "start": { - "column": 15, - "line": 24 - } - }, - { - "defaultMessage": "!!!Confirm transfer from {sourceWalletName}wallet to the {targetWalletName} wallet.", - "description": "description in the transfer funds form.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.description.label", - "start": { - "column": 15, - "line": 29 - } - }, - { - "defaultMessage": "!!!{sourceWalletName} amount", - "description": "Label Source wallet Amount in the transfer funds form", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.sourceWalletAmount.label", - "start": { - "column": 27, - "line": 35 - } - }, - { - "defaultMessage": "!!!Fees", - "description": "Label Fees in the transfer funds form", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.fees.label", - "start": { - "column": 13, - "line": 40 - } - }, - { - "defaultMessage": "!!!Total", - "description": "Total Fees in the transfer funds form", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.total.label", - "start": { - "column": 14, - "line": 45 - } - }, - { - "defaultMessage": "!!!Leftovers", - "description": "Label Leftovers in the transfer funds form", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.leftovers.label", - "start": { - "column": 18, - "line": 50 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Label Leftovers in the transfer funds form", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.leftovers.LearnMore.label", - "start": { - "column": 27, - "line": 55 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/", - "description": "Label Leftovers in the transfer funds form", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.leftovers.LearnMore.url", - "start": { - "column": 25, - "line": 60 - } - }, - { - "defaultMessage": "!!!Transfer funds", - "description": "buttonLabel in the transfer funds form.", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.label.buttonLabel", - "start": { - "column": 15, - "line": 65 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "passphraseFieldPlaceholder in the transfer funds form.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.passphraseFieldPlaceholder", - "start": { - "column": 30, - "line": 70 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "passphraseLabel in the transfer funds form.", - "end": { - "column": 3, - "line": 79 - }, - "file": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.tsx", - "id": "wallet.transferFunds.dialog2.passphraseLabel", - "start": { - "column": 19, - "line": 75 - } - } - ], - "path": "source/renderer/app/components/wallet/transfer-funds/TransferFundsStep2Dialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet UTXO distribution", - "description": "Title for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.title", - "start": { - "column": 9, - "line": 28 - } - }, - { - "defaultMessage": "!!!This wallet contains {formattedWalletAmount} ADA on {walletUtxosAmount} UTXOs (unspent transaction outputs). Examine the histogram below to see the distribution of UTXOs with different amounts of ada.", - "description": "Description for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.description", - "start": { - "column": 15, - "line": 33 - } - }, - { - "defaultMessage": "!!!This wallet is empty so it does not contain any UTXOs (unspent transaction outputs).", - "description": "Empty wallet description for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.emptyWallet", - "start": { - "column": 15, - "line": 39 - } - }, - { - "defaultMessage": "!!!Find out more", - "description": "\"Find out more\" link on the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.findOutMoreLink", - "start": { - "column": 19, - "line": 45 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/360034118013", - "description": "\"Find out more\" link URL on the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 55 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.findOutMoreLinkUrl", - "start": { - "column": 22, - "line": 50 - } - }, - { - "defaultMessage": "!!!amount", - "description": "Label X for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.labelX", - "start": { - "column": 10, - "line": 56 - } - }, - { - "defaultMessage": "!!!Nº UTXO", - "description": "Label Y for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.labelY", - "start": { - "column": 10, - "line": 61 - } - }, - { - "defaultMessage": "!!!Pending transactions may affect the accuracy of data presented here.
You have {pendingTxnsCount} pending transaction{txnsPlural}.", - "description": "Number of pending transactions for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 72 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxo.tsx", - "id": "wallet.settings.utxos.pendingTransactions", - "start": { - "column": 23, - "line": 66 - } - } - ], - "path": "source/renderer/app/components/wallet/utxo/WalletUtxo.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!{walletUtxosAmount} UTXOs containing
{walletAmount} ADA", - "description": "Tooltip for the \"Wallet Utxos - first bar\" screen.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxoTooltip.tsx", - "id": "wallet.settings.utxos.tooltipFirst", - "start": { - "column": 16, - "line": 9 - } - }, - { - "defaultMessage": "!!!{walletUtxosAmount} UTXOs containing
between {previousWalletAmount} and {walletAmount} ADA", - "description": "Tooltip for the \"Wallet Utxos\" screen.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxoTooltip.tsx", - "id": "wallet.settings.utxos.tooltip", - "start": { - "column": 11, - "line": 15 - } - }, - { - "defaultMessage": "!!!{walletUtxosAmount} UTXOs containing
{walletAmount} ADA", - "description": "Tooltip for the \"Wallet Utxos - last bar\" screen.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/wallet/utxo/WalletUtxoTooltip.tsx", - "id": "wallet.settings.utxos.tooltipLast", - "start": { - "column": 15, - "line": 21 - } - } - ], - "path": "source/renderer/app/components/wallet/utxo/WalletUtxoTooltip.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Create a new wallet", - "description": "Title \"Create a new wallet\" in the wallet create form.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.title", - "start": { - "column": 15, - "line": 12 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-create/WalletCreateDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Create a new wallet", - "description": "Title \"Create a new wallet\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.title", - "start": { - "column": 15, - "line": 13 - } - }, - { - "defaultMessage": "!!!Step {currentStep} of {totalSteps}", - "description": "Step counters in the wallet create dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.stepsCounter", - "start": { - "column": 16, - "line": 18 - } - }, - { - "defaultMessage": "!!!Instructions", - "description": "Step \"Instructions\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.instructionsStep", - "start": { - "column": 20, - "line": 23 - } - }, - { - "defaultMessage": "!!!Template", - "description": "Step \"Template\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.templateStep", - "start": { - "column": 16, - "line": 28 - } - }, - { - "defaultMessage": "!!!Mnemonics", - "description": "Step \"Mnemonics\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.mnemonicsStep", - "start": { - "column": 17, - "line": 33 - } - }, - { - "defaultMessage": "!!!Validate", - "description": "Step \"Validate\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.validateStep", - "start": { - "column": 16, - "line": 38 - } - }, - { - "defaultMessage": "!!!Hash & Image", - "description": "Step \"HashImage\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.hashImageStep", - "start": { - "column": 17, - "line": 43 - } - }, - { - "defaultMessage": "!!!Config", - "description": "Step \"Config\" in the wallet create dialog.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.tsx", - "id": "wallet.create.dialog.configStep", - "start": { - "column": 14, - "line": 48 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-create/WalletCreateSteps.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Import wallets", - "description": "Import wallets dialog title", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.title", - "start": { - "column": 9, - "line": 26 - } - }, - { - "defaultMessage": "!!!

This feature enables you to import wallets from the production version of Daedalus, or from the Daedalus state directory.

If you don’t have the complete state directory, then you will need either the ‘Secrets’ or ‘Secrets-1.0’ folder containing the ‘secret.key’ file to be able to import a wallet, although without the complete state directory Daedalus won’t be able to detect your wallet names.

If you don’t have either the ‘Secrets’ or the ‘Secrets-1.0’ folder containing the ‘secret.key’ file, then you cannot import wallets using this feature.

", - "description": "

This feature enables you to import wallets from the production version of Daedalus, or from the Daedalus state directory.

If you don’t have the complete state directory, then you will need either the ‘Secrets’ or ‘Secrets-1.0’ folder containing the ‘secret.key’ file to be able to import a wallet, although without the complete state directory Daedalus won’t be able to detect your wallet names.

If you don’t have either the ‘Secrets’ or the ‘Secrets-1.0’ folder containing the ‘secret.key’ file, then you cannot import wallets using this feature.

", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.description", - "start": { - "column": 15, - "line": 31 - } - }, - { - "defaultMessage": "!!!Select Daedalus state folder:", - "description": "Select Daedalus state folder:", - "end": { - "column": 3, - "line": 42 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.stateFolderLabel", - "start": { - "column": 20, - "line": 38 - } - }, - { - "defaultMessage": "!!!Select Daedalus 'secret.key' file:", - "description": "Select Daedalus 'secret.key' file:", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.secretFileLabel", - "start": { - "column": 19, - "line": 43 - } - }, - { - "defaultMessage": "!!!Import wallets", - "description": "Import wallets", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.buttonLabel", - "start": { - "column": 15, - "line": 48 - } - }, - { - "defaultMessage": "!!!No wallets found. Make sure you have selected a Daedalus state directory which contains the ‘Secrets’ or `Secrets-1.0` folder with a `secret.key` file inside.", - "description": "No wallets found. Make sure you have selected a Daedalus state directory which contains the ‘Secrets’ or `Secrets-1.0` folder with a `secret.key` file inside.", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.stateDirNoWallets", - "start": { - "column": 21, - "line": 53 - } - }, - { - "defaultMessage": "!!!No wallets found. Make sure you have selected a valid `secret.key` file.", - "description": "No wallets found. Make sure you have selected a valid `secret.key` file.", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.secretFileNoWallets", - "start": { - "column": 23, - "line": 60 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Learn more", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.linkLabel", - "start": { - "column": 13, - "line": 67 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/900000623463", - "description": "\"Learn more\" link URL on the wallet import file dialog", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.linkUrl", - "start": { - "column": 11, - "line": 72 - } - }, - { - "defaultMessage": "!!!Import from:", - "description": "Import from:", - "end": { - "column": 3, - "line": 82 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.importFromLabel", - "start": { - "column": 19, - "line": 78 - } - }, - { - "defaultMessage": "!!!Daedalus state directory", - "description": "Daedalus state directory", - "end": { - "column": 3, - "line": 87 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.stateDirOptionLabel", - "start": { - "column": 23, - "line": 83 - } - }, - { - "defaultMessage": "!!!Daedalus 'secret.key' file", - "description": "Daedalus 'secret.key' file", - "end": { - "column": 3, - "line": 92 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.tsx", - "id": "wallet.import.file.dialog.secretFileOptionLabel", - "start": { - "column": 25, - "line": 88 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-import/WalletImportFileDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Found wallets", - "description": "Select import wallets dialog title", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.title", - "start": { - "column": 9, - "line": 33 - } - }, - { - "defaultMessage": "!!!These wallets were found in your Daedalus state directory.

Please select the wallets you want to import.

", - "description": "These wallets were found in your Daedalus state directory. Please select the wallets you want to import.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.description", - "start": { - "column": 15, - "line": 38 - } - }, - { - "defaultMessage": "!!!Unnamed wallets", - "description": "unnamedWalletsTitle", - "end": { - "column": 3, - "line": 49 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.unnamedWalletsTitle", - "start": { - "column": 23, - "line": 45 - } - }, - { - "defaultMessage": "!!!Password protected", - "description": "Password protected", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.passwordProtected", - "start": { - "column": 21, - "line": 50 - } - }, - { - "defaultMessage": "!!!Wallet already exists", - "description": "Wallet already exists", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.walletExists", - "start": { - "column": 16, - "line": 55 - } - }, - { - "defaultMessage": "!!!No password", - "description": "No password", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.noPassword", - "start": { - "column": 14, - "line": 60 - } - }, - { - "defaultMessage": "!!!Importing wallet...", - "description": "Importing wallet...", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.importingWallet", - "start": { - "column": 19, - "line": 65 - } - }, - { - "defaultMessage": "!!!Enter wallet name", - "description": "Enter wallet name", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.walletName", - "start": { - "column": 14, - "line": 70 - } - }, - { - "defaultMessage": "!!!Name not found", - "description": "Name not found", - "end": { - "column": 3, - "line": 79 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.notFound", - "start": { - "column": 12, - "line": 75 - } - }, - { - "defaultMessage": "!!!Enter a wallet name first", - "description": "Enter a wallet name first", - "end": { - "column": 3, - "line": 84 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.enterWalletNameTooltip", - "start": { - "column": 26, - "line": 80 - } - }, - { - "defaultMessage": "!!!Daedalus supports up to {maxWalletsCount} wallets. You will need to remove another wallet before you can import this one.", - "description": "Max number of wallets reached", - "end": { - "column": 3, - "line": 90 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.maxWalletsReachedTooltip", - "start": { - "column": 28, - "line": 85 - } - }, - { - "defaultMessage": "!!!Wallet imported", - "description": "Wallet imported", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.walletImported", - "start": { - "column": 18, - "line": 91 - } - }, - { - "defaultMessage": "!!!Import selected wallets", - "description": "Import selected wallets", - "end": { - "column": 3, - "line": 100 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.buttonLabel", - "start": { - "column": 15, - "line": 96 - } - }, - { - "defaultMessage": "!!!Learn more", - "description": "Learn more", - "end": { - "column": 3, - "line": 105 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.linkLabel", - "start": { - "column": 13, - "line": 101 - } - }, - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/articles/900000623463", - "description": "\"Learn more\" link URL on the wallet import file dialog", - "end": { - "column": 3, - "line": 111 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.linkUrl", - "start": { - "column": 11, - "line": 106 - } - }, - { - "defaultMessage": "!!!Close window", - "description": "Close window", - "end": { - "column": 3, - "line": 116 - }, - "file": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.tsx", - "id": "wallet.select.import.dialog.closeWindow", - "start": { - "column": 15, - "line": 112 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-import/WalletSelectImportDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Name your restored wallet and set a spending password to keep your wallet secure.", - "description": "Description1 for Configuration Step", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.description1", - "start": { - "column": 16, - "line": 29 - } - }, - { - "defaultMessage": "!!!Wallet names and spending passwords are only stored locally and are not stored on the blockchain. You can give your restored wallet a new name and set a new spending password, you don’t need to match the wallet name and spending password you were using before. Only the recovery phrase from your original wallet is needed to restore a wallet.", - "description": "Description2 for Configuration Step", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.description2", - "start": { - "column": 16, - "line": 35 - } - }, - { - "defaultMessage": "!!!Wallet name", - "description": "Label for Wallet Name Input", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.input.walletName.label", - "start": { - "column": 19, - "line": 41 - } - }, - { - "defaultMessage": "!!!Name the wallet you are restoring", - "description": "Placeholder for Wallet Name Input", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.input.walletName.placeholder", - "start": { - "column": 25, - "line": 46 - } - }, - { - "defaultMessage": "!!!Enter password", - "description": "Label for the \"Wallet password\" input in the wallet restore dialog.", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.input.spendingPassword.label", - "start": { - "column": 25, - "line": 51 - } - }, - { - "defaultMessage": "!!!Repeat password", - "description": "Label for the \"Repeat password\" input in the wallet restore dialog.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.input.repeatPassword.label", - "start": { - "column": 23, - "line": 57 - } - }, - { - "defaultMessage": "!!!Password", - "description": "Placeholder for the \"Password\" inputs in the wallet restore dialog.", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.input.passwordFields.placeholder", - "start": { - "column": 29, - "line": 63 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Placeholder for the dialog \"Continue\" button", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.restore.dialog.step.configuration.continueButtonLabel", - "start": { - "column": 23, - "line": 70 - } - }, - { - "defaultMessage": "!!!It is really good to use Password Manager apps to improve security. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris mattis diam non nulla sollicitudin, ac ultrices purus luctus.", - "description": "Tooltip for the password input in the create wallet dialog.", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.tsx", - "id": "wallet.dialog.passwordTooltip", - "start": { - "column": 19, - "line": 75 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/ConfigurationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder for the mnemonics autocomplete.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx", - "id": "wallet.restore.dialog.step.mnemonics.autocomplete.placeholder", - "start": { - "column": 27, - "line": 23 - } - }, - { - "defaultMessage": "!!!Enter your 12, 18 or 24-word recovery phrase", - "description": "Placeholder for the multi-length mnemonics autocomplete.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx", - "id": "wallet.restore.dialog.step.mnemonics.autocomplete.multiLengthPhrase.placeholder", - "start": { - "column": 33, - "line": 28 - } - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the mnemonics autocomplete search results.", - "end": { - "column": 3, - "line": 39 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx", - "id": "wallet.restore.dialog.step.mnemonics.autocomplete.noResults", - "start": { - "column": 25, - "line": 34 - } - }, - { - "defaultMessage": "!!!Check recovery phrase", - "description": "Label for the mnemonics Continue button.", - "end": { - "column": 3, - "line": 44 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx", - "id": "wallet.restore.dialog.step.mnemonics.autocomplete.continueButtonLabel", - "start": { - "column": 23, - "line": 40 - } - }, - { - "defaultMessage": "!!!Invalid recovery phrase", - "description": "Label for invalid recovery phrase", - "end": { - "column": 3, - "line": 50 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.tsx", - "id": "wallet.restore.dialog.step.mnemonics.autocomplete.invalidRecoveryPhrase", - "start": { - "column": 25, - "line": 45 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/MnemonicsDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Close", - "description": "Label for Close button on the wallet restore \"success\" step dialog.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/SuccessDialog.tsx", - "id": "wallet.restore.dialog.step.success.dialog.close", - "start": { - "column": 20, - "line": 18 - } - }, - { - "defaultMessage": "!!!Your wallet has been successfully restored.", - "description": "Description \"line 1\" on the wallet restore \"success\" step dialog.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/SuccessDialog.tsx", - "id": "wallet.restore.dialog.step.success.dialog.description.line1", - "start": { - "column": 20, - "line": 24 - } - }, - { - "defaultMessage": "!!!Restored wallets should have all the funds and transaction history of the original wallet. If your restored wallet does not have the funds and transaction history you were expecting, please check that you have the correct wallet recovery phrase for the wallet you were intending to restore.", - "description": "Description \"line 2\" on the wallet restore \"success\" step dialog.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/SuccessDialog.tsx", - "id": "wallet.restore.dialog.step.success.dialog.description.line2", - "start": { - "column": 20, - "line": 30 - } - }, - { - "defaultMessage": "!!!If your restored wallet is empty, but you were expecting it to have funds, please check that you used the correct wallet recovery phrase during the restoration process.", - "description": "Description \"line 3\" on the wallet restore \"success\" step dialog.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/SuccessDialog.tsx", - "id": "wallet.restore.dialog.step.success.dialog.description.line3", - "start": { - "column": 20, - "line": 37 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/SuccessDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!What kind of wallet would you like to restore?", - "description": "Label for the \"labelwalletKind\" checkbox.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.walletKind", - "start": { - "column": 19, - "line": 26 - } - }, - { - "defaultMessage": "!!!Daedalus wallet", - "description": "Label for the \"labelWalletKindDaedalus\" checkbox.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.walletKindDaedalus", - "start": { - "column": 27, - "line": 31 - } - }, - { - "defaultMessage": "!!!Yoroi wallet", - "description": "Label for the \"labelWalletKindYoroi\" checkbox.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.walletKindYoroi", - "start": { - "column": 24, - "line": 36 - } - }, - { - "defaultMessage": "!!!Hardware wallet", - "description": "Label for the \"labelWalletKindHardware\" checkbox.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.walletKindHardware", - "start": { - "column": 27, - "line": 41 - } - }, - { - "defaultMessage": "!!!What kind of Daedalus wallet would you like to restore?", - "description": "Label for the \"labelDaedalusWalletKind\" checkbox.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.daedalusWalletKind", - "start": { - "column": 27, - "line": 46 - } - }, - { - "defaultMessage": "!!!12 words (Byron legacy wallet)", - "description": "Label for the \"labelDaedalusWalletKind12WordByron\" checkbox.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.daedalusWalletKind12WordByron", - "start": { - "column": 38, - "line": 52 - } - }, - { - "defaultMessage": "!!!15 words (Incentivized Testnet Rewards wallet)", - "description": "Label for the \"labelDaedalusWalletKind15WordShelley\" checkbox.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.daedalusWalletKind15WordShelley", - "start": { - "column": 40, - "line": 58 - } - }, - { - "defaultMessage": "!!!24 words (Shelley wallet)", - "description": "Label for the \"labelDaedalusWalletKind24WordShelley\" checkbox.", - "end": { - "column": 3, - "line": 72 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.daedalusWalletKind24WordShelley", - "start": { - "column": 40, - "line": 66 - } - }, - { - "defaultMessage": "!!!27 words - paper wallet (Byron legacy wallet)", - "description": "Label for the \"labelDaedalusWalletKind27WordPaper\" checkbox.", - "end": { - "column": 3, - "line": 78 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.daedalusWalletKind27WordPaper", - "start": { - "column": 38, - "line": 73 - } - }, - { - "defaultMessage": "!!!What kind of Yoroi wallet would you like to restore?", - "description": "Label for the \"labelYoroiWalletKind\" checkbox.", - "end": { - "column": 3, - "line": 83 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.yoroiWalletKind", - "start": { - "column": 24, - "line": 79 - } - }, - { - "defaultMessage": "!!!15 words (Byron legacy wallet)", - "description": "Label for the \"labelDaedalusWalletKind15WordByron\" checkbox.", - "end": { - "column": 3, - "line": 89 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.yoroiWalletKindByronLegacy15Word", - "start": { - "column": 35, - "line": 84 - } - }, - { - "defaultMessage": "!!!15 words (Shelley wallet)", - "description": "Label for the \"labelDaedalusWalletKind15WordShelley\" checkbox.", - "end": { - "column": 3, - "line": 96 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.yoroiWalletKindShelley15Word", - "start": { - "column": 37, - "line": 90 - } - }, - { - "defaultMessage": "!!!What kind of hardware wallet would you like to restore?", - "description": "Label for the \"labelHardwareWalletKind\" checkbox.", - "end": { - "column": 3, - "line": 102 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.hardwareWalletKind", - "start": { - "column": 27, - "line": 97 - } - }, - { - "defaultMessage": "!!!24 words - Ledger (Byron legacy wallet)", - "description": "Label for the \"labelHardwareWalletKindLedger\" checkbox.", - "end": { - "column": 3, - "line": 107 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.hardwareWalletKindLedger", - "start": { - "column": 33, - "line": 103 - } - }, - { - "defaultMessage": "!!!24 words - Trezor (Byron legacy wallet)", - "description": "Label for the \"labelHardwareWalletKindTrezor\" checkbox.", - "end": { - "column": 3, - "line": 112 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.label.hardwareWalletKindTrezor", - "start": { - "column": 33, - "line": 108 - } - }, - { - "defaultMessage": "!!!Hardware wallets store your private keys securely on a physical device so they are immune to common computer threats such as viruses and software bugs. Recovery phrases for hardware wallets should always be kept offline. By entering your hardware wallet recovery phrase in Daedalus, you expose your hardware wallet private keys to the security risks associated with computers and software.", - "description": "Label for the \"hardwareWalletDisclaimer1\" disclaimer.", - "end": { - "column": 3, - "line": 118 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.hardwareWalletDisclaimer1", - "start": { - "column": 29, - "line": 113 - } - }, - { - "defaultMessage": "!!!All of your assets held on your hardware wallet device are associated with the same wallet recovery phrase and its corresponding private key. If you hold assets other than ada on your hardware wallet device, you expose all of those assets to security risks.", - "description": "Label for the \"hardwareWalletDisclaimer2\" disclaimer.", - "end": { - "column": 3, - "line": 124 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.hardwareWalletDisclaimer2", - "start": { - "column": 29, - "line": 119 - } - }, - { - "defaultMessage": "!!!We strongly recommend that you delete the Byron legacy wallet that was restored from your hardware wallet once you have moved funds into a Shelley wallet.", - "description": "Label for the \"hardwareWalletDisclaimer3\" disclaimer.", - "end": { - "column": 3, - "line": 130 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.hardwareWalletDisclaimer3", - "start": { - "column": 29, - "line": 125 - } - }, - { - "defaultMessage": "!!!I understand and accept responsibility for the security concerns of restoring a hardware wallet on a computer.", - "description": "Label for the \"hardwareWalletCheckbox1\" disclaimer.", - "end": { - "column": 3, - "line": 136 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.hardwareWalletCheckbox1", - "start": { - "column": 27, - "line": 131 - } - }, - { - "defaultMessage": "!!!I understand that I should delete the Byron legacy wallet I am restoring from a hardware wallet after moving funds to a Shelley wallet.", - "description": "Label for the \"hardwareWalletCheckbox2\" disclaimer.", - "end": { - "column": 3, - "line": 142 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.hardwareWalletCheckbox2", - "start": { - "column": 27, - "line": 137 - } - }, - { - "defaultMessage": "!!!I understand that I am exposing all of the assets that are stored on my hardware wallet device, and not just ada, to security risks.", - "description": "Label for the \"hardwareWalletCheckbox2\" disclaimer.", - "end": { - "column": 3, - "line": 148 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.tsx", - "id": "wallet.restore.dialog.step.walletKind.hardwareWalletCheckbox3", - "start": { - "column": 27, - "line": 143 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/WalletTypeDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Are you sure?", - "description": "Headline for the wallet restoration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/ConfirmationDialog.tsx", - "id": "wallet.restore.dialog.confirmation.headline", - "start": { - "column": 12, - "line": 9 - } - }, - { - "defaultMessage": "!!!You haven’t submitted this information yet. If you close the window now, you will lose your progress and have to start again.", - "description": "Content for the wallet restoration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/ConfirmationDialog.tsx", - "id": "wallet.restore.dialog.confirmation.content", - "start": { - "column": 11, - "line": 15 - } - }, - { - "defaultMessage": "!!!Back to wallet restoration", - "description": "\"Cancel\" button label for the wallet restoration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/ConfirmationDialog.tsx", - "id": "wallet.restore.dialog.confirmation.button.cancelButtonLabel", - "start": { - "column": 21, - "line": 22 - } - }, - { - "defaultMessage": "!!!Close window", - "description": "\"Abort\" button label for the wallet restoration cancellation confirmation dialog.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/ConfirmationDialog.tsx", - "id": "wallet.restore.dialog.confirmation.button.confirmButtonLabel", - "start": { - "column": 22, - "line": 28 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/widgets/ConfirmationDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Restore a wallet", - "description": "Title \"Create a new wallet\" in the wallet restore form.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.title", - "start": { - "column": 15, - "line": 15 - } - }, - { - "defaultMessage": "!!!Restore a wallet", - "description": "Title \"Create a new wallet\" in the wallet restore form.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.titleSuccess", - "start": { - "column": 22, - "line": 20 - } - }, - { - "defaultMessage": "!!!Step {currentStep} of {totalSteps}", - "description": "Step counters in the wallet restore dialog.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.stepsCounter", - "start": { - "column": 16, - "line": 25 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Type", - "description": "Step \"Type\" in the wallet restore dialog.", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreSteps.tsx", - "id": "wallet.restore.dialog.typeStep", - "start": { - "column": 12, - "line": 13 - } - }, - { - "defaultMessage": "!!!Recovery Phrase", - "description": "Step \"Recovery Phrase\" in the wallet restore dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreSteps.tsx", - "id": "wallet.restore.dialog.mnemonicsStep", - "start": { - "column": 17, - "line": 18 - } - }, - { - "defaultMessage": "!!!Configuration", - "description": "Step \"Configuration\" in the wallet restore dialog.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreSteps.tsx", - "id": "wallet.restore.dialog.configurationStep", - "start": { - "column": 21, - "line": 23 - } - } - ], - "path": "source/renderer/app/components/wallet/wallet-restore/widgets/WalletRestoreSteps.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Add wallet", - "description": "Label for the \"Add wallet\" title on the wallet add dialog.", - "end": { - "column": 3, - "line": 19 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.title.label", - "start": { - "column": 9, - "line": 15 - } - }, - { - "defaultMessage": "!!!Create", - "description": "Label for the \"Create\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.create.label", - "start": { - "column": 15, - "line": 20 - } - }, - { - "defaultMessage": "!!!Create a new wallet", - "description": "Description for the \"Create a new wallet\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.create.description", - "start": { - "column": 21, - "line": 25 - } - }, - { - "defaultMessage": "!!!Join", - "description": "Label for the \"Join\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.join.label", - "start": { - "column": 13, - "line": 31 - } - }, - { - "defaultMessage": "!!!Join a shared wallet with up to 5 people", - "description": "Description for the \"Join\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.join.description", - "start": { - "column": 19, - "line": 36 - } - }, - { - "defaultMessage": "!!!Pair", - "description": "Label for the \"Connect\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.connect.label", - "start": { - "column": 16, - "line": 41 - } - }, - { - "defaultMessage": "!!!Pair a hardware wallet device", - "description": "Description for the \"Connect\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 51 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.connect.description", - "start": { - "column": 22, - "line": 46 - } - }, - { - "defaultMessage": "!!!Restore", - "description": "Label for the \"Restore\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 56 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.restore.label", - "start": { - "column": 16, - "line": 52 - } - }, - { - "defaultMessage": "!!!Restore a wallet or paper wallet using wallet recovery phrase", - "description": "Description for the \"Restore\" button with paper wallet certificate on the wallet add dialog.", - "end": { - "column": 3, - "line": 63 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.restore.withCertificate.description", - "start": { - "column": 37, - "line": 57 - } - }, - { - "defaultMessage": "!!!Restore wallet from backup", - "description": "Description for the \"Restore\" button without paper wallet certificate on the wallet add dialog.", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.restore.withoutCertificate.description", - "start": { - "column": 40, - "line": 64 - } - }, - { - "defaultMessage": "!!!Import", - "description": "Label for the \"Import\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.import.label", - "start": { - "column": 15, - "line": 70 - } - }, - { - "defaultMessage": "!!!Import wallets from an earlier version of Daedalus or the Daedalus state directory", - "description": "Description for the \"Import\" button on the wallet add dialog.", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.import.description", - "start": { - "column": 21, - "line": 75 - } - }, - { - "defaultMessage": "!!!Wallet restoration is currently in progress. Until it completes, it is not possible to restore or import new wallets.", - "description": "Restore notification message shown during async wallet restore on the wallet add screen.", - "end": { - "column": 3, - "line": 88 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.restoreNotificationMessage", - "start": { - "column": 30, - "line": 82 - } - }, - { - "defaultMessage": "!!!You have reached the maximum of 50 wallets.
No more wallets can be added.", - "description": "\"Maximum number of wallets reached\" notification message shown on the wallet add screen if user has 50 wallets.", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/wallet/WalletAdd.tsx", - "id": "wallet.add.dialog.maxNumberOfWalletsNotificationMessage", - "start": { - "column": 41, - "line": 89 - } - } - ], - "path": "source/renderer/app/components/wallet/WalletAdd.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Pair a hardware wallet device", - "description": "Title \"Connect a hardware wallet device\" in the connect wallet dialog.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.title", - "start": { - "column": 15, - "line": 38 - } - }, - { - "defaultMessage": "!!!Cancel", - "description": "Label for the \"Cancel\" button in the connect wallet dialog", - "end": { - "column": 3, - "line": 48 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.button.cancel", - "start": { - "column": 16, - "line": 44 - } - }, - { - "defaultMessage": "!!!

Daedalus currently supports Ledger Nano S, Ledger Nano X, and Trezor Model T hardware wallet devices.

If you are pairing your device with Daedalus for the first time, please follow the instructions below.

If you have already paired your device with Daedalus, you don’t need to repeat this step. Just connect your device when you need to confirm a transaction.

", - "description": "Follow instructions label", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.instructions", - "start": { - "column": 16, - "line": 49 - } - }, - { - "defaultMessage": "!!!

Daedalus currently supports only Trezor Model T hardware wallet devices.

If you are pairing your device with Daedalus for the first time, please follow the instructions below.

If you have already paired your device with Daedalus, you don’t need to repeat this step. Just connect your device when you need to confirm a transaction.

", - "description": "Follow instructions label", - "end": { - "column": 3, - "line": 60 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.instructionsTrezorOnly", - "start": { - "column": 26, - "line": 55 - } - }, - { - "defaultMessage": "!!!If you are experiencing issues pairing your hardware wallet device, please {supportLink}", - "description": "Connecting issue support description", - "end": { - "column": 3, - "line": 66 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.connectingIssueSupportLabel", - "start": { - "column": 31, - "line": 61 - } - }, - { - "defaultMessage": "!!!read the instructions.", - "description": "Connecting issue support link", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.connectingIssueSupportLink", - "start": { - "column": 30, - "line": 67 - } - }, - { - "defaultMessage": "https://support.ledger.com/hc/en-us/articles/115005165269", - "description": "Link to support article", - "end": { - "column": 3, - "line": 76 - }, - "file": "source/renderer/app/components/wallet/WalletConnectDialog.tsx", - "id": "wallet.connect.dialog.connectingIssueSupportLinkUrl", - "start": { - "column": 33, - "line": 72 - } - } - ], - "path": "source/renderer/app/components/wallet/WalletConnectDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Create a new wallet", - "description": "Title \"Create a new wallet\" in the wallet create form.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.title", - "start": { - "column": 15, - "line": 30 - } - }, - { - "defaultMessage": "!!!Wallet name", - "description": "Label for the \"Wallet Name\" text input in the wallet create form.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.name.label", - "start": { - "column": 14, - "line": 35 - } - }, - { - "defaultMessage": "!!!Enter wallet name", - "description": "Hint for the \"Wallet Name\" text input in the wallet create form.", - "end": { - "column": 3, - "line": 46 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.walletNameHint", - "start": { - "column": 18, - "line": 41 - } - }, - { - "defaultMessage": "!!!Create Shelley wallet", - "description": "Label for the \"Create Shelley wallet\" button on create wallet dialog.", - "end": { - "column": 3, - "line": 52 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.create.personal.wallet.button.label", - "start": { - "column": 24, - "line": 47 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Password creation label.", - "end": { - "column": 3, - "line": 57 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.passwordSectionLabel", - "start": { - "column": 24, - "line": 53 - } - }, - { - "defaultMessage": "!!!Keep your wallet secure by setting a spending password", - "description": "Password creation description.", - "end": { - "column": 3, - "line": 62 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.passwordSectionDescription", - "start": { - "column": 30, - "line": 58 - } - }, - { - "defaultMessage": "!!!Enter password", - "description": "Label for the \"Wallet password\" input in the create wallet dialog.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.spendingPasswordLabel", - "start": { - "column": 25, - "line": 63 - } - }, - { - "defaultMessage": "!!!Repeat password", - "description": "Label for the \"Repeat password\" input in the create wallet dialog.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.repeatPasswordLabel", - "start": { - "column": 23, - "line": 69 - } - }, - { - "defaultMessage": "!!!Password", - "description": "Placeholder for the \"Password\" inputs in the create wallet dialog.", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.create.dialog.passwordFieldPlaceholder", - "start": { - "column": 28, - "line": 75 - } - }, - { - "defaultMessage": "We recommend using a password manager app to manage and store your spending password. Generate a unique password using a password manager and paste it here. Passwords should never be reused.", - "description": "Tooltip for the password input in the wallet dialog.", - "end": { - "column": 3, - "line": 86 - }, - "file": "source/renderer/app/components/wallet/WalletCreateDialog.tsx", - "id": "wallet.dialog.passwordTooltip", - "start": { - "column": 19, - "line": 81 - } - } - ], - "path": "source/renderer/app/components/wallet/WalletCreateDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Restore a wallet", - "description": "Label \"Restore wallet\" on the wallet restore dialog.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.title.label", - "start": { - "column": 9, - "line": 43 - } - }, - { - "defaultMessage": "!!!Wallet name", - "description": "Label for the wallet name input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.wallet.name.input.label", - "start": { - "column": 24, - "line": 48 - } - }, - { - "defaultMessage": "!!!Name the wallet you are restoring", - "description": "Hint \"Name the wallet you are restoring\" for the wallet name input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 59 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.wallet.name.input.hint", - "start": { - "column": 23, - "line": 54 - } - }, - { - "defaultMessage": "!!!Number of words in the recovery phrase", - "description": "Label for the recovery phrase type options on the wallet restore dialog.", - "end": { - "column": 3, - "line": 65 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.type.options.label", - "start": { - "column": 27, - "line": 60 - } - }, - { - "defaultMessage": "!!! words", - "description": "Word for the recovery phrase type on the wallet restore dialog.", - "end": { - "column": 3, - "line": 71 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.type.word", - "start": { - "column": 32, - "line": 66 - } - }, - { - "defaultMessage": "!!!Rewards wallet", - "description": "Label for the recovery phrase type 15-word option on the wallet restore dialog.", - "end": { - "column": 3, - "line": 77 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.type.15word.option", - "start": { - "column": 34, - "line": 72 - } - }, - { - "defaultMessage": "!!!Balance wallet", - "description": "Label for the recovery phrase type 12-word option on the wallet restore dialog.", - "end": { - "column": 3, - "line": 83 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.type.12word.option", - "start": { - "column": 34, - "line": 78 - } - }, - { - "defaultMessage": "!!!Recovery phrase", - "description": "Label for the recovery phrase input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 89 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.input.label", - "start": { - "column": 28, - "line": 84 - } - }, - { - "defaultMessage": "!!!Enter recovery phrase", - "description": "Hint \"Enter recovery phrase\" for the recovery phrase input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 95 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.input.hint", - "start": { - "column": 27, - "line": 90 - } - }, - { - "defaultMessage": "!!!New", - "description": "Label \"new\" on the wallet restore dialog.", - "end": { - "column": 3, - "line": 100 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.newLabel", - "start": { - "column": 12, - "line": 96 - } - }, - { - "defaultMessage": "!!!No results", - "description": "\"No results\" message for the recovery phrase input search results.", - "end": { - "column": 3, - "line": 106 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.recovery.phrase.input.noResults", - "start": { - "column": 27, - "line": 101 - } - }, - { - "defaultMessage": "!!!Restore wallet", - "description": "Label for the \"Restore wallet\" button on the wallet restore dialog.", - "end": { - "column": 3, - "line": 112 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.restore.wallet.button.label", - "start": { - "column": 21, - "line": 107 - } - }, - { - "defaultMessage": "!!!Invalid recovery phrase", - "description": "Error message shown when invalid recovery phrase was entered.", - "end": { - "column": 3, - "line": 118 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.form.errors.invalidRecoveryPhrase", - "start": { - "column": 25, - "line": 113 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Password creation label.", - "end": { - "column": 3, - "line": 123 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.passwordSectionLabel", - "start": { - "column": 24, - "line": 119 - } - }, - { - "defaultMessage": "!!!Keep your wallet secure by setting the spending password", - "description": "Password creation description.", - "end": { - "column": 3, - "line": 129 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.passwordSectionDescription", - "start": { - "column": 30, - "line": 124 - } - }, - { - "defaultMessage": "!!!Enter password", - "description": "Label for the \"Wallet password\" input in the wallet restore dialog.", - "end": { - "column": 3, - "line": 135 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.spendingPasswordLabel", - "start": { - "column": 25, - "line": 130 - } - }, - { - "defaultMessage": "!!!Repeat password", - "description": "Label for the \"Repeat password\" input in the wallet restore dialog.", - "end": { - "column": 3, - "line": 141 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.repeatPasswordLabel", - "start": { - "column": 23, - "line": 136 - } - }, - { - "defaultMessage": "!!!Password", - "description": "Placeholder for the \"Password\" inputs in the wallet restore dialog.", - "end": { - "column": 3, - "line": 147 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.passwordFieldPlaceholder", - "start": { - "column": 28, - "line": 142 - } - }, - { - "defaultMessage": "!!!Daedalus wallet", - "description": "Tab title \"Daedalus wallet\" in the wallet restore dialog.", - "end": { - "column": 3, - "line": 152 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.tab.title.recoveryPhrase", - "start": { - "column": 26, - "line": 148 - } - }, - { - "defaultMessage": "!!!Daedalus paper wallet", - "description": "Tab title \"Daedalus paper wallet\" in the wallet restore dialog.", - "end": { - "column": 3, - "line": 158 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.tab.title.certificate", - "start": { - "column": 23, - "line": 153 - } - }, - { - "defaultMessage": "!!!Yoroi wallet", - "description": "Tab title \"Yoroi wallet\" in the wallet restore dialog.", - "end": { - "column": 3, - "line": 163 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.tab.title.yoroi", - "start": { - "column": 17, - "line": 159 - } - }, - { - "defaultMessage": "!!!27-word paper wallet recovery phrase", - "description": "Label for the shielded recovery phrase input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 169 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.label", - "start": { - "column": 36, - "line": 164 - } - }, - { - "defaultMessage": "!!!Enter your {numberOfWords}-word paper wallet recovery phrase", - "description": "Hint \"Enter your 27-word paper wallet recovery phrase.\" for the recovery phrase input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 176 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.hint", - "start": { - "column": 35, - "line": 170 - } - }, - { - "defaultMessage": "!!!Enter word #{wordNumber}", - "description": "Placeholder \"Enter word #\" for the recovery phrase input on the wallet restore dialog.", - "end": { - "column": 3, - "line": 182 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.shielded.recovery.phrase.input.placeholder", - "start": { - "column": 42, - "line": 177 - } - }, - { - "defaultMessage": "!!!Restore paper wallet", - "description": "Label for the \"Restore paper wallet\" button on the wallet restore dialog.", - "end": { - "column": 3, - "line": 188 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.restore.dialog.paper.wallet.button.label", - "start": { - "column": 33, - "line": 183 - } - }, - { - "defaultMessage": "We recommend using a password manager app to manage and store your spending password. Generate a unique password using a password manager and paste it here. Passwords should never be reused.", - "description": "Tooltip for the password input in the wallet dialog.", - "end": { - "column": 3, - "line": 194 - }, - "file": "source/renderer/app/components/wallet/WalletRestoreDialog.tsx", - "id": "wallet.dialog.passwordTooltip", - "start": { - "column": 19, - "line": 189 - } - } - ], - "path": "source/renderer/app/components/wallet/WalletRestoreDialog.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Back to top", - "description": "\"backToTop\" button label.", - "end": { - "column": 3, - "line": 12 - }, - "file": "source/renderer/app/components/widgets/BackToTopButton.tsx", - "id": "backToTopButton.label", - "start": { - "column": 18, - "line": 8 - } - } - ], - "path": "source/renderer/app/components/widgets/BackToTopButton.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!change", - "description": "Label \"change\" on inline editing inputs in inactive state.", - "end": { - "column": 3, - "line": 29 - }, - "file": "source/renderer/app/components/widgets/forms/InlineEditingInput.tsx", - "id": "inline.editing.input.change.label", - "start": { - "column": 10, - "line": 25 - } - }, - { - "defaultMessage": "!!!cancel", - "description": "Label \"cancel\" on inline editing inputs in inactive state.", - "end": { - "column": 3, - "line": 34 - }, - "file": "source/renderer/app/components/widgets/forms/InlineEditingInput.tsx", - "id": "inline.editing.input.cancel.label", - "start": { - "column": 10, - "line": 30 - } - }, - { - "defaultMessage": "!!!Your changes have been saved", - "description": "Message \"Your changes have been saved\" for inline editing (eg. on Profile Settings page).", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/widgets/forms/InlineEditingInput.tsx", - "id": "inline.editing.input.changesSaved", - "start": { - "column": 16, - "line": 35 - } - } - ], - "path": "source/renderer/app/components/widgets/forms/InlineEditingInput.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Syncing", - "description": "syncingLabel for ItemDropdownOption", - "end": { - "column": 3, - "line": 17 - }, - "file": "source/renderer/app/components/widgets/forms/ItemDropdownOption.tsx", - "id": "widgets.itemsDropdown.syncingLabel", - "start": { - "column": 16, - "line": 13 - } - }, - { - "defaultMessage": "!!!Syncing {syncingProgress}%", - "description": "syncingLabel for WalletsDropdown", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/components/widgets/forms/ItemDropdownOption.tsx", - "id": "widgets.itemsDropdown.syncingLabelProgress", - "start": { - "column": 24, - "line": 18 - } - } - ], - "path": "source/renderer/app/components/widgets/forms/ItemDropdownOption.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Language", - "description": "Label for the language select.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/components/widgets/forms/ProfileSettingsForm.tsx", - "id": "profile.settings.languageSelect.label", - "start": { - "column": 21, - "line": 21 - } - }, - { - "defaultMessage": "!!!Number format", - "description": "Label for the number select.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/components/widgets/forms/ProfileSettingsForm.tsx", - "id": "profile.settings.numberSelect.label", - "start": { - "column": 27, - "line": 26 - } - }, - { - "defaultMessage": "!!!Date format", - "description": "Label for the date select.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/components/widgets/forms/ProfileSettingsForm.tsx", - "id": "profile.settings.dateSelect.label", - "start": { - "column": 25, - "line": 31 - } - }, - { - "defaultMessage": "!!!Time format", - "description": "Label for the time select.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/components/widgets/forms/ProfileSettingsForm.tsx", - "id": "profile.settings.timeSelect.label", - "start": { - "column": 25, - "line": 36 - } - }, - { - "defaultMessage": "!!!Continue", - "description": "Label for the \"Language select\" form submit button.", - "end": { - "column": 3, - "line": 45 - }, - "file": "source/renderer/app/components/widgets/forms/ProfileSettingsForm.tsx", - "id": "profile.settings.submitLabel", - "start": { - "column": 15, - "line": 41 - } - } - ], - "path": "source/renderer/app/components/widgets/forms/ProfileSettingsForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Newsfeed", - "description": "Newsfeed", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/components/widgets/NewsFeedIcon.tsx", - "id": "news.newsfeed.iconTooltip", - "start": { - "column": 15, - "line": 20 - } - } - ], - "path": "source/renderer/app/components/widgets/NewsFeedIcon.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Blocks synced {percentage}%", - "description": "Label for the blocks synced info overlay on node sync status icon.", - "end": { - "column": 3, - "line": 18 - }, - "file": "source/renderer/app/components/widgets/NodeSyncStatusIcon.tsx", - "id": "cardano.node.sync.status.blocksSynced", - "start": { - "column": 16, - "line": 13 - } - } - ], - "path": "source/renderer/app/components/widgets/NodeSyncStatusIcon.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Cardano mainnet - Daedalus Flight", - "description": "Label for Daedalus Flight with version.", - "end": { - "column": 3, - "line": 11 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.daedalusFlightLabel", - "start": { - "column": 10, - "line": 7 - } - }, - { - "defaultMessage": "!!!Testnet vx", - "description": "Label for testnet with version.", - "end": { - "column": 3, - "line": 16 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.testnetLabel", - "start": { - "column": 11, - "line": 12 - } - }, - { - "defaultMessage": "!!!Staging vx", - "description": "Label for staging network with version.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.stagingLabel", - "start": { - "column": 11, - "line": 17 - } - }, - { - "defaultMessage": "!!!Shelley QA", - "description": "Label for shelley_qa with version.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.shelleyQaLabel", - "start": { - "column": 14, - "line": 22 - } - }, - { - "defaultMessage": "!!!Alonzo Purple", - "description": "Label for alonzo_purple with version.", - "end": { - "column": 3, - "line": 31 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.alonzoPurpleLabel", - "start": { - "column": 17, - "line": 27 - } - }, - { - "defaultMessage": "!!!Selfnode vx", - "description": "Label for selfnode with version.", - "end": { - "column": 3, - "line": 36 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.selfnodeLabel", - "start": { - "column": 12, - "line": 32 - } - }, - { - "defaultMessage": "!!!Development vx", - "description": "Label for development with version.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.tsx", - "id": "test.environment.developmentLabel", - "start": { - "column": 15, - "line": 37 - } - } - ], - "path": "source/renderer/app/components/widgets/WalletTestEnvironmentLabel.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Preparing logs for download", - "description": "Notification for download logs in progress in the Loading and Settings pages.", - "end": { - "column": 3, - "line": 24 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadLogsProgress", - "start": { - "column": 24, - "line": 19 - } - }, - { - "defaultMessage": "!!!Logs successfully downloaded", - "description": "Notification for download logs in the Loading and Settings pages.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadLogsSuccess", - "start": { - "column": 23, - "line": 25 - } - }, - { - "defaultMessage": "!!!CSV file successfully downloaded", - "description": "Notification for download Rewards CSV file.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadRewardsCSVSuccess", - "start": { - "column": 29, - "line": 31 - } - }, - { - "defaultMessage": "!!!CSV file successfully downloaded", - "description": "Notification for download Transactions CSV file.", - "end": { - "column": 3, - "line": 40 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadTransactionsCSVSuccess", - "start": { - "column": 34, - "line": 36 - } - }, - { - "defaultMessage": "!!!Public key: {publicKey} copied to clipboard", - "description": "Notification for the wallet public key copy success in the Wallet Settings page.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.copyWalletPublicKey", - "start": { - "column": 23, - "line": 41 - } - }, - { - "defaultMessage": "!!!ICO Public key: {publicKey} copied to clipboard", - "description": "Notification for the ICO public key copy success in the Wallet Settings page.", - "end": { - "column": 3, - "line": 54 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.copyICOPublicKey", - "start": { - "column": 20, - "line": 48 - } - }, - { - "defaultMessage": "!!!Address: {address} copied to clipboard", - "description": "Notification for the wallet address copy success in the Wallet Receive page.", - "end": { - "column": 3, - "line": 61 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.copyAddress", - "start": { - "column": 15, - "line": 55 - } - }, - { - "defaultMessage": "!!!{param}: {shortValue} copied to clipboard", - "description": "Notification for the wallet assetItem copy success in the Wallet Receive page.", - "end": { - "column": 3, - "line": 68 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.copyAssetParam", - "start": { - "column": 18, - "line": 62 - } - }, - { - "defaultMessage": "!!!Address: {walletAddress} PDF successfully downloaded", - "description": "Notification for the wallet address PDF download success in the Wallet Receive page.", - "end": { - "column": 3, - "line": 75 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadAddressPDFSuccess", - "start": { - "column": 29, - "line": 69 - } - }, - { - "defaultMessage": "!!!PDF successfully downloaded", - "description": "Notification for the wallet voting PDF download success in the Voting Registration dialog.", - "end": { - "column": 3, - "line": 81 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadVotingPDFSuccess", - "start": { - "column": 28, - "line": 76 - } - }, - { - "defaultMessage": "!!!Address: {walletAddress} QR code image successfully downloaded", - "description": "Notification for the wallet address PDF download success in the Wallet Receive page.", - "end": { - "column": 3, - "line": 88 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.downloadQRCodeImageSuccess", - "start": { - "column": 30, - "line": 82 - } - }, - { - "defaultMessage": "!!!Daedalus state directory copied to clipboard", - "description": "Notification for the state directory copy success in the Diagnostics page.", - "end": { - "column": 3, - "line": 94 - }, - "file": "source/renderer/app/containers/notifications/NotificationsContainer.tsx", - "id": "notification.copyStateDirectoryPath", - "start": { - "column": 26, - "line": 89 - } - } - ], - "path": "source/renderer/app/containers/notifications/NotificationsContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/requests/new/", - "description": "\"submit a support request\" link URL in the \"Report a problem\" section on the support settings page.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/containers/settings/categories/SupportSettingsPage.tsx", - "id": "settings.support.reportProblem.linkUrl", - "start": { - "column": 25, - "line": 10 - } - } - ], - "path": "source/renderer/app/containers/settings/categories/SupportSettingsPage.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc/en-us/", - "description": "\"Learn more\" link URL on the delegation setup \"intro\" dialog.", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/containers/staking/dialogs/DelegationSetupWizardDialogContainer.tsx", - "id": "staking.delegationSetup.intro.step.dialog.learnMore.url", - "start": { - "column": 20, - "line": 17 - } - }, - { - "defaultMessage": "!!!Wallet", - "description": "Step 1 label text on delegation steps dialog.", - "end": { - "column": 3, - "line": 27 - }, - "file": "source/renderer/app/containers/staking/dialogs/DelegationSetupWizardDialogContainer.tsx", - "id": "staking.delegationSetup.steps.step.1.label", - "start": { - "column": 29, - "line": 23 - } - }, - { - "defaultMessage": "!!!Stake pool", - "description": "Step 2 label text on delegation steps dialog.", - "end": { - "column": 3, - "line": 32 - }, - "file": "source/renderer/app/containers/staking/dialogs/DelegationSetupWizardDialogContainer.tsx", - "id": "staking.delegationSetup.steps.step.2.label", - "start": { - "column": 29, - "line": 28 - } - }, - { - "defaultMessage": "!!!Confirmation", - "description": "Step 3 label text on delegation steps dialog.", - "end": { - "column": 3, - "line": 37 - }, - "file": "source/renderer/app/containers/staking/dialogs/DelegationSetupWizardDialogContainer.tsx", - "id": "staking.delegationSetup.steps.step.3.label", - "start": { - "column": 29, - "line": 33 - } - } - ], - "path": "source/renderer/app/containers/staking/dialogs/DelegationSetupWizardDialogContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!This wallet does not contain the minimum amount of {calculatedMinRewardsReceiverBalance} ADA which is required to cover the necessary transaction fees. Please select a wallet with a minimum amount of {calculatedMinRewardsReceiverBalance} ADA and click continue.", - "description": "errorMinRewardFunds Error Label on the delegation setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/containers/staking/dialogs/redeem-itn-rewards/Step1ConfigurationContainer.tsx", - "id": "staking.redeemItnRewards.step1.errorMessage", - "start": { - "column": 23, - "line": 17 - } - }, - { - "defaultMessage": "!!!This wallet can’t be used for rewards redemption while it’s being synced.", - "description": "RestoringWallet Error Label on the rewards redemption setup \"choose wallet\" step dialog.", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/containers/staking/dialogs/redeem-itn-rewards/Step1ConfigurationContainer.tsx", - "id": "staking.redeemItnRewards.step1.errorRestoringWallet", - "start": { - "column": 24, - "line": 24 - } - } - ], - "path": "source/renderer/app/containers/staking/dialogs/redeem-itn-rewards/Step1ConfigurationContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!https://iohk.zendesk.com/hc", - "description": "\"Learn more\" link URL in the staking countdown page", - "end": { - "column": 3, - "line": 12 - }, - "file": "source/renderer/app/containers/staking/StakingCountdownPage.tsx", - "id": "staking.countdown.learnMore.linkUrl", - "start": { - "column": 20, - "line": 8 - } - } - ], - "path": "source/renderer/app/containers/staking/StakingCountdownPage.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!https://staking.cardano.org/", - "description": "\"Learn more\" link URL in the staking rewards page", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/containers/staking/StakingRewardsPage.tsx", - "id": "staking.rewards.learnMore.linkUrl", - "start": { - "column": 20, - "line": 10 - } - } - ], - "path": "source/renderer/app/containers/staking/StakingRewardsPage.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet", - "description": "Step 1 label text on voting registration.", - "end": { - "column": 3, - "line": 23 - }, - "file": "source/renderer/app/containers/voting/dialogs/VotingRegistrationDialogContainer.tsx", - "id": "voting.votingRegistration.steps.step.1.label", - "start": { - "column": 32, - "line": 19 - } - }, - { - "defaultMessage": "!!!Register", - "description": "Step 2 label text on voting registration.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/containers/voting/dialogs/VotingRegistrationDialogContainer.tsx", - "id": "voting.votingRegistration.steps.step.2.label", - "start": { - "column": 32, - "line": 24 - } - }, - { - "defaultMessage": "!!!Confirm", - "description": "Step 3 label text on voting registration.", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/containers/voting/dialogs/VotingRegistrationDialogContainer.tsx", - "id": "voting.votingRegistration.steps.step.3.label", - "start": { - "column": 32, - "line": 29 - } - }, - { - "defaultMessage": "!!!PIN", - "description": "Step 4 label text on voting registration.", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/containers/voting/dialogs/VotingRegistrationDialogContainer.tsx", - "id": "voting.votingRegistration.steps.step.4.label", - "start": { - "column": 32, - "line": 34 - } - }, - { - "defaultMessage": "QR code", - "description": "Step 5 label text on voting registration.", - "end": { - "column": 3, - "line": 43 - }, - "file": "source/renderer/app/containers/voting/dialogs/VotingRegistrationDialogContainer.tsx", - "id": "voting.votingRegistration.steps.step.5.label", - "start": { - "column": 32, - "line": 39 - } - } - ], - "path": "source/renderer/app/containers/voting/dialogs/VotingRegistrationDialogContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Confirm transaction", - "description": "Title for the \"Confirm transaction\" dialog.", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.title", - "start": { - "column": 15, - "line": 5 - } - }, - { - "defaultMessage": "!!!Spending password", - "description": "Label for the \"Spending password\" input in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.passphraseLabel", - "start": { - "column": 19, - "line": 10 - } - }, - { - "defaultMessage": "!!!Type your spending password", - "description": "Placeholder for the \"Spending password\" inputs in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 21 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.passphraseFieldPlaceholder", - "start": { - "column": 30, - "line": 16 - } - }, - { - "defaultMessage": "!!!{Warning}, flight candidate versions of Daedalus are connected to Cardano mainnet. If you confirm this transaction, your ada will be sent for real.", - "description": "Text for the \"Flight candidate\" warning in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 28 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.flightCandidateWarning", - "start": { - "column": 26, - "line": 22 - } - }, - { - "defaultMessage": "!!!I understand that real ada will be moved as part of this transaction and that this action is irreversible.", - "description": "Label for the \"Flight candidate\" warning checkbox in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 35 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.flightCandidateCheckboxLabel", - "start": { - "column": 32, - "line": 29 - } - }, - { - "defaultMessage": "!!!Send", - "description": "Label for the send button in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 41 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.submit", - "start": { - "column": 19, - "line": 36 - } - }, - { - "defaultMessage": "!!!Back", - "description": "Label for the back button in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 47 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.back", - "start": { - "column": 19, - "line": 42 - } - }, - { - "defaultMessage": "!!!Warning: This transaction will reduce your wallet's balance to less than 2 ada. Your wallet's balance should always be over 2 ada to spend future staking rewards.", - "description": "Warning: This transaction will reduce your wallet's balance", - "end": { - "column": 3, - "line": 53 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.emptyingWarning", - "start": { - "column": 19, - "line": 48 - } - }, - { - "defaultMessage": "!!!To", - "description": "Label for the \"To\" in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 58 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.addressToLabel", - "start": { - "column": 18, - "line": 54 - } - }, - { - "defaultMessage": "!!!Amount", - "description": "Label for the \"Amount\" in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 64 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.amountLabel", - "start": { - "column": 15, - "line": 59 - } - }, - { - "defaultMessage": "!!!Token", - "description": "Token", - "end": { - "column": 3, - "line": 69 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.assetLabel", - "start": { - "column": 14, - "line": 65 - } - }, - { - "defaultMessage": "!!!Transaction fee", - "description": "Label for the \"Fees\" in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 74 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.feesLabel", - "start": { - "column": 13, - "line": 70 - } - }, - { - "defaultMessage": "!!!Total", - "description": "Label for the \"Total\" in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 80 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.totalLabel", - "start": { - "column": 14, - "line": 75 - } - }, - { - "defaultMessage": "!!!Receiver", - "description": "Label for the \"Receiver\" in the wallet send confirmation dialog.", - "end": { - "column": 3, - "line": 86 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.receiver.label", - "start": { - "column": 17, - "line": 81 - } - }, - { - "defaultMessage": "!!!unformatted amount", - "description": "Label for \"unformatted amount\"", - "end": { - "column": 3, - "line": 91 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.unformattedAmountLabel", - "start": { - "column": 26, - "line": 87 - } - }, - { - "defaultMessage": "!!!Native assets may specify a number of decimal places, as defined in the Cardano token registry. Daedalus uses this information to format the amount that is being sent in the transaction.

The native token unformatted amount is the amount without these decimal places. Please ensure that you verify both amounts, as some wallet software may not yet use the Cardano token registry.", - "description": "Message for \"unformatted amount\"", - "end": { - "column": 3, - "line": 98 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.unformattedAmountMessageForSoftwareWallets", - "start": { - "column": 46, - "line": 92 - } - }, - { - "defaultMessage": "!!!Native assets may specify a number of decimal places, as defined in the Cardano token registry. Daedalus uses this information to format the amount that is being sent in the transaction.

The native token unformatted amount is the amount without these decimal places. Please ensure that you verify both amounts, as some wallet software may not yet use the Cardano token registry.

The native token unformatted amount will be displayed on the hardware wallet device during transaction confirmation.", - "description": "Message for \"unformatted amount\"", - "end": { - "column": 3, - "line": 105 - }, - "file": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.ts", - "id": "wallet.send.confirmationDialog.unformattedAmountMessageForHardwareWallets", - "start": { - "column": 46, - "line": 99 - } - } - ], - "path": "source/renderer/app/containers/wallet/dialogs/send-confirmation/messages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delete Wallet", - "description": "Title for the \"Delete wallet\" dialog.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/DeleteWalletDialogContainer.tsx", - "id": "wallet.settings.delete.dialog.title", - "start": { - "column": 15, - "line": 10 - } - }, - { - "defaultMessage": "!!!Delete", - "description": "Label for the \"Delete (x)\" button in the delete wallet dialog.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/DeleteWalletDialogContainer.tsx", - "id": "wallet.settings.delete.dialog.confirmButtonLabel", - "start": { - "column": 22, - "line": 15 - } - }, - { - "defaultMessage": "!!!Do you really want to delete {walletName} wallet?", - "description": "Question if the user really wants to delete the wallet.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/DeleteWalletDialogContainer.tsx", - "id": "wallet.settings.delete.dialog.confirmationQuestion", - "start": { - "column": 24, - "line": 21 - } - }, - { - "defaultMessage": "!!!Make sure you have access to backup before continuing. Otherwise, you will lose all your funds connected to this wallet.", - "description": "Notice to confirm if the user has made a backup of his wallet", - "end": { - "column": 3, - "line": 33 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/DeleteWalletDialogContainer.tsx", - "id": "wallet.settings.delete.dialog.confirmBackupNotice", - "start": { - "column": 23, - "line": 27 - } - }, - { - "defaultMessage": "!!!Enter the name of the wallet to confirm deletion:", - "description": "Instruction for recovery word on delete wallet dialog", - "end": { - "column": 3, - "line": 38 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/DeleteWalletDialogContainer.tsx", - "id": "wallet.settings.delete.dialog.enterRecoveryWordLabel", - "start": { - "column": 26, - "line": 34 - } - } - ], - "path": "source/renderer/app/containers/wallet/dialogs/settings/DeleteWalletDialogContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Wallet Public Key", - "description": "Title for the \"Wallet Public Key QR Code\" dialog.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/PublicKeyQRCodeDialogContainer.tsx", - "id": "wallet.settings.walletPublicKey", - "start": { - "column": 15, - "line": 16 - } - }, - { - "defaultMessage": "!!!Copy public key", - "description": "Copy public key label.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/PublicKeyQRCodeDialogContainer.tsx", - "id": "wallet.settings.copyWalletPublicKey", - "start": { - "column": 22, - "line": 21 - } - }, - { - "defaultMessage": "!!!Derivation path", - "description": "Tooltip for the derivation path", - "end": { - "column": 3, - "line": 30 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/PublicKeyQRCodeDialogContainer.tsx", - "id": "wallet.settings.dialog.derivationPathTooltip", - "start": { - "column": 25, - "line": 26 - } - } - ], - "path": "source/renderer/app/containers/wallet/dialogs/settings/PublicKeyQRCodeDialogContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Unpair Wallet", - "description": "Title for the \"Unpair wallet\" dialog.", - "end": { - "column": 3, - "line": 14 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/UnpairWalletDialogContainer.tsx", - "id": "wallet.settings.unpair.dialog.title", - "start": { - "column": 15, - "line": 10 - } - }, - { - "defaultMessage": "!!!Delete", - "description": "Label for the \"Unpair (x)\" button in the unpair wallet dialog.", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/UnpairWalletDialogContainer.tsx", - "id": "wallet.settings.unpair.dialog.confirmButtonLabel", - "start": { - "column": 22, - "line": 15 - } - }, - { - "defaultMessage": "!!!Do you really want to unpair {walletName} wallet?", - "description": "Question if the user really wants to unpair the wallet.", - "end": { - "column": 3, - "line": 26 - }, - "file": "source/renderer/app/containers/wallet/dialogs/settings/UnpairWalletDialogContainer.tsx", - "id": "wallet.settings.unpair.dialog.confirmationQuestion", - "start": { - "column": 24, - "line": 21 - } - } - ], - "path": "source/renderer/app/containers/wallet/dialogs/settings/UnpairWalletDialogContainer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Address", - "description": "\"Address\" word in the Address PDF export", - "end": { - "column": 3, - "line": 22 - }, - "file": "source/renderer/app/containers/wallet/WalletReceivePage.tsx", - "id": "wallet.receive.pdf.filenamePrefix", - "start": { - "column": 11, - "line": 18 - } - } - ], - "path": "source/renderer/app/containers/wallet/WalletReceivePage.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!No recent transactions", - "description": "Message shown when wallet has no transactions on wallet summary page.", - "end": { - "column": 3, - "line": 25 - }, - "file": "source/renderer/app/containers/wallet/WalletSummaryPage.tsx", - "id": "wallet.summary.page.no.transactions", - "start": { - "column": 18, - "line": 20 - } - } - ], - "path": "source/renderer/app/containers/wallet/WalletSummaryPage.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Toggle discreet mode on.", - "description": "Text for the tooltip on \"discreet mode\" button when mode is on", - "end": { - "column": 3, - "line": 9 - }, - "file": "source/renderer/app/features/discreet-mode/ui/discreet-toggle-top-bar/DiscreetToggleTopBar.messages.ts", - "id": "discreetMode.discreetToggle.on", - "start": { - "column": 6, - "line": 4 - } - }, - { - "defaultMessage": "!!!Toggle discreet mode off.", - "description": "Text for the tooltip on \"discreet mode\" button when mode is off", - "end": { - "column": 3, - "line": 15 - }, - "file": "source/renderer/app/features/discreet-mode/ui/discreet-toggle-top-bar/DiscreetToggleTopBar.messages.ts", - "id": "discreetMode.discreetToggle.off", - "start": { - "column": 7, - "line": 10 - } - }, - { - "defaultMessage": "!!!You can toggle auto discreet mode in Settings.", - "description": "Text for the tooltip on \"discreet mode\" button description", - "end": { - "column": 3, - "line": 20 - }, - "file": "source/renderer/app/features/discreet-mode/ui/discreet-toggle-top-bar/DiscreetToggleTopBar.messages.ts", - "id": "discreetMode.discreetToggle.description", - "start": { - "column": 15, - "line": 16 - } - } - ], - "path": "source/renderer/app/features/discreet-mode/ui/discreet-toggle-top-bar/DiscreetToggleTopBar.messages.json" -======= "path": "source/renderer/app/api/errors.ts" ->>>>>>> origin/develop }, { "descriptors": [ @@ -20868,6 +2614,156 @@ ], "path": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx" }, + { + "descriptors": [ + { + "defaultMessage": "!!!Analytics data collection", + "description": "Analytics form title", + "id": "analytics.form.title" + }, + { + "defaultMessage": "!!!Help and support", + "description": "Title \"Help and support\" on the support settings page.", + "id": "settings.support.faq.title" + }, + { + "defaultMessage": "!!!If you are experiencing a problem, please look for guidance using the list of {faqLink} on the support pages. If you can’t find a solution, please submit a support ticket.", + "description": "Content for the \"Help and support\" section on the support settings page.", + "id": "settings.support.faq.content" + }, + { + "defaultMessage": "!!!Known Issues", + "description": "\"Known Issues\" link in the \"Help and support\" section on the support settings page", + "id": "settings.support.faq.faqLink" + }, + { + "defaultMessage": "!!!Steps for creating a support request:", + "description": "Title \"Steps for creating a support request\" on the support settings page.", + "id": "settings.support.steps.title" + }, + { + "defaultMessage": "!!!Download the logs", + "description": "Title \"Download the logs\" on the support settings page.", + "id": "settings.support.steps.downloadLogs.title" + }, + { + "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", + "description": "Description of \"Download the logs\" on the support settings page.", + "id": "settings.support.steps.downloadLogs.description" + }, + { + "defaultMessage": "!!!download your logs here", + "description": "\"download your logs here\" link in the Logs section on the support settings page", + "id": "settings.support.steps.downloadLogs.link" + }, + { + "defaultMessage": "!!!Report a problem", + "description": "Title \"Report a problem\" on the support settings page.", + "id": "settings.support.steps.reportProblem.title" + }, + { + "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", + "description": "Description of \"Download the logs\" on the support settings page.", + "id": "settings.support.steps.reportProblem.description" + }, + { + "defaultMessage": "!!!download your logs here", + "description": "\"download your logs here\" link in the Logs section on the support settings page", + "id": "settings.support.steps.reportProblem.link" + }, + { + "defaultMessage": "!!!You have opted in to analytics data collection. You can {changeAnalyticsSettingsLink}.", + "description": "Analytics data collection description when user opted in", + "id": "analytics.form.analyticsAcceptedDescription" + }, + { + "defaultMessage": "!!!You have opted out of analytics data collection. You can {changeAnalyticsSettingsLink}.", + "description": "Analytics data collection description when user opted out ", + "id": "analytics.form.analyticsDeclinedDescription" + }, + { + "defaultMessage": "!!!change this setting here", + "description": "Change analytics settings link text", + "id": "analytics.form.changeAnalyticsSettingsLink" + } + ], + "path": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Analytic data is used for product development purposes only.", + "description": "Analytics data collection description", + "id": "analytics.form.description" + }, + { + "defaultMessage": "!!!Allow anonymous data collection", + "description": "Data collection agreement switch button label", + "id": "analytics.form.dataCollectionSwitchText" + }, + { + "defaultMessage": "!!!Allow", + "description": "Analytics data collection allow button text", + "id": "analytics.form.allowButton" + }, + { + "defaultMessage": "!!!Skip", + "description": "Analytics data collection skip button text", + "id": "analytics.dialog.skipButton" + }, + { + "defaultMessage": "!!!Daedalus Privacy Policy", + "description": "Daedalus Privacy Policy link text", + "id": "analytics.form.privacyPolicyLink" + }, + { + "defaultMessage": "!!!Read more about our privacy practices in the {privacyPolicyLink}.", + "description": "Analytics data collection description, under collapsible details", + "id": "analytics.form.analyticsSectionPrivacyPolicy" + } + ], + "path": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!We collect data on (1) User click behavior and (2) Device information.", + "description": "Data collection details title", + "id": "analytics.form.dataCollectionDetailsTitle" + }, + { + "defaultMessage": "!!!User click behavior", + "description": "Title for the user behaviour data collection", + "id": "analytics.form.dataCollectionDetailsUserBehaviourTitle" + }, + { + "defaultMessage": "!!!Clicks, page visits, page scrolling, number of wallets, number of native assets, session duration, type of wallets (soft vs hardware wallets), geolocation (country of location), and page performance.", + "description": "Description for the user behaviour data collection", + "id": "analytics.form.dataCollectionDetailsUserBehaviorText" + }, + { + "defaultMessage": "!!!Device info", + "description": "Title for the device info data collection", + "id": "analytics.form.dataCollectionDetailsDeviceInfoTitle" + }, + { + "defaultMessage": "!!!Operating system, RAM, and disk space.", + "description": "Description for the device info data collection", + "id": "analytics.form.dataCollectionDetailsDeviceInfoText" + }, + { + "defaultMessage": "!!!Expand details", + "description": "Expand details button", + "id": "analytics.dialog.expandButton" + }, + { + "defaultMessage": "!!!Collapse details", + "description": "Collapse details button", + "id": "analytics.dialog.collapseButton" + } + ], + "path": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts" + }, { "descriptors": [ { @@ -21108,61 +3004,6 @@ ], "path": "source/renderer/app/components/widgets/forms/InlineEditingInput.tsx" }, - { - "descriptors": [ - { - "defaultMessage": "!!!Help and support", - "description": "Title \"Help and support\" on the support settings page.", - "id": "settings.support.faq.title" - }, - { - "defaultMessage": "!!!If you are experiencing a problem, please look for guidance using the list of {faqLink} on the support pages. If you can’t find a solution, please submit a support ticket.", - "description": "Content for the \"Help and support\" section on the support settings page.", - "id": "settings.support.faq.content" - }, - { - "defaultMessage": "!!!Known Issues", - "description": "\"Known Issues\" link in the \"Help and support\" section on the support settings page", - "id": "settings.support.faq.faqLink" - }, - { - "defaultMessage": "!!!Steps for creating a support request:", - "description": "Title \"Steps for creating a support request\" on the support settings page.", - "id": "settings.support.steps.title" - }, - { - "defaultMessage": "!!!Download the logs", - "description": "Title \"Download the logs\" on the support settings page.", - "id": "settings.support.steps.downloadLogs.title" - }, - { - "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", - "description": "Description of \"Download the logs\" on the support settings page.", - "id": "settings.support.steps.downloadLogs.description" - }, - { - "defaultMessage": "!!!download your logs here", - "description": "\"download your logs here\" link in the Logs section on the support settings page", - "id": "settings.support.steps.downloadLogs.link" - }, - { - "defaultMessage": "!!!Report a problem", - "description": "Title \"Report a problem\" on the support settings page.", - "id": "settings.support.steps.reportProblem.title" - }, - { - "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", - "description": "Description of \"Download the logs\" on the support settings page.", - "id": "settings.support.steps.reportProblem.description" - }, - { - "defaultMessage": "!!!download your logs here", - "description": "\"download your logs here\" link in the Logs section on the support settings page", - "id": "settings.support.steps.reportProblem.link" - } - ], - "path": "source/renderer/app/components/settings/categories/SupportSettings.tsx" - }, { "descriptors": [ { diff --git a/source/renderer/app/i18n/locales/en-US.json b/source/renderer/app/i18n/locales/en-US.json index 7a845bbd2d..a60fd83329 100755 --- a/source/renderer/app/i18n/locales/en-US.json +++ b/source/renderer/app/i18n/locales/en-US.json @@ -1,4 +1,6 @@ { + "ImageUploadWidget.clickToUploadLabel": "!!!or click to upload", + "ImageUploadWidget.dropFileHint": "!!!Drop file here", "analytics.dialog.collapseButton": "Collapse details", "analytics.dialog.expandButton": "Expand details", "analytics.dialog.skipButton": "Skip", @@ -16,8 +18,6 @@ "analytics.form.description": "All data is anonymous and is used only for product development purposes.", "analytics.form.privacyPolicyLink": "Daedalus Privacy Policy", "analytics.form.title": "Analytics data collection", - "ImageUploadWidget.clickToUploadLabel": "!!!or click to upload", - "ImageUploadWidget.dropFileHint": "!!!Drop file here", "api.errors.ApiMethodNotYetImplementedError": "This API method is not yet implemented.", "api.errors.CanNotCalculateTransactionFeesError": "Cannot calculate fees while there are pending transactions.", "api.errors.ForbiddenMnemonicError": "Invalid recovery phrase. Submitted recovery phrase is one of the example recovery phrases from the documentation and should not be used for wallets holding funds.", @@ -1344,4 +1344,4 @@ "wallet.transferFunds.dialog2.total.label": "Total", "widgets.itemsDropdown.syncingLabel": "Syncing", "widgets.itemsDropdown.syncingLabelProgress": "Syncing {syncingProgress}%" -} +} \ No newline at end of file diff --git a/source/renderer/app/i18n/locales/ja-JP.json b/source/renderer/app/i18n/locales/ja-JP.json index 4956f8e86d..813a3feb91 100755 --- a/source/renderer/app/i18n/locales/ja-JP.json +++ b/source/renderer/app/i18n/locales/ja-JP.json @@ -1,4 +1,6 @@ { + "ImageUploadWidget.clickToUploadLabel": "!!!or click to upload", + "ImageUploadWidget.dropFileHint": "!!!Drop file here", "analytics.dialog.collapseButton": "詳細を隠す", "analytics.dialog.expandButton": "詳細を表示する", "analytics.dialog.skipButton": "スキップする", @@ -16,8 +18,6 @@ "analytics.form.description": "分析データは、製品開発の目的でのみ使用されます。", "analytics.form.privacyPolicyLink": "Daedalusプライバシーポリシー", "analytics.form.title": "分析データの収集", - "ImageUploadWidget.clickToUploadLabel": "!!!or click to upload", - "ImageUploadWidget.dropFileHint": "!!!Drop file here", "api.errors.ApiMethodNotYetImplementedError": "このAPIはまだ実装されていません。", "api.errors.CanNotCalculateTransactionFeesError": "処理中のトランザクションがあるため、手数料を計算できません。", "api.errors.ForbiddenMnemonicError": "ウォレットの復元フレーズが無効です。送信された復元フレーズは参照用復元フレーズ例の1つです。資金を保有しているウォレットには使用できません。", @@ -1344,4 +1344,4 @@ "wallet.transferFunds.dialog2.total.label": "合計", "widgets.itemsDropdown.syncingLabel": "同期", "widgets.itemsDropdown.syncingLabelProgress": "同期中 {syncingProgress}%" -} +} \ No newline at end of file diff --git a/source/renderer/app/index.tsx b/source/renderer/app/index.tsx index 1dd930ec81..9066f8b813 100755 --- a/source/renderer/app/index.tsx +++ b/source/renderer/app/index.tsx @@ -7,7 +7,7 @@ import ja from 'react-intl/locale-data/ja'; import { createHashHistory } from 'history'; import { RouterStore, syncHistoryWithStore } from 'mobx-react-router'; import App from './App'; -import setupStores from './stores'; +import { setUpStores } from './stores'; import actions from './actions'; import utils from './utils'; import Action from './actions/lib/Action'; @@ -20,6 +20,7 @@ import { DiscreetModeFeatureProvider, LocalStorageFeatureProvider, } from './features'; +import { AnalyticsTracker } from './analytics'; // run MobX in strict mode configure({ enforceActions: 'always', @@ -34,7 +35,8 @@ const initializeDaedalus = () => { const api = setupApi(isTest); const hashHistory = createHashHistory(); const routingStore = new RouterStore(); - const stores = setupStores(api, actions, routingStore); + const analyticsTracker = new AnalyticsTracker(environment, api.localStorage); + const stores = setUpStores(api, actions, routingStore, analyticsTracker); const history = syncHistoryWithStore(hashHistory, routingStore); // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message window.daedalus = { @@ -46,7 +48,7 @@ const initializeDaedalus = () => { translations, reset: action(() => { Action.resetAllActions(); - setupStores(api, actions, routingStore); + setUpStores(api, actions, routingStore, analyticsTracker); }), }; const rootElement = document.getElementById('root'); @@ -54,7 +56,12 @@ const initializeDaedalus = () => { render( - + , rootElement diff --git a/source/renderer/app/stores/AnalyticsStore.ts b/source/renderer/app/stores/AnalyticsStore.ts deleted file mode 100644 index 7424eac1dc..0000000000 --- a/source/renderer/app/stores/AnalyticsStore.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { observable, runInAction } from 'mobx'; -import Store from './lib/Store'; -import { AnalyticsClient, getAnalyticsClient } from '../analytics'; - -export default class AnalyticsStore extends Store { - @observable - analyticsClient: AnalyticsClient; - - setup() { - this.resetAnalyticsClient(); - } - - resetAnalyticsClient = async (): Promise => { - const client = await getAnalyticsClient(this.api.localStorage, environment); - - runInAction(() => { - this.analyticsClient = client; - }); - }; -} diff --git a/source/renderer/app/stores/SidebarStore.spec.ts b/source/renderer/app/stores/SidebarStore.spec.ts index ad1ba96246..ec44327e58 100644 --- a/source/renderer/app/stores/SidebarStore.spec.ts +++ b/source/renderer/app/stores/SidebarStore.spec.ts @@ -11,6 +11,7 @@ describe('Sidebar Store', () => { localStorage: jest.fn(), } as any; const actions: ActionsMap = jest.fn() as any; + const analyticsTrackerMock = jest.fn() as any; function setupStore({ wallets, @@ -22,7 +23,7 @@ describe('Sidebar Store', () => { isLegacy?: boolean; }>; }) { - const sidebarStore = new SidebarStore(api, actions); + const sidebarStore = new SidebarStore(api, actions, analyticsTrackerMock); sidebarStore.stores = { wallets: { all: wallets, diff --git a/source/renderer/app/stores/VotingStore.spec.ts b/source/renderer/app/stores/VotingStore.spec.ts index 89d0fb292b..88c99c54fa 100644 --- a/source/renderer/app/stores/VotingStore.spec.ts +++ b/source/renderer/app/stores/VotingStore.spec.ts @@ -17,6 +17,8 @@ describe('VotingStore', () => { ada: jest.fn(), } as any; const actions: ActionsMap = jest.fn() as any; + const analyticsTrackerMock = jest.fn() as any; + const cases = [ [undefined, null], [ @@ -40,7 +42,7 @@ describe('VotingStore', () => { ], [mockFundInfo.current.resultsTime, FundPhase.RESULTS], ]; - const votingStore = new VotingStore(api, actions); + const votingStore = new VotingStore(api, actions, analyticsTrackerMock); beforeAll(() => { votingStore.catalystFund = mockFundInfo as CatalystFund; diff --git a/source/renderer/app/stores/index.ts b/source/renderer/app/stores/index.ts index 4ce9ec261d..56a5e6e958 100644 --- a/source/renderer/app/stores/index.ts +++ b/source/renderer/app/stores/index.ts @@ -24,10 +24,11 @@ import WalletSettingsStore from './WalletSettingsStore'; import WalletsLocalStore from './WalletsLocalStore'; import WalletsStore from './WalletsStore'; import WindowStore from './WindowStore'; -import AnalyticsStore from './AnalyticsStore'; +import { AnalyticsTracker } from '../analytics'; +import { Api } from '../api'; +import { ActionsMap } from '../actions'; export const storeClasses = { - analytics: AnalyticsStore, addresses: AddressesStore, app: AppStore, appUpdate: AppUpdateStore, @@ -51,7 +52,6 @@ export const storeClasses = { window: WindowStore, }; export type StoresMap = { - analytics: AnalyticsStore; addresses: AddressesStore; app: AppStore; appUpdate: AppUpdateStore; @@ -85,12 +85,17 @@ function executeOnEveryStore(fn: (store: Store) => void) { }); } // Set up and return the stores for this app -> also used to reset all stores to defaults -export default action( - (api, actions, router): StoresMap => { +export const setUpStores = action( + ( + api: Api, + actions: ActionsMap, + router: RouterStore, + analyticsTracker: AnalyticsTracker + ): StoresMap => { function createStoreInstanceOf( StoreSubClass: Class ): T { - return new StoreSubClass(api, actions); + return new StoreSubClass(api, actions, analyticsTracker); } // Teardown existing stores @@ -98,7 +103,6 @@ export default action( // Create fresh instances of all stores // @ts-ignore ts-migrate(2322) FIXME: Type '{ addresses: Store; app: Store; assets: Stor... Remove this comment to see the full error message stores = observable({ - analytics: createStoreInstanceOf(AnalyticsStore), addresses: createStoreInstanceOf(AddressesStore), app: createStoreInstanceOf(AppStore), assets: createStoreInstanceOf(AssetsStore), diff --git a/source/renderer/app/stores/lib/Store.ts b/source/renderer/app/stores/lib/Store.ts index 6dee796702..d53f15e9bc 100644 --- a/source/renderer/app/stores/lib/Store.ts +++ b/source/renderer/app/stores/lib/Store.ts @@ -3,18 +3,18 @@ import type { ActionsMap } from '../../actions/index'; import type { StoresMap } from '../index'; import type { Api } from '../../api/index'; import type { Environment } from '../../../../common/types/environment.types'; +import { AnalyticsTracker } from '../../analytics'; export default class Store { stores: StoresMap; - api: Api; - actions: ActionsMap; environment: Environment = global.environment; _reactions: Array = []; - constructor(api: Api, actions: ActionsMap) { - this.api = api; - this.actions = actions; - } + constructor( + protected api: Api, + protected actions: ActionsMap, + protected analytics: AnalyticsTracker + ) {} registerReactions(reactions: Array<(...args: Array) => any>) { reactions.forEach((reaction) => diff --git a/translations/messages.json b/translations/messages.json index b49de0c1d9..7c1fb4f499 100644 --- a/translations/messages.json +++ b/translations/messages.json @@ -2614,6 +2614,156 @@ ], "path": "source/renderer/app/components/loading/system-time-error/SystemTimeError.tsx" }, + { + "descriptors": [ + { + "defaultMessage": "!!!Analytics data collection", + "description": "Analytics form title", + "id": "analytics.form.title" + }, + { + "defaultMessage": "!!!Help and support", + "description": "Title \"Help and support\" on the support settings page.", + "id": "settings.support.faq.title" + }, + { + "defaultMessage": "!!!If you are experiencing a problem, please look for guidance using the list of {faqLink} on the support pages. If you can’t find a solution, please submit a support ticket.", + "description": "Content for the \"Help and support\" section on the support settings page.", + "id": "settings.support.faq.content" + }, + { + "defaultMessage": "!!!Known Issues", + "description": "\"Known Issues\" link in the \"Help and support\" section on the support settings page", + "id": "settings.support.faq.faqLink" + }, + { + "defaultMessage": "!!!Steps for creating a support request:", + "description": "Title \"Steps for creating a support request\" on the support settings page.", + "id": "settings.support.steps.title" + }, + { + "defaultMessage": "!!!Download the logs", + "description": "Title \"Download the logs\" on the support settings page.", + "id": "settings.support.steps.downloadLogs.title" + }, + { + "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", + "description": "Description of \"Download the logs\" on the support settings page.", + "id": "settings.support.steps.downloadLogs.description" + }, + { + "defaultMessage": "!!!download your logs here", + "description": "\"download your logs here\" link in the Logs section on the support settings page", + "id": "settings.support.steps.downloadLogs.link" + }, + { + "defaultMessage": "!!!Report a problem", + "description": "Title \"Report a problem\" on the support settings page.", + "id": "settings.support.steps.reportProblem.title" + }, + { + "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", + "description": "Description of \"Download the logs\" on the support settings page.", + "id": "settings.support.steps.reportProblem.description" + }, + { + "defaultMessage": "!!!download your logs here", + "description": "\"download your logs here\" link in the Logs section on the support settings page", + "id": "settings.support.steps.reportProblem.link" + }, + { + "defaultMessage": "!!!You have opted in to analytics data collection. You can {changeAnalyticsSettingsLink}.", + "description": "Analytics data collection description when user opted in", + "id": "analytics.form.analyticsAcceptedDescription" + }, + { + "defaultMessage": "!!!You have opted out of analytics data collection. You can {changeAnalyticsSettingsLink}.", + "description": "Analytics data collection description when user opted out ", + "id": "analytics.form.analyticsDeclinedDescription" + }, + { + "defaultMessage": "!!!change this setting here", + "description": "Change analytics settings link text", + "id": "analytics.form.changeAnalyticsSettingsLink" + } + ], + "path": "source/renderer/app/components/settings/categories/SupportSettings.messages.ts" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Analytic data is used for product development purposes only.", + "description": "Analytics data collection description", + "id": "analytics.form.description" + }, + { + "defaultMessage": "!!!Allow anonymous data collection", + "description": "Data collection agreement switch button label", + "id": "analytics.form.dataCollectionSwitchText" + }, + { + "defaultMessage": "!!!Allow", + "description": "Analytics data collection allow button text", + "id": "analytics.form.allowButton" + }, + { + "defaultMessage": "!!!Skip", + "description": "Analytics data collection skip button text", + "id": "analytics.dialog.skipButton" + }, + { + "defaultMessage": "!!!Daedalus Privacy Policy", + "description": "Daedalus Privacy Policy link text", + "id": "analytics.form.privacyPolicyLink" + }, + { + "defaultMessage": "!!!Read more about our privacy practices in the {privacyPolicyLink}.", + "description": "Analytics data collection description, under collapsible details", + "id": "analytics.form.analyticsSectionPrivacyPolicy" + } + ], + "path": "source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!We collect data on (1) User click behavior and (2) Device information.", + "description": "Data collection details title", + "id": "analytics.form.dataCollectionDetailsTitle" + }, + { + "defaultMessage": "!!!User click behavior", + "description": "Title for the user behaviour data collection", + "id": "analytics.form.dataCollectionDetailsUserBehaviourTitle" + }, + { + "defaultMessage": "!!!Clicks, page visits, page scrolling, number of wallets, number of native assets, session duration, type of wallets (soft vs hardware wallets), geolocation (country of location), and page performance.", + "description": "Description for the user behaviour data collection", + "id": "analytics.form.dataCollectionDetailsUserBehaviorText" + }, + { + "defaultMessage": "!!!Device info", + "description": "Title for the device info data collection", + "id": "analytics.form.dataCollectionDetailsDeviceInfoTitle" + }, + { + "defaultMessage": "!!!Operating system, RAM, and disk space.", + "description": "Description for the device info data collection", + "id": "analytics.form.dataCollectionDetailsDeviceInfoText" + }, + { + "defaultMessage": "!!!Expand details", + "description": "Expand details button", + "id": "analytics.dialog.expandButton" + }, + { + "defaultMessage": "!!!Collapse details", + "description": "Collapse details button", + "id": "analytics.dialog.collapseButton" + } + ], + "path": "source/renderer/app/components/profile/analytics/CollectedDataOverview.messages.ts" + }, { "descriptors": [ { @@ -2854,61 +3004,6 @@ ], "path": "source/renderer/app/components/widgets/forms/InlineEditingInput.tsx" }, - { - "descriptors": [ - { - "defaultMessage": "!!!Help and support", - "description": "Title \"Help and support\" on the support settings page.", - "id": "settings.support.faq.title" - }, - { - "defaultMessage": "!!!If you are experiencing a problem, please look for guidance using the list of {faqLink} on the support pages. If you can’t find a solution, please submit a support ticket.", - "description": "Content for the \"Help and support\" section on the support settings page.", - "id": "settings.support.faq.content" - }, - { - "defaultMessage": "!!!Known Issues", - "description": "\"Known Issues\" link in the \"Help and support\" section on the support settings page", - "id": "settings.support.faq.faqLink" - }, - { - "defaultMessage": "!!!Steps for creating a support request:", - "description": "Title \"Steps for creating a support request\" on the support settings page.", - "id": "settings.support.steps.title" - }, - { - "defaultMessage": "!!!Download the logs", - "description": "Title \"Download the logs\" on the support settings page.", - "id": "settings.support.steps.downloadLogs.title" - }, - { - "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", - "description": "Description of \"Download the logs\" on the support settings page.", - "id": "settings.support.steps.downloadLogs.description" - }, - { - "defaultMessage": "!!!download your logs here", - "description": "\"download your logs here\" link in the Logs section on the support settings page", - "id": "settings.support.steps.downloadLogs.link" - }, - { - "defaultMessage": "!!!Report a problem", - "description": "Title \"Report a problem\" on the support settings page.", - "id": "settings.support.steps.reportProblem.title" - }, - { - "defaultMessage": "!!!Please {downloadLogsLink} and attach the downloaded file when submitting a support request to help the support team investigate the issue. Logs do not contain sensitive information.", - "description": "Description of \"Download the logs\" on the support settings page.", - "id": "settings.support.steps.reportProblem.description" - }, - { - "defaultMessage": "!!!download your logs here", - "description": "\"download your logs here\" link in the Logs section on the support settings page", - "id": "settings.support.steps.reportProblem.link" - } - ], - "path": "source/renderer/app/components/settings/categories/SupportSettings.tsx" - }, { "descriptors": [ { From 56eece1d674420805322b61902e3ac940e35b1bb Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 14:49:32 +0200 Subject: [PATCH 19/41] [DDW-809] Fix issues --- source/renderer/app/analytics/AnalyticsTracker.ts | 3 ++- source/renderer/app/analytics/types.ts | 5 ++++- .../app/components/staking/stake-pools/StakePools.tsx | 2 +- source/renderer/app/i18n/locales/defaultMessages.json | 2 +- translations/messages.json | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/renderer/app/analytics/AnalyticsTracker.ts b/source/renderer/app/analytics/AnalyticsTracker.ts index 0f075c247c..0488b08559 100644 --- a/source/renderer/app/analytics/AnalyticsTracker.ts +++ b/source/renderer/app/analytics/AnalyticsTracker.ts @@ -1,4 +1,5 @@ -import { AnalyticsClient, AnalyticsAcceptanceStatus } from '.'; +import { AnalyticsAcceptanceStatus } from '.'; +import { AnalyticsClient } from './types'; import { Environment } from '../../../common/types/environment.types'; import LocalStorageApi from '../api/utils/localStorage'; import { MatomoClient } from './MatomoClient'; diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index 8c661d18d8..59f927ef6f 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -1,4 +1,7 @@ -export interface AnalyticsClient {} +export interface AnalyticsClient { + sendPageNavigationEvent(pageTitle: string): Promise; + sendEvent(category: string, name: string): Promise; +} export enum AnalyticsAcceptanceStatus { PENDING = 'PENDING', diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index 7728a790e6..7532d6dbaf 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -22,7 +22,7 @@ import { import smashSettingsIcon from '../../../assets/images/smash-settings-ic.inline.svg'; import tinySpinnerIcon from '../../../assets/images/spinner-tiny.inline.svg'; import { getSmashServerNameFromUrl } from '../../../utils/staking'; -import { AnalyticsTracker } from 'source/renderer/app/analytics'; +import { AnalyticsTracker } from '../../../analytics'; const messages = defineMessages({ delegatingListTitle: { diff --git a/source/renderer/app/i18n/locales/defaultMessages.json b/source/renderer/app/i18n/locales/defaultMessages.json index 89cc87f073..b907fccd3e 100644 --- a/source/renderer/app/i18n/locales/defaultMessages.json +++ b/source/renderer/app/i18n/locales/defaultMessages.json @@ -2692,7 +2692,7 @@ { "descriptors": [ { - "defaultMessage": "!!!Analytics data is used for product development purposes only.", + "defaultMessage": "!!!All data is anonymous and is used only for product development purposes.", "description": "Analytics data collection description", "id": "analytics.form.description" }, diff --git a/translations/messages.json b/translations/messages.json index 7c1fb4f499..35f2a00297 100644 --- a/translations/messages.json +++ b/translations/messages.json @@ -2692,7 +2692,7 @@ { "descriptors": [ { - "defaultMessage": "!!!Analytic data is used for product development purposes only.", + "defaultMessage": "!!!All data is anonymous and is used only for product development purposes.", "description": "Analytics data collection description", "id": "analytics.form.description" }, From 0a81281a177ea7489f2924ce718bb37b6492e014 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 15:15:17 +0200 Subject: [PATCH 20/41] [DDW-809] Fix issues --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e42a07cc18..55f6cbf68a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11218,9 +11218,9 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" +lodash-es@4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" lodash._reinterpolate@^3.0.0: version "3.0.0" From a3551f7d5f1bd049814387b3ea7b37e6243a1016 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 17:16:44 +0200 Subject: [PATCH 21/41] [DDW-809] Update analytics tracker usages --- .../app/analytics/AnalyticsTracker.ts | 51 ++----------------- .../app/analytics/MatomoAnalyticsTracker.ts | 48 +++++++++++++++++ .../app/analytics/NoopAnalyticsTracker.ts | 6 +++ source/renderer/app/analytics/index.ts | 1 + .../components/wallet/WalletSendForm.spec.tsx | 1 + .../app/components/wallet/WalletSendForm.tsx | 8 +-- .../transactions/WalletTransactionsList.tsx | 6 +-- .../app/containers/wallet/WalletSendPage.tsx | 10 ++-- .../app/features/discreet-mode/context.tsx | 10 +--- .../app/features/discreet-mode/feature.ts | 12 ++--- source/renderer/app/index.tsx | 9 ++-- source/renderer/app/stores/AppStore.ts | 2 +- source/renderer/app/stores/AssetsStore.ts | 7 +-- source/renderer/app/stores/CurrencyStore.ts | 8 +-- .../app/stores/HardwareWalletsStore.ts | 4 +- .../renderer/app/stores/NetworkStatusStore.ts | 2 +- source/renderer/app/stores/ProfileStore.ts | 12 +---- .../renderer/app/stores/SidebarStore.spec.ts | 3 -- source/renderer/app/stores/SidebarStore.ts | 2 +- source/renderer/app/stores/StakingStore.ts | 17 ++----- .../renderer/app/stores/TransactionsStore.ts | 10 +--- source/renderer/app/stores/UiDialogsStore.ts | 9 ++-- source/renderer/app/stores/VotingStore.ts | 5 +- .../app/stores/WalletMigrationStore.ts | 5 +- .../app/stores/WalletSettingsStore.ts | 9 ++-- source/renderer/app/stores/WalletsStore.ts | 34 ++++--------- .../wallets/send/WalletSend.stories.tsx | 8 +++ tests/mocks/analyticsStoreMock.ts | 7 --- 28 files changed, 129 insertions(+), 177 deletions(-) create mode 100644 source/renderer/app/analytics/MatomoAnalyticsTracker.ts create mode 100644 source/renderer/app/analytics/NoopAnalyticsTracker.ts delete mode 100644 tests/mocks/analyticsStoreMock.ts diff --git a/source/renderer/app/analytics/AnalyticsTracker.ts b/source/renderer/app/analytics/AnalyticsTracker.ts index 0488b08559..7ab6a2e8b9 100644 --- a/source/renderer/app/analytics/AnalyticsTracker.ts +++ b/source/renderer/app/analytics/AnalyticsTracker.ts @@ -1,47 +1,6 @@ -import { AnalyticsAcceptanceStatus } from '.'; -import { AnalyticsClient } from './types'; -import { Environment } from '../../../common/types/environment.types'; -import LocalStorageApi from '../api/utils/localStorage'; -import { MatomoClient } from './MatomoClient'; -import { NoopAnalyticsClient } from './noopAnalyticsClient'; - -export class AnalyticsTracker { - analyticsClient: AnalyticsClient; - - constructor( - private environment: Environment, - private localStorage: LocalStorageApi - ) { - this.analyticsClient = NoopAnalyticsClient; - this.#enableTrackingIfAccepted(); - } - - async enableTracking() { - this.analyticsClient = new MatomoClient( - this.environment, - await localStorage.getUserID() - ); - } - - disableTracking() { - this.analyticsClient = NoopAnalyticsClient; - } - - sendPageNavigationEvent(pageTitle: string) { - return this.analyticsClient.sendPageNavigationEvent(pageTitle); - } - - sendEvent(category: string, name: string) { - return this.analyticsClient.sendEvent(category, name); - } - - async #enableTrackingIfAccepted() { - const analyticsAccepted = - (await this.localStorage.getAnalyticsAcceptance()) === - AnalyticsAcceptanceStatus.ACCEPTED; - - if (this.environment.analyticsFeatureEnabled && analyticsAccepted) { - this.enableTracking(); - } - } +export interface AnalyticsTracker { + enableTracking(): Promise; + disableTracking(): void; + sendPageNavigationEvent(pageTitle: string): void; + sendEvent(category: string, name: string, action?: string): void; } diff --git a/source/renderer/app/analytics/MatomoAnalyticsTracker.ts b/source/renderer/app/analytics/MatomoAnalyticsTracker.ts new file mode 100644 index 0000000000..7cc83e1f0a --- /dev/null +++ b/source/renderer/app/analytics/MatomoAnalyticsTracker.ts @@ -0,0 +1,48 @@ +import { AnalyticsAcceptanceStatus } from '.'; +import { AnalyticsClient } from './types'; +import { Environment } from '../../../common/types/environment.types'; +import LocalStorageApi from '../api/utils/localStorage'; +import { MatomoClient } from './MatomoClient'; +import { NoopAnalyticsClient } from './noopAnalyticsClient'; +import { AnalyticsTracker } from './AnalyticsTracker'; + +export class MatomoAnalyticsTracker implements AnalyticsTracker { + analyticsClient: AnalyticsClient; + + constructor( + private environment: Environment, + private localStorage: LocalStorageApi + ) { + this.analyticsClient = NoopAnalyticsClient; + this.#enableTrackingIfAccepted(); + } + + async enableTracking() { + this.analyticsClient = new MatomoClient( + this.environment, + await localStorage.getUserID() + ); + } + + disableTracking() { + this.analyticsClient = NoopAnalyticsClient; + } + + sendPageNavigationEvent(pageTitle: string) { + return this.analyticsClient.sendPageNavigationEvent(pageTitle); + } + + sendEvent(category: string, name: string, action?: string) { + return this.analyticsClient.sendEvent(category, name, action); + } + + async #enableTrackingIfAccepted() { + const analyticsAccepted = + (await this.localStorage.getAnalyticsAcceptance()) === + AnalyticsAcceptanceStatus.ACCEPTED; + + if (this.environment.analyticsFeatureEnabled && analyticsAccepted) { + this.enableTracking(); + } + } +} diff --git a/source/renderer/app/analytics/NoopAnalyticsTracker.ts b/source/renderer/app/analytics/NoopAnalyticsTracker.ts new file mode 100644 index 0000000000..5b62431b1d --- /dev/null +++ b/source/renderer/app/analytics/NoopAnalyticsTracker.ts @@ -0,0 +1,6 @@ +export const NoopAnalyticsTracker = { + async enableTracking() {}, + disableTracking() {}, + sendPageNavigationEvent(pageTitle: string) {}, + sendEvent(category: string, name: string) {}, +}; diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index 659caad7a7..d5a1afe7ea 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1,2 +1,3 @@ export { AnalyticsAcceptanceStatus } from './types'; export { AnalyticsTracker } from './AnalyticsTracker'; +export { NoopAnalyticsTracker } from './NoopAnalyticsTracker'; diff --git a/source/renderer/app/components/wallet/WalletSendForm.spec.tsx b/source/renderer/app/components/wallet/WalletSendForm.spec.tsx index 9ae61a58e0..f9254d3d86 100644 --- a/source/renderer/app/components/wallet/WalletSendForm.spec.tsx +++ b/source/renderer/app/components/wallet/WalletSendForm.spec.tsx @@ -88,6 +88,7 @@ describe('wallet/Wallet Send Form', () => { walletName={faker.name.firstName()} onTokenPickerDialogClose={() => setTokenPickerOpen(false)} onTokenPickerDialogOpen={() => setTokenPickerOpen(true)} + analyticsTracker={jest.fn() as any} /> diff --git a/source/renderer/app/components/wallet/WalletSendForm.tsx b/source/renderer/app/components/wallet/WalletSendForm.tsx index 8135669c56..68b4cc9c67 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.tsx +++ b/source/renderer/app/components/wallet/WalletSendForm.tsx @@ -41,7 +41,7 @@ import { DiscreetWalletAmount } from '../../features/discreet-mode'; import WalletTokenPicker from './tokens/wallet-token-picker/WalletTokenPicker'; import { ClearButton } from './widgets/ClearButton'; import { Divider } from './widgets/Divider'; -import { AnalyticsClient } from '../../analytics'; +import { AnalyticsTracker } from '../../analytics'; messages.fieldIsRequired = globalMessages.fieldIsRequired; type AdaInputState = 'restored' | 'updated' | 'reset' | 'none'; @@ -77,7 +77,7 @@ type Props = { walletName: string; onTokenPickerDialogOpen: (...args: Array) => any; onTokenPickerDialogClose: (...args: Array) => any; - analyticsClient?: AnalyticsClient; + analyticsTracker: AnalyticsTracker; }; interface FormFields { @@ -708,7 +708,7 @@ class WalletSendForm extends Component { async () => { this.removeAssetFields(uniqueId); await this.calculateTransactionFee(true); - this.props.analyticsClient?.sendEvent( + this.props.analyticsTracker.sendEvent( 'Wallets', 'Removed token from transaction' ); @@ -1169,7 +1169,7 @@ class WalletSendForm extends Component { onAdd={(checked) => { onTokenPickerDialogClose(); checked.forEach(this.addAssetRow); - this.props.analyticsClient?.sendEvent( + this.props.analyticsTracker.sendEvent( 'Wallets', 'Added token to transaction' ); diff --git a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx index 3b57148d4c..214b657ffa 100644 --- a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx +++ b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx @@ -16,7 +16,7 @@ import { SimpleTransactionList } from './render-strategies/SimpleTransactionList import { TransactionInfo, TransactionsGroup } from './types'; import type { Row } from './types'; import { getNonZeroAssetTokens } from '../../../utils/assets'; -import { AnalyticsClient } from '../../../analytics'; +import { AnalyticsTracker } from '../../../analytics'; const messages = defineMessages({ today: { @@ -70,7 +70,7 @@ type Props = { getAsset: (...args: Array) => any; isInternalAddress: (...args: Array) => any; onCopyAssetParam: (...args: Array) => any; - analyticsClient?: AnalyticsClient; + analyticsTracker: AnalyticsTracker; }; type State = { isPreloading: boolean; @@ -205,7 +205,7 @@ class WalletTransactionsList extends Component { onShowMoreTransactions = (walletId: string) => { if (this.props.onShowMoreTransactions) { this.props.onShowMoreTransactions(walletId); - this.props.analyticsClient?.sendEvent( + this.props.analyticsTracker.sendEvent( 'Wallet Details', 'Clicked Show More Transactions button' ); diff --git a/source/renderer/app/containers/wallet/WalletSendPage.tsx b/source/renderer/app/containers/wallet/WalletSendPage.tsx index c8a44f541c..eeac52f011 100755 --- a/source/renderer/app/containers/wallet/WalletSendPage.tsx +++ b/source/renderer/app/containers/wallet/WalletSendPage.tsx @@ -12,8 +12,12 @@ import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import Asset from '../../domains/Asset'; import type { ApiTokens } from '../../api/assets/types'; import { getNonZeroAssetTokens } from '../../utils/assets'; +import { + withAnalytics, + WithAnalyticsTrackerProps, +} from '../../components/analytics/withAnalytics'; -type Props = InjectedProps; +type Props = InjectedProps & WithAnalyticsTrackerProps; @inject('stores', 'actions') @observer @@ -164,10 +168,10 @@ class WalletSendPage extends Component { walletName={walletName} onTokenPickerDialogOpen={this.openTokenPickerDialog} onTokenPickerDialogClose={this.closeTokenPickerDialog} - analyticsClient={this.props.stores.analytics.analyticsClient} + analyticsTracker={this.props.analyticsTracker} /> ); } } -export default WalletSendPage; +export default withAnalytics(WalletSendPage); diff --git a/source/renderer/app/features/discreet-mode/context.tsx b/source/renderer/app/features/discreet-mode/context.tsx index f3da9d7494..752686fe4f 100644 --- a/source/renderer/app/features/discreet-mode/context.tsx +++ b/source/renderer/app/features/discreet-mode/context.tsx @@ -20,12 +20,12 @@ interface Props { export function DiscreetModeFeatureProvider({ children }: Props) { const localStorageFeature = useLocalStorageFeature(); - const analyticsClient = useAnalytics(); + const analyticsTracker = useAnalytics(); const [discreetModeFeature] = useState(() => { const feature = new DiscreetMode( new DiscreetModeApi(localStorageFeature), - analyticsClient + analyticsTracker ); window.daedalus = merge(window.daedalus, { @@ -37,12 +37,6 @@ export function DiscreetModeFeatureProvider({ children }: Props) { return feature; }); - useEffect(() => { - if (analyticsClient) { - discreetModeFeature.setAnalyticsClient(analyticsClient); - } - }, [analyticsClient]); - useFeature(discreetModeFeature); return ( diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index 3c4d48b372..4f429009fd 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -5,12 +5,12 @@ import { DiscreetModeApi } from './api'; import { SENSITIVE_DATA_SYMBOL } from './config'; import { defaultReplacer } from './replacers/defaultReplacer'; import type { ReplacerFn } from './types'; -import { AnalyticsClient } from '../../analytics'; +import { AnalyticsTracker } from '../../analytics'; export class DiscreetMode extends Feature { constructor( private api: DiscreetModeApi, - private analyticsClient: AnalyticsClient + private analyticsTracker: AnalyticsTracker ) { super(); runInAction(() => { @@ -32,10 +32,6 @@ export class DiscreetMode extends Feature { @observable setDiscreetModeSettingsRequest: Request>; - setAnalyticsClient(analyticsClient: AnalyticsClient) { - this.analyticsClient = analyticsClient; - } - async start() { super.start(); await this._setupDiscreetMode(); @@ -55,7 +51,7 @@ export class DiscreetMode extends Feature { @action toggleDiscreetMode = () => { this.isDiscreetMode = !this.isDiscreetMode; - this.analyticsClient.sendEvent( + this.analyticsTracker.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode' @@ -70,7 +66,7 @@ export class DiscreetMode extends Feature { runInAction('Update open in discreet mode settings', () => { this.openInDiscreetMode = nextSetting; }); - this.analyticsClient.sendEvent( + this.analyticsTracker.sendEvent( 'Settings', this.isDiscreetMode ? 'Turned on discreet mode by default' diff --git a/source/renderer/app/index.tsx b/source/renderer/app/index.tsx index dfefd7d6fa..8d86291029 100755 --- a/source/renderer/app/index.tsx +++ b/source/renderer/app/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { configure, action } from 'mobx'; +import { action, configure } from 'mobx'; import { render } from 'react-dom'; import { addLocaleData } from 'react-intl'; import en from 'react-intl/locale-data/en'; @@ -19,7 +19,7 @@ import { DiscreetModeFeatureProvider, LocalStorageFeatureProvider, } from './features'; -import { AnalyticsTracker } from './analytics'; +import { MatomoAnalyticsTracker } from './analytics/MatomoAnalyticsTracker'; // run MobX in strict mode configure({ enforceActions: 'always', @@ -34,7 +34,10 @@ const initializeDaedalus = () => { const api = setupApi(isTest); const hashHistory = createHashHistory(); const routingStore = new RouterStore(); - const analyticsTracker = new AnalyticsTracker(environment, api.localStorage); + const analyticsTracker = new MatomoAnalyticsTracker( + environment, + api.localStorage + ); const stores = setUpStores(api, actions, routingStore, analyticsTracker); const history = syncHistoryWithStore(hashHistory, routingStore); // @ts-ignore ts-migrate(2339) FIXME: Property 'daedalus' does not exist on type 'Window... Remove this comment to see the full error message diff --git a/source/renderer/app/stores/AppStore.ts b/source/renderer/app/stores/AppStore.ts index 33fed663d6..969a126a61 100644 --- a/source/renderer/app/stores/AppStore.ts +++ b/source/renderer/app/stores/AppStore.ts @@ -249,6 +249,6 @@ export default class AppStore extends Store { }; _sendAnalyticsEvent = (category: string, actionName: string) => { - this.stores.analytics.analyticsClient.sendEvent(category, actionName); + this.analytics.sendEvent(category, actionName); }; } diff --git a/source/renderer/app/stores/AssetsStore.ts b/source/renderer/app/stores/AssetsStore.ts index 856f9fc672..a1f9c4e615 100644 --- a/source/renderer/app/stores/AssetsStore.ts +++ b/source/renderer/app/stores/AssetsStore.ts @@ -108,10 +108,7 @@ export default class AssetsStore extends Store { decimals, }); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Changed native token settings' - ); + this.analytics.sendEvent('Wallets', 'Changed native token settings'); }; @action _onEditedAssetUnset = () => { @@ -199,7 +196,7 @@ export default class AssetsStore extends Store { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message await this.favoritesRequest.execute(); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', !isFavorite ? 'Added token from favorites' diff --git a/source/renderer/app/stores/CurrencyStore.ts b/source/renderer/app/stores/CurrencyStore.ts index f94a0f4ca8..0cab997980 100644 --- a/source/renderer/app/stores/CurrencyStore.ts +++ b/source/renderer/app/stores/CurrencyStore.ts @@ -128,18 +128,14 @@ export default class CurrencyStore extends Store { await this.api.localStorage.setCurrencySelected(selected.code); } - this.stores.analytics.analyticsClient.sendEvent( - 'Settings', - 'Changed currency', - code - ); + this.analytics.sendEvent('Settings', 'Changed currency', code); }; @action _toggleCurrencyIsActive = () => { this.isActive = !this.isActive; this.api.localStorage.setCurrencyIsActive(this.isActive); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Settings', `Turned ${ this.isActive ? 'on' : 'off' diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index 00b32b7096..aabc4e8b29 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -525,7 +525,7 @@ export default class HardwareWalletsStore extends Store { } ); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Transaction made', 'Hardware wallet' @@ -1471,7 +1471,7 @@ export default class HardwareWalletsStore extends Store { this.showAddress(params); } - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Verified wallet address with hardware wallet' ); diff --git a/source/renderer/app/stores/NetworkStatusStore.ts b/source/renderer/app/stores/NetworkStatusStore.ts index d5538fce0c..3eb504abd3 100644 --- a/source/renderer/app/stores/NetworkStatusStore.ts +++ b/source/renderer/app/stores/NetworkStatusStore.ts @@ -431,7 +431,7 @@ export default class NetworkStatusStore extends Store { // DEFINE ACTIONS @action _toggleRTSFlagsMode = async () => { - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Settings', `RTS flags ${this.isRTSFlagsModeEnabled ? 'disabled' : 'enabled'}` ); diff --git a/source/renderer/app/stores/ProfileStore.ts b/source/renderer/app/stores/ProfileStore.ts index e21c6ae2eb..ffd833b82f 100644 --- a/source/renderer/app/stores/ProfileStore.ts +++ b/source/renderer/app/stores/ProfileStore.ts @@ -372,11 +372,7 @@ export default class ProfileStore extends Store { this.stores.wallets.refreshWalletsData(); } - this.stores.analytics.analyticsClient.sendEvent( - 'Settings', - 'Changed user settings', - param - ); + this.analytics.sendEvent('Settings', 'Changed user settings', param); }; _updateTheme = async ({ theme }: { theme: string }) => { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message @@ -384,11 +380,7 @@ export default class ProfileStore extends Store { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message await this.getThemeRequest.execute(); - this.stores.analytics.analyticsClient.sendEvent( - 'Settings', - 'Changed theme', - theme - ); + this.analytics.sendEvent('Settings', 'Changed theme', theme); }; _acceptTermsOfUse = async () => { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message diff --git a/source/renderer/app/stores/SidebarStore.spec.ts b/source/renderer/app/stores/SidebarStore.spec.ts index 4677426b04..ec44327e58 100644 --- a/source/renderer/app/stores/SidebarStore.spec.ts +++ b/source/renderer/app/stores/SidebarStore.spec.ts @@ -4,8 +4,6 @@ import type { ActionsMap } from '../actions/index'; import { WalletSortBy, WalletSortOrder } from '../types/sidebarTypes'; import type { SidebarWalletType } from '../types/sidebarTypes'; import SidebarStore from './SidebarStore'; -import { analyticsStoreMock } from '../../../../tests/mocks/analyticsStoreMock'; -import { StoresMap } from './index'; describe('Sidebar Store', () => { const api: Api = { @@ -39,7 +37,6 @@ describe('Sidebar Store', () => { networkStatus: { isConnected: true, }, - analytics: analyticsStoreMock, } as any; return sidebarStore; } diff --git a/source/renderer/app/stores/SidebarStore.ts b/source/renderer/app/stores/SidebarStore.ts index 3e5b65b37f..59fe6879db 100644 --- a/source/renderer/app/stores/SidebarStore.ts +++ b/source/renderer/app/stores/SidebarStore.ts @@ -206,7 +206,7 @@ export default class SidebarStore extends Store { } }; _sendAnalyticsEvent = (action: string) => { - this.stores.analytics.analyticsClient.sendEvent('Layout', action); + this.analytics.sendEvent('Layout', action); }; _sendSearchAnalyticsEvent = debounce(() => { this._sendAnalyticsEvent('Used wallet search'); diff --git a/source/renderer/app/stores/StakingStore.ts b/source/renderer/app/stores/StakingStore.ts index a0fe63c7f1..53438b2981 100644 --- a/source/renderer/app/stores/StakingStore.ts +++ b/source/renderer/app/stores/StakingStore.ts @@ -229,10 +229,7 @@ export default class StakingStore extends Store { }; _sendStakePoolsSliderUsedAnalyticsEvent = debounce(() => { - this.stores.analytics.analyticsClient.sendEvent( - 'Stake Pools', - 'Used stake pools amount slider' - ); + this.analytics.sendEvent('Stake Pools', 'Used stake pools amount slider'); }, 5000); @action @@ -276,10 +273,7 @@ export default class StakingStore extends Store { // Update // @ts-ignore ts-migrate(2339) FIXME: Property 'api' does not exist on type 'StakingStor... Remove this comment to see the full error message await this.api.localStorage.setSmashServer(smashServerUrl); - this.stores.analytics.analyticsClient.sendEvent( - 'Settings', - 'Changed SMASH server' - ); + this.analytics.sendEvent('Settings', 'Changed SMASH server'); } catch (error) { runInAction(() => { this.smashServerUrlError = error; @@ -400,7 +394,7 @@ export default class StakingStore extends Store { const wallet = this.stores.wallets.getWalletById(walletId); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Stake Pools', wallet.isDelegating ? 'Redelegated a wallet' : 'Delegated a wallet' ); @@ -528,10 +522,7 @@ export default class StakingStore extends Store { }); // @ts-ignore ts-migrate(2339) FIXME: Property 'actions' does not exist on type 'Staking... Remove this comment to see the full error message this.actions.staking.requestCSVFileSuccess.trigger(); - this.stores.analytics.analyticsClient.sendEvent( - 'Stake Pools', - 'Exported rewards as CSV' - ); + this.analytics.sendEvent('Stake Pools', 'Exported rewards as CSV'); }; calculateDelegationFee = async ( delegationFeeRequest: GetDelegationFeeRequest diff --git a/source/renderer/app/stores/TransactionsStore.ts b/source/renderer/app/stores/TransactionsStore.ts index dbacd5b1a7..829d05e086 100644 --- a/source/renderer/app/stores/TransactionsStore.ts +++ b/source/renderer/app/stores/TransactionsStore.ts @@ -368,10 +368,7 @@ export default class TransactionsStore extends Store { ...filterOptions, }; - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Set transaction filters' - ); + this.analytics.sendEvent('Wallets', 'Set transaction filters'); return true; }; @action @@ -410,10 +407,7 @@ export default class TransactionsStore extends Store { }); if (success) { actions.transactions.requestCSVFileSuccess.trigger(); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Exported transactions as CSV' - ); + this.analytics.sendEvent('Wallets', 'Exported transactions as CSV'); } }; @action diff --git a/source/renderer/app/stores/UiDialogsStore.ts b/source/renderer/app/stores/UiDialogsStore.ts index 4641037435..db7c1aa22b 100644 --- a/source/renderer/app/stores/UiDialogsStore.ts +++ b/source/renderer/app/stores/UiDialogsStore.ts @@ -61,21 +61,18 @@ export default class UiDialogsStore extends Store { _handleAnalytics = (dialog: object) => { switch (dialog) { case WalletReceiveDialog: - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Opened share wallet address modal' ); break; case AssetSettingsDialog: - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Opened native token settings' - ); + this.analytics.sendEvent('Wallets', 'Opened native token settings'); break; case DelegationSetupWizardDialog: - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Stake Pools', 'Opened delegate wallet dialog' ); diff --git a/source/renderer/app/stores/VotingStore.ts b/source/renderer/app/stores/VotingStore.ts index 89c8e2053d..834adf9946 100644 --- a/source/renderer/app/stores/VotingStore.ts +++ b/source/renderer/app/stores/VotingStore.ts @@ -406,10 +406,7 @@ export default class VotingStore extends Store { this._setQrCode(formattedArrayBufferToHexString(encrypt)); this._nextRegistrationStep(); - this.stores.analytics.analyticsClient.sendEvent( - 'Voting', - 'Registered for voting' - ); + this.analytics.sendEvent('Voting', 'Registered for voting'); }; _saveAsPDF = async () => { const { qrCode, selectedWalletId } = this; diff --git a/source/renderer/app/stores/WalletMigrationStore.ts b/source/renderer/app/stores/WalletMigrationStore.ts index 7cb90c4d37..057ee165c7 100644 --- a/source/renderer/app/stores/WalletMigrationStore.ts +++ b/source/renderer/app/stores/WalletMigrationStore.ts @@ -312,10 +312,7 @@ export default class WalletMigrationStore extends Store { this.isRestorationRunning = false; }); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Restored legacy wallet(s)' - ); + this.analytics.sendEvent('Wallets', 'Restored legacy wallet(s)'); }; @action _restoreWallet = async (exportedWallet: ExportedByronWallet) => { diff --git a/source/renderer/app/stores/WalletSettingsStore.ts b/source/renderer/app/stores/WalletSettingsStore.ts index ac7ad57107..f63b4a2d40 100644 --- a/source/renderer/app/stores/WalletSettingsStore.ts +++ b/source/renderer/app/stores/WalletSettingsStore.ts @@ -156,7 +156,7 @@ export default class WalletSettingsStore extends Store { this.actions.dialogs.closeActiveDialog.trigger(); this.updateSpendingPasswordRequest.reset(); this.stores.wallets.refreshWalletsData(); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallet Settings', 'Changed wallet settings', 'password' @@ -194,7 +194,7 @@ export default class WalletSettingsStore extends Store { }); this.updateWalletRequest.reset(); this.stores.wallets.refreshWalletsData(); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallet Settings', 'Changed wallet settings', field @@ -289,10 +289,7 @@ export default class WalletSettingsStore extends Store { const isCorrect = walletId === activeWalletId; const nextStep = isCorrect ? 3 : 4; - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Verified recovery phrase' - ); + this.analytics.sendEvent('Wallets', 'Verified recovery phrase'); if (isCorrect) { const recoveryPhraseVerificationDate = new Date(); diff --git a/source/renderer/app/stores/WalletsStore.ts b/source/renderer/app/stores/WalletsStore.ts index 64311b3fd8..b7ebf5a38f 100644 --- a/source/renderer/app/stores/WalletsStore.ts +++ b/source/renderer/app/stores/WalletsStore.ts @@ -365,10 +365,7 @@ export default class WalletsStore extends Store { runInAction('update account public key', () => { this.activePublicKey = accountPublicKey; }); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Reveal wallet public key' - ); + this.analytics.sendEvent('Wallets', 'Reveal wallet public key'); } catch (error) { throw error; } @@ -401,10 +398,7 @@ export default class WalletsStore extends Store { runInAction('update ICO public key', () => { this.icoPublicKey = icoPublicKey; }); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Reveal wallet public key' - ); + this.analytics.sendEvent('Wallets', 'Reveal wallet public key'); } catch (error) { throw error; } @@ -472,7 +466,7 @@ export default class WalletsStore extends Store { this.goToWalletRoute(restoredWallet.id); this.refreshWalletsData(); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Restored a software wallet', this.walletKind @@ -632,10 +626,7 @@ export default class WalletsStore extends Store { this.goToWalletRoute(wallet.id); this.refreshWalletsData(); this.actions.dialogs.closeActiveDialog.trigger(); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Created a new hardware wallet' - ); + this.analytics.sendEvent('Wallets', 'Created a new hardware wallet'); } } catch (error) { throw error; @@ -656,10 +647,7 @@ export default class WalletsStore extends Store { this.actions.dialogs.closeActiveDialog.trigger(); this.goToWalletRoute(wallet.id); this.refreshWalletsData(); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Created a new software wallet' - ); + this.analytics.sendEvent('Wallets', 'Created a new software wallet'); } }; _deleteWallet = async (params: { walletId: string; isLegacy: boolean }) => { @@ -703,7 +691,7 @@ export default class WalletsStore extends Store { } }); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Wallet deleted', walletToDelete.isHardwareWallet ? 'Hardware wallet' : 'Software wallet' @@ -845,11 +833,7 @@ export default class WalletsStore extends Store { assets: formattedAssets, hasAssetsRemainingAfterTransaction, }); - this.stores.analytics.analyticsClient.sendEvent( - 'Wallets', - 'Transaction made', - 'Software wallet' - ); + this.analytics.sendEvent('Wallets', 'Transaction made', 'Software wallet'); this.refreshWalletsData(); this.actions.dialogs.closeActiveDialog.trigger(); this.sendMoneyRequest.reset(); @@ -1541,7 +1525,7 @@ export default class WalletsStore extends Store { this.actions.wallets.generateAddressPDFSuccess.trigger({ walletAddress, }); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Saved wallet address as PDF', 'Software wallet' @@ -1566,7 +1550,7 @@ export default class WalletsStore extends Store { this.actions.wallets.saveQRCodeImageSuccess.trigger({ walletAddress, }); - this.stores.analytics.analyticsClient.sendEvent( + this.analytics.sendEvent( 'Wallets', 'Saved wallet address as QR code', 'Software wallet' diff --git a/storybook/stories/wallets/send/WalletSend.stories.tsx b/storybook/stories/wallets/send/WalletSend.stories.tsx index 5f43d24b25..04d3e34fe6 100644 --- a/storybook/stories/wallets/send/WalletSend.stories.tsx +++ b/storybook/stories/wallets/send/WalletSend.stories.tsx @@ -19,6 +19,9 @@ import Wallet, { import WalletSendForm from '../../../../source/renderer/app/components/wallet/WalletSendForm'; import type { WalletTokens } from '../../../../source/renderer/app/api/assets/types'; import { WalletSendConfirmationDialogView } from '../../../../source/renderer/app/containers/wallet/dialogs/send-confirmation/SendConfirmation.view'; +import { NoopAnalyticsTracker } from '../../../../source/renderer/app/analytics'; + +const analyticsTracker = NoopAnalyticsTracker; const allAssets = [ generateAssetToken( @@ -232,6 +235,7 @@ storiesOf('Wallets / Send', module) walletName="My wallet" onTokenPickerDialogClose={action('onTokenPickerDialogClose')} onTokenPickerDialogOpen={action('onTokenPickerDialogOpen')} + analyticsTracker={analyticsTracker} /> )) .add('Send - Hardware wallet verifying transaction', () => ( @@ -260,6 +264,7 @@ storiesOf('Wallets / Send', module) walletName="My wallet" onTokenPickerDialogClose={action('onTokenPickerDialogClose')} onTokenPickerDialogOpen={action('onTokenPickerDialogOpen')} + analyticsTracker={analyticsTracker} /> )) .add('Send - Hardware wallet verifying transaction succeeded', () => ( @@ -288,6 +293,7 @@ storiesOf('Wallets / Send', module) walletName="My wallet" onTokenPickerDialogClose={action('onTokenPickerDialogClose')} onTokenPickerDialogOpen={action('onTokenPickerDialogOpen')} + analyticsTracker={analyticsTracker} /> )) .add('Send - Hardware wallet verifying transaction failed', () => ( @@ -316,6 +322,7 @@ storiesOf('Wallets / Send', module) walletName="My wallet" onTokenPickerDialogClose={action('onTokenPickerDialogClose')} onTokenPickerDialogOpen={action('onTokenPickerDialogOpen')} + analyticsTracker={analyticsTracker} /> )) .add('Send - With Assets', () => ( @@ -347,6 +354,7 @@ storiesOf('Wallets / Send', module) walletName="My wallet" onTokenPickerDialogClose={action('onTokenPickerDialogClose')} onTokenPickerDialogOpen={action('onTokenPickerDialogOpen')} + analyticsTracker={analyticsTracker} /> )) .add('Wallet Send Confirmation Dialog With Assets', () => { diff --git a/tests/mocks/analyticsStoreMock.ts b/tests/mocks/analyticsStoreMock.ts deleted file mode 100644 index 61617e6f93..0000000000 --- a/tests/mocks/analyticsStoreMock.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { NoopAnalyticsClient } from '../../source/renderer/app/analytics'; - -export const analyticsStoreMock = { - analyticsClient: NoopAnalyticsClient, - setup: jest.fn(), - resetAnalyticsClient: jest.fn(), -}; From 0dff7f8ddf20840f705309f26a7f587a9df0c7ad Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 20:18:47 +0200 Subject: [PATCH 22/41] [DDW-809] Ensure AnalyticsTracker is configured when user consents --- .../app/analytics/AnalyticsTracker.ts | 14 ++++++------ source/renderer/app/analytics/MatomoClient.ts | 5 ++--- source/renderer/app/stores/ProfileStore.ts | 22 +++++++++++-------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/source/renderer/app/analytics/AnalyticsTracker.ts b/source/renderer/app/analytics/AnalyticsTracker.ts index 0488b08559..2041a291ba 100644 --- a/source/renderer/app/analytics/AnalyticsTracker.ts +++ b/source/renderer/app/analytics/AnalyticsTracker.ts @@ -6,33 +6,33 @@ import { MatomoClient } from './MatomoClient'; import { NoopAnalyticsClient } from './noopAnalyticsClient'; export class AnalyticsTracker { - analyticsClient: AnalyticsClient; + #analyticsClient: AnalyticsClient; constructor( private environment: Environment, private localStorage: LocalStorageApi ) { - this.analyticsClient = NoopAnalyticsClient; + this.#analyticsClient = NoopAnalyticsClient; this.#enableTrackingIfAccepted(); } async enableTracking() { - this.analyticsClient = new MatomoClient( + this.#analyticsClient = new MatomoClient( this.environment, - await localStorage.getUserID() + await this.localStorage.getUserID() ); } disableTracking() { - this.analyticsClient = NoopAnalyticsClient; + this.#analyticsClient = NoopAnalyticsClient; } sendPageNavigationEvent(pageTitle: string) { - return this.analyticsClient.sendPageNavigationEvent(pageTitle); + return this.#analyticsClient.sendPageNavigationEvent(pageTitle); } sendEvent(category: string, name: string) { - return this.analyticsClient.sendEvent(category, name); + return this.#analyticsClient.sendEvent(category, name); } async #enableTrackingIfAccepted() { diff --git a/source/renderer/app/analytics/MatomoClient.ts b/source/renderer/app/analytics/MatomoClient.ts index a08daf3292..43036e9783 100644 --- a/source/renderer/app/analytics/MatomoClient.ts +++ b/source/renderer/app/analytics/MatomoClient.ts @@ -7,6 +7,7 @@ import { DEV_MODE_SITE_MAP_ID, NETWORK_TO_ANALYTICS_SITE_ID_MAP, } from '../config/analyticsConfig'; +import { formattedBytesToSize } from '../utils/formatters'; const CPU_DIMENSION_KEY = 'dimension2'; const RAM_DIMENSION_KEY = 'dimension3'; @@ -33,9 +34,7 @@ export class MatomoClient implements AnalyticsClient { action_name: pageTitle, url: this.getAnalyticsURL(), [CPU_DIMENSION_KEY]: formatCpuInfo(this.environment.cpu), - [RAM_DIMENSION_KEY]: Math.round( - this.environment.ram / 1024 / 1024 / 1024 - ).toString(), + [RAM_DIMENSION_KEY]: formattedBytesToSize(this.environment.ram), [OS_DIMENSION_KEY]: this.environment.os, [VERSION_DIMENSION_KEY]: this.environment.version, }); diff --git a/source/renderer/app/stores/ProfileStore.ts b/source/renderer/app/stores/ProfileStore.ts index c8a8e6c877..b4738c7a46 100644 --- a/source/renderer/app/stores/ProfileStore.ts +++ b/source/renderer/app/stores/ProfileStore.ts @@ -1,8 +1,6 @@ -import { action, observable, computed, runInAction } from 'mobx'; +import { action, computed, observable, runInAction } from 'mobx'; import BigNumber from 'bignumber.js'; -import { includes, camelCase } from 'lodash'; -import axios from 'axios'; -import { v4 as uuidv4 } from 'uuid'; +import { camelCase, includes } from 'lodash'; import { toJS } from '../../../common/utils/helper'; import Store from './lib/Store'; import Request from './lib/LocalizedRequest'; @@ -15,32 +13,32 @@ import { logger } from '../utils/logging'; import { setStateSnapshotLogChannel } from '../ipc/setStateSnapshotLogChannel'; import { getDesktopDirectoryPathChannel } from '../ipc/getDesktopDirectoryPathChannel'; import { getSystemLocaleChannel } from '../ipc/getSystemLocaleChannel'; +import type { Locale } from '../../../common/types/locales.types'; import { LOCALES } from '../../../common/types/locales.types'; import { compressLogsChannel, downloadLogsChannel, getLogsChannel, } from '../ipc/logs.ipc'; -import type { LogFiles, CompressedLogStatus } from '../types/LogTypes'; +import type { CompressedLogStatus, LogFiles } from '../types/LogTypes'; import type { StateSnapshotLogParams } from '../../../common/types/logging.types'; -import type { Locale } from '../../../common/types/locales.types'; import { DEFAULT_NUMBER_FORMAT, NUMBER_FORMATS, } from '../../../common/types/number.types'; import { + getRequestKeys, hasLoadedRequest, isRequestSet, requestGetter, requestGetterLocale, - getRequestKeys, } from '../utils/storesUtils'; import { - NUMBER_OPTIONS, DATE_ENGLISH_OPTIONS, DATE_JAPANESE_OPTIONS, - TIME_OPTIONS, + NUMBER_OPTIONS, PROFILE_SETTINGS, + TIME_OPTIONS, } from '../config/profileConfig'; import { buildSystemInfo } from '../utils/buildSystemInfo'; import { AnalyticsAcceptanceStatus } from '../analytics/types'; @@ -398,6 +396,12 @@ export default class ProfileStore extends Store { _setAnalyticsAcceptanceStatus = (status: AnalyticsAcceptanceStatus) => { this.setAnalyticsAcceptanceRequest.execute(status); this.getAnalyticsAcceptanceRequest.execute(); + + if (status === AnalyticsAcceptanceStatus.ACCEPTED) { + this.analytics.enableTracking(); + } else if (status === AnalyticsAcceptanceStatus.REJECTED) { + this.analytics.disableTracking(); + } }; _getAnalyticsAcceptance = () => { this.getAnalyticsAcceptanceRequest.execute(); From 4f192d8561dd17a73c9ea859f8097237e320b846 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 20:20:08 +0200 Subject: [PATCH 23/41] [DDW-809] Temporary settings for testing --- source/renderer/app/config/analyticsConfig.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/source/renderer/app/config/analyticsConfig.ts b/source/renderer/app/config/analyticsConfig.ts index bb7c9effb2..505c33faf1 100644 --- a/source/renderer/app/config/analyticsConfig.ts +++ b/source/renderer/app/config/analyticsConfig.ts @@ -1,6 +1,7 @@ import { Network } from '../../../common/types/environment.types'; -export const ANALYTICS_API_ENDPOINT = 'http://localhost:8080/matomo.php'; +export const ANALYTICS_API_ENDPOINT = + 'http://daedalusqa.matomo.cloud/matomo.php'; export const PRIVACY_POLICY_LINK = 'https://static.iohk.io/terms/iog-privacy-policy.pdf'; export const DEV_MODE_SITE_MAP_ID = 1; @@ -8,9 +9,9 @@ export const NETWORK_TO_ANALYTICS_SITE_ID_MAP: Record = { mainnet: 4, mainnet_flight: 4, testnet: 3, - staging: 5, - shelley_qa: 5, - alonzo_purple: 5, - selfnode: 5, - development: 5, + staging: 1, + shelley_qa: 1, + alonzo_purple: 1, + selfnode: 1, + development: 1, }; From 3765c4a62cac93d9fc44b93f41fb9f0f5a830579 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 20:52:30 +0200 Subject: [PATCH 24/41] [DDW-809] Fix issues --- .../renderer/app/analytics/AnalyticsTracker.ts | 6 ------ .../app/analytics/MatomoAnalyticsTracker.ts | 9 ++++----- .../app/analytics/NoopAnalyticsTracker.ts | 16 ++++++++++------ source/renderer/app/analytics/index.ts | 4 ++-- source/renderer/app/analytics/types.ts | 7 +++++++ source/renderer/app/config/analyticsConfig.ts | 2 +- .../app/containers/wallet/WalletSummaryPage.tsx | 10 +++++++--- .../stories/wallets/send/WalletSend.stories.tsx | 4 +--- 8 files changed, 32 insertions(+), 26 deletions(-) delete mode 100644 source/renderer/app/analytics/AnalyticsTracker.ts diff --git a/source/renderer/app/analytics/AnalyticsTracker.ts b/source/renderer/app/analytics/AnalyticsTracker.ts deleted file mode 100644 index 7ab6a2e8b9..0000000000 --- a/source/renderer/app/analytics/AnalyticsTracker.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface AnalyticsTracker { - enableTracking(): Promise; - disableTracking(): void; - sendPageNavigationEvent(pageTitle: string): void; - sendEvent(category: string, name: string, action?: string): void; -} diff --git a/source/renderer/app/analytics/MatomoAnalyticsTracker.ts b/source/renderer/app/analytics/MatomoAnalyticsTracker.ts index d4f9ed9e4c..f788175cea 100644 --- a/source/renderer/app/analytics/MatomoAnalyticsTracker.ts +++ b/source/renderer/app/analytics/MatomoAnalyticsTracker.ts @@ -1,17 +1,16 @@ -import { AnalyticsAcceptanceStatus } from '.'; +import { AnalyticsAcceptanceStatus, AnalyticsTracker } from '.'; import { AnalyticsClient } from './types'; import { Environment } from '../../../common/types/environment.types'; import LocalStorageApi from '../api/utils/localStorage'; import { MatomoClient } from './MatomoClient'; import { NoopAnalyticsClient } from './noopAnalyticsClient'; -import { AnalyticsTracker } from './AnalyticsTracker'; export class MatomoAnalyticsTracker implements AnalyticsTracker { #analyticsClient: AnalyticsClient; constructor( private environment: Environment, - private localStorage: LocalStorageApi + private localStorageApi: LocalStorageApi ) { this.#analyticsClient = NoopAnalyticsClient; this.#enableTrackingIfAccepted(); @@ -20,7 +19,7 @@ export class MatomoAnalyticsTracker implements AnalyticsTracker { async enableTracking() { this.#analyticsClient = new MatomoClient( this.environment, - await localStorage.getUserID() + await this.localStorageApi.getUserID() ); } @@ -38,7 +37,7 @@ export class MatomoAnalyticsTracker implements AnalyticsTracker { async #enableTrackingIfAccepted() { const analyticsAccepted = - (await this.localStorage.getAnalyticsAcceptance()) === + (await this.localStorageApi.getAnalyticsAcceptance()) === AnalyticsAcceptanceStatus.ACCEPTED; if (this.environment.analyticsFeatureEnabled && analyticsAccepted) { diff --git a/source/renderer/app/analytics/NoopAnalyticsTracker.ts b/source/renderer/app/analytics/NoopAnalyticsTracker.ts index 5b62431b1d..f9daa5e01d 100644 --- a/source/renderer/app/analytics/NoopAnalyticsTracker.ts +++ b/source/renderer/app/analytics/NoopAnalyticsTracker.ts @@ -1,6 +1,10 @@ -export const NoopAnalyticsTracker = { - async enableTracking() {}, - disableTracking() {}, - sendPageNavigationEvent(pageTitle: string) {}, - sendEvent(category: string, name: string) {}, -}; +import { AnalyticsTracker } from '.'; + +class NoopAnalyticsTracker implements AnalyticsTracker { + async enableTracking() {} + disableTracking() {} + sendPageNavigationEvent(pageTitle: string) {} + sendEvent(category: string, name: string) {} +} + +export const noopAnalyticsTracker = new NoopAnalyticsTracker(); diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index d5a1afe7ea..e0a27fea05 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1,3 +1,3 @@ export { AnalyticsAcceptanceStatus } from './types'; -export { AnalyticsTracker } from './AnalyticsTracker'; -export { NoopAnalyticsTracker } from './NoopAnalyticsTracker'; +export type { AnalyticsClient, AnalyticsTracker } from './types'; +export { noopAnalyticsTracker } from './NoopAnalyticsTracker'; diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index 8d07442320..13f92e2d17 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -8,3 +8,10 @@ export enum AnalyticsAcceptanceStatus { ACCEPTED = 'ACCEPTED', REJECTED = 'REJECTED', } + +export interface AnalyticsTracker { + enableTracking(): Promise; + disableTracking(): void; + sendPageNavigationEvent(pageTitle: string): void; + sendEvent(category: string, name: string, action?: string): void; +} diff --git a/source/renderer/app/config/analyticsConfig.ts b/source/renderer/app/config/analyticsConfig.ts index 505c33faf1..2dcc5318ea 100644 --- a/source/renderer/app/config/analyticsConfig.ts +++ b/source/renderer/app/config/analyticsConfig.ts @@ -1,7 +1,7 @@ import { Network } from '../../../common/types/environment.types'; export const ANALYTICS_API_ENDPOINT = - 'http://daedalusqa.matomo.cloud/matomo.php'; + 'https://daedalusqa.matomo.cloud/matomo.php'; export const PRIVACY_POLICY_LINK = 'https://static.iohk.io/terms/iog-privacy-policy.pdf'; export const DEV_MODE_SITE_MAP_ID = 1; diff --git a/source/renderer/app/containers/wallet/WalletSummaryPage.tsx b/source/renderer/app/containers/wallet/WalletSummaryPage.tsx index 68fa6866e3..5dd71ccf91 100755 --- a/source/renderer/app/containers/wallet/WalletSummaryPage.tsx +++ b/source/renderer/app/containers/wallet/WalletSummaryPage.tsx @@ -14,6 +14,10 @@ import { formattedWalletAmount } from '../../utils/formatters'; import { getNetworkExplorerUrlByType } from '../../utils/network'; import { WALLET_ASSETS_ENABLED } from '../../config/walletsConfig'; import { getAssetTokens, sortAssets } from '../../utils/assets'; +import { + withAnalytics, + WithAnalyticsTrackerProps, +} from '../../components/analytics/withAnalytics'; import type { InjectedProps } from '../../types/injectedPropsType'; export const messages = defineMessages({ @@ -24,7 +28,7 @@ export const messages = defineMessages({ 'Message shown when wallet has no transactions on wallet summary page.', }, }); -type Props = InjectedProps; +type Props = InjectedProps & WithAnalyticsTrackerProps; type OpenAssetSettingsDialogArgs = { asset: AssetToken; }; @@ -162,7 +166,7 @@ class WalletSummaryPage extends Component { hasAssetsEnabled={hasAssetsEnabled} getAsset={getAsset} onCopyAssetParam={onCopyAssetParam.trigger} - analyticsClient={this.props.stores.analytics.analyticsClient} + analyticsTracker={this.props.analyticsTracker} /> ); } else if (!hasAny) { @@ -204,4 +208,4 @@ class WalletSummaryPage extends Component { } } -export default WalletSummaryPage; +export default withAnalytics(WalletSummaryPage); diff --git a/storybook/stories/wallets/send/WalletSend.stories.tsx b/storybook/stories/wallets/send/WalletSend.stories.tsx index 04d3e34fe6..27b0d9e727 100644 --- a/storybook/stories/wallets/send/WalletSend.stories.tsx +++ b/storybook/stories/wallets/send/WalletSend.stories.tsx @@ -19,9 +19,7 @@ import Wallet, { import WalletSendForm from '../../../../source/renderer/app/components/wallet/WalletSendForm'; import type { WalletTokens } from '../../../../source/renderer/app/api/assets/types'; import { WalletSendConfirmationDialogView } from '../../../../source/renderer/app/containers/wallet/dialogs/send-confirmation/SendConfirmation.view'; -import { NoopAnalyticsTracker } from '../../../../source/renderer/app/analytics'; - -const analyticsTracker = NoopAnalyticsTracker; +import { noopAnalyticsTracker as analyticsTracker } from '../../../../source/renderer/app/analytics'; const allAssets = [ generateAssetToken( From ffe500f61a22e0e8bc219aa7d49db2fa7aec38f8 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 22:07:24 +0200 Subject: [PATCH 25/41] [DDW-809] Fix tests --- source/main/trezor/connection.ts | 1 - .../components/wallet/WalletSendForm.spec.tsx | 3 ++- .../discreet-mode/integration-tests.spec.tsx | 20 +++++++++++-------- .../renderer/app/stores/SidebarStore.spec.ts | 4 ++-- .../renderer/app/stores/VotingStore.spec.ts | 4 ++-- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/source/main/trezor/connection.ts b/source/main/trezor/connection.ts index ac5bc8d1b3..49fcda15ef 100644 --- a/source/main/trezor/connection.ts +++ b/source/main/trezor/connection.ts @@ -14,7 +14,6 @@ export const initTrezorConnect = async () => { logger.info('[TREZOR-CONNECT] Called TrezorConnect.init()'); } catch (error) { logger.info('[TREZOR-CONNECT] Failed to call TrezorConnect.init()'); - throw error; } }; diff --git a/source/renderer/app/components/wallet/WalletSendForm.spec.tsx b/source/renderer/app/components/wallet/WalletSendForm.spec.tsx index f9254d3d86..874a8e5d96 100644 --- a/source/renderer/app/components/wallet/WalletSendForm.spec.tsx +++ b/source/renderer/app/components/wallet/WalletSendForm.spec.tsx @@ -21,6 +21,7 @@ import { BrowserLocalStorageBridge } from '../../features/local-storage'; import { HwDeviceStatuses } from '../../domains/Wallet'; import WalletTokenPicker from './tokens/wallet-token-picker/WalletTokenPicker'; import WalletSendForm from './WalletSendForm'; +import { noopAnalyticsTracker } from '../../analytics'; describe('wallet/Wallet Send Form', () => { beforeEach(() => addLocaleData([...en])); @@ -88,7 +89,7 @@ describe('wallet/Wallet Send Form', () => { walletName={faker.name.firstName()} onTokenPickerDialogClose={() => setTokenPickerOpen(false)} onTokenPickerDialogOpen={() => setTokenPickerOpen(true)} - analyticsTracker={jest.fn() as any} + analyticsTracker={noopAnalyticsTracker} /> diff --git a/source/renderer/app/features/discreet-mode/integration-tests.spec.tsx b/source/renderer/app/features/discreet-mode/integration-tests.spec.tsx index 77f20d3288..3d7b89e8e2 100644 --- a/source/renderer/app/features/discreet-mode/integration-tests.spec.tsx +++ b/source/renderer/app/features/discreet-mode/integration-tests.spec.tsx @@ -16,6 +16,8 @@ import { withDiscreetMode, } from './ui'; import { DiscreetMode } from './feature'; +import { AnalyticsProvider } from '../../components/analytics'; +import { noopAnalyticsTracker } from '../../analytics'; describe('Discreet Mode feature', () => { afterEach(cleanup); @@ -29,15 +31,17 @@ describe('Discreet Mode feature', () => { }) { return ( - - - <> - + + + + <> + -
{children}
- -
-
+
{children}
+ +
+
+
); } diff --git a/source/renderer/app/stores/SidebarStore.spec.ts b/source/renderer/app/stores/SidebarStore.spec.ts index ec44327e58..718898aedc 100644 --- a/source/renderer/app/stores/SidebarStore.spec.ts +++ b/source/renderer/app/stores/SidebarStore.spec.ts @@ -4,6 +4,7 @@ import type { ActionsMap } from '../actions/index'; import { WalletSortBy, WalletSortOrder } from '../types/sidebarTypes'; import type { SidebarWalletType } from '../types/sidebarTypes'; import SidebarStore from './SidebarStore'; +import { noopAnalyticsTracker } from '../analytics'; describe('Sidebar Store', () => { const api: Api = { @@ -11,7 +12,6 @@ describe('Sidebar Store', () => { localStorage: jest.fn(), } as any; const actions: ActionsMap = jest.fn() as any; - const analyticsTrackerMock = jest.fn() as any; function setupStore({ wallets, @@ -23,7 +23,7 @@ describe('Sidebar Store', () => { isLegacy?: boolean; }>; }) { - const sidebarStore = new SidebarStore(api, actions, analyticsTrackerMock); + const sidebarStore = new SidebarStore(api, actions, noopAnalyticsTracker); sidebarStore.stores = { wallets: { all: wallets, diff --git a/source/renderer/app/stores/VotingStore.spec.ts b/source/renderer/app/stores/VotingStore.spec.ts index 88c99c54fa..6d049c494a 100644 --- a/source/renderer/app/stores/VotingStore.spec.ts +++ b/source/renderer/app/stores/VotingStore.spec.ts @@ -2,6 +2,7 @@ import type { Api } from '../api/index'; import type { ActionsMap } from '../actions/index'; import VotingStore, { FundPhase } from './VotingStore'; import type { CatalystFund } from '../api/voting/types'; +import { noopAnalyticsTracker } from '../analytics'; const mockFundInfo = { current: { @@ -17,7 +18,6 @@ describe('VotingStore', () => { ada: jest.fn(), } as any; const actions: ActionsMap = jest.fn() as any; - const analyticsTrackerMock = jest.fn() as any; const cases = [ [undefined, null], @@ -42,7 +42,7 @@ describe('VotingStore', () => { ], [mockFundInfo.current.resultsTime, FundPhase.RESULTS], ]; - const votingStore = new VotingStore(api, actions, analyticsTrackerMock); + const votingStore = new VotingStore(api, actions, noopAnalyticsTracker); beforeAll(() => { votingStore.catalystFund = mockFundInfo as CatalystFund; From 2759b0307b99ef4dad7536d3c9a7cc50703f4341 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 28 Jun 2022 22:40:48 +0200 Subject: [PATCH 26/41] [DDW-809] Address PR comments --- source/renderer/app/analytics/index.ts | 2 +- source/renderer/app/analytics/types.ts | 11 +++++- .../staking/stake-pools/StakePools.tsx | 10 +++--- .../app/components/wallet/WalletSendForm.tsx | 6 ++-- .../transactions/WalletTransactionsList.tsx | 4 +-- .../app/features/discreet-mode/feature.ts | 6 ++-- source/renderer/app/stores/AppStore.ts | 30 +++++++++------- source/renderer/app/stores/AssetsStore.ts | 8 +++-- source/renderer/app/stores/CurrencyStore.ts | 9 +++-- .../app/stores/HardwareWalletsStore.ts | 5 +-- .../renderer/app/stores/NetworkStatusStore.ts | 3 +- source/renderer/app/stores/ProfileStore.ts | 10 ++++-- source/renderer/app/stores/SidebarStore.ts | 17 ++++----- source/renderer/app/stores/StakingStore.ts | 18 +++++++--- .../renderer/app/stores/TransactionsStore.ts | 11 ++++-- source/renderer/app/stores/UiDialogsStore.ts | 10 ++++-- source/renderer/app/stores/VotingStore.ts | 3 +- .../app/stores/WalletMigrationStore.ts | 6 +++- .../app/stores/WalletSettingsStore.ts | 10 ++++-- source/renderer/app/stores/WalletsStore.ts | 35 ++++++++++++++----- 20 files changed, 146 insertions(+), 68 deletions(-) diff --git a/source/renderer/app/analytics/index.ts b/source/renderer/app/analytics/index.ts index e0a27fea05..903e452e9f 100644 --- a/source/renderer/app/analytics/index.ts +++ b/source/renderer/app/analytics/index.ts @@ -1,3 +1,3 @@ -export { AnalyticsAcceptanceStatus } from './types'; +export { AnalyticsAcceptanceStatus, EventCategories } from './types'; export type { AnalyticsClient, AnalyticsTracker } from './types'; export { noopAnalyticsTracker } from './NoopAnalyticsTracker'; diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index 13f92e2d17..56737d3a6b 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -13,5 +13,14 @@ export interface AnalyticsTracker { enableTracking(): Promise; disableTracking(): void; sendPageNavigationEvent(pageTitle: string): void; - sendEvent(category: string, name: string, action?: string): void; + sendEvent(category: EventCategories, name: string, action?: string): void; +} + +export enum EventCategories { + WALLETS = 'Wallets', + STAKE_POOLS = 'Stake Pools', + SETTINGS = 'Settings', + LAYOUT = 'Layout', + SYSTEM_MENU = 'System Menu', + VOTING = 'Voting', } diff --git a/source/renderer/app/components/staking/stake-pools/StakePools.tsx b/source/renderer/app/components/staking/stake-pools/StakePools.tsx index ec1a0f2a1c..c1f1af675a 100644 --- a/source/renderer/app/components/staking/stake-pools/StakePools.tsx +++ b/source/renderer/app/components/staking/stake-pools/StakePools.tsx @@ -23,7 +23,7 @@ import { import smashSettingsIcon from '../../../assets/images/smash-settings-ic.inline.svg'; import tinySpinnerIcon from '../../../assets/images/spinner-tiny.inline.svg'; import { getSmashServerNameFromUrl } from '../../../utils/staking'; -import { AnalyticsTracker } from '../../../analytics'; +import { AnalyticsTracker, EventCategories } from '../../../analytics'; const messages = defineMessages({ delegatingListTitle: { @@ -120,7 +120,7 @@ class StakePools extends Component { sendSearchAnalyticsEvent = debounce( () => this.props.analyticsTracker.sendEvent( - 'Stake Pools', + EventCategories.STAKE_POOLS, 'Used stake pools search' ), 5000 @@ -147,7 +147,7 @@ class StakePools extends Component { }); this.props.analyticsTracker.sendEvent( - 'Stake Pools', + EventCategories.STAKE_POOLS, 'Changed view to grid view' ); }; @@ -159,7 +159,7 @@ class StakePools extends Component { }); this.props.analyticsTracker.sendEvent( - 'Stake Pools', + EventCategories.STAKE_POOLS, 'Changed view to grid rewards view' ); }; @@ -171,7 +171,7 @@ class StakePools extends Component { }); this.props.analyticsTracker.sendEvent( - 'Stake Pools', + EventCategories.STAKE_POOLS, 'Changed view to list view' ); }; diff --git a/source/renderer/app/components/wallet/WalletSendForm.tsx b/source/renderer/app/components/wallet/WalletSendForm.tsx index 68b4cc9c67..fd3e0d1bc8 100755 --- a/source/renderer/app/components/wallet/WalletSendForm.tsx +++ b/source/renderer/app/components/wallet/WalletSendForm.tsx @@ -41,7 +41,7 @@ import { DiscreetWalletAmount } from '../../features/discreet-mode'; import WalletTokenPicker from './tokens/wallet-token-picker/WalletTokenPicker'; import { ClearButton } from './widgets/ClearButton'; import { Divider } from './widgets/Divider'; -import { AnalyticsTracker } from '../../analytics'; +import { AnalyticsTracker, EventCategories } from '../../analytics'; messages.fieldIsRequired = globalMessages.fieldIsRequired; type AdaInputState = 'restored' | 'updated' | 'reset' | 'none'; @@ -709,7 +709,7 @@ class WalletSendForm extends Component { this.removeAssetFields(uniqueId); await this.calculateTransactionFee(true); this.props.analyticsTracker.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Removed token from transaction' ); } @@ -1170,7 +1170,7 @@ class WalletSendForm extends Component { onTokenPickerDialogClose(); checked.forEach(this.addAssetRow); this.props.analyticsTracker.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Added token to transaction' ); }} diff --git a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx index 214b657ffa..c9c2862988 100644 --- a/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx +++ b/source/renderer/app/components/wallet/transactions/WalletTransactionsList.tsx @@ -16,7 +16,7 @@ import { SimpleTransactionList } from './render-strategies/SimpleTransactionList import { TransactionInfo, TransactionsGroup } from './types'; import type { Row } from './types'; import { getNonZeroAssetTokens } from '../../../utils/assets'; -import { AnalyticsTracker } from '../../../analytics'; +import { AnalyticsTracker, EventCategories } from '../../../analytics'; const messages = defineMessages({ today: { @@ -206,7 +206,7 @@ class WalletTransactionsList extends Component { if (this.props.onShowMoreTransactions) { this.props.onShowMoreTransactions(walletId); this.props.analyticsTracker.sendEvent( - 'Wallet Details', + EventCategories.WALLETS, 'Clicked Show More Transactions button' ); } diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index 4f429009fd..987f48e267 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -5,7 +5,7 @@ import { DiscreetModeApi } from './api'; import { SENSITIVE_DATA_SYMBOL } from './config'; import { defaultReplacer } from './replacers/defaultReplacer'; import type { ReplacerFn } from './types'; -import { AnalyticsTracker } from '../../analytics'; +import { AnalyticsTracker, EventCategories } from '../../analytics'; export class DiscreetMode extends Feature { constructor( @@ -52,7 +52,7 @@ export class DiscreetMode extends Feature { toggleDiscreetMode = () => { this.isDiscreetMode = !this.isDiscreetMode; this.analyticsTracker.sendEvent( - 'Settings', + EventCategories.SETTINGS, this.isDiscreetMode ? 'Turned on discreet mode' : 'Turned off discreet mode' @@ -67,7 +67,7 @@ export class DiscreetMode extends Feature { this.openInDiscreetMode = nextSetting; }); this.analyticsTracker.sendEvent( - 'Settings', + EventCategories.SETTINGS, this.isDiscreetMode ? 'Turned on discreet mode by default' : 'Turned off discreet mode by default' diff --git a/source/renderer/app/stores/AppStore.ts b/source/renderer/app/stores/AppStore.ts index 969a126a61..04d90bd00a 100644 --- a/source/renderer/app/stores/AppStore.ts +++ b/source/renderer/app/stores/AppStore.ts @@ -15,6 +15,7 @@ import { getGPUStatusChannel } from '../ipc/get-gpu-status.ipc'; import { generateFileNameWithTimestamp } from '../../../common/utils/files'; import type { GpuStatus } from '../types/gpuStatus'; import type { ApplicationDialog } from '../types/applicationDialogTypes'; +import { EventCategories } from '../analytics'; export default class AppStore extends Store { @observable @@ -89,7 +90,7 @@ export default class AppStore extends Store { this.newsFeedIsOpen = !this.newsFeedIsOpen; if (this.newsFeedIsOpen) { - this._sendAnalyticsEvent('Topbar', 'Opened newsfeed'); + this.analytics.sendEvent(EventCategories.LAYOUT, 'Opened newsfeed'); } }; @action @@ -118,21 +119,27 @@ export default class AppStore extends Store { case DIALOGS.ABOUT: // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message this._updateActiveDialog(DIALOGS.ABOUT); - this._sendAnalyticsEvent('System menu', 'Showed about dialog'); + this.analytics.sendEvent( + EventCategories.SYSTEM_MENU, + 'Showed about dialog' + ); break; case DIALOGS.DAEDALUS_DIAGNOSTICS: // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message this._updateActiveDialog(DIALOGS.DAEDALUS_DIAGNOSTICS); - this._sendAnalyticsEvent('System menu', 'Showed diagnostics dialog'); + this.analytics.sendEvent( + EventCategories.SYSTEM_MENU, + 'Showed diagnostics dialog' + ); break; case DIALOGS.TOGGLE_RTS_FLAGS_MODE: // @ts-ignore ts-migrate(2345) FIXME: Argument of type 'string' is not assignable to par... Remove this comment to see the full error message this._updateActiveDialog(DIALOGS.TOGGLE_RTS_FLAGS_MODE); - this._sendAnalyticsEvent( - 'System menu', + this.analytics.sendEvent( + EventCategories.SYSTEM_MENU, 'Showed toggle RTS flags dialog' ); break; @@ -140,15 +147,18 @@ export default class AppStore extends Store { case DIALOGS.ITN_REWARDS_REDEMPTION: // @ts-ignore ts-migrate(2554) FIXME: Expected 1 arguments, but got 0. this.actions.staking.onRedeemStart.trigger(); - this._sendAnalyticsEvent( - 'System menu', + this.analytics.sendEvent( + EventCategories.SYSTEM_MENU, 'Showed ITN rewards redemption dialog' ); break; case NOTIFICATIONS.DOWNLOAD_LOGS: this._downloadLogs(); - this._sendAnalyticsEvent('System menu', 'Downloaded logs'); + this.analytics.sendEvent( + EventCategories.SYSTEM_MENU, + 'Downloaded logs' + ); break; case PAGES.SETTINGS: @@ -247,8 +257,4 @@ export default class AppStore extends Store { _setIsDownloadingLogs = (isDownloadNotificationVisible: boolean) => { this.isDownloadNotificationVisible = isDownloadNotificationVisible; }; - - _sendAnalyticsEvent = (category: string, actionName: string) => { - this.analytics.sendEvent(category, actionName); - }; } diff --git a/source/renderer/app/stores/AssetsStore.ts b/source/renderer/app/stores/AssetsStore.ts index a1f9c4e615..721cbd6588 100644 --- a/source/renderer/app/stores/AssetsStore.ts +++ b/source/renderer/app/stores/AssetsStore.ts @@ -6,6 +6,7 @@ import Asset from '../domains/Asset'; import { ROUTES } from '../routes-config'; import { ellipsis } from '../utils/strings'; import type { GetAssetsResponse, AssetToken } from '../api/assets/types'; +import { EventCategories } from '../analytics'; type WalletId = string; export default class AssetsStore extends Store { @@ -108,7 +109,10 @@ export default class AssetsStore extends Store { decimals, }); - this.analytics.sendEvent('Wallets', 'Changed native token settings'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Changed native token settings' + ); }; @action _onEditedAssetUnset = () => { @@ -197,7 +201,7 @@ export default class AssetsStore extends Store { await this.favoritesRequest.execute(); this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, !isFavorite ? 'Added token from favorites' : 'Removed token from favorites' diff --git a/source/renderer/app/stores/CurrencyStore.ts b/source/renderer/app/stores/CurrencyStore.ts index 0cab997980..cbdaddb31a 100644 --- a/source/renderer/app/stores/CurrencyStore.ts +++ b/source/renderer/app/stores/CurrencyStore.ts @@ -7,6 +7,7 @@ import { getCurrencyFromCode, } from '../config/currencyConfig'; import type { Currency, LocalizedCurrency } from '../types/currencyTypes'; +import { EventCategories } from '../analytics'; export default class CurrencyStore extends Store { @observable @@ -128,7 +129,11 @@ export default class CurrencyStore extends Store { await this.api.localStorage.setCurrencySelected(selected.code); } - this.analytics.sendEvent('Settings', 'Changed currency', code); + this.analytics.sendEvent( + EventCategories.SETTINGS, + 'Changed currency', + code + ); }; @action _toggleCurrencyIsActive = () => { @@ -136,7 +141,7 @@ export default class CurrencyStore extends Store { this.api.localStorage.setCurrencyIsActive(this.isActive); this.analytics.sendEvent( - 'Settings', + EventCategories.SETTINGS, `Turned ${ this.isActive ? 'on' : 'off' } displaying ada balances in other currency` diff --git a/source/renderer/app/stores/HardwareWalletsStore.ts b/source/renderer/app/stores/HardwareWalletsStore.ts index aabc4e8b29..0cb2c9f490 100644 --- a/source/renderer/app/stores/HardwareWalletsStore.ts +++ b/source/renderer/app/stores/HardwareWalletsStore.ts @@ -101,6 +101,7 @@ import type { TrezorWitness, } from '../../../common/types/hardware-wallets.types'; import { logger } from '../utils/logging'; +import { EventCategories } from '../analytics'; export type TxSignRequestTypes = { coinSelection: CoinSelectionsResponse; @@ -526,7 +527,7 @@ export default class HardwareWalletsStore extends Store { ); this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Transaction made', 'Hardware wallet' ); @@ -1472,7 +1473,7 @@ export default class HardwareWalletsStore extends Store { } this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Verified wallet address with hardware wallet' ); } else { diff --git a/source/renderer/app/stores/NetworkStatusStore.ts b/source/renderer/app/stores/NetworkStatusStore.ts index 3eb504abd3..3c14077ec0 100644 --- a/source/renderer/app/stores/NetworkStatusStore.ts +++ b/source/renderer/app/stores/NetworkStatusStore.ts @@ -42,6 +42,7 @@ import type { CheckDiskSpaceResponse } from '../../../common/types/no-disk-space import { TlsCertificateNotValidError } from '../api/nodes/errors'; import { openLocalDirectoryChannel } from '../ipc/open-local-directory'; import { toggleRTSFlagsModeChannel } from '../ipc/toggleRTSFlagsModeChannel'; +import { EventCategories } from '../analytics'; // DEFINE CONSTANTS ------------------------- const NETWORK_STATUS = { @@ -432,7 +433,7 @@ export default class NetworkStatusStore extends Store { // DEFINE ACTIONS @action _toggleRTSFlagsMode = async () => { this.analytics.sendEvent( - 'Settings', + EventCategories.SETTINGS, `RTS flags ${this.isRTSFlagsModeEnabled ? 'disabled' : 'enabled'}` ); await toggleRTSFlagsModeChannel.send(); diff --git a/source/renderer/app/stores/ProfileStore.ts b/source/renderer/app/stores/ProfileStore.ts index 2787f5368a..2cbddd7f30 100644 --- a/source/renderer/app/stores/ProfileStore.ts +++ b/source/renderer/app/stores/ProfileStore.ts @@ -41,7 +41,7 @@ import { TIME_OPTIONS, } from '../config/profileConfig'; import { buildSystemInfo } from '../utils/buildSystemInfo'; -import { AnalyticsAcceptanceStatus } from '../analytics/types'; +import { AnalyticsAcceptanceStatus, EventCategories } from '../analytics/types'; export default class ProfileStore extends Store { @observable @@ -370,7 +370,11 @@ export default class ProfileStore extends Store { this.stores.wallets.refreshWalletsData(); } - this.analytics.sendEvent('Settings', 'Changed user settings', param); + this.analytics.sendEvent( + EventCategories.SETTINGS, + 'Changed user settings', + param + ); }; _updateTheme = async ({ theme }: { theme: string }) => { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message @@ -378,7 +382,7 @@ export default class ProfileStore extends Store { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message await this.getThemeRequest.execute(); - this.analytics.sendEvent('Settings', 'Changed theme', theme); + this.analytics.sendEvent(EventCategories.SETTINGS, 'Changed theme', theme); }; _acceptTermsOfUse = async () => { // @ts-ignore ts-migrate(1320) FIXME: Type of 'await' operand must either be a valid pro... Remove this comment to see the full error message diff --git a/source/renderer/app/stores/SidebarStore.ts b/source/renderer/app/stores/SidebarStore.ts index 59fe6879db..1310ca29c2 100644 --- a/source/renderer/app/stores/SidebarStore.ts +++ b/source/renderer/app/stores/SidebarStore.ts @@ -10,6 +10,7 @@ import type { import { WalletSortBy, WalletSortOrder } from '../types/sidebarTypes'; import { changeWalletSorting, sortWallets } from '../utils/walletSorting'; import Store from './lib/Store'; +import { EventCategories } from '../analytics'; export default class SidebarStore extends Store { @observable @@ -98,7 +99,10 @@ export default class SidebarStore extends Store { currentSortBy: this.walletSortConfig.sortBy, }); - this._sendAnalyticsEvent('Changed wallet sorting settings'); + this.analytics.sendEvent( + EventCategories.LAYOUT, + 'Changed wallet sorting settings' + ); }; @action onSearchValueUpdated = (searchValue: string) => { @@ -178,17 +182,17 @@ export default class SidebarStore extends Store { @action _showSubMenus = () => { this.isShowingSubMenus = true; - this._sendAnalyticsEvent('Toggled submenu'); + this.analytics.sendEvent(EventCategories.LAYOUT, 'Toggled submenu'); }; @action _hideSubMenus = () => { this.isShowingSubMenus = false; - this._sendAnalyticsEvent('Toggled submenu'); + this.analytics.sendEvent(EventCategories.LAYOUT, 'Toggled submenu'); }; @action _toggleSubMenus = () => { this.isShowingSubMenus = !this.isShowingSubMenus; - this._sendAnalyticsEvent('Toggled submenu'); + this.analytics.sendEvent(EventCategories.LAYOUT, 'Toggled submenu'); }; _syncSidebarRouteWithRouter = () => { const route = this.stores.app.currentRoute; @@ -205,10 +209,7 @@ export default class SidebarStore extends Store { this._configureCategories(); } }; - _sendAnalyticsEvent = (action: string) => { - this.analytics.sendEvent('Layout', action); - }; _sendSearchAnalyticsEvent = debounce(() => { - this._sendAnalyticsEvent('Used wallet search'); + this.analytics.sendEvent(EventCategories.LAYOUT, 'Used wallet search'); }, 5000); } diff --git a/source/renderer/app/stores/StakingStore.ts b/source/renderer/app/stores/StakingStore.ts index 53438b2981..14ecb68d07 100644 --- a/source/renderer/app/stores/StakingStore.ts +++ b/source/renderer/app/stores/StakingStore.ts @@ -36,6 +36,7 @@ import { showSaveDialogChannel } from '../ipc/show-file-dialog-channels'; import { generateFileNameWithTimestamp } from '../../../common/utils/files'; import type { RedeemItnRewardsStep } from '../types/stakingTypes'; import type { CsvFileContent } from '../../../common/types/csv-request.types'; +import { EventCategories } from '../analytics'; export default class StakingStore extends Store { @observable @@ -229,7 +230,10 @@ export default class StakingStore extends Store { }; _sendStakePoolsSliderUsedAnalyticsEvent = debounce(() => { - this.analytics.sendEvent('Stake Pools', 'Used stake pools amount slider'); + this.analytics.sendEvent( + EventCategories.STAKE_POOLS, + 'Used stake pools amount slider' + ); }, 5000); @action @@ -273,7 +277,10 @@ export default class StakingStore extends Store { // Update // @ts-ignore ts-migrate(2339) FIXME: Property 'api' does not exist on type 'StakingStor... Remove this comment to see the full error message await this.api.localStorage.setSmashServer(smashServerUrl); - this.analytics.sendEvent('Settings', 'Changed SMASH server'); + this.analytics.sendEvent( + EventCategories.SETTINGS, + 'Changed SMASH server' + ); } catch (error) { runInAction(() => { this.smashServerUrlError = error; @@ -395,7 +402,7 @@ export default class StakingStore extends Store { const wallet = this.stores.wallets.getWalletById(walletId); this.analytics.sendEvent( - 'Stake Pools', + EventCategories.STAKE_POOLS, wallet.isDelegating ? 'Redelegated a wallet' : 'Delegated a wallet' ); } catch (error) { @@ -522,7 +529,10 @@ export default class StakingStore extends Store { }); // @ts-ignore ts-migrate(2339) FIXME: Property 'actions' does not exist on type 'Staking... Remove this comment to see the full error message this.actions.staking.requestCSVFileSuccess.trigger(); - this.analytics.sendEvent('Stake Pools', 'Exported rewards as CSV'); + this.analytics.sendEvent( + EventCategories.STAKE_POOLS, + 'Exported rewards as CSV' + ); }; calculateDelegationFee = async ( delegationFeeRequest: GetDelegationFeeRequest diff --git a/source/renderer/app/stores/TransactionsStore.ts b/source/renderer/app/stores/TransactionsStore.ts index 829d05e086..ab480dd3b0 100644 --- a/source/renderer/app/stores/TransactionsStore.ts +++ b/source/renderer/app/stores/TransactionsStore.ts @@ -28,6 +28,7 @@ import { isTransactionInFilterRange, } from '../utils/transaction'; import type { ApiTokens } from '../api/assets/types'; +import { EventCategories } from '../analytics'; const INITIAL_SEARCH_LIMIT = null; // 'null' value stands for 'load all' @@ -368,7 +369,10 @@ export default class TransactionsStore extends Store { ...filterOptions, }; - this.analytics.sendEvent('Wallets', 'Set transaction filters'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Set transaction filters' + ); return true; }; @action @@ -407,7 +411,10 @@ export default class TransactionsStore extends Store { }); if (success) { actions.transactions.requestCSVFileSuccess.trigger(); - this.analytics.sendEvent('Wallets', 'Exported transactions as CSV'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Exported transactions as CSV' + ); } }; @action diff --git a/source/renderer/app/stores/UiDialogsStore.ts b/source/renderer/app/stores/UiDialogsStore.ts index db7c1aa22b..064cb8dc87 100644 --- a/source/renderer/app/stores/UiDialogsStore.ts +++ b/source/renderer/app/stores/UiDialogsStore.ts @@ -4,6 +4,7 @@ import Store from './lib/Store'; import WalletReceiveDialog from '../components/wallet/receive/WalletReceiveDialog'; import AssetSettingsDialog from '../components/assets/AssetSettingsDialog'; import DelegationSetupWizardDialog from '../components/staking/delegation-setup-wizard/DelegationSetupWizardDialog'; +import { EventCategories } from '../analytics'; export default class UiDialogsStore extends Store { @observable @@ -62,18 +63,21 @@ export default class UiDialogsStore extends Store { switch (dialog) { case WalletReceiveDialog: this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Opened share wallet address modal' ); break; case AssetSettingsDialog: - this.analytics.sendEvent('Wallets', 'Opened native token settings'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Opened native token settings' + ); break; case DelegationSetupWizardDialog: this.analytics.sendEvent( - 'Stake Pools', + EventCategories.STAKE_POOLS, 'Opened delegate wallet dialog' ); break; diff --git a/source/renderer/app/stores/VotingStore.ts b/source/renderer/app/stores/VotingStore.ts index 834adf9946..2b35664fae 100644 --- a/source/renderer/app/stores/VotingStore.ts +++ b/source/renderer/app/stores/VotingStore.ts @@ -22,6 +22,7 @@ import type { VotingMetadataType, } from '../api/transactions/types'; import type { CatalystFund } from '../api/voting/types'; +import { EventCategories } from '../analytics'; export type VotingRegistrationKeyType = { bytes: (...args: Array) => any; @@ -406,7 +407,7 @@ export default class VotingStore extends Store { this._setQrCode(formattedArrayBufferToHexString(encrypt)); this._nextRegistrationStep(); - this.analytics.sendEvent('Voting', 'Registered for voting'); + this.analytics.sendEvent(EventCategories.VOTING, 'Registered for voting'); }; _saveAsPDF = async () => { const { qrCode, selectedWalletId } = this; diff --git a/source/renderer/app/stores/WalletMigrationStore.ts b/source/renderer/app/stores/WalletMigrationStore.ts index 057ee165c7..ee07ac5f5a 100644 --- a/source/renderer/app/stores/WalletMigrationStore.ts +++ b/source/renderer/app/stores/WalletMigrationStore.ts @@ -29,6 +29,7 @@ import { import { IMPORT_WALLET_STEPS } from '../config/walletRestoreConfig'; import { IS_AUTOMATIC_WALLET_MIGRATION_ENABLED } from '../config/walletsConfig'; import type { ImportWalletStep } from '../types/walletRestoreTypes'; +import { EventCategories } from '../analytics'; export type WalletMigrationStatus = | 'unstarted' @@ -312,7 +313,10 @@ export default class WalletMigrationStore extends Store { this.isRestorationRunning = false; }); - this.analytics.sendEvent('Wallets', 'Restored legacy wallet(s)'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Restored legacy wallet(s)' + ); }; @action _restoreWallet = async (exportedWallet: ExportedByronWallet) => { diff --git a/source/renderer/app/stores/WalletSettingsStore.ts b/source/renderer/app/stores/WalletSettingsStore.ts index f63b4a2d40..68b8f5ae2f 100644 --- a/source/renderer/app/stores/WalletSettingsStore.ts +++ b/source/renderer/app/stores/WalletSettingsStore.ts @@ -11,6 +11,7 @@ import type { WalletExportToFileParams } from '../actions/wallet-settings-action import type { WalletUtxos } from '../api/wallets/types'; import type { WalletLocalData } from '../api/utils/localStorage'; import { RECOVERY_PHRASE_VERIFICATION_STATUSES } from '../config/walletRecoveryPhraseVerificationConfig'; +import { EventCategories } from '../analytics'; export default class WalletSettingsStore extends Store { @observable @@ -157,7 +158,7 @@ export default class WalletSettingsStore extends Store { this.updateSpendingPasswordRequest.reset(); this.stores.wallets.refreshWalletsData(); this.analytics.sendEvent( - 'Wallet Settings', + EventCategories.WALLETS, 'Changed wallet settings', 'password' ); @@ -195,7 +196,7 @@ export default class WalletSettingsStore extends Store { this.updateWalletRequest.reset(); this.stores.wallets.refreshWalletsData(); this.analytics.sendEvent( - 'Wallet Settings', + EventCategories.WALLETS, 'Changed wallet settings', field ); @@ -289,7 +290,10 @@ export default class WalletSettingsStore extends Store { const isCorrect = walletId === activeWalletId; const nextStep = isCorrect ? 3 : 4; - this.analytics.sendEvent('Wallets', 'Verified recovery phrase'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Verified recovery phrase' + ); if (isCorrect) { const recoveryPhraseVerificationDate = new Date(); diff --git a/source/renderer/app/stores/WalletsStore.ts b/source/renderer/app/stores/WalletsStore.ts index b7ebf5a38f..7032203c81 100644 --- a/source/renderer/app/stores/WalletsStore.ts +++ b/source/renderer/app/stores/WalletsStore.ts @@ -57,6 +57,7 @@ import type { HardwareWalletExtendedPublicKeyResponse, } from '../../../common/types/hardware-wallets.types'; import { NetworkMagics } from '../../../common/types/cardano-node.types'; +import { EventCategories } from '../analytics'; /* eslint-disable consistent-return */ /** @@ -365,7 +366,10 @@ export default class WalletsStore extends Store { runInAction('update account public key', () => { this.activePublicKey = accountPublicKey; }); - this.analytics.sendEvent('Wallets', 'Reveal wallet public key'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Reveal wallet public key' + ); } catch (error) { throw error; } @@ -398,7 +402,10 @@ export default class WalletsStore extends Store { runInAction('update ICO public key', () => { this.icoPublicKey = icoPublicKey; }); - this.analytics.sendEvent('Wallets', 'Reveal wallet public key'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Reveal wallet public key' + ); } catch (error) { throw error; } @@ -467,7 +474,7 @@ export default class WalletsStore extends Store { this.refreshWalletsData(); this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Restored a software wallet', this.walletKind ); @@ -626,7 +633,10 @@ export default class WalletsStore extends Store { this.goToWalletRoute(wallet.id); this.refreshWalletsData(); this.actions.dialogs.closeActiveDialog.trigger(); - this.analytics.sendEvent('Wallets', 'Created a new hardware wallet'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Created a new hardware wallet' + ); } } catch (error) { throw error; @@ -647,7 +657,10 @@ export default class WalletsStore extends Store { this.actions.dialogs.closeActiveDialog.trigger(); this.goToWalletRoute(wallet.id); this.refreshWalletsData(); - this.analytics.sendEvent('Wallets', 'Created a new software wallet'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Created a new software wallet' + ); } }; _deleteWallet = async (params: { walletId: string; isLegacy: boolean }) => { @@ -692,7 +705,7 @@ export default class WalletsStore extends Store { }); this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Wallet deleted', walletToDelete.isHardwareWallet ? 'Hardware wallet' : 'Software wallet' ); @@ -833,7 +846,11 @@ export default class WalletsStore extends Store { assets: formattedAssets, hasAssetsRemainingAfterTransaction, }); - this.analytics.sendEvent('Wallets', 'Transaction made', 'Software wallet'); + this.analytics.sendEvent( + EventCategories.WALLETS, + 'Transaction made', + 'Software wallet' + ); this.refreshWalletsData(); this.actions.dialogs.closeActiveDialog.trigger(); this.sendMoneyRequest.reset(); @@ -1526,7 +1543,7 @@ export default class WalletsStore extends Store { walletAddress, }); this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Saved wallet address as PDF', 'Software wallet' ); @@ -1551,7 +1568,7 @@ export default class WalletsStore extends Store { walletAddress, }); this.analytics.sendEvent( - 'Wallets', + EventCategories.WALLETS, 'Saved wallet address as QR code', 'Software wallet' ); From e39ce55d819cfab85e544d528b7e0d1ad5d9c53d Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Wed, 29 Jun 2022 13:30:38 +0200 Subject: [PATCH 27/41] [DDW-809] Disable menu until analytics accepted/rejected --- source/renderer/app/containers/MenuUpdater/useMenuUpdater.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/renderer/app/containers/MenuUpdater/useMenuUpdater.ts b/source/renderer/app/containers/MenuUpdater/useMenuUpdater.ts index ef6957e23e..a701e81979 100644 --- a/source/renderer/app/containers/MenuUpdater/useMenuUpdater.ts +++ b/source/renderer/app/containers/MenuUpdater/useMenuUpdater.ts @@ -3,6 +3,7 @@ import { matchPath } from 'react-router-dom'; import { WalletSettingsStateEnum } from '../../../../common/ipc/api'; import { ROUTES } from '../../routes-config'; import type { UseMenuUpdaterArgs } from './types'; +import { AnalyticsAcceptanceStatus } from '../../analytics'; const walletRoutes = Object.values(ROUTES.WALLETS); @@ -32,7 +33,9 @@ const useMenuUpdater = ({ } rebuildApplicationMenu.send({ - isNavigationEnabled: profile.areTermsOfUseAccepted, + isNavigationEnabled: + profile.areTermsOfUseAccepted && + profile.analyticsAcceptanceStatus !== AnalyticsAcceptanceStatus.PENDING, walletSettingsState, }); }, [ From 92dc3776d9bad987039261910d56f6fec109af5d Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Thu, 30 Jun 2022 13:53:28 +0200 Subject: [PATCH 28/41] [DDW-809] New text for skip button - WIP --- source/renderer/app/analytics/types.ts | 3 +- source/renderer/app/api/utils/localStorage.ts | 4 +- .../AnalyticsConsentForm.messages.ts | 4 +- .../analytics/AnalyticsConsentForm.scss | 2 +- .../analytics/AnalyticsConsentForm.tsx | 6 +-- .../categories/SupportSettings.messages.ts | 9 ++++- .../settings/categories/SupportSettings.tsx | 13 +++++-- .../containers/MenuUpdater/useMenuUpdater.ts | 5 ++- .../categories/SupportSettingsPage.tsx | 2 +- source/renderer/app/i18n/locales/en-US.json | 9 +++-- source/renderer/app/i18n/locales/ja-JP.json | 9 +++-- source/renderer/app/stores/ProfileStore.ts | 38 +++++++++++-------- 12 files changed, 64 insertions(+), 40 deletions(-) diff --git a/source/renderer/app/analytics/types.ts b/source/renderer/app/analytics/types.ts index 56737d3a6b..0e119cecea 100644 --- a/source/renderer/app/analytics/types.ts +++ b/source/renderer/app/analytics/types.ts @@ -4,7 +4,8 @@ export interface AnalyticsClient { } export enum AnalyticsAcceptanceStatus { - PENDING = 'PENDING', + INITIAL_DECISION_REQUIRED = 'INITIAL_DECISION_REQUIRED', + DECISION_CHANGE_REQUESTED = 'DECISION_CHANGE_REQUESTED', ACCEPTED = 'ACCEPTED', REJECTED = 'REJECTED', } diff --git a/source/renderer/app/api/utils/localStorage.ts b/source/renderer/app/api/utils/localStorage.ts index 0b609f7c31..f1d2bc974c 100644 --- a/source/renderer/app/api/utils/localStorage.ts +++ b/source/renderer/app/api/utils/localStorage.ts @@ -147,14 +147,14 @@ export default class LocalStorageApi { getAnalyticsAcceptance = (): Promise => LocalStorageApi.get( keys.ANALYTICS_ACCEPTANCE, - AnalyticsAcceptanceStatus.PENDING + AnalyticsAcceptanceStatus.INITIAL_DECISION_REQUIRED ); setAnalyticsAcceptance = (status: AnalyticsAcceptanceStatus): Promise => LocalStorageApi.set(keys.ANALYTICS_ACCEPTANCE, status); unsetAnalyticsAcceptance = (): Promise => LocalStorageApi.set( keys.ANALYTICS_ACCEPTANCE, - AnalyticsAcceptanceStatus.PENDING + AnalyticsAcceptanceStatus.INITIAL_DECISION_REQUIRED ); getUserID = async (): Promise => { let userId: string = await LocalStorageApi.get(keys.USER_ID, null); diff --git a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts index 0b90e08a8d..91627ff990 100644 --- a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts +++ b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.messages.ts @@ -22,8 +22,8 @@ export const messages = defineMessages({ defaultMessage: '!!!Allow', description: 'Analytics data collection allow button text', }, - skipButton: { - id: 'analytics.dialog.skipButton', + disallowButton: { + id: 'analytics.form.disallowButton', defaultMessage: '!!!Skip', description: 'Analytics data collection skip button text', }, diff --git a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.scss b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.scss index fc43c7feef..26e669b681 100644 --- a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.scss +++ b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.scss @@ -42,7 +42,7 @@ margin-top: 24px; } -.skipButton { +.disallowButton { margin-right: 12px; } diff --git a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx index 8a5d7072c8..41bca62ca2 100644 --- a/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx +++ b/source/renderer/app/components/profile/analytics/AnalyticsConsentForm.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback } from 'react'; +import React, { useCallback } from 'react'; import { FormattedMessage, injectIntl } from 'react-intl'; import { Button } from 'react-polymorph/lib/components/Button'; import { Link } from 'react-polymorph/lib/components/Link'; @@ -57,8 +57,8 @@ function AnalyticsConsentForm({

)} diff --git a/source/renderer/app/components/wallet/send-form/AssetInput.tsx b/source/renderer/app/components/wallet/send-form/AssetInput.tsx index 6dde6ff1fd..ae2541d470 100644 --- a/source/renderer/app/components/wallet/send-form/AssetInput.tsx +++ b/source/renderer/app/components/wallet/send-form/AssetInput.tsx @@ -11,7 +11,7 @@ import removeIcon from '../../../assets/images/remove.inline.svg'; import type { NumberFormat } from '../../../../../common/types/number.types'; import { DiscreetTokenWalletAmount } from '../../../features/discreet-mode'; import Asset from '../../assets/Asset'; -import { Divider } from '../widgets/Divider'; +import { VerticalSeparator } from '../widgets/VerticalSeparator'; import { ClearButton } from '../widgets/ClearButton'; import styles from './AssetInput.scss'; import messages from './messages'; @@ -152,7 +152,7 @@ class AssetInput extends Component { )} {ticker ? ( <> - + {ticker} ) : null} diff --git a/source/renderer/app/components/wallet/widgets/Divider.tsx b/source/renderer/app/components/wallet/widgets/VerticalSeparator.tsx similarity index 75% rename from source/renderer/app/components/wallet/widgets/Divider.tsx rename to source/renderer/app/components/wallet/widgets/VerticalSeparator.tsx index dee00283b9..d79a795011 100644 --- a/source/renderer/app/components/wallet/widgets/Divider.tsx +++ b/source/renderer/app/components/wallet/widgets/VerticalSeparator.tsx @@ -2,6 +2,6 @@ import React from 'react'; import styles from './Divider.scss'; -export function Divider() { +export function VerticalSeparator() { return ; } diff --git a/source/renderer/app/features/discreet-mode/feature.ts b/source/renderer/app/features/discreet-mode/feature.ts index 54f12fa1a6..9d59a72e99 100644 --- a/source/renderer/app/features/discreet-mode/feature.ts +++ b/source/renderer/app/features/discreet-mode/feature.ts @@ -53,9 +53,7 @@ export class DiscreetMode extends Feature { this.isDiscreetMode = !this.isDiscreetMode; this.analyticsTracker.sendEvent( EventCategories.SETTINGS, - this.isDiscreetMode - ? 'Turned on discreet mode' - : 'Turned off discreet mode' + `Turned ${this.isDiscreetMode ? 'on' : 'off'} discreet mode` ); }; @action @@ -68,9 +66,7 @@ export class DiscreetMode extends Feature { }); this.analyticsTracker.sendEvent( EventCategories.SETTINGS, - nextSetting - ? 'Turned on discreet mode by default' - : 'Turned off discreet mode by default' + `Turned ${nextSetting ? 'on' : 'off'} discreet mode by default` ); }; diff --git a/source/renderer/app/stores/AssetsStore.ts b/source/renderer/app/stores/AssetsStore.ts index 721cbd6588..44d228bb60 100644 --- a/source/renderer/app/stores/AssetsStore.ts +++ b/source/renderer/app/stores/AssetsStore.ts @@ -202,9 +202,7 @@ export default class AssetsStore extends Store { this.analytics.sendEvent( EventCategories.WALLETS, - !isFavorite - ? 'Added token from favorites' - : 'Removed token from favorites' + `${!isFavorite ? 'Added' : 'Removed'} token from favorites` ); }; _retrieveAssetsRequest = (walletId: string): Request => diff --git a/storybook/stories/common/Widgets.stories.tsx b/storybook/stories/common/Widgets.stories.tsx index d53078973a..4bd601e419 100644 --- a/storybook/stories/common/Widgets.stories.tsx +++ b/storybook/stories/common/Widgets.stories.tsx @@ -24,6 +24,7 @@ import ButtonLink from '../../../source/renderer/app/components/widgets/ButtonLi import NormalSwitch from '../../../source/renderer/app/components/widgets/forms/NormalSwitch'; import { Separator } from '../../../source/renderer/app/components/widgets/separator/Separator'; import { CollapsibleSection } from '../../../source/renderer/app/components/widgets/collapsible-section/CollapsibleSection'; +import { VerticalSeparator } from '../../../source/renderer/app/components/wallet/widgets/VerticalSeparator'; const { intl: enIntl } = new IntlProvider({ locale: 'en-US', @@ -266,4 +267,9 @@ storiesOf('Common / Widgets', module) + )) + .add('VerticalSeparator', () => ( + + + )); From eef8073bbff157835de30a82a891492e295e10cd Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 22 Aug 2022 15:28:19 +0200 Subject: [PATCH 38/41] [DDW-1125] Final analytics config --- source/renderer/app/config/analyticsConfig.ts | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/source/renderer/app/config/analyticsConfig.ts b/source/renderer/app/config/analyticsConfig.ts index f239171b82..cd163cddaa 100644 --- a/source/renderer/app/config/analyticsConfig.ts +++ b/source/renderer/app/config/analyticsConfig.ts @@ -1,25 +1,28 @@ import { Network } from '../../../common/types/environment.types'; -export const ANALYTICS_API_ENDPOINT = - 'https://daedalusqa2.matomo.cloud/matomo.php'; +export const ANALYTICS_API_ENDPOINT = 'https://matomo.cw.iog.io/matomo.php'; export const PRIVACY_POLICY_LINK = 'https://static.iohk.io/terms/iog-privacy-policy.pdf'; -export const DEV_MODE_SITE_MAP_ID = 1; + +// ID used when Daedalus is launched from nix-shell +export const DEV_MODE_SITE_MAP_ID = 11; + +// IDs used when Daedalus is launched as a binary (installed with installer) export const NETWORK_TO_ANALYTICS_SITE_ID_MAP: Record = { - mainnet: 4, - mainnet_flight: 4, + mainnet: 2, + mainnet_flight: 12, testnet: 3, - preprod: 3, - preview: 3, - staging: 5, - shelley_qa: 5, - alonzo_purple: 5, - selfnode: 5, - development: 5, - vasil_dev: 5, + preprod: 9, + preview: 10, + staging: 4, + shelley_qa: 6, + alonzo_purple: 7, + selfnode: 11, + development: 11, + vasil_dev: 8, }; -export const CPU_DIMENSION_KEY = 'dimension2'; -export const RAM_DIMENSION_KEY = 'dimension3'; -export const OS_DIMENSION_KEY = 'dimension4'; -export const VERSION_DIMENSION_KEY = 'dimension5'; +export const CPU_DIMENSION_KEY = 'dimension1'; +export const RAM_DIMENSION_KEY = 'dimension2'; +export const OS_DIMENSION_KEY = 'dimension3'; +export const VERSION_DIMENSION_KEY = 'dimension4'; From 02e79e5596f702efa5ce0ec5ce22e14d61167bab Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 22 Aug 2022 16:42:15 +0200 Subject: [PATCH 39/41] Update CSP headers --- source/renderer/index.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/renderer/index.ejs b/source/renderer/index.ejs index 6c430af395..e627e30fa1 100644 --- a/source/renderer/index.ejs +++ b/source/renderer/index.ejs @@ -13,7 +13,7 @@ script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; - connect-src 'self' https://*.matomo.cloud/ http://localhost:8080; + connect-src 'self' https://matomo.cw.iog.io/ http://localhost:8080; " > Daedalus From 061eca85a1bfed5357bb4f506686e2316607e1c0 Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Mon, 22 Aug 2022 17:41:50 +0200 Subject: [PATCH 40/41] Update the changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a76faa0a5..1275489fa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Features - Added new Mnemonic input component ([PR 2979](https://github.com/input-output-hk/daedalus/pull/2979)) +- Added analytics data collection ([PR 2927](https://github.com/input-output-hk/daedalus/pull/2927), [PR 2989](https://github.com/input-output-hk/daedalus/pull/2989), [PR 3003](https://github.com/input-output-hk/daedalus/pull/3003), [PR 3028](https://github.com/input-output-hk/daedalus/pull/3028)) ### Fixes @@ -48,7 +49,6 @@ - Added support for Ledger Nano S Plus ([PR 2975](https://github.com/input-output-hk/daedalus/pull/2975)) - Support of Apple AArch64 chip ([PR 2684](https://github.com/input-output-hk/daedalus/pull/2684)) -- Added analytics data collection ([PR 2927](https://github.com/input-output-hk/daedalus/pull/2927), [PR 2989](https://github.com/input-output-hk/daedalus/pull/2989), [PR 3003](https://github.com/input-output-hk/daedalus/pull/3003)) ### Chores From 0cdf36d347057a50e027907ec7a9eec920521a4b Mon Sep 17 00:00:00 2001 From: Marcin Mazurek Date: Tue, 13 Sep 2022 11:23:15 +0200 Subject: [PATCH 41/41] [DDW-1125] Fix typo --- source/renderer/app/stores/AssetsStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/renderer/app/stores/AssetsStore.ts b/source/renderer/app/stores/AssetsStore.ts index 44d228bb60..bc23ef3d10 100644 --- a/source/renderer/app/stores/AssetsStore.ts +++ b/source/renderer/app/stores/AssetsStore.ts @@ -202,7 +202,7 @@ export default class AssetsStore extends Store { this.analytics.sendEvent( EventCategories.WALLETS, - `${!isFavorite ? 'Added' : 'Removed'} token from favorites` + `${!isFavorite ? 'Added token to' : 'Removed token from'} favorites` ); }; _retrieveAssetsRequest = (walletId: string): Request =>