From d03096fb017627c29ebfce9f6178b82508e8234d Mon Sep 17 00:00:00 2001 From: Iveta Date: Mon, 11 Sep 2023 09:42:29 -0400 Subject: [PATCH 1/3] Updated onboarding last steps (#955) * Functional, needs styling * Use proper apostrophe --- .../src/popup/assets/illo-pin-extension.svg | 26 +++++++++++ .../views/FullscreenSuccessMessage/index.tsx | 33 +++++-------- .../FullscreenSuccessMessage/styles.scss | 16 +++++-- .../src/popup/views/PinExtension/index.tsx | 46 +++++++++++++------ .../src/popup/views/PinExtension/styles.scss | 13 ++++-- 5 files changed, 91 insertions(+), 43 deletions(-) create mode 100644 extension/src/popup/assets/illo-pin-extension.svg diff --git a/extension/src/popup/assets/illo-pin-extension.svg b/extension/src/popup/assets/illo-pin-extension.svg new file mode 100644 index 0000000000..df2173d34c --- /dev/null +++ b/extension/src/popup/assets/illo-pin-extension.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extension/src/popup/views/FullscreenSuccessMessage/index.tsx b/extension/src/popup/views/FullscreenSuccessMessage/index.tsx index 624b920ff0..e1a1408617 100644 --- a/extension/src/popup/views/FullscreenSuccessMessage/index.tsx +++ b/extension/src/popup/views/FullscreenSuccessMessage/index.tsx @@ -1,7 +1,7 @@ import React from "react"; import { useLocation } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import { Button, Icon, Notification } from "@stellar/design-system"; +import { Button, Notification } from "@stellar/design-system"; import { emitMetric } from "helpers/metrics"; @@ -12,7 +12,6 @@ import { SubmitButtonWrapper } from "popup/basics/Forms"; import { FullscreenStyle } from "popup/components/FullscreenStyle"; import { Header } from "popup/components/Header"; import { OnboardingHeader } from "popup/components/Onboarding"; -import SuccessIllo from "popup/assets/illo-success-screen.svg"; import ExtensionIllo from "popup/assets/illo-extension.png"; import "./styles.scss"; @@ -27,16 +26,12 @@ const AvoidScamsWarningBlock = () => { return (
- } - title={t("Avoid scams and keep your account safe")} - > +
  • {t( - "Freighter will never ask for your recovery phrase unless you’re actively importing your account using the browser extension - never on an external website.", + "Freighter will never ask for your recovery phrase unless you’re actively importing your account using the browser extension - never on an external website", )}
  • @@ -72,8 +67,8 @@ const MnemonicPhraseConfirmedMessage = () => { @@ -153,15 +151,8 @@ export const FullscreenSuccessMessage = () => {
    -
    - Success -
    - {t("Woo, you’re in!")} + {t("Wallet created successfully!")}
    {IS_MNEMONIC_PHRASE_STATE ? ( diff --git a/extension/src/popup/views/FullscreenSuccessMessage/styles.scss b/extension/src/popup/views/FullscreenSuccessMessage/styles.scss index 0eed86669d..cc22135802 100644 --- a/extension/src/popup/views/FullscreenSuccessMessage/styles.scss +++ b/extension/src/popup/views/FullscreenSuccessMessage/styles.scss @@ -15,6 +15,7 @@ ul { list-style-type: disc; } + li { margin-top: 1rem; line-height: 1.5rem; @@ -45,18 +46,22 @@ justify-content: start; padding: 0 0 2rem 0; color: var(--color-gray-90); - max-width: 24rem; + max-width: 31rem; } &__infoBlock { margin-bottom: 0.5rem; &__list { - margin-top: -0.25rem; + list-style: inside; ::before { content: none !important; } + + li:not(:last-of-type) { + margin-bottom: 1rem; + } } } @@ -74,14 +79,17 @@ } &__copy { - text-align: center; font-size: 1rem; line-height: 1.5rem; font-weight: var(--font-weight-normal); margin-bottom: 1.5rem; p { - color: rgba(255, 255, 255, 0.6); + color: var(--color-gray-70) !important; + + strong { + color: var(--color-gray-80) !important; + } } } } diff --git a/extension/src/popup/views/PinExtension/index.tsx b/extension/src/popup/views/PinExtension/index.tsx index 6001b501b1..8cbd9e522c 100644 --- a/extension/src/popup/views/PinExtension/index.tsx +++ b/extension/src/popup/views/PinExtension/index.tsx @@ -1,10 +1,12 @@ import React from "react"; import { useTranslation } from "react-i18next"; +import { Button, Icon } from "@stellar/design-system"; -import ExtensionsMenu from "popup/assets/extensions-menu.png"; -import ExtensionsPin from "popup/assets/extensions-pin.png"; +import ExtensionsPin from "popup/assets/illo-pin-extension.svg"; +import { SubmitButtonWrapper } from "popup/basics/Forms"; import { Header } from "popup/components/Header"; import { FullscreenStyle } from "popup/components/FullscreenStyle"; +import { OnboardingHeader } from "popup/components/Onboarding"; import "./styles.scss"; @@ -17,24 +19,38 @@ export const PinExtension = () => {
    -
    - {t("Pin the extension in your browser to access it easily.")} -
    -
    - 1.{" "} - {t( - "Click on the extensions button at the top of your browser’s bar", - )} -
    -
    - Extensions Menu -
    + + {t("Your Freighter install is complete")} +
    - 2. {t("Click on Freighter’s pin button to have it always visible")} +
    + 1.{" "} + {t( + "Click on the extensions button at the top of your browser’s bar", + )} +
    +
    + 2.{" "} + {t("Click on Freighter’s pin button to have it always visible")} +
    Extensions Pin
    + + +
    diff --git a/extension/src/popup/views/PinExtension/styles.scss b/extension/src/popup/views/PinExtension/styles.scss index 68d93f14c2..c23109b4d0 100644 --- a/extension/src/popup/views/PinExtension/styles.scss +++ b/extension/src/popup/views/PinExtension/styles.scss @@ -6,7 +6,7 @@ align-items: center; &__wrapper { - max-width: 24rem; + max-width: 31rem; } &__title { @@ -14,15 +14,22 @@ line-height: 2.25rem; text-align: center; color: var(--color-gray-90); + margin-bottom: 1rem; } &__caption { line-height: 1.5rem; - margin: 2rem 0; - color: var(--color-gray-60); + margin-bottom: 2rem; + color: var(--color-gray-70); + + div:not(:last-child) { + margin-bottom: 0.4rem; + } } &__img { + margin-bottom: 2rem; + img { width: 100%; } From b9509780897b84f1510832e135e1745fc953d349 Mon Sep 17 00:00:00 2001 From: aristides Date: Wed, 13 Sep 2023 13:04:09 -0600 Subject: [PATCH 2/3] Network Settings - Soroban RPC URL (#953) * renames url field in network settings, adds soroban rpc url field * adds handling for optional soroban rpc support * also config custom soroban rpcs * refactor helper to be more concise --- @shared/api/helpers/soroban.ts | 27 ++++++++++++++++ @shared/api/internal.ts | 15 +++++++-- @shared/api/types.ts | 1 + @shared/constants/stellar.ts | 1 + @shared/helpers/types.ts | 2 ++ .../src/background/helpers/dataStorage.ts | 21 +++++++++++++ extension/src/background/index.ts | 2 ++ extension/src/popup/SorobanContext.tsx | 31 ++++++++++++++----- .../manageNetwork/NetworkForm/index.tsx | 30 ++++++++++++++++-- .../SendConfirm/TransactionDetails/index.tsx | 1 + extension/src/popup/ducks/settings.ts | 1 + extension/src/popup/ducks/soroban.ts | 5 +++ 12 files changed, 126 insertions(+), 11 deletions(-) create mode 100644 @shared/api/helpers/soroban.ts create mode 100644 @shared/helpers/types.ts diff --git a/@shared/api/helpers/soroban.ts b/@shared/api/helpers/soroban.ts new file mode 100644 index 0000000000..da428db8a7 --- /dev/null +++ b/@shared/api/helpers/soroban.ts @@ -0,0 +1,27 @@ +import { xdr, Address, ScInt, scValToBigInt } from "soroban-client"; + +export const accountIdentifier = (account: string) => + new Address(account).toScVal(); + +export const valueToI128String = (value: xdr.ScVal) => + scValToBigInt(value).toString(); + +// How do we decode these in a more generic way? +export const decodei128 = (b64: string) => { + const value = xdr.ScVal.fromXDR(b64, "base64"); + try { + return valueToI128String(value); + } catch (error) { + console.error(error); + return 0; + } +}; + +export const decodeStr = (b64: string) => + xdr.ScVal.fromXDR(b64, "base64").str().toString(); + +export const decodeU32 = (b64: string) => + xdr.ScVal.fromXDR(b64, "base64").u32(); + +export const numberToI128 = (value: number): xdr.ScVal => + new ScInt(value).toI128(); diff --git a/@shared/api/internal.ts b/@shared/api/internal.ts index 8fa6823fb6..b51d2c4527 100644 --- a/@shared/api/internal.ts +++ b/@shared/api/internal.ts @@ -19,7 +19,8 @@ import { MAINNET_NETWORK_DETAILS, DEFAULT_NETWORKS, NetworkDetails, - SOROBAN_RPC_URLS, + NETWORKS, + SOROBAN_RPC_URLS } from "../constants/stellar"; import { SERVICE_TYPES } from "../constants/services"; import { APPLICATION_STATE } from "../constants/applicationState"; @@ -636,7 +637,17 @@ export const submitFreighterSorobanTransaction = async ({ console.error(e); } - const server = new SorobanClient.Server(SOROBAN_RPC_URLS.FUTURENET!, { + if (!networkDetails.sorobanRpcUrl && networkDetails.network !== NETWORKS.FUTURENET) { + throw new Error("soroban rpc not supported") + } + + // TODO: after enough time has passed to assume most clients have ran + // the migrateSorobanRpcUrlNetworkDetails migration, remove and use networkDetails.sorobanRpcUrl + const serverUrl = !networkDetails.sorobanRpcUrl + ? SOROBAN_RPC_URLS[NETWORKS.FUTURENET]! + : networkDetails.sorobanRpcUrl + + const server = new SorobanClient.Server(serverUrl, { allowHttp: true, }); diff --git a/@shared/api/types.ts b/@shared/api/types.ts index 3652d793df..611b52a610 100644 --- a/@shared/api/types.ts +++ b/@shared/api/types.ts @@ -48,6 +48,7 @@ export interface Response { isValidatingSafeAssetsEnabled: boolean; isExperimentalModeEnabled: boolean; networkDetails: NetworkDetails; + sorobanRpcUrl: string; networksList: NetworkDetails[]; allAccounts: Array; accountName: string; diff --git a/@shared/constants/stellar.ts b/@shared/constants/stellar.ts index ae44cafb73..8ff513b617 100644 --- a/@shared/constants/stellar.ts +++ b/@shared/constants/stellar.ts @@ -33,6 +33,7 @@ export interface NetworkDetails { networkUrl: string; networkPassphrase: string; friendbotUrl?: string; + sorobanRpcUrl?: string } export const MAINNET_NETWORK_DETAILS: NetworkDetails = { diff --git a/@shared/helpers/types.ts b/@shared/helpers/types.ts new file mode 100644 index 0000000000..cb0bc9aa07 --- /dev/null +++ b/@shared/helpers/types.ts @@ -0,0 +1,2 @@ + +export type WithRequired = T & { [P in K]-?: T[P] } \ No newline at end of file diff --git a/extension/src/background/helpers/dataStorage.ts b/extension/src/background/helpers/dataStorage.ts index 99a5f3a11b..1faf9c5653 100644 --- a/extension/src/background/helpers/dataStorage.ts +++ b/extension/src/background/helpers/dataStorage.ts @@ -7,6 +7,7 @@ import { NETWORKS, TESTNET_NETWORK_DETAILS, FUTURENET_NETWORK_DETAILS, + SOROBAN_RPC_URLS, } from "@shared/constants/stellar"; interface SetItemParams { @@ -105,3 +106,23 @@ export const migrateFriendBotUrlNetworkDetails = async () => { await localStore.setItem(NETWORKS_LIST_ID, migratedNetworkList); }; + +export const migrateSorobanRpcUrlNetworkDetails = async () => { + const localStore = dataStorageAccess(browserLocalStorage); + + const networksList: NetworkDetails[] = + (await localStore.getItem(NETWORKS_LIST_ID)) || DEFAULT_NETWORKS; + + const migratedNetworkList = networksList.map((network) => { + if (network.network === NETWORKS.FUTURENET) { + return { + ...FUTURENET_NETWORK_DETAILS, + sorobanRpcUrl: SOROBAN_RPC_URLS[NETWORKS.FUTURENET] + } + } + + return network; + }); + + await localStore.setItem(NETWORKS_LIST_ID, migratedNetworkList); +} diff --git a/extension/src/background/index.ts b/extension/src/background/index.ts index a82d40b815..956b3ff06a 100644 --- a/extension/src/background/index.ts +++ b/extension/src/background/index.ts @@ -13,6 +13,7 @@ import { timeoutAccountAccess } from "./ducks/session"; import { migrateFriendBotUrlNetworkDetails, normalizeMigratedData, + migrateSorobanRpcUrlNetworkDetails } from "./helpers/dataStorage"; export const initContentScriptMessageListener = () => { @@ -56,6 +57,7 @@ export const initInstalledListener = () => { }); browser?.runtime?.onInstalled.addListener(normalizeMigratedData); browser?.runtime?.onInstalled.addListener(migrateFriendBotUrlNetworkDetails); + browser?.runtime?.onInstalled.addListener(migrateSorobanRpcUrlNetworkDetails); }; export const initAlarmListener = (sessionStore: Store) => { diff --git a/extension/src/popup/SorobanContext.tsx b/extension/src/popup/SorobanContext.tsx index d4a16d9a44..d08bd32382 100644 --- a/extension/src/popup/SorobanContext.tsx +++ b/extension/src/popup/SorobanContext.tsx @@ -2,7 +2,10 @@ import React from "react"; import { useSelector } from "react-redux"; import * as SorobanClient from "soroban-client"; -import { NETWORKS, SOROBAN_RPC_URLS } from "@shared/constants/stellar"; +import { + SOROBAN_RPC_URLS, + NETWORKS +} from "@shared/constants/stellar"; import { settingsNetworkDetailsSelector } from "./ducks/settings"; @@ -28,14 +31,16 @@ export const SorobanProvider = ({ pubKey: string; }) => { const networkDetails = useSelector(settingsNetworkDetailsSelector); - const serverUrl = SOROBAN_RPC_URLS[networkDetails.network as NETWORKS]; - let server: SorobanContextInterface["server"]; - let newTxBuilder: SorobanContextInterface["newTxBuilder"]; + let server: SorobanContextInterface['server'] + let newTxBuilder: SorobanContextInterface['newTxBuilder'] + if (!networkDetails.sorobanRpcUrl && networkDetails.network === NETWORKS.FUTURENET) { + // TODO: after enough time has passed to assume most clients have ran + // the migrateSorobanRpcUrlNetworkDetails migration, remove and use networkDetails.sorobanRpcUrl + const serverUrl = SOROBAN_RPC_URLS[NETWORKS.FUTURENET]! - if (serverUrl) { server = new SorobanClient.Server(serverUrl, { - allowHttp: networkDetails.networkUrl.startsWith("http://"), + allowHttp: serverUrl.startsWith("http://"), }); newTxBuilder = async (fee = SorobanClient.BASE_FEE) => { @@ -45,8 +50,20 @@ export const SorobanProvider = ({ networkPassphrase: networkDetails.networkPassphrase, }); }; - } + } else if (networkDetails.sorobanRpcUrl) { + server = new SorobanClient.Server(networkDetails.sorobanRpcUrl, { + allowHttp: networkDetails.sorobanRpcUrl.startsWith("http://"), + }); + newTxBuilder = async (fee = SorobanClient.BASE_FEE) => { + const sourceAccount = await server!.getAccount(pubKey); + return new SorobanClient.TransactionBuilder(sourceAccount, { + fee, + networkPassphrase: networkDetails.networkPassphrase, + }); + }; + } + return ( {children} diff --git a/extension/src/popup/components/manageNetwork/NetworkForm/index.tsx b/extension/src/popup/components/manageNetwork/NetworkForm/index.tsx index 14f15d66a6..7bb954603d 100644 --- a/extension/src/popup/components/manageNetwork/NetworkForm/index.tsx +++ b/extension/src/popup/components/manageNetwork/NetworkForm/index.tsx @@ -10,6 +10,7 @@ import { AppDispatch } from "popup/App"; import { SimpleBarWrapper } from "popup/basics/SimpleBarWrapper"; import { PillButton } from "popup/basics/buttons/PillButton"; import { ROUTES } from "popup/constants/routes"; +import { NETWORKS, NETWORK_NAMES, SOROBAN_RPC_URLS } from "@shared/constants/stellar"; import { navigateTo } from "popup/helpers/navigate"; import { isNetworkUrlValid as isNetworkUrlValidHelper } from "popup/helpers/account"; @@ -36,6 +37,7 @@ interface FormValues { networkName: string; networkPassphrase: string; networkUrl: string; + sorobanRpcUrl?: string isSwitchSelected?: boolean; isAllowHttpSelected: boolean; friendbotUrl?: string; @@ -72,10 +74,12 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { const isEditingDefaultNetworks = isEditing && (networkIndex === 0 || networkIndex === 1); + const initialValues: FormValues = isEditing ? { ...networkDetailsToEdit, isSwitchSelected: false, + sorobanRpcUrl: SOROBAN_RPC_URLS[networkDetailsToEdit.network as NETWORKS], isAllowHttpSelected: !networkDetailsToEdit?.networkUrl.includes( "https", ), @@ -84,6 +88,7 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { networkName: "", networkPassphrase: "", networkUrl: "", + sorobanRpcUrl: "", friendbotUrl: "", isSwitchSelected: false, isAllowHttpSelected: false, @@ -93,6 +98,7 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { networkName: YupString().required(), networkPassphrase: YupString().required(), networkUrl: YupString().required(), + sorobanRpcUrl: YupString() }); const handleRemoveNetwork = async () => { @@ -113,7 +119,7 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { }; const getCustomNetworkDetailsFromFormValues = (values: FormValues) => { - const { friendbotUrl, networkName, networkUrl, networkPassphrase } = values; + const { friendbotUrl, networkName, networkUrl, networkPassphrase, sorobanRpcUrl } = values; return { friendbotUrl, @@ -121,6 +127,7 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { networkName, networkUrl, networkPassphrase, + sorobanRpcUrl }; }; @@ -179,6 +186,8 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { } }; + const supportsSorobanRpc = (network: string) => network === NETWORK_NAMES.FUTURENET + const handleSubmit = async (values: FormValues) => { if (isEditing) { await handleEditNetwork(values); @@ -345,10 +354,27 @@ export const NetworkForm = ({ isEditing }: NetworkFormProps) => { : "" } customInput={} - label={t("URL")} + label={t("HORIZON RPC URL")} name="networkUrl" placeholder={t("Enter network URL")} /> + {supportsSorobanRpc(initialValues.networkName) || !isEditingDefaultNetworks ? ( + } + label={t("SOROBAN RPC URL")} + name="sorobanRpcUrl" + placeholder={t("Enter Soroban RPC URL")} + /> + ) : null} void }) => { }, [dispatch]); const handleXferTransaction = async () => { + try { const assetAddress = asset.split(":")[1]; const assetBalance = tokenBalances.find( diff --git a/extension/src/popup/ducks/settings.ts b/extension/src/popup/ducks/settings.ts index eebbca4bbd..5af870dd7d 100644 --- a/extension/src/popup/ducks/settings.ts +++ b/extension/src/popup/ducks/settings.ts @@ -34,6 +34,7 @@ const initialState: Settings = { networkName: "", networkUrl: "", networkPassphrase: "", + sorobanRpcUrl: "", } as NetworkDetails, networksList: DEFAULT_NETWORKS, isMemoValidationEnabled: true, diff --git a/extension/src/popup/ducks/soroban.ts b/extension/src/popup/ducks/soroban.ts index 914dca0bb2..9ee03ae228 100644 --- a/extension/src/popup/ducks/soroban.ts +++ b/extension/src/popup/ducks/soroban.ts @@ -18,6 +18,11 @@ export const getTokenBalances = createAsyncThunk< { sorobanClient: SorobanContextInterface }, { rejectValue: ErrorMessage } >("getTokenBalances", async ({ sorobanClient }, thunkApi) => { + + if (!sorobanClient.server || !sorobanClient.newTxBuilder) { + throw new Error("soroban rpc not supported") + } + try { const { publicKey } = await internalLoadAccount(); const tokenIdList = await internalGetTokenIds(); From 47bca9eaa9386199cfb9dba45c06572d3b62547d Mon Sep 17 00:00:00 2001 From: Piyal Basu Date: Wed, 13 Sep 2023 19:10:52 -0400 Subject: [PATCH 3/3] Added translations --- .../src/popup/locales/en/translation.json | 21 ++++++++++--------- .../src/popup/locales/pt/translation.json | 21 ++++++++++--------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/extension/src/popup/locales/en/translation.json b/extension/src/popup/locales/en/translation.json index abd6c14492..ad89ef8141 100644 --- a/extension/src/popup/locales/en/translation.json +++ b/extension/src/popup/locales/en/translation.json @@ -62,10 +62,10 @@ "Authorization Revocable": "Authorization Revocable", "Authorization Revocable; Authorization Immutable": "Authorization Revocable; Authorization Immutable", "available": "available", - "Avoid scams and keep your account safe": "Avoid scams and keep your account safe", "Awesome, you passed the test": { " Keep your recovery phrase safe, it’s your responsibility": "Awesome, you passed the test. Keep your recovery phrase safe, it’s your responsibility." }, + "Awesome, you passed the test! Pin the extension in your browser to access it easily": "Awesome, you passed the test! Pin the extension in your browser to access it easily.", "Balance Id": "Balance Id", "Base fee": "Base fee", "Before You Add This Asset": "Before You Add This Asset", @@ -130,6 +130,7 @@ "Enter passphrase": "Enter passphrase", "Enter password": "Enter password", "Enter Password": "Enter Password", + "Enter Soroban RPC URL": "Enter Soroban RPC URL", "Enter Token ID": "Enter Token ID", "Enter your 12 word phrase to restore your wallet": "Enter your 12 word phrase to restore your wallet", "Enter your account password to authorize this transaction": "Enter your account password to authorize this transaction.", @@ -175,7 +176,9 @@ "High Threshold": "High Threshold", "History": "History", "Home": "Home", + "HORIZON RPC URL": "HORIZON RPC URL", "I have my 12 word seed phrase": "I have my 12 word seed phrase", + "I have my recovery phrase safe": "I have my recovery phrase safe", "I have read and agree to": "I have read and agree to", "I’m aware Freighter can’t recover the imported secret key": "I’m aware Freighter can’t recover the imported secret key", "I’m going to need a seed phrase": "I’m going to need a seed phrase", @@ -206,9 +209,11 @@ "is requesting approval to sign an authorization entry": "is requesting approval to sign an authorization entry", "Issuer": "Issuer", "Keep it in a safe place": "Keep it in a safe place.", + "Keep your account safe": "Keep your account safe", "Keep your recovery phrase in a safe and secure place": { " Anyone who has access to this phrase has access to your account and to the funds in it, so save it in a safe and secure place": "Keep your recovery phrase in a safe and secure place. Anyone who has access to this phrase has access to your account and to the funds in it, so save it in a safe and secure place." }, + "Keep your recovery phrase safe, it’s your responsibility": "Keep your recovery phrase safe, it’s your responsibility.", "Learn more": "Learn more", "Learn More": "Learn More", "Learn more about account creation": "Learn more about account creation", @@ -246,7 +251,7 @@ "Min Amount B": "Min Amount B", "Min Price": "Min Price", "Minimum Received": "Minimum Received", - "Mint": "Mint", + "Minted": "Minted", "Multiple assets": "Multiple assets", "Multiple assets have a similar code, please check the domain before adding": "Multiple assets have a similar code, please check the domain before adding.", "must be below": "must be below", @@ -279,7 +284,6 @@ "Parameters": "Parameters", "Passphrase": "Passphrase", "Paths": "Paths", - "Pin the extension in your browser to access it easily": "Pin the extension in your browser to access it easily.", "Please check if the network information is correct and try again": { " Alternatively, this network may not be operational": "Please check if the network information is correct and try again. Alternatively, this network may not be operational." }, @@ -340,6 +344,7 @@ "Signer": "Signer", "Signing arbitrary data with a hardware wallet is currently not supported": "Signing arbitrary data with a hardware wallet is currently not supported.", "Signing this transaction is not possible at the moment": "Signing this transaction is not possible at the moment.", + "SOROBAN RPC URL": "SOROBAN RPC URL", "Source": "Source", "Sponsored Id": "Sponsored Id", "Stellar address is not funded": "Stellar address is not funded", @@ -401,7 +406,6 @@ "Unable to search for assets": "Unable to search for assets", "Unsafe": "Unsafe", "Unsupported signing method": "Unsupported signing method", - "URL": "URL", "Validate addresses that require a memo": "Validate addresses that require a memo", "Value Data": "Value Data", "Value Type": "Value Type", @@ -410,15 +414,14 @@ "View on": "View on", "View public key": "View public key", "Wallet Address": "Wallet Address", + "Wallet created successfully!": "Wallet created successfully!", "Want to add another account?": "Want to add another account?", "WEBSITE CONNECTION IS NOT SECURE": "WEBSITE CONNECTION IS NOT SECURE", "Weight": "Weight", "Welcome! Is this your first time using Freighter?": "Welcome! Is this your first time using Freighter?", "which is not available on Freighter": { - " If you own this account, you can import it into Freighter to complete this request": "which is not available on Freighter. If you own this account, you can import it into Freighter to complete this request.", - " If you own this account, you can import it into Freighter to complete this transaction": "which is not available on Freighter. If you own this account, you can import it into Freighter to complete this transaction." + " If you own this account, you can import it into Freighter to complete this request": "which is not available on Freighter. If you own this account, you can import it into Freighter to complete this request." }, - "Woo, you’re in!": "Woo, you’re in!", "You are attempting to sign arbitrary data": { " Please use extreme caution and understand the implications of signing this data": "You are attempting to sign arbitrary data. Please use extreme caution and understand the implications of signing this data." }, @@ -433,13 +436,11 @@ " The friendbot is a horizon API endpoint that will fund an account with 10,000 lumens": "You can fund this account using the friendbot tool. The friendbot is a horizon API endpoint that will fund an account with 10,000 lumens." }, "You must have a balance of": "You must have a balance of", - "You successfully imported your account": { - " Keep your recovery phrase safe, it’s your responsibility": "You successfully imported your account. Keep your recovery phrase safe, it’s your responsibility" - }, "You’re good to go!": "You’re good to go!", "Your account balance is not sufficient for this transaction": { " Please review the transaction and try again": "Your account balance is not sufficient for this transaction. Please review the transaction and try again." }, + "Your Freighter install is complete": "Your Freighter install is complete", "Your recovery phrase gives you access to your account and is the": "Your recovery phrase gives you access to your account and is the", "Your Stellar secret key": "Your Stellar secret key" } diff --git a/extension/src/popup/locales/pt/translation.json b/extension/src/popup/locales/pt/translation.json index 05dd9535a1..2e69ea60fd 100644 --- a/extension/src/popup/locales/pt/translation.json +++ b/extension/src/popup/locales/pt/translation.json @@ -62,10 +62,10 @@ "Authorization Revocable": "Authorization Revocable", "Authorization Revocable; Authorization Immutable": "Authorization Revocable; Authorization Immutable", "available": "available", - "Avoid scams and keep your account safe": "Avoid scams and keep your account safe", "Awesome, you passed the test": { " Keep your recovery phrase safe, it’s your responsibility": "Awesome, you passed the test. Keep your recovery phrase safe, it’s your responsibility." }, + "Awesome, you passed the test! Pin the extension in your browser to access it easily": "Awesome, you passed the test! Pin the extension in your browser to access it easily.", "Balance Id": "Balance Id", "Base fee": "Base fee", "Before You Add This Asset": "Before You Add This Asset", @@ -130,6 +130,7 @@ "Enter passphrase": "Enter passphrase", "Enter password": "Enter password", "Enter Password": "Enter Password", + "Enter Soroban RPC URL": "Enter Soroban RPC URL", "Enter Token ID": "Enter Token ID", "Enter your 12 word phrase to restore your wallet": "Enter your 12 word phrase to restore your wallet", "Enter your account password to authorize this transaction": "Enter your account password to authorize this transaction.", @@ -175,7 +176,9 @@ "High Threshold": "High Threshold", "History": "History", "Home": "Home", + "HORIZON RPC URL": "HORIZON RPC URL", "I have my 12 word seed phrase": "I have my 12 word seed phrase", + "I have my recovery phrase safe": "I have my recovery phrase safe", "I have read and agree to": "I have read and agree to", "I’m aware Freighter can’t recover the imported secret key": "I’m aware Freighter can’t recover the imported secret key", "I’m going to need a seed phrase": "I’m going to need a seed phrase", @@ -206,9 +209,11 @@ "is requesting approval to sign an authorization entry": "is requesting approval to sign an authorization entry", "Issuer": "Issuer", "Keep it in a safe place": "Keep it in a safe place.", + "Keep your account safe": "Keep your account safe", "Keep your recovery phrase in a safe and secure place": { " Anyone who has access to this phrase has access to your account and to the funds in it, so save it in a safe and secure place": "Keep your recovery phrase in a safe and secure place. Anyone who has access to this phrase has access to your account and to the funds in it, so save it in a safe and secure place." }, + "Keep your recovery phrase safe, it’s your responsibility": "Keep your recovery phrase safe, it’s your responsibility.", "Learn more": "Learn more", "Learn More": "Learn More", "Learn more about account creation": "Learn more about account creation", @@ -246,7 +251,7 @@ "Min Amount B": "Min Amount B", "Min Price": "Min Price", "Minimum Received": "Minimum Received", - "Mint": "Mint", + "Minted": "Minted", "Multiple assets": "Multiple assets", "Multiple assets have a similar code, please check the domain before adding": "Multiple assets have a similar code, please check the domain before adding.", "must be below": "must be below", @@ -279,7 +284,6 @@ "Parameters": "Parameters", "Passphrase": "Passphrase", "Paths": "Paths", - "Pin the extension in your browser to access it easily": "Pin the extension in your browser to access it easily.", "Please check if the network information is correct and try again": { " Alternatively, this network may not be operational": "Please check if the network information is correct and try again. Alternatively, this network may not be operational." }, @@ -340,6 +344,7 @@ "Signer": "Signer", "Signing arbitrary data with a hardware wallet is currently not supported": "Signing arbitrary data with a hardware wallet is currently not supported.", "Signing this transaction is not possible at the moment": "Signing this transaction is not possible at the moment.", + "SOROBAN RPC URL": "SOROBAN RPC URL", "Source": "Source", "Sponsored Id": "Sponsored Id", "Stellar address is not funded": "Stellar address is not funded", @@ -401,7 +406,6 @@ "Unable to search for assets": "Unable to search for assets", "Unsafe": "Unsafe", "Unsupported signing method": "Unsupported signing method", - "URL": "URL", "Validate addresses that require a memo": "Validate addresses that require a memo", "Value Data": "Value Data", "Value Type": "Value Type", @@ -410,15 +414,14 @@ "View on": "View on", "View public key": "View public key", "Wallet Address": "Wallet Address", + "Wallet created successfully!": "Wallet created successfully!", "Want to add another account?": "Want to add another account?", "WEBSITE CONNECTION IS NOT SECURE": "WEBSITE CONNECTION IS NOT SECURE", "Weight": "Weight", "Welcome! Is this your first time using Freighter?": "Welcome! Is this your first time using Freighter?", "which is not available on Freighter": { - " If you own this account, you can import it into Freighter to complete this request": "which is not available on Freighter. If you own this account, you can import it into Freighter to complete this request.", - " If you own this account, you can import it into Freighter to complete this transaction": "which is not available on Freighter. If you own this account, you can import it into Freighter to complete this transaction." + " If you own this account, you can import it into Freighter to complete this request": "which is not available on Freighter. If you own this account, you can import it into Freighter to complete this request." }, - "Woo, you’re in!": "Woo, you’re in!", "You are attempting to sign arbitrary data": { " Please use extreme caution and understand the implications of signing this data": "You are attempting to sign arbitrary data. Please use extreme caution and understand the implications of signing this data." }, @@ -433,13 +436,11 @@ " The friendbot is a horizon API endpoint that will fund an account with 10,000 lumens": "You can fund this account using the friendbot tool. The friendbot is a horizon API endpoint that will fund an account with 10,000 lumens." }, "You must have a balance of": "You must have a balance of", - "You successfully imported your account": { - " Keep your recovery phrase safe, it’s your responsibility": "You successfully imported your account. Keep your recovery phrase safe, it’s your responsibility" - }, "You’re good to go!": "You’re good to go!", "Your account balance is not sufficient for this transaction": { " Please review the transaction and try again": "Your account balance is not sufficient for this transaction. Please review the transaction and try again." }, + "Your Freighter install is complete": "Your Freighter install is complete", "Your recovery phrase gives you access to your account and is the": "Your recovery phrase gives you access to your account and is the", "Your Stellar secret key": "Your Stellar secret key" }