From 2d568ba4ece8801bd938c3df1595dd922580eee8 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 5 Sep 2024 16:58:39 -0700 Subject: [PATCH 01/82] Add missing saveTx for Cardano staking transactions --- .../generic/policyAdapters/CardanoKilnAdaptor.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts index a41533b1c18..7ef054e47af 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts @@ -60,7 +60,8 @@ export const makeCardanoKilnAdapter = (policyConfig: StakePolicyConfig { const signedTx = await wallet.signTx(edgeTx) - await wallet.broadcastTx(signedTx) + const broadcastTx = await wallet.broadcastTx(signedTx) + await wallet.saveTx(broadcastTx) } } }, @@ -109,7 +110,8 @@ export const makeCardanoKilnAdapter = (policyConfig: StakePolicyConfig { const signedTx = await wallet.signTx(edgeTx) - await wallet.broadcastTx(signedTx) + const broadcastTx = await wallet.broadcastTx(signedTx) + await wallet.saveTx(broadcastTx) } } }, @@ -144,7 +146,8 @@ export const makeCardanoKilnAdapter = (policyConfig: StakePolicyConfig { const signedTx = await wallet.signTx(edgeTx) - await wallet.broadcastTx(signedTx) + const broadcastTx = await wallet.broadcastTx(signedTx) + await wallet.saveTx(broadcastTx) } } }, From f341505eb2c35c41c1473e43842e2c9b6d0e1230 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Fri, 6 Sep 2024 11:54:39 -0700 Subject: [PATCH 02/82] Add a hard-coded 2.3 ADA balance requirement to stake --- src/locales/en_US.ts | 1 + src/locales/strings/enUS.json | 1 + .../generic/policyAdapters/CardanoKilnAdaptor.ts | 11 ++++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index dedc7eb697b..d062a510241 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -101,6 +101,7 @@ const strings = { error_paymentprotocol_tx_verification_failed: 'Payment Protocol transaction verification mismatch', error_spend_amount_less_then_min_s: 'Spend amount is less than minimum of %s', error_amount_too_low_to_stake_s: 'The amount %s is too low to stake successfully', + error_balance_below_minimum_to_stake_2s: 'Your balance of %1$s does not meet the minimum %2$s required to stake.', // Warning messages: warning_low_fee_selected: 'Low Fee Selected', diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index d6b5d29bc8c..453ac6c75fa 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", diff --git a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts index 7ef054e47af..5fe19321b9a 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts @@ -1,4 +1,4 @@ -import { eq, gt, sub } from 'biggystring' +import { eq, gt, lt, sub } from 'biggystring' import { EdgeCurrencyWallet, EdgeTransaction } from 'edge-core-js' import { lstrings } from '../../../../locales/strings' @@ -10,6 +10,8 @@ import { StakePolicyConfig } from '../types' import { KilnError, makeKilnApi } from '../util/kilnUtils' import { StakePolicyAdapter } from './types' +const MIN_STAKE_LOVELACE_AMOUNT = '2300000' + export interface CardanoPooledKilnAdapterConfig { type: 'cardano-pooled-kiln' pluginId: string @@ -73,6 +75,13 @@ export const makeCardanoKilnAdapter = (policyConfig: StakePolicyConfig { if (error instanceof Error) return error From 015b5b3b15900af6d6a0e746755a26902918b1b9 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Fri, 6 Sep 2024 12:13:15 -0700 Subject: [PATCH 03/82] Add APR estimate text to StakingOptionCard on StakingOptionsScene --- src/components/cards/StakingOptionCard.tsx | 17 ++++++++++------- .../scenes/Staking/StakeOptionsScene.tsx | 1 + src/locales/en_US.ts | 1 + src/locales/strings/enUS.json | 1 + 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/components/cards/StakingOptionCard.tsx b/src/components/cards/StakingOptionCard.tsx index fa76111c94b..6a597fa6072 100644 --- a/src/components/cards/StakingOptionCard.tsx +++ b/src/components/cards/StakingOptionCard.tsx @@ -1,27 +1,29 @@ import * as React from 'react' import { View } from 'react-native' import FastImage from 'react-native-fast-image' +import { sprintf } from 'sprintf-js' +import { lstrings } from '../../locales/strings' import { StakeProviderInfo } from '../../plugins/stake-plugins/types' import { getStakeProviderIcon } from '../../util/CdnUris' import { PairIcons } from '../icons/PairIcons' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' import { EdgeText } from '../themed/EdgeText' -export function StakingOptionCard({ - currencyLogos, - primaryText, - secondaryText, - stakeProviderInfo -}: { +interface StakingOptionCardProps { + apy?: number currencyLogos: string[] primaryText: string secondaryText: string stakeProviderInfo?: StakeProviderInfo -}) { +} + +export function StakingOptionCard({ apy, currencyLogos, primaryText, secondaryText, stakeProviderInfo }: StakingOptionCardProps) { const theme = useTheme() const styles = getStyles(theme) + const aprText: string | undefined = apy != null ? apy.toFixed(2) + '%' : undefined + const renderStakeProvider = () => { if (stakeProviderInfo == null) return null const { displayName, pluginId, stakeProviderId } = stakeProviderInfo @@ -49,6 +51,7 @@ export function StakingOptionCard({ {primaryText} {renderStakeProvider()} {secondaryText} + {aprText == null ? null : {sprintf(lstrings.stake_estimated_apr_s, aprText)}} diff --git a/src/components/scenes/Staking/StakeOptionsScene.tsx b/src/components/scenes/Staking/StakeOptionsScene.tsx index b0724452f86..af553a85202 100644 --- a/src/components/scenes/Staking/StakeOptionsScene.tsx +++ b/src/components/scenes/Staking/StakeOptionsScene.tsx @@ -71,6 +71,7 @@ const StakeOptionsSceneComponent = (props: Props) => { handleStakeOptionPress(item)}> Date: Fri, 6 Sep 2024 17:37:09 -0700 Subject: [PATCH 04/82] Finish check for $50 maximum sweep amount for light accounts --- CHANGELOG.md | 1 + src/actions/ScanActions.tsx | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 842e4c17ff1..7a71e644d13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - changed: Some unecessary `showError` dropdowns demoted to hidden `showDevError` - changed: Restrict Bity buy/sell to no-KYC asset - changed: Determine Moonpay asset support using chainCode/contractAddress +- changed: Allow private key sweep in light accounts for amounts less than $50 - changed: Allow reverse quotes for Kado - changed: Credit card allowed countries to add Botswana, Cambodia, Panama, and Sri Lanka - fixed: Default swap pair logic from the trade modal was not prioritizing mainnet assets diff --git a/src/actions/ScanActions.tsx b/src/actions/ScanActions.tsx index e6426c32a7d..b7b75c1da22 100644 --- a/src/actions/ScanActions.tsx +++ b/src/actions/ScanActions.tsx @@ -1,4 +1,4 @@ -import { gt } from 'biggystring' +import { abs, eq, gt, mul } from 'biggystring' import { asMaybeInsufficientFundsError, EdgeAccount, EdgeCurrencyWallet, EdgeParsedUri, EdgeSpendInfo, EdgeTokenId } from 'edge-core-js' import * as React from 'react' import { sprintf } from 'sprintf-js' @@ -10,7 +10,7 @@ import { WalletListModal, WalletListResult } from '../components/modals/WalletLi import { Airship, showError, showWarning } from '../components/services/AirshipInstance' import { getSpecialCurrencyInfo } from '../constants/WalletAndCurrencyConstants' import { lstrings } from '../locales/strings' -import { convertCurrency } from '../selectors/WalletSelectors' +import { getExchangeRate } from '../selectors/WalletSelectors' import { config } from '../theme/appConfig' import { RequestAddressLink } from '../types/DeepLinkTypes' import { Dispatch, RootState, ThunkAction } from '../types/reduxTypes' @@ -278,17 +278,22 @@ async function privateKeyModalActivated( } async function sweepPrivateKeys(state: RootState, account: EdgeAccount, navigation: NavigationBase, wallet: EdgeCurrencyWallet, privateKeys: string[]) { - if (checkAndShowLightBackupModal(account, navigation)) return - try { const unsignedTx = await wallet.sweepPrivateKeys({ tokenId: null, privateKeys, spendTargets: [] }) - // Check for a $50 maximum sweep for light accounts - const sweepAmountFiat = convertCurrency(state, wallet.currencyInfo.currencyCode, 'USD', unsignedTx.nativeAmount) - if (gt(sweepAmountFiat, 50) && checkAndShowLightBackupModal(account, navigation)) return + + // Check for a $50 maximum sweep for light accounts: + const sendNativeAmount = abs(unsignedTx.nativeAmount) + const sendExchangeAmount = await wallet.nativeToDenomination(sendNativeAmount, wallet.currencyInfo.currencyCode) + const exchangeRate = getExchangeRate(state, wallet.currencyInfo.currencyCode, 'iso:USD') + const sweepAmountFiat = mul(sendExchangeAmount, exchangeRate) + if (eq(exchangeRate, '0') || gt(sweepAmountFiat, '50')) { + const modalShown = checkAndShowLightBackupModal(account, navigation) + if (modalShown) return + } // Continue with sweep if above requirements met const signedTx = await wallet.signTx(unsignedTx) From 02fa6c9dd1b1c18c78a0bd26e5abf4df49b558ba Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Sep 2024 13:21:07 -0700 Subject: [PATCH 05/82] Upgrade edge-currency-plugins@^3.3.2 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f8072432255..6d90fed3143 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -19,7 +19,7 @@ PODS: - React-Core - edge-currency-accountbased (4.24.0): - React-Core - - edge-currency-plugins (3.3.1): + - edge-currency-plugins (3.3.2): - React-Core - edge-exchange-plugins (2.7.5): - React-Core @@ -1081,7 +1081,7 @@ SPEC CHECKSUMS: DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: 9e7f9dc8b064c7be712e2988feb78db0ed5dbd77 edge-currency-accountbased: d811f4a22df0142f41951d8b5ddd7ccfd41191f9 - edge-currency-plugins: 009d185ef6f1fb7b0f764bf22715aaefe531ca82 + edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: 58b0d0c9b821155ce9282896cb76be948209592b EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 diff --git a/package.json b/package.json index 18807ea9a81..758157a1ec3 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "edge-core-js": "^2.14.0", "edge-currency-accountbased": "^4.24.0", "edge-currency-monero": "^1.3.1", - "edge-currency-plugins": "^3.3.1", + "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", "edge-info-server": "^2.6.0", "edge-login-ui-rn": "^3.19.1", diff --git a/yarn.lock b/yarn.lock index debe50ef918..69b41443ee2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9183,10 +9183,10 @@ edge-currency-monero@^1.3.1: buffer "^5.0.6" uri-js "^3.0.2" -edge-currency-plugins@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/edge-currency-plugins/-/edge-currency-plugins-3.3.1.tgz#ff29956970e8bafaf9970a42ad7f28cf31da39af" - integrity sha512-Sp1JWAUGnWQ7Cupc3ywfrjoCOAPBlsJVRehBiztH91WkTLAKOMssBIhnls4/aoIEygyAxq6HFSLIxs6M6nE/rg== +edge-currency-plugins@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/edge-currency-plugins/-/edge-currency-plugins-3.3.2.tgz#6622c2c76a7eeff65b9d82a0b432cd08baac0cc1" + integrity sha512-MNuHrEfX6ytsPJGrRq39lrGfVV8YM5l5x0J+2lqGMcH7FKQpuDWomcdGXC+Pbe7595xG5uAwcI8FaeGhoyxU0g== dependencies: "@bitcoin-js/tiny-secp256k1-asmjs" "^2.2.3" altcoin-js "^1.0.0" From 3260680389505cd2d874957fe97217baf94f0c35 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Fri, 6 Sep 2024 14:08:45 -0700 Subject: [PATCH 06/82] Rename kilnUtils.ts -> KilnApi.ts --- .../stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts | 2 +- .../stake-plugins/generic/policyAdapters/EthereumKilnAdaptor.ts | 2 +- .../stake-plugins/generic/util/{kilnUtils.ts => KilnApi.ts} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/plugins/stake-plugins/generic/util/{kilnUtils.ts => KilnApi.ts} (100%) diff --git a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts index 5fe19321b9a..9f7a661bf50 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts @@ -7,7 +7,7 @@ import { infoServerData } from '../../../../util/network' import { AssetId, ChangeQuote, PositionAllocation, QuoteAllocation, StakePosition } from '../../types' import { asInfoServerResponse } from '../../util/internalTypes' import { StakePolicyConfig } from '../types' -import { KilnError, makeKilnApi } from '../util/kilnUtils' +import { KilnError, makeKilnApi } from '../util/KilnApi' import { StakePolicyAdapter } from './types' const MIN_STAKE_LOVELACE_AMOUNT = '2300000' diff --git a/src/plugins/stake-plugins/generic/policyAdapters/EthereumKilnAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/EthereumKilnAdaptor.ts index 3942293c4ca..02bfdfe032b 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/EthereumKilnAdaptor.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/EthereumKilnAdaptor.ts @@ -8,7 +8,7 @@ import { AssetId, ChangeQuote, PositionAllocation, QuoteAllocation, StakePositio import { asInfoServerResponse } from '../../util/internalTypes' import { StakePolicyConfig } from '../types' import { EdgeWalletSigner } from '../util/EdgeWalletSigner' -import { makeKilnApi } from '../util/kilnUtils' +import { makeKilnApi } from '../util/KilnApi' import { StakePolicyAdapter } from './types' export interface EthereumPooledKilnAdapterConfig { diff --git a/src/plugins/stake-plugins/generic/util/kilnUtils.ts b/src/plugins/stake-plugins/generic/util/KilnApi.ts similarity index 100% rename from src/plugins/stake-plugins/generic/util/kilnUtils.ts rename to src/plugins/stake-plugins/generic/util/KilnApi.ts From 59fe4317e150041fb35fdca47c7cf39165999448 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Sep 2024 13:39:43 -0700 Subject: [PATCH 07/82] Change minimum Cardano stake amount --- .../stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts index 9f7a661bf50..d16a59978b3 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts @@ -10,7 +10,7 @@ import { StakePolicyConfig } from '../types' import { KilnError, makeKilnApi } from '../util/KilnApi' import { StakePolicyAdapter } from './types' -const MIN_STAKE_LOVELACE_AMOUNT = '2300000' +const MIN_STAKE_LOVELACE_AMOUNT = '4000000' export interface CardanoPooledKilnAdapterConfig { type: 'cardano-pooled-kiln' From d751c970385884b7240973e3b776448afa784d0f Mon Sep 17 00:00:00 2001 From: William Swanson Date: Mon, 9 Sep 2024 15:14:49 -0700 Subject: [PATCH 08/82] Upgrade to edge-core-js v2.15.0 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 6d90fed3143..7f5341e6860 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,7 +15,7 @@ PODS: - disklet (0.5.2): - React - DoubleConversion (1.1.6) - - edge-core-js (2.14.0): + - edge-core-js (2.15.0): - React-Core - edge-currency-accountbased (4.24.0): - React-Core @@ -1079,7 +1079,7 @@ SPEC CHECKSUMS: CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - edge-core-js: 9e7f9dc8b064c7be712e2988feb78db0ed5dbd77 + edge-core-js: dd26fda41ecdd7d0960672a10ee04759e90ee542 edge-currency-accountbased: d811f4a22df0142f41951d8b5ddd7ccfd41191f9 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 diff --git a/package.json b/package.json index 758157a1ec3..7f489a6e857 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "deepmerge": "^4.3.1", "detect-bundler": "^1.1.0", "disklet": "^0.5.2", - "edge-core-js": "^2.14.0", + "edge-core-js": "^2.15.0", "edge-currency-accountbased": "^4.24.0", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", diff --git a/yarn.lock b/yarn.lock index 69b41443ee2..6cf573181d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9101,10 +9101,10 @@ ed25519@0.0.4: bindings "^1.2.1" nan "^2.0.9" -edge-core-js@^2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.14.0.tgz#cf67eb72363e60da06e0b14abe22a383d17a82c7" - integrity sha512-Hu9OB6GHVi+oTY4kvIACVA69v+smkK0VKxmrQsu4laQ7+hUksQF2TQdoLIJS0ttgXVZfSa1v7Sxq9y269tvRxg== +edge-core-js@^2.15.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.15.0.tgz#743032c5f3c4b5d55dc18a4d4108bb96239e63ec" + integrity sha512-sGup80sRpRKl9UwVHQn/qYZAKGJArw7cgH1ED1fyIbTzLXJAL2qxC5OubPu02xMeUUe2SW1VoSqSIUCA4fUcOA== dependencies: aes-js "^3.1.0" base-x "^4.0.0" From cab6c1e77aabd99399d54448d54f0beb0744d95b Mon Sep 17 00:00:00 2001 From: William Swanson Date: Mon, 9 Sep 2024 15:21:57 -0700 Subject: [PATCH 09/82] Upgrade to cleaners v0.3.17 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7f489a6e857..d36778dff3e 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "big-integer": "^1.6.51", "biggystring": "^4.2.3", "cleaner-config": "^0.1.9", - "cleaners": "^0.3.16", + "cleaners": "^0.3.17", "core-js": "^2.5.2", "csv-stringify": "^5.6.2", "date-fns": "^2.22.1", diff --git a/yarn.lock b/yarn.lock index 6cf573181d3..f21079ec9f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7609,10 +7609,10 @@ cleaner-config@^0.1.9: minimist "^1.2.5" sucrase "^3.17.1" -cleaners@^0.3.12, cleaners@^0.3.13, cleaners@^0.3.14, cleaners@^0.3.16, cleaners@^0.3.8, cleaners@^0.3.9: - version "0.3.16" - resolved "https://registry.yarnpkg.com/cleaners/-/cleaners-0.3.16.tgz#d3a7ab936cb78b0d6ac19ba87b2d28ec41f30502" - integrity sha512-Ecu8Fwv3wT7GV44K4Zas2CQJI11ZV/yPwoh8Gg9BSV6rAmhNsqFeWceA1RII1czbarFSG3XClUePrpI806OvRw== +cleaners@^0.3.12, cleaners@^0.3.13, cleaners@^0.3.14, cleaners@^0.3.16, cleaners@^0.3.17, cleaners@^0.3.8, cleaners@^0.3.9: + version "0.3.17" + resolved "https://registry.yarnpkg.com/cleaners/-/cleaners-0.3.17.tgz#dae498f3d49b7e9364050402d2f4ad09abcd31ba" + integrity sha512-X5acjsLwJK+JEK5hv0Rve7G78+E6iYh1TzJZ40z7Yjrba0WhW6spTq28WgG9w+AK+YQIOHtQTrzaiuntMBBIwQ== cli-boxes@^3.0.0: version "3.0.0" From c99e053187f8b9fed7aa3501e4ff72e26559be97 Mon Sep 17 00:00:00 2001 From: peachbits Date: Wed, 4 Sep 2024 10:49:28 -0700 Subject: [PATCH 10/82] Remove unused TickerText This is unrelated to the reported bug and I just noticed it wasn't used. I can drop this commit if we planning on using TickerText in the future. --- src/components/rows/CurrencyRow.tsx | 17 +------ src/components/rows/CustomAssetRow.tsx | 15 +----- src/components/text/TickerText.tsx | 69 -------------------------- 3 files changed, 4 insertions(+), 97 deletions(-) delete mode 100644 src/components/text/TickerText.tsx diff --git a/src/components/rows/CurrencyRow.tsx b/src/components/rows/CurrencyRow.tsx index 534a424ab03..b9b0c3c6a3e 100644 --- a/src/components/rows/CurrencyRow.tsx +++ b/src/components/rows/CurrencyRow.tsx @@ -11,7 +11,6 @@ import { CryptoIcon } from '../icons/CryptoIcon' import { useTheme } from '../services/ThemeContext' import { CryptoText } from '../text/CryptoText' import { FiatText } from '../text/FiatText' -import { TickerText } from '../text/TickerText' import { IconDataRow } from './IconDataRow' interface Props { @@ -19,7 +18,6 @@ interface Props { nativeAmount?: string /** Override user show/hide balance settings. If unset, defaults to user show/hide balance settings. */ hideBalance?: boolean - showRate?: boolean token?: EdgeToken tokenId: EdgeTokenId wallet: EdgeCurrencyWallet @@ -29,7 +27,7 @@ interface Props { * A view representing the data from a wallet, used for rows, cards, etc. */ const CurrencyRowComponent = (props: Props) => { - const { marginRem, nativeAmount, hideBalance, showRate = false, token, tokenId, wallet } = props + const { marginRem, nativeAmount, hideBalance, token, tokenId, wallet } = props const { pluginId } = wallet.currencyInfo const { showTokenNames = false } = SPECIAL_CURRENCY_INFO[pluginId] ?? {} const theme = useTheme() @@ -57,7 +55,6 @@ const CurrencyRowComponent = (props: Props) => { const hideBalanceSetting = useSelector(state => (hideBalance == null ? !state.ui.settings.isAccountBalanceVisible : hideBalance)) const balance = useWalletBalance(wallet, tokenId) const icon = - const tickerText = showRate && wallet != null ? : null const cryptoText = const fiatText = @@ -66,17 +63,7 @@ const CurrencyRowComponent = (props: Props) => { displayCurrencyCode = `${tokenFromId.displayName}` } - return ( - - ) + return } export const CurrencyRow = React.memo(CurrencyRowComponent) diff --git a/src/components/rows/CustomAssetRow.tsx b/src/components/rows/CustomAssetRow.tsx index 09c65e4ae5f..d2546752bdb 100644 --- a/src/components/rows/CustomAssetRow.tsx +++ b/src/components/rows/CustomAssetRow.tsx @@ -6,7 +6,6 @@ import { useSelector } from '../../types/reactRedux' import { CryptoIcon } from '../icons/CryptoIcon' import { CryptoText } from '../text/CryptoText' import { FiatText } from '../text/FiatText' -import { TickerText } from '../text/TickerText' import { IconDataRow } from './IconDataRow' // For display of custom assets such as AAVE collateral tokens @@ -23,21 +22,19 @@ export interface CustomAsset { interface Props { customAsset: CustomAsset marginRem?: number[] | number - showRate?: boolean } /** * A view representing the data from a custom asset, used for rows, cards, etc. */ const CustomAssetRowComponent = (props: Props) => { - const { customAsset, marginRem, showRate = false } = props + const { customAsset, marginRem } = props const { wallet, referenceTokenId, displayName, currencyCode, nativeBalance } = customAsset const { pluginId } = wallet.currencyInfo const { showTokenNames = false } = SPECIAL_CURRENCY_INFO[pluginId] ?? {} // Balance stuff: const showBalance = useSelector(state => state.ui.settings.isAccountBalanceVisible) - const tickerText = showRate && wallet != null ? : null const cryptoText = showBalance ? : null const fiatText = showBalance ? : null @@ -50,15 +47,7 @@ const CustomAssetRowComponent = (props: Props) => { } return ( - + ) } diff --git a/src/components/text/TickerText.tsx b/src/components/text/TickerText.tsx deleted file mode 100644 index b3daf038912..00000000000 --- a/src/components/text/TickerText.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { abs, div, gt, mul, sub } from 'biggystring' -import { EdgeCurrencyWallet, EdgeTokenId } from 'edge-core-js' -import * as React from 'react' -import { TextStyle } from 'react-native' - -import { useFiatText } from '../../hooks/useFiatText' -import { useTokenDisplayData } from '../../hooks/useTokenDisplayData' -import { toPercentString } from '../../locales/intl' -import { Theme } from '../../types/Theme' -import { zeroString } from '../../util/utils' -import { useTheme } from '../services/ThemeContext' -import { EdgeText } from '../themed/EdgeText' - -interface Props { - wallet: EdgeCurrencyWallet - tokenId: EdgeTokenId -} - -const getPercentDeltaString = (currencyCode: string, assetToFiatRate: string, assetToYestFiatRate: string, usdToWalletFiatRate: string, theme: Theme) => { - const yesterdayExchangeRate = mul(assetToYestFiatRate, usdToWalletFiatRate) - const yesterdayDelta = sub(assetToFiatRate, yesterdayExchangeRate) - // Avoid divide by zero if there's no exchange rate from yesterday - const yesterdayDeltaPct = zeroString(yesterdayExchangeRate) ? '0' : div(yesterdayDelta, yesterdayExchangeRate, 3) - - // Blank string if yesterday's exchange rate does not exist or delta percent is close enough to 0 (rounding) - if (zeroString(yesterdayExchangeRate) || zeroString(yesterdayDeltaPct)) return { percentString: '', deltaColorStyle: theme.secondaryText } - - // Colored, signed percentString representing daily price delta. Prepends a '+' - // symbol to the percent string if > 0, otherwise a "-" if < 0. - const percentString = toPercentString(abs(yesterdayDeltaPct), { intlOpts: { noGrouping: true } }) - if (gt(yesterdayDeltaPct, '0')) return { percentString: `+${percentString}`, deltaColorStyle: theme.positiveText } - return { percentString: `-${percentString}`, deltaColorStyle: theme.negativeText } -} - -/** - * Returns a text string that displays the crypto-fiat exchange rate and the - * daily % change from a wallet asset - **/ -export const TickerText = React.memo(({ wallet, tokenId }: Props) => { - const { currencyCode, denomination, isoFiatCurrencyCode, assetToFiatRate, usdToWalletFiatRate, assetToYestFiatRate } = useTokenDisplayData({ - tokenId, - wallet - }) - - const fiatText = useFiatText({ - autoPrecision: true, - cryptoCurrencyCode: currencyCode, - cryptoExchangeMultiplier: denomination.multiplier, - fiatSymbolSpace: true, - isoFiatCurrencyCode, - nativeCryptoAmount: denomination.multiplier - }) - - const theme = useTheme() - const { percentString, deltaColorStyle } = getPercentDeltaString(currencyCode, assetToFiatRate, assetToYestFiatRate, usdToWalletFiatRate, theme) - const style = React.useMemo( - () => ({ - color: deltaColorStyle, - textAlign: 'left', - flexShrink: 1, - marginLeft: theme.rem(0.75), - alignSelf: 'center' - }), - [deltaColorStyle, theme] - ) - - const tickerText = `${fiatText} ${percentString}` - return {tickerText} -}) From 5a917b6dc24cee596b943b694f780c84ff18c771 Mon Sep 17 00:00:00 2001 From: peachbits Date: Thu, 5 Sep 2024 12:53:01 -0700 Subject: [PATCH 11/82] Do not calculate a delta if either rate is missing --- src/components/text/AssetChangeText.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/text/AssetChangeText.tsx b/src/components/text/AssetChangeText.tsx index 9b6b842c7b6..535ad28a0e1 100644 --- a/src/components/text/AssetChangeText.tsx +++ b/src/components/text/AssetChangeText.tsx @@ -45,8 +45,9 @@ const getPercentDeltaString = (assetToFiatRate: string, assetToYestFiatRate: str const yesterdayExchangeRate = mul(assetToYestFiatRate, usdToWalletFiatRate) const yesterdayDelta = sub(assetToFiatRate, yesterdayExchangeRate) - // Avoid divide by zero if there's no exchange rate from yesterday - const yesterdayDeltaPct = zeroString(yesterdayExchangeRate) ? '0' : div(yesterdayDelta, yesterdayExchangeRate, DECIMAL_PRECISION) + // Use 0 as delta if either exchange rate is missing or 0 + const yesterdayDeltaPct = + zeroString(yesterdayExchangeRate) || zeroString(assetToFiatRate) ? '0' : div(yesterdayDelta, yesterdayExchangeRate, DECIMAL_PRECISION) let percentString // Prepend a < sign if a nonzero delta rounds to zero From f85696057b88b50e98233284b0c868efb6aedd87 Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 3 Sep 2024 18:35:21 -0700 Subject: [PATCH 12/82] Fix yesterday rate key lookup This needs to be stricter so we don't use yesterday's WBTC rate when looking for BTC. This could result in a -100% price change if BTC hasn't been loaded into redux yet --- CHANGELOG.md | 1 + src/hooks/useTokenDisplayData.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a71e644d13..7665ca55139 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - changed: Credit card allowed countries to add Botswana, Cambodia, Panama, and Sri Lanka - fixed: Default swap pair logic from the trade modal was not prioritizing mainnet assets - fixed: "FIO Address does not exist" error after transferring a FIO name +- fixed: Fix incorrect string comparison resulting in wrong rate used for 24 change calculation - removed: 'fasterpayments' payment type - removed: Turking bank transfer support diff --git a/src/hooks/useTokenDisplayData.ts b/src/hooks/useTokenDisplayData.ts index fccec619d92..a4b70292b14 100644 --- a/src/hooks/useTokenDisplayData.ts +++ b/src/hooks/useTokenDisplayData.ts @@ -31,7 +31,7 @@ export const useTokenDisplayData = (props: { tokenId: EdgeTokenId; wallet: EdgeC const assetFiatPrice = useCurrencyFiatRate({ currencyCode, isoFiatCurrencyCode }) const assetFiatYestPrice = useSelector(state => { // The extra _ at the end means there is yesterday's date string at the end of the key - const pair = Object.keys(state.exchangeRates).find(pair => pair.includes(`${currencyCode}_iso:USD_`)) + const pair = Object.keys(state.exchangeRates).find(pair => pair.startsWith(`${currencyCode}_iso:USD_`)) if (pair != null) return state.exchangeRates[pair] return '0' }) From 42188703fa4560891ae1b6b2efcb70332931c153 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 10 Sep 2024 10:32:39 -0700 Subject: [PATCH 13/82] Upgrade edge-currency-accountbased@^4.24.1 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 7f5341e6860..5462fe4c787 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.15.0): - React-Core - - edge-currency-accountbased (4.24.0): + - edge-currency-accountbased (4.24.1): - React-Core - edge-currency-plugins (3.3.2): - React-Core @@ -1080,7 +1080,7 @@ SPEC CHECKSUMS: disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: dd26fda41ecdd7d0960672a10ee04759e90ee542 - edge-currency-accountbased: d811f4a22df0142f41951d8b5ddd7ccfd41191f9 + edge-currency-accountbased: 2632506090c61bbbd41eb51cf1282ff646b4c68c edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: 58b0d0c9b821155ce9282896cb76be948209592b diff --git a/package.json b/package.json index d36778dff3e..a98b6fedf06 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.15.0", - "edge-currency-accountbased": "^4.24.0", + "edge-currency-accountbased": "^4.24.1", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", diff --git a/yarn.lock b/yarn.lock index f21079ec9f5..b8eb79fa61d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9126,10 +9126,10 @@ edge-core-js@^2.15.0: yaob "^0.3.12" yavent "^0.1.3" -edge-currency-accountbased@^4.24.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.0.tgz#22a86b562da80915ccb73d7704d4803ae122ab33" - integrity sha512-eAepyCOYxaX1K1vKomYn2Ey2Jw9yKWFcDNx7NvJ6nzeGJGFwLwV2/RwQoj7KUvLDxYJiQksMjHbfAhirtFXntQ== +edge-currency-accountbased@^4.24.1: + version "4.24.1" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.1.tgz#b8c679fd323e95f35ce3aae49cb08d69baf55cad" + integrity sha512-JFH/c+SbrzVZ0i0uzCC/0716ydUMn48NvStjgdS9S33T4N3RROPMZuB5w45+dWvCXHLakE0aaQKsEgUx43ZfiA== dependencies: "@binance-chain/javascript-sdk" "^4.2.0" "@chain-registry/client" "^1.15.0" From 049248cbd7612e61ae1fd1ca15af67abbd0327e2 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Sep 2024 16:21:58 -0700 Subject: [PATCH 14/82] Break up `State` into distinct, well-named user input state --- src/components/scenes/SwapCreateScene.tsx | 64 ++++++++--------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/src/components/scenes/SwapCreateScene.tsx b/src/components/scenes/SwapCreateScene.tsx index c813ef4c16f..ec5b0855593 100644 --- a/src/components/scenes/SwapCreateScene.tsx +++ b/src/components/scenes/SwapCreateScene.tsx @@ -52,27 +52,16 @@ export interface SwapErrorDisplayInfo { interface Props extends EdgeSceneProps<'swapCreate'> {} -interface State { - nativeAmount: string - fiatAmount: string - nativeAmountFor: 'from' | 'to' -} - -const defaultState: State = { - nativeAmount: '0', - fiatAmount: '0', - nativeAmountFor: 'from' -} - export const SwapCreateScene = (props: Props) => { const { navigation, route } = props const { fromWalletId, fromTokenId = null, toWalletId, toTokenId = null, errorDisplayInfo } = route.params ?? {} const theme = useTheme() const dispatch = useDispatch() - const [state, setState] = useState({ - ...defaultState - }) + // Input state is the state of the user input + const [inputNativeAmount, setInputNativeAmount] = useState('0') + const [inputFiatAmount, setInputFiatAmount] = useState('0') + const [inputNativeAmountFor, setInputNativeAmountFor] = useState<'from' | 'to'>('from') const fromInputRef = React.useRef(null) const toInputRef = React.useRef(null) @@ -104,7 +93,7 @@ export const SwapCreateScene = (props: Props) => { fromWallet == null || toWallet == null || // Don't show next button if the amount is zero: - zeroString(state.nativeAmount) || + zeroString(inputNativeAmount) || // Don't show next button if the amount exceeds the balance: checkAmountExceedsBalance() @@ -141,12 +130,12 @@ export const SwapCreateScene = (props: Props) => { if (fromWallet == null) return false // We do not know what the from amount is if we are quoting "to" a // specific amount. Therefore we always return false in this case. - if (state.nativeAmountFor === 'to') return false + if (inputNativeAmountFor === 'to') return false // Get the balance: const fromWalletBalance = fromWalletBalanceMap.get(fromTokenId) ?? '0' // If there is a balance and the amount is greater than the balance, // return true (which means amount exceeded balance). - return gte(fromWalletBalance, '0') && gt(state.nativeAmount, fromWalletBalance) + return gte(fromWalletBalance, '0') && gt(inputNativeAmount, fromWalletBalance) } const getQuote = (swapRequest: EdgeSwapRequest) => { @@ -187,7 +176,9 @@ export const SwapCreateScene = (props: Props) => { } const resetState = () => { - setState(defaultState) + setInputNativeAmount('0') + setInputFiatAmount('0') + setInputNativeAmountFor('from') } const showWalletListModal = async (whichWallet: 'from' | 'to') => { @@ -220,15 +211,12 @@ export const SwapCreateScene = (props: Props) => { toTokenId: fromTokenId, errorDisplayInfo }) - const newNativeAmountFor = state.nativeAmountFor === 'from' ? 'to' : 'from' + const newNativeAmountFor = inputNativeAmountFor === 'from' ? 'to' : 'from' // Clear amount input state: - setState({ - ...state, - nativeAmountFor: newNativeAmountFor - }) + setInputNativeAmountFor(newNativeAmountFor) // Swap the amounts: - const toAmount = newNativeAmountFor === 'to' ? state.fiatAmount : '0' - const fromAmount = newNativeAmountFor === 'from' ? state.fiatAmount : '0' + const toAmount = newNativeAmountFor === 'to' ? inputFiatAmount : '0' + const fromAmount = newNativeAmountFor === 'from' ? inputFiatAmount : '0' toInputRef.current?.setAmount('fiat', toAmount) fromInputRef.current?.setAmount('fiat', fromAmount) }) @@ -279,7 +267,7 @@ export const SwapCreateScene = (props: Props) => { // Should only happen if the user initiated the swap from the keyboard if (fromWallet == null || toWallet == null) return - if (zeroString(state.nativeAmount)) { + if (zeroString(inputNativeAmount)) { showToast(`${lstrings.no_exchange_amount}. ${lstrings.select_exchange_amount}.`) return } @@ -287,8 +275,8 @@ export const SwapCreateScene = (props: Props) => { const request: EdgeSwapRequest = { fromTokenId: fromTokenId, fromWallet: fromWallet, - nativeAmount: state.nativeAmount, - quoteFor: state.nativeAmountFor, + nativeAmount: inputNativeAmount, + quoteFor: inputNativeAmountFor, toTokenId: toTokenId, toWallet: toWallet } @@ -307,23 +295,17 @@ export const SwapCreateScene = (props: Props) => { }) const handleFromAmountChange = useHandler((amounts: ExchangedFlipInputAmounts) => { - setState({ - ...state, - nativeAmount: amounts.nativeAmount, - fiatAmount: amounts.fiatAmount, - nativeAmountFor: 'from' - }) + setInputNativeAmount(amounts.nativeAmount) + setInputFiatAmount(amounts.fiatAmount) + setInputNativeAmountFor('from') // Clear other input's amount: toInputRef.current?.setAmount('crypto', '0') }) const handleToAmountChange = useHandler((amounts: ExchangedFlipInputAmounts) => { - setState({ - ...state, - nativeAmount: amounts.nativeAmount, - fiatAmount: amounts.fiatAmount, - nativeAmountFor: 'to' - }) + setInputNativeAmount(amounts.nativeAmount) + setInputFiatAmount(amounts.fiatAmount) + setInputNativeAmountFor('to') // Clear other input's amount: fromInputRef.current?.setAmount('crypto', '0') }) From 6edaca669bb975371bc666f40a53901cd2b3bb70 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 10 Sep 2024 14:44:13 -0700 Subject: [PATCH 15/82] Remove console.log turd --- src/components/themed/ExchangedFlipInput2.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/themed/ExchangedFlipInput2.tsx b/src/components/themed/ExchangedFlipInput2.tsx index 1fe0f30489b..e2e7e17eb7d 100644 --- a/src/components/themed/ExchangedFlipInput2.tsx +++ b/src/components/themed/ExchangedFlipInput2.tsx @@ -177,7 +177,6 @@ const ExchangedFlipInput2Component = React.forwardRef ({ setAmount: (field, value) => { - console.log(field, value) if (field === 'crypto') { const { displayAmount, fiatAmount } = convertFromCryptoNative(value) flipInputRef.current?.setAmounts([displayAmount, fiatAmount]) From 3268f8c1746dd1089ef65b154979b4897f37cc65 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Sep 2024 17:01:31 -0700 Subject: [PATCH 16/82] Add missing newline --- src/components/themed/ExchangedFlipInput2.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/themed/ExchangedFlipInput2.tsx b/src/components/themed/ExchangedFlipInput2.tsx index e2e7e17eb7d..7ba159fdc60 100644 --- a/src/components/themed/ExchangedFlipInput2.tsx +++ b/src/components/themed/ExchangedFlipInput2.tsx @@ -14,6 +14,7 @@ import { EdgeRow } from '../rows/EdgeRow' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' import { EdgeText } from './EdgeText' import { FieldNum, FlipInput2, FlipInputFieldInfos, FlipInputRef } from './FlipInput2' + export type ExchangeFlipInputFields = 'fiat' | 'crypto' export interface ExchangedFlipInputRef { From 575ad4c96dfeb1f4fef7b96eddd72c77904e2c0a Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Sep 2024 17:14:54 -0700 Subject: [PATCH 17/82] Remove unneeded variables, lowering CL (cognitive-load) --- src/components/scenes/SwapCreateScene.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/scenes/SwapCreateScene.tsx b/src/components/scenes/SwapCreateScene.tsx index ec5b0855593..6ca3f4a2f50 100644 --- a/src/components/scenes/SwapCreateScene.tsx +++ b/src/components/scenes/SwapCreateScene.tsx @@ -211,14 +211,17 @@ export const SwapCreateScene = (props: Props) => { toTokenId: fromTokenId, errorDisplayInfo }) - const newNativeAmountFor = inputNativeAmountFor === 'from' ? 'to' : 'from' // Clear amount input state: - setInputNativeAmountFor(newNativeAmountFor) + setInputNativeAmountFor(inputNativeAmountFor === 'from' ? 'to' : 'from') + // Swap the amounts: - const toAmount = newNativeAmountFor === 'to' ? inputFiatAmount : '0' - const fromAmount = newNativeAmountFor === 'from' ? inputFiatAmount : '0' - toInputRef.current?.setAmount('fiat', toAmount) - fromInputRef.current?.setAmount('fiat', fromAmount) + if (inputNativeAmountFor === 'from') { + fromInputRef.current?.setAmount('fiat', '0') + toInputRef.current?.setAmount('fiat', inputFiatAmount) + } else { + toInputRef.current?.setAmount('fiat', '0') + fromInputRef.current?.setAmount('fiat', inputFiatAmount) + } }) const handleSelectWallet = useHandler(async (walletId: string, tokenId: EdgeTokenId, direction: 'from' | 'to') => { From 3bf9a897a6c8fa7fdb1030b86bd901950edd0e61 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Mon, 9 Sep 2024 17:17:17 -0700 Subject: [PATCH 18/82] Fix display bug caused by flipping inputs on SwapCreateScene Because we're flipping the wallets and the amounts for each SwapInput component and each strategy to change this state is mixed between imperative and declarative, we converge with incorrect state. This is because the imperative change to the amounts happens to the SwapInput before it's wallet state is change (which is the declarative state change). Ultimately the mix of two techniques on state management is the cause of the bug. The solution is to add a delay to the imperative change, to allow for the component's state to be updated before making the imperative changes. --- CHANGELOG.md | 1 + src/components/scenes/SwapCreateScene.tsx | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7665ca55139..ec17d148a06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - fixed: Default swap pair logic from the trade modal was not prioritizing mainnet assets - fixed: "FIO Address does not exist" error after transferring a FIO name - fixed: Fix incorrect string comparison resulting in wrong rate used for 24 change calculation +- fixed: Crypto amount display bug after flipping the wallet input on `SwapCreateScne` - removed: 'fasterpayments' payment type - removed: Turking bank transfer support diff --git a/src/components/scenes/SwapCreateScene.tsx b/src/components/scenes/SwapCreateScene.tsx index 6ca3f4a2f50..986e050363e 100644 --- a/src/components/scenes/SwapCreateScene.tsx +++ b/src/components/scenes/SwapCreateScene.tsx @@ -215,13 +215,17 @@ export const SwapCreateScene = (props: Props) => { setInputNativeAmountFor(inputNativeAmountFor === 'from' ? 'to' : 'from') // Swap the amounts: - if (inputNativeAmountFor === 'from') { - fromInputRef.current?.setAmount('fiat', '0') - toInputRef.current?.setAmount('fiat', inputFiatAmount) - } else { - toInputRef.current?.setAmount('fiat', '0') - fromInputRef.current?.setAmount('fiat', inputFiatAmount) - } + // Use setTimeout to allow the component's state to change before making + // the imperative state changes. + setTimeout(() => { + if (inputNativeAmountFor === 'from') { + fromInputRef.current?.setAmount('fiat', '0') + toInputRef.current?.setAmount('fiat', inputFiatAmount) + } else { + toInputRef.current?.setAmount('fiat', '0') + fromInputRef.current?.setAmount('fiat', inputFiatAmount) + } + }, 0) }) const handleSelectWallet = useHandler(async (walletId: string, tokenId: EdgeTokenId, direction: 'from' | 'to') => { From e323202d888fbdf71e0cabb0bc9aa5234d67a22b Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 9 Sep 2024 18:01:30 -0700 Subject: [PATCH 19/82] Fix hardcoded spamFilterOn = false --- src/components/scenes/TransactionListScene.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/scenes/TransactionListScene.tsx b/src/components/scenes/TransactionListScene.tsx index adfbe102b42..d492da24636 100644 --- a/src/components/scenes/TransactionListScene.tsx +++ b/src/components/scenes/TransactionListScene.tsx @@ -64,7 +64,7 @@ function TransactionListComponent(props: Props) { // Selectors: const exchangeDenom = getExchangeDenomByCurrencyCode(wallet.currencyConfig, currencyCode) const exchangeRate = useSelector(state => state.exchangeRates[`${currencyCode}_${state.ui.settings.defaultIsoFiat}`]) - const spamFilterOn = false // useSelector(state => state.ui.settings.spamFilterOn) + const spamFilterOn = useSelector(state => state.ui.settings.spamFilterOn) const activeUsername = useSelector(state => state.core.account.username) const isLightAccount = activeUsername == null From 912bf3629ad70436ece4a436ab80acef96d69a50 Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 10 Sep 2024 17:08:39 -0700 Subject: [PATCH 20/82] Add Free Talk Live and Crypto Canal options to survey modal --- CHANGELOG.md | 2 ++ src/components/modals/SurveyModal.tsx | 3 +++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec17d148a06..7fc47aae317 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal + ## 4.13.0 - added: Cardano staking through Kiln staking pools diff --git a/src/components/modals/SurveyModal.tsx b/src/components/modals/SurveyModal.tsx index 3d47f71bc90..4770b6007f9 100644 --- a/src/components/modals/SurveyModal.tsx +++ b/src/components/modals/SurveyModal.tsx @@ -26,6 +26,9 @@ const SURVEY_OPTS = [ { label: lstrings.survey_opt_in_person_event, selected: false }, { label: lstrings.survey_opt_personal_referral, selected: false }, { label: lstrings.survey_opt_article, selected: false }, + // Show names intentionally left untranslated: + { label: 'Free Talk Live', selected: false }, + { label: 'Crypto Canal', selected: false }, { label: lstrings.survey_opt_other_specify, selected: false } ] From 75897945eb3514de718d7c31fad6f138ac6b6b66 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 10 Sep 2024 15:10:40 -0700 Subject: [PATCH 21/82] Add customTokens to WalletData in the log output --- CHANGELOG.md | 1 + src/actions/LogActions.tsx | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fc47aae317..864cfcfe3b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal +- added: Include custom tokens within wallet data in log output ## 4.13.0 diff --git a/src/actions/LogActions.tsx b/src/actions/LogActions.tsx index 63af0d76416..8ed0fe4b5fc 100644 --- a/src/actions/LogActions.tsx +++ b/src/actions/LogActions.tsx @@ -1,5 +1,5 @@ import { uncleaner } from 'cleaners' -import { EdgeDataDump } from 'edge-core-js' +import { EdgeDataDump, EdgeTokenMap } from 'edge-core-js' import * as React from 'react' import { Platform } from 'react-native' import { getBrand, getBuildNumber, getDeviceId, getVersion } from 'react-native-device-info' @@ -50,6 +50,7 @@ interface LoggedInUser { interface WalletData { currencyCode?: string + customTokens?: EdgeTokenMap imported?: boolean repoId?: string pluginDump?: EdgeDataDump @@ -180,6 +181,7 @@ export function getLogOutput(): ThunkAction> { const currencyCode = wallet.currencyInfo.currencyCode ?? '' logOutput.loggedInUser.wallets.push({ currencyCode, + customTokens: wallet.currencyConfig.customTokens, imported, repoId: getRepoId(syncKey), pluginDump: await wallet.dumpData().catch(error => ({ From 8a38f9e0190c1bf5a37acbe15c5f133ab2f9256c Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Fri, 6 Sep 2024 17:42:12 -0700 Subject: [PATCH 22/82] Add onPress handling to AlertDropdown --- src/components/navigation/AlertDropdown.tsx | 29 +++++++++++++++++---- src/components/services/AirshipInstance.tsx | 2 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/components/navigation/AlertDropdown.tsx b/src/components/navigation/AlertDropdown.tsx index b45a60a7e66..a5ea77e89a6 100644 --- a/src/components/navigation/AlertDropdown.tsx +++ b/src/components/navigation/AlertDropdown.tsx @@ -4,35 +4,54 @@ import { AirshipBridge } from 'react-native-airship' import AntDesignIcon from 'react-native-vector-icons/AntDesign' import EntypoIcon from 'react-native-vector-icons/Entypo' +import { useHandler } from '../../hooks/useHandler' import { lstrings } from '../../locales/strings' import { textStyle } from '../../styles/common/textStylesThemed' import { AirshipDropdown } from '../common/AirshipDropdown' +import { EdgeTouchableOpacity } from '../common/EdgeTouchableOpacity' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' interface Props { bridge: AirshipBridge message: string - // True for orange warning, false for red alert: + /** True for orange warning, false for red alert: */ warning?: boolean - devAlert?: boolean + + /** No auto-hide, must dismiss through the tap. */ + persistent?: boolean + + /** If given, pressing the body of the dropdown invokes onPress, while the + * close icon dismisses the dropdown */ + onPress?: () => void | Promise } export function AlertDropdown(props: Props) { - const { bridge, devAlert, message, warning } = props + const { bridge, persistent, message, warning, onPress } = props const theme = useTheme() const styles = getStyles(theme) const color = warning ? theme.dropdownWarning : theme.dropdownError + const handleOnPress = useHandler(async () => { + if (onPress != null) await onPress() + bridge.resolve() + }) + + const handleClose = useHandler(() => { + bridge.resolve() + }) + return ( - + {warning ? lstrings.alert_dropdown_warning : lstrings.alert_dropdown_alert} {message} - + + + ) diff --git a/src/components/services/AirshipInstance.tsx b/src/components/services/AirshipInstance.tsx index 4ac9ade2785..7f015a5ee0b 100644 --- a/src/components/services/AirshipInstance.tsx +++ b/src/components/services/AirshipInstance.tsx @@ -56,7 +56,7 @@ export async function showDevErrorAsync(error: unknown, options: ShowErrorWarnin if (__DEV__ || appVersion === '99.99.99' || appVersion.includes('-d')) { // Non-production (develop) builds show all errors - await Airship.show(bridge => ) + await Airship.show(bridge => ) } else { // Production/staging builds don't show visible errors, but just saves a // breadcrumb. From 50499d9af675ce061f3e32a67088686cc3e4469a Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 9 Sep 2024 14:35:23 -0700 Subject: [PATCH 23/82] Add the UK warning --- CHANGELOG.md | 1 + src/actions/LoginActions.tsx | 20 ++++++++++++++++++-- src/locales/en_US.ts | 1 + src/locales/strings/enUS.json | 1 + 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 864cfcfe3b4..767db80ecb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal - added: Include custom tokens within wallet data in log output +- added: Warning message about risks of investing to all UK IPs ## 4.13.0 diff --git a/src/actions/LoginActions.tsx b/src/actions/LoginActions.tsx index 929189e114a..2106fa927c9 100644 --- a/src/actions/LoginActions.tsx +++ b/src/actions/LoginActions.tsx @@ -10,6 +10,7 @@ import { readSyncedSettings } from '../actions/SettingsActions' import { ConfirmContinueModal } from '../components/modals/ConfirmContinueModal' import { FioCreateHandleModal } from '../components/modals/FioCreateHandleModal' import { SurveyModal } from '../components/modals/SurveyModal' +import { AlertDropdown } from '../components/navigation/AlertDropdown' import { Airship, showError } from '../components/services/AirshipInstance' import { ENV } from '../env' import { getExperimentConfig } from '../experimentConfig' @@ -22,8 +23,8 @@ import { NavigationBase, NavigationProp } from '../types/routerTypes' import { currencyCodesToEdgeAssets } from '../util/CurrencyInfoHelpers' import { logActivity } from '../util/logger' import { logEvent, trackError } from '../util/tracking' -import { runWithTimeout } from '../util/utils' -import { loadAccountReferral, refreshAccountReferral } from './AccountReferralActions' +import { openLink, runWithTimeout } from '../util/utils' +import { getCountryCodeByIp, loadAccountReferral, refreshAccountReferral } from './AccountReferralActions' import { getUniqueWalletName } from './CreateWalletActions' import { getDeviceSettings, writeIsSurveyDiscoverShown } from './DeviceSettingsActions' import { readLocalAccountSettings } from './LocalSettingsActions' @@ -249,6 +250,7 @@ export function initializeAccount(navigation: NavigationBase, account: EdgeAccou showError(error) } + // Post login stuff: if (!newAccount && !hideSurvey && !getDeviceSettings().isSurveyDiscoverShown && config.disableSurveyModal !== true) { // Show the survey modal once per app install, only if this isn't the // first login of a newly created account and the user didn't get any @@ -256,6 +258,20 @@ export function initializeAccount(navigation: NavigationBase, account: EdgeAccou await Airship.show(bridge => ) await writeIsSurveyDiscoverShown(true) } + + if ((await getCountryCodeByIp()) === 'GB') { + await Airship.show(bridge => ( + { + await openLink('https://edge.app/due-diligence/') + }} + /> + )) + } } } diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index f532eadea5d..5a0af41def8 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -127,6 +127,7 @@ const strings = { warning_token_contract_override_3s: 'The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.', warning_token_exists_1s: 'The entered token already exists as a built-in token %1$s', + warning_uk_risk: `Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.`, // Alert component: alert_dropdown_alert: 'Alert! ', diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index 59ca02e61dc..4c3cd579176 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -81,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Alert! ", "alert_dropdown_warning": "Warning! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", From 4a144b0c4785395b0bff4752725d89b87ed20c70 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Wed, 11 Sep 2024 15:15:01 -0700 Subject: [PATCH 24/82] Upgrade to edge-core-js v2.16.0 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 5462fe4c787..a3124bd0e38 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,7 +15,7 @@ PODS: - disklet (0.5.2): - React - DoubleConversion (1.1.6) - - edge-core-js (2.15.0): + - edge-core-js (2.16.0): - React-Core - edge-currency-accountbased (4.24.1): - React-Core @@ -1079,7 +1079,7 @@ SPEC CHECKSUMS: CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - edge-core-js: dd26fda41ecdd7d0960672a10ee04759e90ee542 + edge-core-js: 50d53d7ccfd2e09caf6cf6232f638538954f42c8 edge-currency-accountbased: 2632506090c61bbbd41eb51cf1282ff646b4c68c edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 diff --git a/package.json b/package.json index a98b6fedf06..b7883d562d1 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "deepmerge": "^4.3.1", "detect-bundler": "^1.1.0", "disklet": "^0.5.2", - "edge-core-js": "^2.15.0", + "edge-core-js": "^2.16.0", "edge-currency-accountbased": "^4.24.1", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", diff --git a/yarn.lock b/yarn.lock index b8eb79fa61d..6bf3b78cdee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9101,10 +9101,10 @@ ed25519@0.0.4: bindings "^1.2.1" nan "^2.0.9" -edge-core-js@^2.15.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.15.0.tgz#743032c5f3c4b5d55dc18a4d4108bb96239e63ec" - integrity sha512-sGup80sRpRKl9UwVHQn/qYZAKGJArw7cgH1ED1fyIbTzLXJAL2qxC5OubPu02xMeUUe2SW1VoSqSIUCA4fUcOA== +edge-core-js@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.16.0.tgz#c4695dd25e1bf755a775ffeaa67c29706a351cb4" + integrity sha512-XAiFLRtHyUq/eUmEHfYbdsapeUmeQgGNAYPlyj6u6sqlqSLqNnvYsNyfipnd9JBJEZu8E4WH9TJAhUPh26zUHw== dependencies: aes-js "^3.1.0" base-x "^4.0.0" From 886723047c167610c3f1983f7451f15b626e1edf Mon Sep 17 00:00:00 2001 From: William Swanson Date: Wed, 11 Sep 2024 15:35:20 -0700 Subject: [PATCH 25/82] Upgrade to edge-login-ui-rn v3.20.0 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index a3124bd0e38..57bc8e3752d 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -23,7 +23,7 @@ PODS: - React-Core - edge-exchange-plugins (2.7.5): - React-Core - - edge-login-ui-rn (3.19.1): + - edge-login-ui-rn (3.20.0): - React-Core - EXApplication (5.1.1): - ExpoModulesCore @@ -1083,7 +1083,7 @@ SPEC CHECKSUMS: edge-currency-accountbased: 2632506090c61bbbd41eb51cf1282ff646b4c68c edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 - edge-login-ui-rn: 58b0d0c9b821155ce9282896cb76be948209592b + edge-login-ui-rn: e9053aeebcfdb1d093ea2bf32d0e53f274826233 EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d diff --git a/package.json b/package.json index b7883d562d1..ab0d166d8cc 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", "edge-info-server": "^2.6.0", - "edge-login-ui-rn": "^3.19.1", + "edge-login-ui-rn": "^3.20.0", "ethers": "^5.7.2", "expo": "^48.0.0", "jsrsasign": "^11.1.0", diff --git a/yarn.lock b/yarn.lock index 6bf3b78cdee..b7518d6ac82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9232,10 +9232,10 @@ edge-info-server@^2.6.0: dependencies: cleaners "^0.3.16" -edge-login-ui-rn@^3.19.1: - version "3.19.1" - resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.19.1.tgz#61aba735c5643b8116f7073c5bdcdca2ec1aa637" - integrity sha512-dxsCv97YqxCBPmIAcB8j0QYW5a7v6j9E/q94do7HdHb1YXFANJzqDmlzECiZxjvBG2lS541UidEoGDQrfsBowg== +edge-login-ui-rn@^3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.20.0.tgz#51c3e2fba0cdd172b7ce0c22d8f7497adb2d3562" + integrity sha512-5ijiV/HfdWZwjHZVQq6/zUID28DMfZ/3/7wqCAVoarBjyTLUuV668yr0MMps3GR5qJC/bioAdQhfpUSWLVPVaQ== dependencies: base-x "^4.0.0" cleaners "^0.3.12" From 37185f38da461c2a985d879d208987be31463f9b Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 12 Sep 2024 13:38:51 -0700 Subject: [PATCH 26/82] Upgrade edge-currency-accountbased@^4.24.2 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 57bc8e3752d..1c68ce50de1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.16.0): - React-Core - - edge-currency-accountbased (4.24.1): + - edge-currency-accountbased (4.24.2): - React-Core - edge-currency-plugins (3.3.2): - React-Core @@ -1080,7 +1080,7 @@ SPEC CHECKSUMS: disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: 50d53d7ccfd2e09caf6cf6232f638538954f42c8 - edge-currency-accountbased: 2632506090c61bbbd41eb51cf1282ff646b4c68c + edge-currency-accountbased: ee7fce87e5688c0ad9dd420ac6727318574a805d edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: e9053aeebcfdb1d093ea2bf32d0e53f274826233 diff --git a/package.json b/package.json index ab0d166d8cc..c5e779420b2 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.16.0", - "edge-currency-accountbased": "^4.24.1", + "edge-currency-accountbased": "^4.24.2", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", diff --git a/yarn.lock b/yarn.lock index b7518d6ac82..2c99d3d741c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9126,10 +9126,10 @@ edge-core-js@^2.16.0: yaob "^0.3.12" yavent "^0.1.3" -edge-currency-accountbased@^4.24.1: - version "4.24.1" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.1.tgz#b8c679fd323e95f35ce3aae49cb08d69baf55cad" - integrity sha512-JFH/c+SbrzVZ0i0uzCC/0716ydUMn48NvStjgdS9S33T4N3RROPMZuB5w45+dWvCXHLakE0aaQKsEgUx43ZfiA== +edge-currency-accountbased@^4.24.2: + version "4.24.2" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.2.tgz#41eaf15d6c76ad2dde30ffa72702898136f174de" + integrity sha512-cPfM7bZb3ikIjpIBnzfM8qgBfrKL4V3iA2/ACs9uvF2JXvQP1hPEnne/VvauMmA+AeT7pJFKvX0FZJLkThjGFA== dependencies: "@binance-chain/javascript-sdk" "^4.2.0" "@chain-registry/client" "^1.15.0" From 1a2c0cb278d7f170c8a0f3d6d970c9918042cd9e Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 12 Sep 2024 15:56:54 -0700 Subject: [PATCH 27/82] Fix crash from filterContentPosts nullish input and improve type safety - Update filterContentPosts function to accept nullish input - Add explicit return type for filterContentPosts - Simplify usage of filterContentPosts in HomeScene component - Improve null handling for infoServerData.rollup properties --- CHANGELOG.md | 1 + src/components/scenes/HomeScene.tsx | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 767db80ecb3..155aeead3d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal - added: Include custom tokens within wallet data in log output - added: Warning message about risks of investing to all UK IPs +- fixed: Crash on HomeScene when logging while in airplane mode ## 4.13.0 diff --git a/src/components/scenes/HomeScene.tsx b/src/components/scenes/HomeScene.tsx index 0c59d8f45e0..dbd0b9f01ce 100644 --- a/src/components/scenes/HomeScene.tsx +++ b/src/components/scenes/HomeScene.tsx @@ -41,7 +41,8 @@ const TEMP_PADDING_REM = 0.5 // To be built-in to SceneWrapper when fully UI4 * @param countryCode - An optional string representing the country code to filter by. If `null`, an empty array is returned. * @returns An array of `ContentPost` objects that match the provided country code. */ -export const filterContentPosts = (contentPosts: ContentPost[], countryCode?: string) => { +export const filterContentPosts = (contentPosts?: ContentPost[], countryCode?: string): ContentPost[] => { + if (contentPosts == null) return [] return contentPosts.filter((contentPost: ContentPost) => { const { countryCodes: includeCountryCodes = [], excludeCountryCodes = [] } = contentPost @@ -109,10 +110,10 @@ export const HomeScene = (props: Props) => { excludeCountryCodes: [], ...legacyBlogPost })) - setBlogPosts([...nonGeoPosts, ...(filterContentPosts(infoServerData.rollup?.blogPostsGeo as ContentPost[], countryCode) ?? [])]) + setBlogPosts([...nonGeoPosts, ...filterContentPosts(infoServerData.rollup?.blogPostsGeo, countryCode)]) // Get video posts - setVideoPosts(filterContentPosts(infoServerData.rollup?.videoPosts ?? [], countryCode)) + setVideoPosts(filterContentPosts(infoServerData.rollup?.videoPosts, countryCode)) }, [countryCode]) const buyCryptoIcon = React.useMemo(() => ({ uri: getUi4ImageUri(theme, 'cardBackgrounds/bg-buy-crypto') }), [theme]) From d1d2911dddec3ede1ff2c750d13b508aab4e7a8c Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Thu, 5 Sep 2024 17:14:41 -0700 Subject: [PATCH 28/82] Implement Moonpay sell Disable Paybis sell to debit in USA --- src/locales/en_US.ts | 5 + src/locales/strings/enUS.json | 5 + src/plugins/gui/providers/moonpayProvider.ts | 279 ++++++++++++++++--- src/plugins/gui/providers/paybisProvider.ts | 4 + 4 files changed, 251 insertions(+), 42 deletions(-) diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 5a0af41def8..7cf0948ca23 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -1445,6 +1445,11 @@ const strings = { fiat_plugin_fetching_assets: 'Fetching supported assets', fiat_plugin_sell_cancelled: 'Sell order cancelled', fiat_plugin_finalizing_quote: 'Finalizing your exchange quote. Please wait as this may take up to a minute', + fiat_plugin_sell_complete_title: 'Sell Order Complete', + fiat_plugin_sell_complete_message_s: 'Your sell order of %1$s %2$s for %3$s %4$s has been completed.', + fiat_plugin_sell_complete_message_2_hour_s: 'Please allow up to %1$s hour for the funds to appear in your account.', + fiat_plugin_sell_complete_message_2_hours_s: 'Please allow up to %1$s hours for the funds to appear in your account.', + fiat_plugin_sell_complete_message_3: 'A confirmation email has been sent to your registered email address.', fiat_plugin_sell_failed_try_again: 'Sell order failed. Please try again.', fiat_plugin_sell_failed_to_send_try_again: 'Failed to send funds for sell transaction. Please try again.', fiat_plugin_cannot_continue_camera_permission: 'Cannot continue. Camera permission needed for ID verifications', diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index 4c3cd579176..ef67327d091 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -1275,6 +1275,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", diff --git a/src/plugins/gui/providers/moonpayProvider.ts b/src/plugins/gui/providers/moonpayProvider.ts index 0fcdf65ea8c..e639bd73b25 100644 --- a/src/plugins/gui/providers/moonpayProvider.ts +++ b/src/plugins/gui/providers/moonpayProvider.ts @@ -1,11 +1,16 @@ // import { div, gt, lt, mul, toFixed } from 'biggystring' import { asArray, asBoolean, asEither, asNull, asNumber, asObject, asOptional, asString, asValue } from 'cleaners' -import { EdgeTokenId } from 'edge-core-js' +import { EdgeAssetAction, EdgeSpendInfo, EdgeTokenId, EdgeTxActionFiat } from 'edge-core-js' +import { sprintf } from 'sprintf-js' import URL from 'url-parse' +import { SendScene2Params } from '../../../components/scenes/SendScene2' +import { lstrings } from '../../../locales/strings' import { StringMap } from '../../../types/types' +import { CryptoAmount } from '../../../util/CryptoAmount' import { removeIsoPrefix } from '../../../util/utils' -import { FiatDirection, FiatPaymentType } from '../fiatPluginTypes' +import { SendErrorBackPressed, SendErrorNoTransaction } from '../fiatPlugin' +import { FiatDirection, FiatPaymentType, SaveTxActionParams } from '../fiatPluginTypes' import { FiatProvider, FiatProviderApproveQuoteParams, @@ -18,11 +23,12 @@ import { FiatProviderQuote } from '../fiatProviderTypes' import { addTokenToArray } from '../util/providerUtils' -import { addExactRegion, isDailyCheckDue, validateExactRegion } from './common' +import { addExactRegion, isDailyCheckDue, NOT_SUCCESS_TOAST_HIDE_MS, RETURN_URL_PAYMENT, validateExactRegion } from './common' const providerId = 'moonpay' const storeId = 'com.moonpay' const partnerIcon = 'moonpay_symbol_prp.png' const pluginDisplayName = 'Moonpay' +const supportEmail = 'support@moonpay.com' const allowedCurrencyCodes: Record = { buy: { credit: { providerId, fiat: {}, crypto: {} } }, @@ -100,16 +106,43 @@ const asApiKeys = asString const asMoonpayCountries = asArray(asMoonpayCountry) type MoonpayPaymentMethod = 'ach_bank_transfer' | 'credit_debit_card' + interface MoonpayWidgetQueryParams { apiKey: string + lockAmount: true + showAllCurrencies: false + paymentMethod: MoonpayPaymentMethod +} + +type MoonpayBuyWidgetQueryParams = MoonpayWidgetQueryParams & { + /** crypto currency code */ currencyCode: string + + /** fiat currency code */ baseCurrencyCode: string - lockAmount: boolean walletAddress: string - showAllCurrencies: boolean - enableRecurringBuys: boolean - paymentMethod: MoonpayPaymentMethod + enableRecurringBuys: false + + /** crypto amount to buy */ + quoteCurrencyAmount?: number + + /** fiat amount to spend */ + baseCurrencyAmount?: number +} + +type MoonpaySellWidgetQueryParams = MoonpayWidgetQueryParams & { + /** fiat currency code */ + quoteCurrencyCode: string + + /** crypto currency code */ + baseCurrencyCode: string + refundWalletAddress: string + redirectURL: string + + /** fiat amount to receive */ quoteCurrencyAmount?: number + + /** crypto amount to sell */ baseCurrencyAmount?: number } @@ -163,10 +196,6 @@ export const moonpayProvider: FiatProviderFactory = { getSupportedAssets: async ({ direction, paymentTypes, regionCode }): Promise => { const paymentType = PAYMENT_TYPE_MAP[paymentTypes[0]] ?? paymentTypes[0] - if (direction !== 'buy') { - throw new FiatProviderError({ providerId, errorType: 'paymentUnsupported' }) - } - // Return nothing if paymentTypes are not supported by this provider const assetMap = allowedCurrencyCodes[direction][paymentType] if (assetMap == null) throw new FiatProviderError({ providerId, errorType: 'paymentUnsupported' }) @@ -185,9 +214,9 @@ export const moonpayProvider: FiatProviderFactory = { return assetMap } for (const currency of moonpayCurrencies) { - // if (direction === 'sell' && currency.isSellSupported !== true) { - // continue - // } + if (direction === 'sell' && currency.isSellSupported !== true) { + continue + } if (currency.type === 'crypto') { if (regionCode.countryCode === 'US' && currency.isSupportedInUS !== true) { @@ -223,10 +252,13 @@ export const moonpayProvider: FiatProviderFactory = { for (const country of countries) { if (country.isAllowed) { if (country.states == null) { - if (country.isBuyAllowed) { - allowedCountryCodes.buy[country.alpha2] = true - } else if (country.isSellAllowed) { - allowedCountryCodes.sell[country.alpha2] = true + if (country.isAllowed) { + if (country.isBuyAllowed) { + allowedCountryCodes.buy[country.alpha2] = true + } + if (country.isSellAllowed) { + allowedCountryCodes.sell[country.alpha2] = true + } } } else { const countryCode = country.alpha2 @@ -252,13 +284,9 @@ export const moonpayProvider: FiatProviderFactory = { return assetMap }, getQuote: async (params: FiatProviderGetQuoteParams): Promise => { - const { direction, regionCode, paymentTypes, displayCurrencyCode } = params + const { direction, fiatCurrencyCode, regionCode, paymentTypes, displayCurrencyCode, tokenId } = params validateExactRegion(providerId, regionCode, allowedCountryCodes[direction]) - if (direction !== 'buy') { - throw new FiatProviderError({ providerId, errorType: 'paymentUnsupported' }) - } - const paymentType = PAYMENT_TYPE_MAP[paymentTypes[0]] ?? paymentTypes[0] const assetMap = allowedCurrencyCodes[direction][paymentType] if (assetMap == null) throw new FiatProviderError({ providerId, errorType: 'paymentUnsupported' }) @@ -356,27 +384,194 @@ export const moonpayProvider: FiatProviderFactory = { approveQuote: async (approveParams: FiatProviderApproveQuoteParams): Promise => { const { coreWallet, showUi } = approveParams const receiveAddress = await coreWallet.getReceiveAddress({ tokenId: null }) - const url = new URL('https://buy.moonpay.com?', true) - const queryObj: MoonpayWidgetQueryParams = { - apiKey, - walletAddress: receiveAddress.publicAddress, - currencyCode: cryptoCurrencyObj.code, - paymentMethod, - baseCurrencyCode: fiatCurrencyObj.code, - lockAmount: true, - showAllCurrencies: false, - enableRecurringBuys: true - } - if (params.amountType === 'crypto') { - queryObj.quoteCurrencyAmount = moonpayQuote.quoteCurrencyAmount + if (direction === 'buy') { + const urlObj = new URL('https://buy.moonpay.com?', true) + const queryObj: MoonpayBuyWidgetQueryParams = { + apiKey, + walletAddress: receiveAddress.publicAddress, + currencyCode: cryptoCurrencyObj.code, + paymentMethod, + baseCurrencyCode: fiatCurrencyObj.code, + lockAmount: true, + showAllCurrencies: false, + enableRecurringBuys: false + } + if (params.amountType === 'crypto') { + queryObj.quoteCurrencyAmount = moonpayQuote.quoteCurrencyAmount + } else { + queryObj.baseCurrencyAmount = 'totalAmount' in moonpayQuote ? moonpayQuote.totalAmount : undefined + } + urlObj.set('query', queryObj) + console.log('Approving moonpay buy quote url=' + urlObj.href) + await showUi.openExternalWebView({ url: urlObj.href }) } else { - queryObj.baseCurrencyAmount = 'totalAmount' in moonpayQuote ? moonpayQuote.totalAmount : undefined + const urlObj = new URL('https://sell.moonpay.com?', true) + const queryObj: MoonpaySellWidgetQueryParams = { + apiKey, + refundWalletAddress: receiveAddress.publicAddress, + quoteCurrencyCode: fiatCurrencyObj.code, + paymentMethod, + baseCurrencyCode: cryptoCurrencyObj.code, + lockAmount: true, + showAllCurrencies: false, + redirectURL: RETURN_URL_PAYMENT + } + if (params.amountType === 'crypto') { + queryObj.baseCurrencyAmount = moonpayQuote.baseCurrencyAmount + } else { + queryObj.quoteCurrencyAmount = 'totalAmount' in moonpayQuote ? moonpayQuote.totalAmount : undefined + } + urlObj.set('query', queryObj) + console.log('Approving moonpay sell quote url=' + urlObj.href) + + let inPayment = false + + const openWebView = async () => { + await showUi.openWebView({ + url: urlObj.href, + onUrlChange: async (uri: string) => { + console.log('Moonpay WebView url change: ' + uri) + + if (uri.startsWith(RETURN_URL_PAYMENT)) { + console.log('Moonpay WebView launch payment: ' + uri) + const urlObj = new URL(uri, true) + const { query } = urlObj + const { baseCurrencyAmount, baseCurrencyCode, depositWalletAddress, depositWalletAddressTag, transactionId } = query + if (inPayment) return + inPayment = true + try { + if (baseCurrencyAmount == null || baseCurrencyCode == null || depositWalletAddress == null || transactionId == null) { + throw new Error('Moonpay missing parameters') + } + + const nativeAmount = await coreWallet.denominationToNative(baseCurrencyAmount, displayCurrencyCode) + + const assetAction: EdgeAssetAction = { + assetActionType: 'sell' + } + const savedAction: EdgeTxActionFiat = { + actionType: 'fiat', + orderId: transactionId, + orderUri: `https://sell.moonpay.com/transaction_receipt?transactionId=${transactionId}`, + isEstimate: true, + fiatPlugin: { + providerId, + providerDisplayName: pluginDisplayName, + supportEmail + }, + payinAddress: depositWalletAddress, + cryptoAsset: { + pluginId: coreWallet.currencyInfo.pluginId, + tokenId, + nativeAmount + }, + fiatAsset: { + fiatCurrencyCode, + fiatAmount + } + } + + // Launch the SendScene to make payment + const spendInfo: EdgeSpendInfo = { + tokenId, + assetAction, + savedAction, + spendTargets: [ + { + nativeAmount, + publicAddress: depositWalletAddress + } + ] + } + + if (depositWalletAddressTag != null) { + spendInfo.memos = [ + { + type: 'text', + value: depositWalletAddressTag, + hidden: true + } + ] + } + + const sendParams: SendScene2Params = { + walletId: coreWallet.id, + tokenId, + spendInfo, + dismissAlert: true, + lockTilesMap: { + address: true, + amount: true, + wallet: true + }, + hiddenFeaturesMap: { + address: true + } + } + const tx = await showUi.send(sendParams) + await showUi.trackConversion('Sell_Success', { + conversionValues: { + conversionType: 'sell', + destFiatCurrencyCode: fiatCurrencyCode, + destFiatAmount: fiatAmount, + sourceAmount: new CryptoAmount({ + currencyConfig: coreWallet.currencyConfig, + currencyCode: displayCurrencyCode, + exchangeAmount: baseCurrencyAmount + }), + fiatProviderId: providerId, + orderId: transactionId + } + }) + + // Save separate metadata/action for token transaction fee + if (tokenId != null) { + const params: SaveTxActionParams = { + walletId: coreWallet.id, + tokenId, + txid: tx.txid, + savedAction, + assetAction: { ...assetAction, assetActionType: 'sell' } + } + await showUi.saveTxAction(params) + } + + // Route back to the original URL to show Paybis confirmation screen + await showUi.exitScene() + + const message = + sprintf(lstrings.fiat_plugin_sell_complete_message_s, cryptoAmount, displayCurrencyCode, fiatAmount, displayFiatCurrencyCode, '1') + + '\n\n' + + sprintf(lstrings.fiat_plugin_sell_complete_message_2_hour_s, '1') + + '\n\n' + + lstrings.fiat_plugin_sell_complete_message_3 + await showUi.buttonModal({ + buttons: { + ok: { label: lstrings.string_ok, type: 'primary' } + }, + title: lstrings.fiat_plugin_sell_complete_title, + message + }) + } catch (e: any) { + await showUi.exitScene() + // Reopen the webivew on the Paybis payment screen + await openWebView() + if (e.message === SendErrorNoTransaction) { + await showUi.showToast(lstrings.fiat_plugin_sell_failed_to_send_try_again, NOT_SUCCESS_TOAST_HIDE_MS) + } else if (e.message === SendErrorBackPressed) { + // Do nothing + } else { + await showUi.showError(e) + } + } finally { + inPayment = false + } + } + } + }) + } + await openWebView() } - - url.set('query', queryObj) - - console.log('Approving moonpay quote url=' + url.href) - await showUi.openExternalWebView({ url: url.href }) }, closeQuote: async (): Promise => {} } diff --git a/src/plugins/gui/providers/paybisProvider.ts b/src/plugins/gui/providers/paybisProvider.ts index 6f9848ce3bc..b42ec2905e5 100644 --- a/src/plugins/gui/providers/paybisProvider.ts +++ b/src/plugins/gui/providers/paybisProvider.ts @@ -345,6 +345,10 @@ export const paybisProvider: FiatProviderFactory = { partnerIcon, pluginDisplayName, getSupportedAssets: async ({ direction, paymentTypes, regionCode }): Promise => { + // Do not allow sell to debit in US + if (direction === 'sell' && paymentTypes.includes('credit') && regionCode.countryCode === 'US') { + throw new FiatProviderError({ providerId, errorType: 'paymentUnsupported' }) + } validateRegion(providerId, regionCode, SUPPORTED_REGIONS) // Return nothing if paymentTypes are not supported by this provider const paymentType = paymentTypes.find(paymentType => allowedPaymentTypes[direction][paymentType] === true) From 9b102878b60e56be8acc06239b7e3ba3179e8e32 Mon Sep 17 00:00:00 2001 From: Paul Puey Date: Fri, 6 Sep 2024 15:54:07 -0700 Subject: [PATCH 29/82] Add paypal and revolut support --- .../__snapshots__/GuiPlugins.test.ts.snap | 56 ++++++++++++++++++ .../paymentTypes/paymentTypeLogoPaypal.png | Bin 0 -> 25993 bytes .../paymentTypeLogoRevolut-dark.png | Bin 0 -> 17288 bytes .../paymentTypeLogoRevolut-light.png | Bin 0 -> 18513 bytes src/components/scenes/GuiPluginListScene.tsx | 2 + src/constants/plugins/GuiPlugins.ts | 16 +++++ src/constants/plugins/buyPluginList.json | 47 +++++++++++++++ src/constants/plugins/sellPluginList.json | 44 ++++++++++++++ src/plugins/gui/fiatPluginTypes.ts | 2 + src/plugins/gui/providers/moonpayProvider.ts | 17 ++++-- src/plugins/gui/providers/paybisProvider.ts | 4 ++ src/theme/variables/edgeDark.ts | 4 ++ src/theme/variables/edgeLight.ts | 4 ++ src/theme/variables/testDark.ts | 4 ++ src/theme/variables/testLight.ts | 4 ++ src/types/Theme.ts | 2 + 16 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 src/assets/images/paymentTypes/paymentTypeLogoPaypal.png create mode 100644 src/assets/images/paymentTypes/paymentTypeLogoRevolut-dark.png create mode 100644 src/assets/images/paymentTypes/paymentTypeLogoRevolut-light.png diff --git a/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap b/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap index e8b346e1fd6..6292d537266 100644 --- a/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap +++ b/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap @@ -133,6 +133,20 @@ Settlement: 1 - 48 hours", "pluginId": "bitsofgold", "title": "Israeli Bank Transfer", }, + { + "cryptoCodes": [], + "deepPath": "", + "deepQuery": {}, + "description": "Fee: ~5% +Settlement: 5 min - 24 hours", + "paymentType": "paypal", + "paymentTypeLogoKey": "paypal", + "paymentTypes": [ + "paypal", + ], + "pluginId": "paypal", + "title": "Paypal", + }, { "cryptoCodes": [], "deepPath": "", @@ -181,6 +195,20 @@ Limit $1000", "pluginId": "iach", "title": "Instant ACH Bank Transfer", }, + { + "cryptoCodes": [], + "deepPath": "", + "deepQuery": {}, + "description": "Fee: ~5% +Settlement: 5 min - 24 hours", + "paymentType": "paypal", + "paymentTypeLogoKey": "paypal", + "paymentTypes": [ + "paypal", + ], + "pluginId": "paypal", + "title": "Paypal", + }, { "cryptoCodes": [], "deepPath": "", @@ -209,6 +237,20 @@ Settlement: 10 - 30 minutes", "pluginId": "creditcard", "title": "Credit and Debit Card", }, + { + "cryptoCodes": [], + "deepPath": "", + "deepQuery": {}, + "description": "Fee: ~5% +Settlement: 5 min - 24 hours", + "paymentType": "revolut", + "paymentTypeLogoKey": "revolut", + "paymentTypes": [ + "revolut", + ], + "pluginId": "revolut", + "title": "Revolut", + }, { "cryptoCodes": [], "deepPath": "", @@ -260,6 +302,20 @@ Settlement: 2 - 3 days", "pluginId": "ach", "title": "ACH Bank Transfer", }, + { + "cryptoCodes": [], + "deepPath": "", + "deepQuery": {}, + "description": "Fee: ~5% +Settlement: 5 min - 24 hours", + "paymentType": "paypal", + "paymentTypeLogoKey": "paypal", + "paymentTypes": [ + "paypal", + ], + "pluginId": "paypal", + "title": "Paypal", + }, { "cryptoCodes": [], "deepPath": "", diff --git a/src/assets/images/paymentTypes/paymentTypeLogoPaypal.png b/src/assets/images/paymentTypes/paymentTypeLogoPaypal.png new file mode 100644 index 0000000000000000000000000000000000000000..514fd057b7322536c55617e1ae2532b4e832a0d0 GIT binary patch literal 25993 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∾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 literal 0 HcmV?d00001 diff --git a/src/assets/images/paymentTypes/paymentTypeLogoRevolut-dark.png b/src/assets/images/paymentTypes/paymentTypeLogoRevolut-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8be63ccaff38b4c558830d83ab1c78e3c5bb77 GIT binary patch literal 17288 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 D^e6C; literal 0 HcmV?d00001 diff --git a/src/assets/images/paymentTypes/paymentTypeLogoRevolut-light.png b/src/assets/images/paymentTypes/paymentTypeLogoRevolut-light.png new file mode 100644 index 0000000000000000000000000000000000000000..19c938b7faa6fe457340b2edfecac1f023fad7ce GIT binary patch literal 18513 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 literal 0 HcmV?d00001 diff --git a/src/components/scenes/GuiPluginListScene.tsx b/src/components/scenes/GuiPluginListScene.tsx index 88201643bd0..070be86aef0 100644 --- a/src/components/scenes/GuiPluginListScene.tsx +++ b/src/components/scenes/GuiPluginListScene.tsx @@ -81,8 +81,10 @@ const paymentTypeLogosById = { interac: 'paymentTypeLogoInterac', payid: 'paymentTypeLogoPayid', paynow: 'paymentTypeLogoPaynow', + paypal: 'paymentTypeLogoPaypal', pix: 'paymentTypeLogoPix', poli: 'paymentTypeLogoPoli', + revolut: 'paymentTypeLogoRevolut', sofort: 'paymentTypeLogoSofort', upi: 'paymentTypeLogoUpi', visa: 'paymentTypeVisa' diff --git a/src/constants/plugins/GuiPlugins.ts b/src/constants/plugins/GuiPlugins.ts index 57f8c3ab50a..ddf78a2c131 100644 --- a/src/constants/plugins/GuiPlugins.ts +++ b/src/constants/plugins/GuiPlugins.ts @@ -157,6 +157,14 @@ export const guiPlugins: { [pluginId: string]: GuiPlugin } = { forceFiatCurrencyCode: 'iso:AUD', displayName: '' }, + paypal: { + pluginId: 'amountquote', + storeId: '', + baseUri: '', + lockUriPath: true, + nativePlugin: amountQuoteFiatPlugin, + displayName: '' + }, pix: { pluginId: 'amountquote', storeId: '', @@ -187,6 +195,14 @@ export const guiPlugins: { [pluginId: string]: GuiPlugin } = { defaultFiatAmount: '2000', displayName: '' }, + revolut: { + pluginId: 'amountquote', + storeId: '', + baseUri: '', + lockUriPath: true, + nativePlugin: amountQuoteFiatPlugin, + displayName: '' + }, sepa: { pluginId: 'amountquote', storeId: '', diff --git a/src/constants/plugins/buyPluginList.json b/src/constants/plugins/buyPluginList.json index 6672cb18bc2..17fac897220 100644 --- a/src/constants/plugins/buyPluginList.json +++ b/src/constants/plugins/buyPluginList.json @@ -369,6 +369,23 @@ "cryptoCodes": [], "paymentTypeLogoKey": "payid" }, + { + "id": "paypal", + "pluginId": "paypal", + "paymentType": "paypal", + "paymentTypes": ["paypal"], + "title": "Paypal", + "description": "Fee: ~5%\nSettlement: 5 min - 24 hours", + "forCountries": [ + "AE", "AR", "AT", "AU", "BE", "BR", "CA", "CH", "CL", "CO", + "CZ", "DE", "DK", "EG", "ES", "FI", "FR", "GH", "GR", "HK", + "HU", "IE", "IL", "IN", "IT", "JP", "KE", "KR", "MX", "MY", + "NG", "NL", "NO", "NZ", "PE", "PH", "PL", "PT", "RU", "SA", + "SE", "SG", "TH", "TR", "TZ", "US", "VN", "ZA" + ], + "cryptoCodes": [], + "paymentTypeLogoKey": "paypal" + }, { "id": "pix", "pluginId": "pix", @@ -392,6 +409,23 @@ "cryptoCodes": [], "paymentTypeLogoKey": "bank" }, + { + "id": "revolut", + "pluginId": "revolut", + "paymentType": "revolut", + "paymentTypes": ["revolut"], + "title": "Revolut", + "description": "Fee: ~5%\nSettlement: 5 min - 24 hours", + "forCountries": [ + "AU", "BR", "AT", "BE", "BG", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", + "FR", "GR", "HR", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", + "MT", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "JP", "NZ", + "SG", "CH", "GB", "US", "IO", "IM", "JE", "GG", "GF", "GP", "YT", + "MQ", "RE", "MF" + ], + "cryptoCodes": [], + "paymentTypeLogoKey": "revolut" + }, { "id": "turkishbank", "pluginId": "turkishbank", @@ -469,10 +503,18 @@ "id": "pix", "sortIndex": 10 }, + { + "id": "paypal", + "sortIndex": 15 + }, { "id": "pse", "sortIndex": 10 }, + { + "id": "revolut", + "sortIndex": 15 + }, { "id": "turkishbank", "sortIndex": 10 @@ -1008,5 +1050,10 @@ "id": "sepa", "forCountries": ["GB"], "sortIndex": 50 + }, + { + "id": "revolut", + "forCountries": ["US"], + "sortIndex": 30 } ] diff --git a/src/constants/plugins/sellPluginList.json b/src/constants/plugins/sellPluginList.json index 684bb1b0ee7..33ab51e1772 100644 --- a/src/constants/plugins/sellPluginList.json +++ b/src/constants/plugins/sellPluginList.json @@ -142,6 +142,23 @@ "cryptoCodes": [], "paymentTypeLogoKey": "bank" }, + { + "id": "paypal", + "pluginId": "paypal", + "paymentType": "paypal", + "paymentTypes": ["paypal"], + "title": "Paypal", + "description": "Fee: ~5%\nSettlement: 5 min - 24 hours", + "forCountries": [ + "AE", "AR", "AT", "AU", "BE", "BR", "CA", "CH", "CL", "CO", + "CZ", "DE", "DK", "EG", "ES", "FI", "FR", "GH", "GR", "HK", + "HU", "IE", "IL", "IN", "IT", "JP", "KE", "KR", "MX", "MY", + "NG", "NL", "NO", "NZ", "PE", "PH", "PL", "PT", "RU", "SA", + "SE", "SG", "TH", "TR", "TZ", "US", "VN", "ZA" + ], + "cryptoCodes": [], + "paymentTypeLogoKey": "paypal" + }, { "id": "pix", "pluginId": "pix", @@ -501,6 +518,25 @@ "type": "sell" } }, + { + "##": "Disabled for now", + "id": "revolut", + "pluginId": "revolut", + "paymentType": "revolut", + "paymentTypes": ["revolut"], + "title": "Revolut", + "description": "Fee: ~5%\nSettlement: 5 min - 24 hours", + "forCountries": [], + "-forCountries": [ + "AU", "BR", "AT", "BE", "BG", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", + "FR", "GR", "HR", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", + "MT", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "JP", "NZ", + "SG", "CH", "GB", "US", "IO", "IM", "JE", "GG", "GF", "GP", "YT", + "MQ", "RE", "MF" + ], + "cryptoCodes": [], + "paymentTypeLogoKey": "revolut" + }, { "id": "xanpool", "pluginId": "xanpool", @@ -546,6 +582,14 @@ "id": "pix", "sortIndex": 10 }, + { + "id": "paypal", + "sortIndex": 15 + }, + { + "id": "revolut", + "sortIndex": 15 + }, { "id": "bitsofgold", "sortIndex": 10 diff --git a/src/plugins/gui/fiatPluginTypes.ts b/src/plugins/gui/fiatPluginTypes.ts index 8aa0c38cc94..66e9e8898b0 100644 --- a/src/plugins/gui/fiatPluginTypes.ts +++ b/src/plugins/gui/fiatPluginTypes.ts @@ -34,8 +34,10 @@ export const asFiatPaymentType = asValue( 'iobank', 'mexicobank', 'payid', + 'paypal', 'pix', 'pse', + 'revolut', 'sepa', 'spei', 'turkishbank', diff --git a/src/plugins/gui/providers/moonpayProvider.ts b/src/plugins/gui/providers/moonpayProvider.ts index e639bd73b25..e709e6d2b0d 100644 --- a/src/plugins/gui/providers/moonpayProvider.ts +++ b/src/plugins/gui/providers/moonpayProvider.ts @@ -31,8 +31,11 @@ const pluginDisplayName = 'Moonpay' const supportEmail = 'support@moonpay.com' const allowedCurrencyCodes: Record = { - buy: { credit: { providerId, fiat: {}, crypto: {} } }, - sell: { credit: { providerId, fiat: {}, crypto: {}, requiredAmountType: 'crypto' } } + buy: { credit: { providerId, fiat: {}, crypto: {} }, paypal: { providerId, fiat: {}, crypto: {} } }, + sell: { + credit: { providerId, fiat: {}, crypto: {}, requiredAmountType: 'crypto' }, + paypal: { providerId, fiat: {}, crypto: {}, requiredAmountType: 'crypto' } + } } const allowedCountryCodes: Record = { buy: {}, sell: {} } @@ -105,7 +108,7 @@ const asApiKeys = asString const asMoonpayCountries = asArray(asMoonpayCountry) -type MoonpayPaymentMethod = 'ach_bank_transfer' | 'credit_debit_card' +type MoonpayPaymentMethod = 'ach_bank_transfer' | 'credit_debit_card' | 'paypal' interface MoonpayWidgetQueryParams { apiKey: string @@ -150,7 +153,8 @@ const MOONPAY_PAYMENT_TYPE_MAP: Partial> = { applepay: 'credit', credit: 'credit', - googlepay: 'credit' + googlepay: 'credit', + paypal: 'paypal' } let lastChecked = 0 @@ -200,7 +205,7 @@ export const moonpayProvider: FiatProviderFactory = { const assetMap = allowedCurrencyCodes[direction][paymentType] if (assetMap == null) throw new FiatProviderError({ providerId, errorType: 'paymentUnsupported' }) - if (isDailyCheckDue(lastChecked)) { + if (Object.keys(assetMap.crypto).length === 0 || isDailyCheckDue(lastChecked)) { const response = await fetch(`https://api.moonpay.com/v3/currencies?apiKey=${apiKey}`).catch(e => undefined) if (response == null || !response.ok) return assetMap diff --git a/src/plugins/gui/providers/paybisProvider.ts b/src/plugins/gui/providers/paybisProvider.ts index b42ec2905e5..0f922584f37 100644 --- a/src/plugins/gui/providers/paybisProvider.ts +++ b/src/plugins/gui/providers/paybisProvider.ts @@ -42,6 +42,7 @@ const allowedPaymentTypes: AllowedPaymentTypes = { googlepay: true, pix: true, pse: true, + revolut: true, spei: true }, sell: { @@ -64,6 +65,7 @@ const asApiKeys = asObject({ const asPaymentMethodId = asValue( 'method-id-credit-card', 'method-id-credit-card-out', + 'method-id_bridgerpay_revolutpay', // XXX Hack. Fake payment methods for googlepay/applepay 'fake-id-googlepay', @@ -278,6 +280,7 @@ const EDGE_TO_PAYBIS_CURRENCY_MAP: StringMap = Object.entries(PAYBIS_TO_EDGE_CUR const PAYMENT_METHOD_MAP: { [Payment in PaymentMethodId]: FiatPaymentType } = { 'method-id-credit-card': 'credit', 'method-id-credit-card-out': 'credit', + 'method-id_bridgerpay_revolutpay': 'revolut', // XXX Hack. Fake payment methods for googlepay/applepay 'fake-id-googlepay': 'googlepay', @@ -302,6 +305,7 @@ const REVERSE_PAYMENT_METHOD_MAP: Partial<{ [Payment in FiatPaymentType]: Paymen googlepay: 'method-id-credit-card', pix: 'method-id_bridgerpay_directa24_pix', pse: 'method-id_bridgerpay_directa24_pse', + revolut: 'method-id_bridgerpay_revolutpay', spei: 'method-id_bridgerpay_directa24_spei' } diff --git a/src/theme/variables/edgeDark.ts b/src/theme/variables/edgeDark.ts index 26494e37e89..2a8442ca9d6 100644 --- a/src/theme/variables/edgeDark.ts +++ b/src/theme/variables/edgeDark.ts @@ -17,8 +17,10 @@ import paymentTypeLogoIdeal from '../../assets/images/paymentTypes/paymentTypeLo import paymentTypeLogoInterac from '../../assets/images/paymentTypes/paymentTypeLogoInterac.png' import paymentTypeLogoPayid from '../../assets/images/paymentTypes/paymentTypeLogoPayid.png' import paymentTypeLogoPaynow from '../../assets/images/paymentTypes/paymentTypeLogoPaynow.png' +import paymentTypeLogoPaypal from '../../assets/images/paymentTypes/paymentTypeLogoPaypal.png' import paymentTypeLogoPix from '../../assets/images/paymentTypes/paymentTypeLogoPix.png' import paymentTypeLogoPoli from '../../assets/images/paymentTypes/paymentTypeLogoPoli.png' +import paymentTypeLogoRevolut from '../../assets/images/paymentTypes/paymentTypeLogoRevolut-dark.png' import paymentTypeLogoSofort from '../../assets/images/paymentTypes/paymentTypeLogoSofort.png' import paymentTypeLogoUpi from '../../assets/images/paymentTypes/paymentTypeLogoUpi.png' import paymentTypeVisa from '../../assets/images/paymentTypes/paymentTypeVisa.png' @@ -446,8 +448,10 @@ export const edgeDark: Theme = { paymentTypeLogoInterac, paymentTypeLogoPayid, paymentTypeLogoPaynow, + paymentTypeLogoPaypal, paymentTypeLogoPix, paymentTypeLogoPoli, + paymentTypeLogoRevolut, paymentTypeLogoSofort, paymentTypeLogoUpi, paymentTypeVisa, diff --git a/src/theme/variables/edgeLight.ts b/src/theme/variables/edgeLight.ts index 1c53c1bb1e4..13930b65e9e 100644 --- a/src/theme/variables/edgeLight.ts +++ b/src/theme/variables/edgeLight.ts @@ -17,8 +17,10 @@ import paymentTypeLogoIdeal from '../../assets/images/paymentTypes/paymentTypeLo import paymentTypeLogoInterac from '../../assets/images/paymentTypes/paymentTypeLogoInterac.png' import paymentTypeLogoPayid from '../../assets/images/paymentTypes/paymentTypeLogoPayid.png' import paymentTypeLogoPaynow from '../../assets/images/paymentTypes/paymentTypeLogoPaynow.png' +import paymentTypeLogoPaypal from '../../assets/images/paymentTypes/paymentTypeLogoPaypal.png' import paymentTypeLogoPix from '../../assets/images/paymentTypes/paymentTypeLogoPix.png' import paymentTypeLogoPoli from '../../assets/images/paymentTypes/paymentTypeLogoPoli.png' +import paymentTypeLogoRevolut from '../../assets/images/paymentTypes/paymentTypeLogoRevolut-light.png' import paymentTypeLogoSofort from '../../assets/images/paymentTypes/paymentTypeLogoSofort.png' import paymentTypeLogoUpi from '../../assets/images/paymentTypes/paymentTypeLogoUpi.png' import paymentTypeVisa from '../../assets/images/paymentTypes/paymentTypeVisa.png' @@ -402,8 +404,10 @@ export const edgeLight: Theme = { paymentTypeLogoInterac, paymentTypeLogoPayid, paymentTypeLogoPaynow, + paymentTypeLogoPaypal, paymentTypeLogoPix, paymentTypeLogoPoli, + paymentTypeLogoRevolut, paymentTypeLogoSofort, paymentTypeLogoUpi, paymentTypeVisa, diff --git a/src/theme/variables/testDark.ts b/src/theme/variables/testDark.ts index d3b689eb2a8..dc481d85aa5 100644 --- a/src/theme/variables/testDark.ts +++ b/src/theme/variables/testDark.ts @@ -17,8 +17,10 @@ import paymentTypeLogoIdeal from '../../assets/images/paymentTypes/paymentTypeLo import paymentTypeLogoInterac from '../../assets/images/paymentTypes/paymentTypeLogoInterac.png' import paymentTypeLogoPayid from '../../assets/images/paymentTypes/paymentTypeLogoPayid.png' import paymentTypeLogoPaynow from '../../assets/images/paymentTypes/paymentTypeLogoPaynow.png' +import paymentTypeLogoPaypal from '../../assets/images/paymentTypes/paymentTypeLogoPaypal.png' import paymentTypeLogoPix from '../../assets/images/paymentTypes/paymentTypeLogoPix.png' import paymentTypeLogoPoli from '../../assets/images/paymentTypes/paymentTypeLogoPoli.png' +import paymentTypeLogoRevolut from '../../assets/images/paymentTypes/paymentTypeLogoRevolut-dark.png' import paymentTypeLogoSofort from '../../assets/images/paymentTypes/paymentTypeLogoSofort.png' import paymentTypeLogoUpi from '../../assets/images/paymentTypes/paymentTypeLogoUpi.png' import paymentTypeVisa from '../../assets/images/paymentTypes/paymentTypeVisa.png' @@ -443,8 +445,10 @@ export const testDark: Theme = { paymentTypeLogoInterac, paymentTypeLogoPayid, paymentTypeLogoPaynow, + paymentTypeLogoPaypal, paymentTypeLogoPix, paymentTypeLogoPoli, + paymentTypeLogoRevolut, paymentTypeLogoSofort, paymentTypeLogoUpi, paymentTypeVisa, diff --git a/src/theme/variables/testLight.ts b/src/theme/variables/testLight.ts index 23fcf711ec0..a3301105c4d 100644 --- a/src/theme/variables/testLight.ts +++ b/src/theme/variables/testLight.ts @@ -17,8 +17,10 @@ import paymentTypeLogoIdeal from '../../assets/images/paymentTypes/paymentTypeLo import paymentTypeLogoInterac from '../../assets/images/paymentTypes/paymentTypeLogoInterac.png' import paymentTypeLogoPayid from '../../assets/images/paymentTypes/paymentTypeLogoPayid.png' import paymentTypeLogoPaynow from '../../assets/images/paymentTypes/paymentTypeLogoPaynow.png' +import paymentTypeLogoPaypal from '../../assets/images/paymentTypes/paymentTypeLogoPaypal.png' import paymentTypeLogoPix from '../../assets/images/paymentTypes/paymentTypeLogoPix.png' import paymentTypeLogoPoli from '../../assets/images/paymentTypes/paymentTypeLogoPoli.png' +import paymentTypeLogoRevolut from '../../assets/images/paymentTypes/paymentTypeLogoRevolut-light.png' import paymentTypeLogoSofort from '../../assets/images/paymentTypes/paymentTypeLogoSofort.png' import paymentTypeLogoUpi from '../../assets/images/paymentTypes/paymentTypeLogoUpi.png' import paymentTypeVisa from '../../assets/images/paymentTypes/paymentTypeVisa.png' @@ -402,8 +404,10 @@ export const testLight: Theme = { paymentTypeLogoInterac, paymentTypeLogoPayid, paymentTypeLogoPaynow, + paymentTypeLogoPaypal, paymentTypeLogoPix, paymentTypeLogoPoli, + paymentTypeLogoRevolut, paymentTypeLogoSofort, paymentTypeLogoUpi, paymentTypeVisa, diff --git a/src/types/Theme.ts b/src/types/Theme.ts index 466b3e8f50d..d99b1d9e97c 100644 --- a/src/types/Theme.ts +++ b/src/types/Theme.ts @@ -424,8 +424,10 @@ export interface Theme { paymentTypeLogoInterac: ImageProp paymentTypeLogoPayid: ImageProp paymentTypeLogoPaynow: ImageProp + paymentTypeLogoPaypal: ImageProp paymentTypeLogoPix: ImageProp paymentTypeLogoPoli: ImageProp + paymentTypeLogoRevolut: ImageProp paymentTypeLogoSofort: ImageProp paymentTypeLogoUpi: ImageProp paymentTypeVisa: ImageProp From 73efd1cb9be9767c59060379ebd48ed820bc42f6 Mon Sep 17 00:00:00 2001 From: Paul Puey Date: Wed, 11 Sep 2024 16:14:46 -0700 Subject: [PATCH 30/82] Sort and organize plugin country list --- src/constants/plugins/buyPluginList.json | 808 ++-------------------- src/constants/plugins/sellPluginList.json | 342 +-------- 2 files changed, 107 insertions(+), 1043 deletions(-) diff --git a/src/constants/plugins/buyPluginList.json b/src/constants/plugins/buyPluginList.json index 17fac897220..60c262f84dc 100644 --- a/src/constants/plugins/buyPluginList.json +++ b/src/constants/plugins/buyPluginList.json @@ -7,243 +7,30 @@ "paymentTypes": ["credit"], "title": "Credit and Debit Card", "forCountries": [ - "AF", - "AL", - "DZ", - "AS", - "AD", - "AO", - "AI", - "AQ", - "AG", - "AR", - "AM", - "AW", - "AU", - "AT", - "AZ", - "BH", - "BD", - "BB", - "BY", - "BE", - "BZ", - "BJ", - "BM", - "BT", - "BO", - "BQ", - "BA", - "BV", - "BR", - "BW", - "IO", - "BN", - "BG", - "BF", - "BI", - "CM", - "CA", - "CV", - "KY", - "CF", - "TD", - "CL", - "CN", - "CX", - "CC", - "CO", - "KM", - "CG", - "CD", - "CK", - "CR", - "HR", - "CW", - "CY", - "CZ", - "CI", - "DK", - "DJ", - "DM", - "DO", - "EC", - "EG", - "SV", - "GQ", - "ER", - "EE", - "FK", - "FO", - "FJ", - "FI", - "FR", - "GF", - "GH", - "PF", - "TF", - "GA", - "GM", - "GE", - "DE", - "GI", - "GR", - "GL", - "GD", - "GP", - "GU", - "GT", - "GG", - "GN", - "GW", - "GY", - "KH", - "HT", - "HM", - "VA", - "HN", - "HK", - "HU", - "IS", - "IN", - "ID", - "IE", - "IM", - "IL", - "IT", - "JM", - "JP", - "JE", - "JO", - "KZ", - "KE", - "KI", - "KR", - "KW", - "KG", - "LA", - "LV", - "LB", - "LS", - "LR", - "LY", - "LI", - "LK", - "LT", - "LU", - "MO", - "MK", - "MG", - "MW", - "MY", - "MV", - "ML", - "MT", - "MH", - "MQ", - "MR", - "MU", - "YT", - "MX", - "FM", - "MD", - "MC", - "MN", - "ME", - "MS", - "MA", - "MZ", - "MM", - "NA", - "NR", - "NP", - "NL", - "NC", - "NZ", - "NI", - "NE", - "NG", - "NU", - "NF", - "MP", - "NO", - "OM", - "PA", - "PW", - "PS", - "PG", - "PY", - "PE", - "PH", - "PN", - "PL", - "PT", - "PR", - "QA", - "RO", - "RU", - "RW", - "RE", - "BL", - "SH", - "KN", - "LC", - "MF", - "PM", - "VC", - "WS", - "SM", - "ST", - "SA", - "SN", - "RS", - "SC", - "SL", - "SG", - "SX", - "SK", - "SI", - "SB", - "SO", - "ZA", - "GS", - "SS", - "ES", - "SD", - "SR", - "SJ", - "SZ", - "SE", - "CH", - "TW", - "TJ", - "TZ", - "TH", - "TL", - "TG", - "TK", - "TO", - "TR", - "TM", - "TC", - "TV", - "UG", - "UA", - "AE", - "GB", - "US", - "UM", - "UY", - "UZ", - "VU", - "VE", - "VN", - "VG", - "VI", - "WF", - "EH", - "ZM", - "ZW" + "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", + "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", + "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", + "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", + "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CV", "CW", + "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", + "EE", "EG", "EH", "ER", "ES", "FI", "FJ", "FK", "FM", "FO", + "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", + "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", + "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", + "IN", "IO", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", + "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", + "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", + "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", + "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", + "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", + "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", + "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", + "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", + "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", + "ST", "SV", "SX", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", + "TK", "TL", "TM", "TO", "TR", "TV", "TW", "TZ", "UA", "UG", + "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", + "VU", "WF", "WS", "YT", "ZA", "ZM", "ZW" ], "cryptoCodes": [], "paymentTypeLogoKey": "credit" @@ -287,36 +74,9 @@ "id": "sepa", "pluginId": "sepa", "forCountries": [ - "AT", - "BE", - "BG", - "CH", - "CZ", - "DK", - "EE", - "FI", - "FR", - "DE", - "GR", - "HU", - "IE", - "IT", - "LV", - "LT", - "LU", - "NL", - "PL", - "PT", - "RO", - "SK", - "SI", - "ES", - "SE", - "HR", - "LI", - "NO", - "SM", - "GB" + "AT", "BE", "BG", "CH", "CZ", "DE", "DK", "EE", "ES", "FI", + "FR", "GB", "GR", "HR", "HU", "IE", "IT", "LI", "LT", "LU", + "LV", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "SM" ], "paymentType": "sepa", "paymentTypes": ["sepa"], @@ -561,239 +321,30 @@ "paymentTypes": ["credit"], "title": "Apple Pay", "forCountries": [ - "AF", - "AL", - "DZ", - "AS", - "AD", - "AO", - "AI", - "AQ", - "AG", - "AR", - "AM", - "AW", - "AU", - "AT", - "AZ", - "BH", - "BD", - "BB", - "BY", - "BE", - "BZ", - "BJ", - "BM", - "BT", - "BO", - "BQ", - "BA", - "BV", - "BR", - "IO", - "BN", - "BG", - "BF", - "BI", - "CM", - "CA", - "CV", - "KY", - "CF", - "TD", - "CL", - "CN", - "CX", - "CC", - "CO", - "KM", - "CG", - "CD", - "CK", - "CR", - "HR", - "CW", - "CY", - "CZ", - "CI", - "DK", - "DJ", - "DM", - "DO", - "EC", - "EG", - "SV", - "GH", - "GQ", - "ER", - "EE", - "FK", - "FO", - "FJ", - "FI", - "FR", - "GF", - "PF", - "TF", - "GA", - "GM", - "GE", - "DE", - "GI", - "GR", - "GL", - "GD", - "GP", - "GU", - "GT", - "GG", - "GN", - "GW", - "GY", - "HT", - "HM", - "VA", - "HN", - "HK", - "HU", - "IS", - "IN", - "ID", - "IE", - "IM", - "IL", - "IT", - "JM", - "JP", - "JE", - "JO", - "KZ", - "KE", - "KI", - "KR", - "KW", - "KG", - "LA", - "LV", - "LB", - "LS", - "LR", - "LY", - "LI", - "LT", - "LU", - "MO", - "MK", - "MG", - "MW", - "MY", - "MV", - "ML", - "MT", - "MH", - "MQ", - "MR", - "MU", - "YT", - "MX", - "FM", - "MD", - "MC", - "MN", - "ME", - "MS", - "MA", - "MZ", - "MM", - "NA", - "NR", - "NP", - "NL", - "NC", - "NZ", - "NI", - "NE", - "NG", - "NU", - "NF", - "MP", - "NO", - "OM", - "PW", - "PS", - "PG", - "PY", - "PE", - "PH", - "PN", - "PL", - "PT", - "PR", - "QA", - "RO", - "RU", - "RW", - "RE", - "BL", - "SH", - "KN", - "LC", - "MF", - "PM", - "VC", - "WS", - "SM", - "ST", - "SA", - "SN", - "RS", - "SC", - "SL", - "SG", - "SX", - "SK", - "SI", - "SB", - "SO", - "ZA", - "GS", - "SS", - "ES", - "SD", - "SR", - "SJ", - "SZ", - "SE", - "CH", - "TW", - "TJ", - "TZ", - "TH", - "TL", - "TG", - "TK", - "TO", - "TR", - "TM", - "TC", - "TV", - "UG", - "UA", - "AE", - "GB", - "US", - "UM", - "UY", - "UZ", - "VU", - "VE", - "VN", - "VG", - "VI", - "WF", - "EH", - "ZM", - "ZW" + "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", + "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", + "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", + "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", + "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CV", "CW", + "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", + "EE", "EG", "EH", "ER", "ES", "FI", "FJ", "FK", "FM", "FO", + "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", + "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", + "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", + "IN", "IO", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", + "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", + "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", + "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", + "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", + "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", + "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", + "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", + "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", + "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", + "ST", "SV", "SX", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", + "TK", "TL", "TM", "TO", "TR", "TV", "TW", "TZ", "UA", "UG", + "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", + "VU", "WF", "WS", "YT", "ZA", "ZM", "ZW" ], "cryptoCodes": [], "paymentTypeLogoKey": "applepay" @@ -808,239 +359,30 @@ "paymentTypes": ["credit"], "title": "Google Pay", "forCountries": [ - "AF", - "AL", - "DZ", - "AS", - "AD", - "AO", - "AI", - "AQ", - "AG", - "AR", - "AM", - "AW", - "AU", - "AT", - "AZ", - "BH", - "BD", - "BB", - "BY", - "BE", - "BZ", - "BJ", - "BM", - "BT", - "BO", - "BQ", - "BA", - "BV", - "BR", - "IO", - "BN", - "BG", - "BF", - "BI", - "CM", - "CA", - "CV", - "KY", - "CF", - "TD", - "CL", - "CN", - "CX", - "CC", - "CO", - "KM", - "CG", - "CD", - "CK", - "CR", - "HR", - "CW", - "CY", - "CZ", - "CI", - "DK", - "DJ", - "DM", - "DO", - "EC", - "EG", - "SV", - "GQ", - "ER", - "EE", - "FK", - "FO", - "FJ", - "FI", - "FR", - "GF", - "GH", - "PF", - "TF", - "GA", - "GM", - "GE", - "DE", - "GI", - "GR", - "GL", - "GD", - "GP", - "GU", - "GT", - "GG", - "GN", - "GW", - "GY", - "HT", - "HM", - "VA", - "HN", - "HK", - "HU", - "IS", - "IN", - "ID", - "IE", - "IM", - "IL", - "IT", - "JM", - "JP", - "JE", - "JO", - "KZ", - "KE", - "KI", - "KR", - "KW", - "KG", - "LA", - "LV", - "LB", - "LS", - "LR", - "LY", - "LI", - "LT", - "LU", - "MO", - "MK", - "MG", - "MW", - "MY", - "MV", - "ML", - "MT", - "MH", - "MQ", - "MR", - "MU", - "YT", - "MX", - "FM", - "MD", - "MC", - "MN", - "ME", - "MS", - "MA", - "MZ", - "MM", - "NA", - "NR", - "NP", - "NL", - "NC", - "NZ", - "NI", - "NE", - "NG", - "NU", - "NF", - "MP", - "NO", - "OM", - "PW", - "PS", - "PG", - "PY", - "PE", - "PH", - "PN", - "PL", - "PT", - "PR", - "QA", - "RO", - "RU", - "RW", - "RE", - "BL", - "SH", - "KN", - "LC", - "MF", - "PM", - "VC", - "WS", - "SM", - "ST", - "SA", - "SN", - "RS", - "SC", - "SL", - "SG", - "SX", - "SK", - "SI", - "SB", - "SO", - "ZA", - "GS", - "SS", - "ES", - "SD", - "SR", - "SJ", - "SZ", - "SE", - "CH", - "TW", - "TJ", - "TZ", - "TH", - "TL", - "TG", - "TK", - "TO", - "TR", - "TM", - "TC", - "TV", - "UG", - "UA", - "AE", - "GB", - "US", - "UM", - "UY", - "UZ", - "VU", - "VE", - "VN", - "VG", - "VI", - "WF", - "EH", - "ZM", - "ZW" + "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", + "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", + "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", + "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", "CG", + "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CV", "CW", + "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", + "EE", "EG", "EH", "ER", "ES", "FI", "FJ", "FK", "FM", "FO", + "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", + "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", + "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", + "IN", "IO", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", + "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", + "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", + "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", + "MO", "MP", "MQ", "MR", "MS", "MT", "MU", "MV", "MW", "MX", + "MY", "MZ", "NA", "NC", "NE", "NF", "NG", "NI", "NL", "NO", + "NP", "NR", "NU", "NZ", "OM", "PA", "PE", "PF", "PG", "PH", + "PL", "PM", "PN", "PR", "PS", "PT", "PW", "PY", "QA", "RE", + "RO", "RS", "RU", "RW", "SA", "SB", "SC", "SD", "SE", "SG", + "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SR", "SS", + "ST", "SV", "SX", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", + "TK", "TL", "TM", "TO", "TR", "TV", "TW", "TZ", "UA", "UG", + "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", + "VU", "WF", "WS", "YT", "ZA", "ZM", "ZW" ], "cryptoCodes": [], "paymentTypeLogoKey": "googlepay" diff --git a/src/constants/plugins/sellPluginList.json b/src/constants/plugins/sellPluginList.json index 33ab51e1772..9d16580bfd2 100644 --- a/src/constants/plugins/sellPluginList.json +++ b/src/constants/plugins/sellPluginList.json @@ -46,38 +46,10 @@ "title": "Bank Transfer via Debit Card", "description": "Fee: 4.0%\nSettlement: 5 min - 24 hours", "forCountries": [ - "US", - "GB", - "AU", - "AT", - "BE", - "BG", - "CH", - "CZ", - "DK", - "EE", - "FI", - "FR", - "DE", - "GR", - "HU", - "IE", - "IT", - "LV", - "LT", - "LU", - "NL", - "PL", - "PT", - "RO", - "SK", - "SI", - "ES", - "SE", - "HR", - "LI", - "NO", - "SM" + "AT", "AU", "BE", "BG", "CH", "CZ", "DE", "DK", "EE", "ES", + "FI", "FR", "GB", "GR", "HR", "HU", "IE", "IT", "LI", "LT", + "LU", "LV", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", + "SM", "US" ], "notStateProvinces": { "US": ["HI", "NY"] }, "cryptoCodes": [], @@ -211,254 +183,31 @@ "title": "Gift Cards", "partnerIconPath": "bitrefill-2.png", "forCountries": [ - "AD", - "AE", - "AF", - "AG", - "AI", - "AL", - "AM", - "AO", - "AQ", - "AR", - "AS", - "AT", - "AU", - "AW", - "AZ", - "BA", - "BB", - "BD", - "BE", - "BF", - "BG", - "BH", - "BI", - "BJ", - "BL", - "BM", - "BN", - "BO", - "BQ", - "BR", - "BS", - "BT", - "BV", - "BW", - "BY", - "BZ", - "CA", - "CC", - "CD", - "CF", - "CG", - "CH", - "CI", - "CK", - "CL", - "CM", - "CN", - "CO", - "CR", - "CU", - "CV", - "CW", - "CX", - "CY", - "CZ", - "DE", - "DJ", - "DK", - "DM", - "DO", - "DZ", - "EC", - "EE", - "EG", - "EH", - "ER", - "ES", - "ET", - "FI", - "FJ", - "FK", - "FM", - "FO", - "FR", - "GA", - "GB", - "GD", - "GE", - "GF", - "GG", - "GH", - "GI", - "GL", - "GM", - "GN", - "GP", - "GQ", - "GR", - "GS", - "GT", - "GU", - "GW", - "GY", - "HK", - "HM", - "HN", - "HR", - "HT", - "HU", - "ID", - "IE", - "IL", - "IM", - "IN", - "IO", - "IQ", - "IR", - "IS", - "IT", - "JE", - "JM", - "JO", - "JP", - "KE", - "KG", - "KH", - "KI", - "KM", - "KN", - "KP", - "KR", - "KW", - "KY", - "KZ", - "LA", - "LB", - "LC", - "LI", - "LK", - "LR", - "LS", - "LT", - "LU", - "LV", - "LY", - "MA", - "MC", - "MD", - "ME", - "MF", - "MG", - "MH", - "MK", - "ML", - "MM", - "MN", - "MO", - "MP", - "MQ", - "MR", - "MS", - "MT", - "MU", - "MV", - "MW", - "MX", - "MY", - "MZ", - "NA", - "NC", - "NE", - "NF", - "NG", - "NI", - "NL", - "NO", - "NP", - "NR", - "NU", - "NZ", - "OM", - "PA", - "PE", - "PF", - "PG", - "PH", - "PK", - "PL", - "PM", - "PN", - "PR", - "PS", - "PT", - "PW", - "PY", - "QA", - "RE", - "RO", - "RS", - "RU", - "RW", - "SA", - "SB", - "SC", - "SD", - "SE", - "SG", - "SH", - "SI", - "SJ", - "SK", - "SL", - "SM", - "SN", - "SO", - "SR", - "SS", - "ST", - "SV", - "SX", - "SY", - "SZ", - "TC", - "TD", - "TF", - "TG", - "TH", - "TJ", - "TK", - "TL", - "TM", - "TN", - "TO", - "TR", - "TT", - "TV", - "TW", - "TZ", - "UA", - "UG", - "UM", - "US", - "UY", - "UZ", - "VA", - "VC", - "VE", - "VG", - "VI", - "VN", - "VU", - "WF", - "WS", - "YE", - "YT", - "ZA", - "ZM", - "ZW" + "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", + "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", + "BG", "BH", "BI", "BJ", "BL", "BM", "BN", "BO", "BQ", "BR", + "BS", "BT", "BV", "BW", "BY", "BZ", "CA", "CC", "CD", "CF", + "CG", "CH", "CI", "CK", "CL", "CM", "CN", "CO", "CR", "CU", + "CV", "CW", "CX", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", + "DZ", "EC", "EE", "EG", "EH", "ER", "ES", "ET", "FI", "FJ", + "FK", "FM", "FO", "FR", "GA", "GB", "GD", "GE", "GF", "GG", + "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", + "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", + "IE", "IL", "IM", "IN", "IO", "IQ", "IR", "IS", "IT", "JE", + "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KP", + "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", + "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", + "MG", "MH", "MK", "ML", "MM", "MN", "MO", "MP", "MQ", "MR", + "MS", "MT", "MU", "MV", "MW", "MX", "MY", "MZ", "NA", "NC", + "NE", "NF", "NG", "NI", "NL", "NO", "NP", "NR", "NU", "NZ", + "OM", "PA", "PE", "PF", "PG", "PH", "PK", "PL", "PM", "PN", + "PR", "PS", "PT", "PW", "PY", "QA", "RE", "RO", "RS", "RU", + "RW", "SA", "SB", "SC", "SD", "SE", "SG", "SH", "SI", "SJ", + "SK", "SL", "SM", "SN", "SO", "SR", "SS", "ST", "SV", "SX", + "SY", "SZ", "TC", "TD", "TF", "TG", "TH", "TJ", "TK", "TL", + "TM", "TN", "TO", "TR", "TT", "TV", "TW", "TZ", "UA", "UG", + "UM", "US", "UY", "UZ", "VA", "VC", "VE", "VG", "VI", "VN", + "VU", "WF", "WS", "YE", "YT", "ZA", "ZM", "ZW" ], "cryptoCodes": [ "BTC", @@ -473,36 +222,9 @@ "id": "sepa", "pluginId": "sepa", "forCountries": [ - "AT", - "BE", - "BG", - "CH", - "CZ", - "DK", - "EE", - "FI", - "FR", - "DE", - "GR", - "HU", - "IE", - "IT", - "LV", - "LT", - "LU", - "NL", - "PL", - "PT", - "RO", - "SK", - "SI", - "ES", - "SE", - "HR", - "LI", - "NO", - "SM", - "GB" + "AT", "BE", "BG", "CH", "CZ", "DE", "DK", "EE", "ES", "FI", + "FR", "GB", "GR", "HR", "HU", "IE", "IT", "LI", "LT", "LU", + "LV", "NL", "NO", "PL", "PT", "RO", "SE", "SI", "SK", "SM" ], "cryptoCodes": [ "BTC" From cf231db848bcbfbb4364e6f33a90e3e6899a571c Mon Sep 17 00:00:00 2001 From: Paul Puey Date: Wed, 11 Sep 2024 18:07:46 -0700 Subject: [PATCH 31/82] Add Iraq for CC, Apple Pay, Google Pay --- src/constants/plugins/buyPluginList.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/constants/plugins/buyPluginList.json b/src/constants/plugins/buyPluginList.json index 60c262f84dc..4b6f3dcc420 100644 --- a/src/constants/plugins/buyPluginList.json +++ b/src/constants/plugins/buyPluginList.json @@ -17,7 +17,7 @@ "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", - "IN", "IO", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", + "IN", "IO", "IQ", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", @@ -331,7 +331,7 @@ "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", - "IN", "IO", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", + "IN", "IO", "IQ", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", @@ -369,7 +369,7 @@ "FR", "GA", "GB", "GD", "GE", "GF", "GG", "GH", "GI", "GL", "GM", "GN", "GP", "GQ", "GR", "GS", "GT", "GU", "GW", "GY", "HK", "HM", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IM", - "IN", "IO", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", + "IN", "IO", "IQ", "IS", "IT", "JE", "JM", "JO", "JP", "KE", "KG", "KH", "KI", "KM", "KN", "KR", "KW", "KY", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "ME", "MF", "MG", "MH", "MK", "ML", "MM", "MN", From 4000859020a3b02e0640525b0a668446bb623e3b Mon Sep 17 00:00:00 2001 From: Paul Puey Date: Thu, 12 Sep 2024 09:43:39 -0700 Subject: [PATCH 32/82] Change restricted ACH US states --- src/constants/plugins/buyPluginList.json | 2 +- src/constants/plugins/sellPluginList.json | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/constants/plugins/buyPluginList.json b/src/constants/plugins/buyPluginList.json index 4b6f3dcc420..0719951d5db 100644 --- a/src/constants/plugins/buyPluginList.json +++ b/src/constants/plugins/buyPluginList.json @@ -54,7 +54,7 @@ "title": "Instant ACH Bank Transfer", "description": "Fee: ~2%\nSettlement: ~5 minutes\nLimit $1000", "forCountries": ["US"], - "notStateProvinces": { "US": ["FL", "NY", "TX"] }, + "notStateProvinces": { "US": ["AK", "AR", "CT", "NC", "NY", "TX"] }, "cryptoCodes": [], "paymentTypeLogoKey": "bank" }, diff --git a/src/constants/plugins/sellPluginList.json b/src/constants/plugins/sellPluginList.json index 9d16580bfd2..8d12f309ce4 100644 --- a/src/constants/plugins/sellPluginList.json +++ b/src/constants/plugins/sellPluginList.json @@ -12,11 +12,7 @@ "US" ], "notStateProvinces": { - "US": [ - "FL", - "NY", - "TX" - ] + "US": ["AK", "AR", "CT", "NC", "NY", "TX"] }, "cryptoCodes": [], "paymentTypeLogoKey": "bank" From a77e452ba5784f6baa06ea3ad254eff1446229e4 Mon Sep 17 00:00:00 2001 From: Paul Puey Date: Thu, 12 Sep 2024 09:49:35 -0700 Subject: [PATCH 33/82] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 155aeead3d4..5e032781c09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal - added: Include custom tokens within wallet data in log output - added: Warning message about risks of investing to all UK IPs +- added: Sell with Moonpay +- added: Buy/sell with Paypal +- added: Buy with Revolut +- changed: Added Iraq to list of Visa/MC supported countries +- changed: Updated ACH supported US states - fixed: Crash on HomeScene when logging while in airplane mode ## 4.13.0 From 43c6cda5a5c682e69544380b6f76ca4ff4862be7 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 12 Sep 2024 15:11:02 -0700 Subject: [PATCH 34/82] Change Cardano's minimum staking amount to 5 ADA --- .../stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts index d16a59978b3..bfcbbc9e188 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/CardanoKilnAdaptor.ts @@ -10,7 +10,7 @@ import { StakePolicyConfig } from '../types' import { KilnError, makeKilnApi } from '../util/KilnApi' import { StakePolicyAdapter } from './types' -const MIN_STAKE_LOVELACE_AMOUNT = '4000000' +const MIN_STAKE_LOVELACE_AMOUNT = '5000000' export interface CardanoPooledKilnAdapterConfig { type: 'cardano-pooled-kiln' From d4946d15183062ec1e898ff17694fb02eac7f2fe Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 12 Sep 2024 14:41:30 -0700 Subject: [PATCH 35/82] Update GLIF Infinity Pool addresses --- .../stake-plugins/generic/pluginInfo/filecoinGlifpool.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/stake-plugins/generic/pluginInfo/filecoinGlifpool.ts b/src/plugins/stake-plugins/generic/pluginInfo/filecoinGlifpool.ts index 41aeda323e5..42fbdf2ab4e 100644 --- a/src/plugins/stake-plugins/generic/pluginInfo/filecoinGlifpool.ts +++ b/src/plugins/stake-plugins/generic/pluginInfo/filecoinGlifpool.ts @@ -17,8 +17,8 @@ const filecoinPolicyConfig: Array Date: Wed, 11 Sep 2024 14:01:43 -0700 Subject: [PATCH 36/82] Process metadata as its own entry in customData for EdgeWalletSigner --- .../policyAdapters/GlifInfinityPoolAdapter.ts | 24 +++--- .../policyAdapters/TarotPoolAdaptor.ts | 80 ++++++++++++------- .../generic/util/EdgeWalletSigner.ts | 6 +- 3 files changed, 70 insertions(+), 40 deletions(-) diff --git a/src/plugins/stake-plugins/generic/policyAdapters/GlifInfinityPoolAdapter.ts b/src/plugins/stake-plugins/generic/policyAdapters/GlifInfinityPoolAdapter.ts index 41aea49817b..ec6109b7d2d 100644 --- a/src/plugins/stake-plugins/generic/policyAdapters/GlifInfinityPoolAdapter.ts +++ b/src/plugins/stake-plugins/generic/policyAdapters/GlifInfinityPoolAdapter.ts @@ -111,9 +111,11 @@ export const makeGlifInfinityPoolAdapter = (policyConfig: StakePolicyConfig Date: Mon, 16 Sep 2024 11:26:28 -0700 Subject: [PATCH 37/82] Disable Kiln pools --- src/plugins/stake-plugins/generic/pluginInfo.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/stake-plugins/generic/pluginInfo.ts b/src/plugins/stake-plugins/generic/pluginInfo.ts index 2b0a1a766ea..4d257d0cc7b 100644 --- a/src/plugins/stake-plugins/generic/pluginInfo.ts +++ b/src/plugins/stake-plugins/generic/pluginInfo.ts @@ -1,8 +1,8 @@ -import { kilncardanopool } from './pluginInfo/cardanoKilnPool' +// import { kilncardanopool } from './pluginInfo/cardanoKilnPool' import { coreumnative } from './pluginInfo/coreumNativeStaking' -import { kilnpool } from './pluginInfo/ethereumKilnPool' +// import { kilnpool } from './pluginInfo/ethereumKilnPool' import { glifpoolCalibration } from './pluginInfo/filecoinCalibrationGlifpool' import { glifpool } from './pluginInfo/filecoinGlifpool' import { tarotpool } from './pluginInfo/optimismTarotPool' -export const genericPlugins = [glifpool, glifpoolCalibration, tarotpool, coreumnative, kilnpool, kilncardanopool] +export const genericPlugins = [glifpool, glifpoolCalibration, tarotpool, coreumnative] From df1b7f0ededeed9782afeb5ff15dd7166c2eb916 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 16 Sep 2024 14:35:24 -0700 Subject: [PATCH 38/82] Upgrade edge-currency-accountbased to v4.24.3 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1c68ce50de1..0f8bd8b7aba 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.16.0): - React-Core - - edge-currency-accountbased (4.24.2): + - edge-currency-accountbased (4.24.3): - React-Core - edge-currency-plugins (3.3.2): - React-Core @@ -1080,7 +1080,7 @@ SPEC CHECKSUMS: disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: 50d53d7ccfd2e09caf6cf6232f638538954f42c8 - edge-currency-accountbased: ee7fce87e5688c0ad9dd420ac6727318574a805d + edge-currency-accountbased: 167e58fefcbaa659a48f59312e0f73a594eba4a7 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: e9053aeebcfdb1d093ea2bf32d0e53f274826233 diff --git a/package.json b/package.json index c5e779420b2..09c22c595b6 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.16.0", - "edge-currency-accountbased": "^4.24.2", + "edge-currency-accountbased": "^4.24.3", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", diff --git a/yarn.lock b/yarn.lock index 2c99d3d741c..99fa330a186 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9126,10 +9126,10 @@ edge-core-js@^2.16.0: yaob "^0.3.12" yavent "^0.1.3" -edge-currency-accountbased@^4.24.2: - version "4.24.2" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.2.tgz#41eaf15d6c76ad2dde30ffa72702898136f174de" - integrity sha512-cPfM7bZb3ikIjpIBnzfM8qgBfrKL4V3iA2/ACs9uvF2JXvQP1hPEnne/VvauMmA+AeT7pJFKvX0FZJLkThjGFA== +edge-currency-accountbased@^4.24.3: + version "4.24.3" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.3.tgz#f4dac2d7b404c92db603a597982da5fab11308e2" + integrity sha512-IvnidxzMeFFrtZ56qJP894xuKtyon8GkwEwVWCg/5wAe5WWLKkssDmnfKru2nvyaoLXXVZX3k46ItwxCjOr8iw== dependencies: "@binance-chain/javascript-sdk" "^4.2.0" "@chain-registry/client" "^1.15.0" From e0d61a8eff453c45f136e8f37a13134210752860 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Mon, 16 Sep 2024 15:30:03 -0700 Subject: [PATCH 39/82] Upgrade to react-native-zcash v0.8.1 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0f8bd8b7aba..9ae36923a2f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -430,7 +430,7 @@ PODS: - react-native-webview (13.8.4): - RCT-Folly (= 2021.07.22.00) - React-Core - - react-native-zcash (0.8.0): + - react-native-zcash (0.8.1): - gRPC-Swift (~> 1.8) - MnemonicSwift (~> 2.2) - React-Core @@ -1140,7 +1140,7 @@ SPEC CHECKSUMS: react-native-safari-view: 955d7160d159241b8e9395d12d10ea0ef863dcdd react-native-safe-area-context: dcab599c527c2d7de2d76507a523d20a0b83823d react-native-webview: fa228e55c53372c2b361d2fa5e415844fa83eabf - react-native-zcash: e9be77ab00cc04fe3c19125e12817c00d9356bc8 + react-native-zcash: 2959ff77ba393d08bcd65aa582fef8445c99453c React-perflogger: 0cc42978a483a47f3696171dac2e7033936fc82d React-RCTActionSheet: ea922b476d24f6d40b8e02ac3228412bd3637468 React-RCTAnimation: 7be2c148398eaa5beac950b2b5ec7102389ec3ad diff --git a/package.json b/package.json index 09c22c595b6..c2080ecf2ce 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "react-native-svg": "^15.3.0", "react-native-vector-icons": "^10.1.0", "react-native-webview": "^13.8.4", - "react-native-zcash": "^0.8.0", + "react-native-zcash": "^0.8.1", "react-redux": "^8.1.1", "redux": "^4.2.1", "redux-thunk": "^2.3.0", diff --git a/yarn.lock b/yarn.lock index 99fa330a186..e3b171f95bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16374,10 +16374,10 @@ react-native-webview@^13.8.4: escape-string-regexp "2.0.0" invariant "2.2.4" -react-native-zcash@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/react-native-zcash/-/react-native-zcash-0.8.0.tgz#ca3dc76c9e4ae9e7b3e4840526f38acb4b139d7b" - integrity sha512-UtgdWTo8ZNAHvYaKiGGlm9jJZ+jGQxUVZWuoEUUjPxgr87+Tb8FpXTpkvzm5ThRxDrgEKS8Dj98mdJnKO06rAA== +react-native-zcash@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/react-native-zcash/-/react-native-zcash-0.8.1.tgz#04c1ce86134558a8563c3d7258ae703bf060c6ee" + integrity sha512-5eH1jbOH/2he+UZn0BbbYOSRfs+9g9kjZBXXU2ozZ0giS1rZCBc0oUIEVYEnQOPw38BJpbeAjlqYz2EuRl/8hg== dependencies: biggystring "^4.1.3" rfc4648 "^1.3.0" From 085f344766b9181bb71b7efacf0b42b3f78ffc00 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Mon, 16 Sep 2024 15:54:22 -0700 Subject: [PATCH 40/82] Upgrade to react-native-piratechain v0.5.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c2080ecf2ce..036a0dc0188 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,7 @@ "react-native-mymonero-core": "^0.3.1", "react-native-patina": "^0.1.6", "react-native-permissions": "^4.1.5", - "react-native-piratechain": "^0.5.0", + "react-native-piratechain": "^0.5.1", "react-native-reanimated": "^3.14.0", "react-native-safari-view": "^2.1.0", "react-native-safe-area-context": "^4.10.1", diff --git a/yarn.lock b/yarn.lock index e3b171f95bc..6de649eca0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16264,10 +16264,10 @@ react-native-permissions@^4.1.5: resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-4.1.5.tgz#db4d1ddbf076570043f4fd4168f54bb6020aec92" integrity sha512-r6VMRacASmtRHS+GZ+5HQCp9p9kiE+UU9magHOZCXZLTJitdTuVHWZRrb4v4oqZGU+zAp3mZhTQftuMMv+WLUg== -react-native-piratechain@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/react-native-piratechain/-/react-native-piratechain-0.5.0.tgz#74519d6983d6281eda9b0b788081eb2221a08204" - integrity sha512-cCYNGll6Zye+2oIABBLMSg6DEuIEUJomZkODXKnEDvG8SSIByz2w00Crt6Ol3UjIaDlA69Y10Ty4SiKvLTy2EQ== +react-native-piratechain@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/react-native-piratechain/-/react-native-piratechain-0.5.1.tgz#c7acf6f258b67bdaea0bf232c177022df99dcdfb" + integrity sha512-IJAcg44LVzggXhXK/BSVMFPP/71Qv0Dlq1+1R2feaRCT4ljJrJBsDLLxJKjnfu4OWuz2oEWohCy9kmmZMO4wuQ== dependencies: rfc4648 "^1.3.0" From e187ab1a6b07af856cea0ff4b394949250bf97ba Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 16 Sep 2024 16:01:13 -0700 Subject: [PATCH 41/82] Upgrade edge-core-js to v2.18.0 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9ae36923a2f..ef167d7f36a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,7 +15,7 @@ PODS: - disklet (0.5.2): - React - DoubleConversion (1.1.6) - - edge-core-js (2.16.0): + - edge-core-js (2.18.0): - React-Core - edge-currency-accountbased (4.24.3): - React-Core @@ -1079,7 +1079,7 @@ SPEC CHECKSUMS: CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 - edge-core-js: 50d53d7ccfd2e09caf6cf6232f638538954f42c8 + edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 edge-currency-accountbased: 167e58fefcbaa659a48f59312e0f73a594eba4a7 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 diff --git a/package.json b/package.json index 036a0dc0188..37abe596f87 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "deepmerge": "^4.3.1", "detect-bundler": "^1.1.0", "disklet": "^0.5.2", - "edge-core-js": "^2.16.0", + "edge-core-js": "^2.18.0", "edge-currency-accountbased": "^4.24.3", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", diff --git a/yarn.lock b/yarn.lock index 6de649eca0d..f46eda943f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9101,10 +9101,10 @@ ed25519@0.0.4: bindings "^1.2.1" nan "^2.0.9" -edge-core-js@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.16.0.tgz#c4695dd25e1bf755a775ffeaa67c29706a351cb4" - integrity sha512-XAiFLRtHyUq/eUmEHfYbdsapeUmeQgGNAYPlyj6u6sqlqSLqNnvYsNyfipnd9JBJEZu8E4WH9TJAhUPh26zUHw== +edge-core-js@^2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.18.0.tgz#9188b28bb68bf7646a1d8bdda0e06844ea9dc6e8" + integrity sha512-YqH4zNvk31THl01T6JPZ5oTFWMm7DpKueWlUDNOiLjknArxL9GaQfFMo1m+Yvr2JiPdaBKsrwM1MaN2rYyHRog== dependencies: aes-js "^3.1.0" base-x "^4.0.0" From a4a33f665cdd204b42c4371397b25e42b154d596 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Mon, 16 Sep 2024 16:20:39 -0700 Subject: [PATCH 42/82] Upgrade to edge-currency-accountbased v4.24.4 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 36 ++++++++++++++++++------------------ 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index ef167d7f36a..27b4fd634ba 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.18.0): - React-Core - - edge-currency-accountbased (4.24.3): + - edge-currency-accountbased (4.24.4): - React-Core - edge-currency-plugins (3.3.2): - React-Core @@ -1080,7 +1080,7 @@ SPEC CHECKSUMS: disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 - edge-currency-accountbased: 167e58fefcbaa659a48f59312e0f73a594eba4a7 + edge-currency-accountbased: ce0080fd58e36b75677a1ec84319f2801cb96f61 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: e9053aeebcfdb1d093ea2bf32d0e53f274826233 diff --git a/package.json b/package.json index 37abe596f87..9320048e93b 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.18.0", - "edge-currency-accountbased": "^4.24.3", + "edge-currency-accountbased": "^4.24.4", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", diff --git a/yarn.lock b/yarn.lock index f46eda943f2..e3a29e0a072 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1266,10 +1266,10 @@ dependencies: "@babel/runtime" "^7.21.0" -"@chain-registry/types@^0.45.44": - version "0.45.44" - resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-0.45.44.tgz#d732643e2c33f1ec5bcff75ff149be9c5188f5ec" - integrity sha512-s59rl13Uvv8yECDRFTx81YHWwH8Kw/X3mZaafe2qGjGVhsCeJvVqFBhxK1Znnx1m6/auL+S4sVhcTYFqb/3ujQ== +"@chain-registry/types@^0.45.73": + version "0.45.73" + resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-0.45.73.tgz#affdccc8c79070afd2d7e5ccebffc08bda11ae06" + integrity sha512-DXp7vUuAGdL0HgzmQ6GaSgGoI7Ey0ODoBCi+IawDf6uAsB9KkJiEfV4Yb5dW4pj4frJoI+yZExMMGmilFgMWIQ== "@chain-registry/utils@^1.14.0": version "1.14.0" @@ -2202,9 +2202,9 @@ randombytes "^2.1.0" text-encoding "0.7.0" -"@fioprotocol/fiosdk@https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": +"@fioprotocol/fiosdk@git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": version "1.9.0" - resolved "https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" + resolved "git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" dependencies: "@fioprotocol/fiojs" "1.0.1" "@types/text-encoding" "0.0.35" @@ -7455,12 +7455,12 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chain-registry@^1.63.50: - version "1.63.54" - resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-1.63.54.tgz#e34b5f70b7c5bacd6a60b38b55d1c7ee8b2b0f9a" - integrity sha512-qiJnoZqkOQayW5JMTd+vWSohj+CxIxuXd8kCk+u8tDsItNPVA1gltgOvDi00FZL/+j2+xrnxiVR6hVn5H6/8kg== +chain-registry@^1.63.92: + version "1.63.92" + resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-1.63.92.tgz#8b049aef4913fcd3e848f608f97025215688aad2" + integrity sha512-IXa/cOGoTYEUDuCByuDNVKsHMYD+krR5scD2XNyLxBHvqCexMkdxZ3XyeZGe/Vr3JKiM6cHyinDNvRQr4j2kpQ== dependencies: - "@chain-registry/types" "^0.45.44" + "@chain-registry/types" "^0.45.73" chainsaw@~0.1.0: version "0.1.0" @@ -9126,10 +9126,10 @@ edge-core-js@^2.18.0: yaob "^0.3.12" yavent "^0.1.3" -edge-currency-accountbased@^4.24.3: - version "4.24.3" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.3.tgz#f4dac2d7b404c92db603a597982da5fab11308e2" - integrity sha512-IvnidxzMeFFrtZ56qJP894xuKtyon8GkwEwVWCg/5wAe5WWLKkssDmnfKru2nvyaoLXXVZX3k46ItwxCjOr8iw== +edge-currency-accountbased@^4.24.4: + version "4.24.4" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.4.tgz#0836c597bc3971b1f73e82cd8e7164ce9507d600" + integrity sha512-dK41pCcw6lOnAwVpfs7DB7hdj4I3wiq+OhmRaOweD8o8wpjj6wOa8cqWA0jFkmpwTDVqKz9kULlxbOIibQvbbA== dependencies: "@binance-chain/javascript-sdk" "^4.2.0" "@chain-registry/client" "^1.15.0" @@ -9149,7 +9149,7 @@ edge-currency-accountbased@^4.24.3: biggystring "^4.1.3" bip39 "^3.0.2" bs58 "4.0.1" - chain-registry "^1.63.50" + chain-registry "^1.63.92" cleaners "^0.3.14" ed25519-hd-key "^1.3.0" eth-sig-util "^3.0.1" @@ -10459,9 +10459,9 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== -"eztz.js@https://github.com/EdgeApp/eztz.git#edge-fixes": +"eztz.js@git+https://github.com/EdgeApp/eztz.git#edge-fixes": version "0.0.1" - resolved "https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" + resolved "git+https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" dependencies: bignumber.js "^7.2.1" bip39 "^3.0.2" From bb5b67851fd82b281e264ba05f1dfb5e92b5de7e Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 9 Sep 2024 17:18:40 -0700 Subject: [PATCH 43/82] Remove green border from dropdown --- src/plugins/gui/scenes/AddressFormScene.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/plugins/gui/scenes/AddressFormScene.tsx b/src/plugins/gui/scenes/AddressFormScene.tsx index 1554dce666e..824d9ebfdea 100644 --- a/src/plugins/gui/scenes/AddressFormScene.tsx +++ b/src/plugins/gui/scenes/AddressFormScene.tsx @@ -3,7 +3,7 @@ import { asArray, asObject, asOptional, asString } from 'cleaners' import * as React from 'react' import { Platform, ScrollView, View, ViewStyle } from 'react-native' import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' -import Animated, { Easing, interpolateColor, useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated' +import Animated, { Easing, useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated' import { SceneButtons } from '../../../components/buttons/SceneButtons' import { EdgeTouchableOpacity } from '../../../components/common/EdgeTouchableOpacity' @@ -60,7 +60,6 @@ export const AddressFormScene = React.memo((props: Props) => { const { route, navigation } = props const { countryCode, headerTitle, /* headerIconUri, */ onSubmit, onClose } = route.params const disklet = useSelector(state => state.core.disklet) - const dropdownBorderColor = React.useMemo(() => [theme.iconDeactivated, theme.iconTappable], [theme]) const [formData, setFormData] = React.useState({ address: '', @@ -95,9 +94,7 @@ export const AddressFormScene = React.memo((props: Props) => { duration: isAnimateHintsNumChange ? 250 : 0, easing: Easing.inOut(Easing.circle) }), - opacity: isHintsDropped && searchResults.length > 0 ? sAnimationMult.value : withTiming(0, { duration: 500 }), - - borderColor: interpolateColor(sAnimationMult.value, [0, 1], dropdownBorderColor) + opacity: isHintsDropped && searchResults.length > 0 ? sAnimationMult.value : withTiming(0, { duration: 500 }) })) const handleHintLayout = useHandler(event => { @@ -353,8 +350,6 @@ const getStyles = cacheStyles((theme: Theme) => { backgroundColor: theme.modal, borderRadius: theme.rem(0.5), zIndex: 1, - borderColor: theme.iconTappable, - borderWidth: theme.thinLineWidth, overflow: 'hidden', position: 'absolute', left: theme.rem(0.5), From 670e365823769f053b4b79dfb3edc5d04a970243 Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Tue, 10 Sep 2024 16:14:23 -0700 Subject: [PATCH 44/82] Factor out ExpandableList from AddressFormScene --- src/components/common/ExpandableList.tsx | 92 +++++++++++++++++ src/plugins/gui/scenes/AddressFormScene.tsx | 109 +++++--------------- 2 files changed, 117 insertions(+), 84 deletions(-) create mode 100644 src/components/common/ExpandableList.tsx diff --git a/src/components/common/ExpandableList.tsx b/src/components/common/ExpandableList.tsx new file mode 100644 index 00000000000..5ca6bb9d9f0 --- /dev/null +++ b/src/components/common/ExpandableList.tsx @@ -0,0 +1,92 @@ +/** + * IMPORTANT: Changes in this file MUST be synced between edge-react-gui and + * edge-login-ui-rn! + */ + +import * as React from 'react' +import { ScrollView, View } from 'react-native' +import { cacheStyles } from 'react-native-patina' +import Animated, { Easing, useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated' + +import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings' +import { GradientFadeOut } from '../modals/GradientFadeout' +import { Theme, useTheme } from '../services/ThemeContext' + +interface Props { + isExpanded: boolean + items: React.ReactNode[] + itemHeight: number + /** Defaults to 4.75. */ + maxDisplayedItems?: number + /** Defaults to full scene width. If specified, is left-justified with + * built-in 0.5rem margins on the specified width. */ + widthRem?: number +} + +export const ExpandableList = ({ isExpanded, items, itemHeight, maxDisplayedItems = 4.75, widthRem }: Props) => { + const theme = useTheme() + const styles = getStyles(theme) + + const [isAnimateItemsNumChange, setIsAnimateItemsNumChange] = React.useState(false) + + const widthStyle = React.useMemo( + () => + widthRem != null + ? { + width: theme.rem(widthRem) + } + : undefined, + [theme, widthRem] + ) + + const sAnimationMult = useSharedValue(0) + + const dFinalHeight = useDerivedValue(() => { + return itemHeight * Math.min(items.length, maxDisplayedItems) + }) + + const aContainerStyle = useAnimatedStyle(() => ({ + height: withTiming(dFinalHeight.value * sAnimationMult.value, { + duration: isAnimateItemsNumChange ? 250 : 0, + easing: Easing.inOut(Easing.circle) + }), + opacity: isExpanded && items.length > 0 ? sAnimationMult.value : withTiming(0, { duration: 500 }) + })) + + React.useEffect(() => { + sAnimationMult.value = withTiming(isExpanded ? 1 : 0, { + duration: 500, + easing: Easing.inOut(Easing.circle) + }) + }, [sAnimationMult, isExpanded]) + + React.useEffect(() => { + setIsAnimateItemsNumChange(isExpanded) + }, [items, isExpanded]) + + return ( + + + + {items} + + + + + ) +} + +const getStyles = cacheStyles((theme: Theme) => ({ + relativeContainer: { + position: 'relative', + zIndex: 1 + }, + dropdownContainer: { + position: 'absolute', + top: '100%', + backgroundColor: theme.modal, + borderRadius: theme.rem(0.5), + left: theme.rem(0.5), + right: theme.rem(0.5) + } +})) diff --git a/src/plugins/gui/scenes/AddressFormScene.tsx b/src/plugins/gui/scenes/AddressFormScene.tsx index 824d9ebfdea..14045f9c7c3 100644 --- a/src/plugins/gui/scenes/AddressFormScene.tsx +++ b/src/plugins/gui/scenes/AddressFormScene.tsx @@ -1,12 +1,12 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { asArray, asObject, asOptional, asString } from 'cleaners' import * as React from 'react' -import { Platform, ScrollView, View, ViewStyle } from 'react-native' +import { Platform, ScrollView, View } from 'react-native' import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' -import Animated, { Easing, useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated' import { SceneButtons } from '../../../components/buttons/SceneButtons' import { EdgeTouchableOpacity } from '../../../components/common/EdgeTouchableOpacity' +import { ExpandableList } from '../../../components/common/ExpandableList' import { SceneWrapper } from '../../../components/common/SceneWrapper' import { cacheStyles, Theme, useTheme } from '../../../components/services/ThemeContext' import { EdgeText } from '../../../components/themed/EdgeText' @@ -73,29 +73,18 @@ export const AddressFormScene = React.memo((props: Props) => { const [searchResults, setSearchResults] = React.useState([]) const [prevAddressQuery, setPrevAddressQuery] = React.useState(undefined) const [isHintsDropped, setIsHintsDropped] = React.useState(false) - const [isAnimateHintsNumChange, setIsAnimateHintsNumChange] = React.useState(false) const [hintHeight, setHintHeight] = React.useState(0) const rAddressInput = React.createRef() const mounted = React.useRef(true) - const sAnimationMult = useSharedValue(0) - - const dFinalHeight = useDerivedValue(() => { - return hintHeight * Math.min(searchResults.length, MAX_DISPLAYED_HINTS) - }) - - // Further calculations to determine the height. Also add another - // conditional animation based on the number of hints changing as - // the search query changes from user input - const aDropContainerStyle = useAnimatedStyle(() => ({ - height: withTiming(dFinalHeight.value * sAnimationMult.value, { - duration: isAnimateHintsNumChange ? 250 : 0, - easing: Easing.inOut(Easing.circle) - }), - opacity: isHintsDropped && searchResults.length > 0 ? sAnimationMult.value : withTiming(0, { duration: 500 }) - })) + const addressHintPress = (selectedAddressHint: HomeAddress) => () => { + setFormData({ ...selectedAddressHint }) + if (rAddressInput.current != null) { + rAddressInput.current.blur() + } + } const handleHintLayout = useHandler(event => { if (event != null && hintHeight === 0) { @@ -104,16 +93,27 @@ export const AddressFormScene = React.memo((props: Props) => { } }) + const addressHints = React.useMemo(() => { + return searchResults.map(searchResult => { + const displaySearchResult = `${searchResult.address}\n${searchResult.city}, ${searchResult.state}, ${countryCode}` + return ( + + + + {displaySearchResult} + + + + ) + }) + }, [searchResults, countryCode, addressHintPress, handleHintLayout, styles.rowContainer, styles.addressHintText]) + const handleShowAddressHints = useHandler(() => { setIsHintsDropped(true) }) const handleHideAddressHints = useHandler(() => { setIsHintsDropped(false) - - // Avoid stacking multiple animation multipliers the next - // time the dropdown opens - setIsAnimateHintsNumChange(false) }) // Search for address hints @@ -169,14 +169,6 @@ export const AddressFormScene = React.memo((props: Props) => { // Populate the address fields with the values from the selected search // results - const addressHintPress = (selectedAddressHint: HomeAddress) => () => { - setFormData({ ...selectedAddressHint }) // Update address's value with new value - - if (rAddressInput.current != null) { - rAddressInput.current.blur() - } - } - const handleChangeAddress = useHandler((inputValue: string) => { setIsNeedsFuzzySearch(true) setFormData({ ...formData, address: inputValue }) @@ -205,15 +197,6 @@ export const AddressFormScene = React.memo((props: Props) => { await onSubmit(formData) }) - // The main hints dropdown animation depending on focus state of the - // address field - React.useEffect(() => { - sAnimationMult.value = withTiming(isHintsDropped ? 1 : 0, { - duration: 500, - easing: Easing.inOut(Easing.circle) - }) - }, [sAnimationMult, isHintsDropped]) - // Periodically run a fuzzy search on changed address user input React.useEffect(() => { const task = makePeriodicTask(handlePeriodicSearch, FUZZY_SEARCH_INTERVAL) @@ -222,16 +205,6 @@ export const AddressFormScene = React.memo((props: Props) => { return () => task.stop() }, [handlePeriodicSearch]) - // Changes to the number of address hints results should trigger - // another animation if the hints are are open - React.useEffect(() => { - setIsAnimateHintsNumChange(isHintsDropped) - - // Don't want to react on isHintsDropped, only changes to the - // number of results while dropdown is open - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [searchResults]) - // Unmount cleanup React.useEffect(() => { return navigation.addListener('beforeRemove', () => { @@ -269,22 +242,7 @@ export const AddressFormScene = React.memo((props: Props) => { onFocus={handleShowAddressHints} onBlur={handleHideAddressHints} /> - - - {searchResults.map(searchResult => { - const displaySearchResult = `${searchResult.address}\n${searchResult.city}, ${searchResult.state}, ${countryCode}` - return ( - - - - {displaySearchResult} - - - - ) - })} - - + { }) const getStyles = cacheStyles((theme: Theme) => { - const dropContainerCommon: ViewStyle = { - backgroundColor: theme.modal, - borderRadius: theme.rem(0.5), - zIndex: 1, - overflow: 'hidden', - position: 'absolute', - left: theme.rem(0.5), - right: theme.rem(0.5) - } return { addressHintText: { marginHorizontal: theme.rem(0.5), @@ -362,17 +311,9 @@ const getStyles = cacheStyles((theme: Theme) => { }, container: { paddingTop: 0, - marginHorizontal: theme.rem(0.5), + paddingHorizontal: theme.rem(0.5), flexGrow: 1 }, - dropContainer: { - top: theme.rem(3.75), - ...dropContainerCommon - }, - dropContainerAndroid: { - top: theme.rem(4) - 3, - ...dropContainerCommon - }, formSectionTitle: { marginLeft: theme.rem(0.5), marginTop: theme.rem(1), From 726005ef438726b5988fab35c8a608231a663e5e Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Thu, 12 Sep 2024 16:56:53 -0700 Subject: [PATCH 45/82] Fix the mismatch between Android (2 line rows) and iOS (1 line row) for the address hints --- src/plugins/gui/scenes/AddressFormScene.tsx | 26 ++++++++++----------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/plugins/gui/scenes/AddressFormScene.tsx b/src/plugins/gui/scenes/AddressFormScene.tsx index 14045f9c7c3..cab57227fa6 100644 --- a/src/plugins/gui/scenes/AddressFormScene.tsx +++ b/src/plugins/gui/scenes/AddressFormScene.tsx @@ -95,18 +95,19 @@ export const AddressFormScene = React.memo((props: Props) => { const addressHints = React.useMemo(() => { return searchResults.map(searchResult => { - const displaySearchResult = `${searchResult.address}\n${searchResult.city}, ${searchResult.state}, ${countryCode}` + const displaySearchResult1 = searchResult.address + const displaySearchResult2 = `${searchResult.city}, ${searchResult.state}, ${countryCode}` + return ( - - {displaySearchResult} - + {displaySearchResult1} + {displaySearchResult2} ) }) - }, [searchResults, countryCode, addressHintPress, handleHintLayout, styles.rowContainer, styles.addressHintText]) + }, [searchResults, countryCode, addressHintPress, handleHintLayout, styles.rowContainer]) const handleShowAddressHints = useHandler(() => { setIsHintsDropped(true) @@ -305,10 +306,6 @@ export const AddressFormScene = React.memo((props: Props) => { const getStyles = cacheStyles((theme: Theme) => { return { - addressHintText: { - marginHorizontal: theme.rem(0.5), - marginVertical: theme.rem(0.25) - }, container: { paddingTop: 0, paddingHorizontal: theme.rem(0.5), @@ -321,11 +318,12 @@ const getStyles = cacheStyles((theme: Theme) => { fontFamily: theme.fontFaceBold }, rowContainer: { - display: 'flex', - height: theme.rem(2.75), - flexDirection: 'row', - justifyContent: 'flex-start', - alignItems: 'center' + flexGrow: 1, + flexShrink: 1, + justifyContent: 'center', + alignItems: 'flex-start', + marginHorizontal: theme.rem(0.5), + marginVertical: theme.rem(0.25) } } }) From b713f34fda267ec85d163848837410e5d49c4457 Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Thu, 12 Sep 2024 17:14:49 -0700 Subject: [PATCH 46/82] Redesign ExpandableList - Add shadows - Allow relative positioning without hard-coded coordinates - Dynamically measure item heights - Add a `GradientFadeOut` to indicate scrollability - Minor state fix on AddressFormScene to support new design --- src/components/common/ExpandableList.tsx | 168 ++++++++++++++------ src/components/scenes/DevTestScene.tsx | 29 +++- src/plugins/gui/scenes/AddressFormScene.tsx | 3 +- src/theme/variables/edgeDark.ts | 13 ++ src/theme/variables/edgeLight.ts | 12 ++ src/theme/variables/testDark.ts | 12 ++ src/theme/variables/testLight.ts | 12 ++ src/types/Theme.ts | 1 + 8 files changed, 202 insertions(+), 48 deletions(-) diff --git a/src/components/common/ExpandableList.tsx b/src/components/common/ExpandableList.tsx index 5ca6bb9d9f0..9180a2dd12e 100644 --- a/src/components/common/ExpandableList.tsx +++ b/src/components/common/ExpandableList.tsx @@ -1,43 +1,38 @@ -/** - * IMPORTANT: Changes in this file MUST be synced between edge-react-gui and - * edge-login-ui-rn! - */ - import * as React from 'react' -import { ScrollView, View } from 'react-native' +import { Platform, ScrollView, View, ViewStyle } from 'react-native' +import { AirshipBridge } from 'react-native-airship' +import { ShadowedView } from 'react-native-fast-shadow' import { cacheStyles } from 'react-native-patina' import Animated, { Easing, useAnimatedStyle, useDerivedValue, useSharedValue, withTiming } from 'react-native-reanimated' import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings' +import { useAsyncEffect } from '../../hooks/useAsyncEffect' import { GradientFadeOut } from '../modals/GradientFadeout' +import { Airship } from '../services/AirshipInstance' import { Theme, useTheme } from '../services/ThemeContext' interface Props { isExpanded: boolean items: React.ReactNode[] - itemHeight: number - /** Defaults to 4.75. */ + /** Defaults to 4.75 */ maxDisplayedItems?: number - /** Defaults to full scene width. If specified, is left-justified with - * built-in 0.5rem margins on the specified width. */ + /** If not provided, defaults to full screen width. Whether set or not, 0.5rem + * margins are applied. */ widthRem?: number } -export const ExpandableList = ({ isExpanded, items, itemHeight, maxDisplayedItems = 4.75, widthRem }: Props) => { +export const ExpandableList = (props: Props) => { + const { isExpanded, items, maxDisplayedItems = 4.75, widthRem } = props + const theme = useTheme() const styles = getStyles(theme) - const [isAnimateItemsNumChange, setIsAnimateItemsNumChange] = React.useState(false) + const [localBridge, setLocalBridge] = React.useState>() + const [itemHeight, setItemHeight] = React.useState(0) + const [dropdownLayoutStyle, setDropdownLayoutStyle] = React.useState() - const widthStyle = React.useMemo( - () => - widthRem != null - ? { - width: theme.rem(widthRem) - } - : undefined, - [theme, widthRem] - ) + /** To measure the positioning and width of the anchor view */ + const anchorViewRef = React.useRef(null) const sAnimationMult = useSharedValue(0) @@ -45,48 +40,129 @@ export const ExpandableList = ({ isExpanded, items, itemHeight, maxDisplayedItem return itemHeight * Math.min(items.length, maxDisplayedItems) }) - const aContainerStyle = useAnimatedStyle(() => ({ - height: withTiming(dFinalHeight.value * sAnimationMult.value, { - duration: isAnimateItemsNumChange ? 250 : 0, + const aContainerHeightStyle = useAnimatedStyle(() => ({ + height: withTiming(isExpanded ? dFinalHeight.value : 0, { + duration: 250, easing: Easing.inOut(Easing.circle) }), opacity: isExpanded && items.length > 0 ? sAnimationMult.value : withTiming(0, { duration: 500 }) })) - React.useEffect(() => { - sAnimationMult.value = withTiming(isExpanded ? 1 : 0, { - duration: 500, - easing: Easing.inOut(Easing.circle) - }) - }, [sAnimationMult, isExpanded]) + const aFadeoutStyle = useAnimatedStyle(() => { + const isShowFade = items.length > maxDisplayedItems && isExpanded + return { + opacity: isShowFade ? withTiming(1, { duration: 500 }) : withTiming(0, { duration: 250 }), + height: isShowFade ? withTiming(48, { duration: 500 }) : withTiming(0, { duration: 250 }) + } + }) + + useAsyncEffect( + async () => { + if (dropdownLayoutStyle == null || itemHeight === 0) return + + sAnimationMult.value = withTiming(isExpanded ? 1 : 0, { + duration: 500, + easing: Easing.inOut(Easing.circle) + }) + + if (isExpanded && items.length > 0) { + if (localBridge != null) { + localBridge.resolve(undefined) + } + + await Airship.show(bridge => { + setLocalBridge(bridge) + + return ( + + + + {items} + + {!isExpanded ? null : ( + + + + )} + + + ) + }) + } else { + localBridge?.resolve(undefined) + } + + // Cleanup + return () => { + localBridge?.resolve(undefined) + } + }, + [sAnimationMult, isExpanded, items, dropdownLayoutStyle, itemHeight], + 'ExpandableList' + ) + // Measure the anchor view position and width React.useEffect(() => { - setIsAnimateItemsNumChange(isExpanded) - }, [items, isExpanded]) + if (anchorViewRef.current != null) { + anchorViewRef.current.measureInWindow((x, y, width, height) => { + // iOS and Android return various garbage values initially. + // We expect positive nonzero values. We can always safely omit 0 values + // because we guarantee some amount of margin under correct UI design + if (x <= 0 || y <= 0 || width <= 0) return + + setDropdownLayoutStyle({ left: x, top: Platform.OS === 'android' ? y + 25 : y, width: widthRem == null ? width : theme.rem(widthRem) }) + }) + } + }, [dropdownLayoutStyle, anchorViewRef, theme, isExpanded, widthRem]) + + const handleRowLayout = (event: { nativeEvent: { layout: { height: number } } }) => { + if (event != null && itemHeight === 0) { + const { height } = event.nativeEvent.layout + setItemHeight(height) + } + } return ( - - - - {items} - - - + + {items.length === 0 ? null : ( + + {items[0]} + + )} ) } const getStyles = cacheStyles((theme: Theme) => ({ - relativeContainer: { - position: 'relative', - zIndex: 1 + anchorContainer: { + marginHorizontal: theme.rem(0.5) }, dropdownContainer: { position: 'absolute', - top: '100%', - backgroundColor: theme.modal, + borderRadius: theme.rem(0.5) + }, + dummyMeasureContainer: { + position: 'absolute', + opacity: 0 + }, + fadeoutContainer: { + position: 'absolute', + right: 0, + left: 0, + bottom: 0, + borderBottomLeftRadius: theme.rem(0.5), + borderBottomRightRadius: theme.rem(0.5), + overflow: 'hidden' + }, + scrollContainer: { + flexGrow: 1 + }, + shadowViewStyle: { borderRadius: theme.rem(0.5), - left: theme.rem(0.5), - right: theme.rem(0.5) + backgroundColor: theme.modal, + ...theme.dropdownListShadow + }, + shadowViewStyleAndroidAdjust: { + shadowOpacity: 0.1 } })) diff --git a/src/components/scenes/DevTestScene.tsx b/src/components/scenes/DevTestScene.tsx index c67c9e427c8..eb044f26ef1 100644 --- a/src/components/scenes/DevTestScene.tsx +++ b/src/components/scenes/DevTestScene.tsx @@ -1,3 +1,4 @@ +import { useNavigation } from '@react-navigation/native' import { addBreadcrumb, captureException } from '@sentry/react-native' import { eq } from 'biggystring' import { InsufficientFundsError } from 'edge-core-js' @@ -11,9 +12,10 @@ import { Fontello } from '../../assets/vector' import { ENV } from '../../env' import { useSelectedWallet } from '../../hooks/useSelectedWallet' import { lstrings } from '../../locales/strings' +import { HomeAddress } from '../../types/FormTypes' import { useState } from '../../types/reactHooks' import { useDispatch } from '../../types/reactRedux' -import { EdgeSceneProps } from '../../types/routerTypes' +import { EdgeSceneProps, NavigationBase } from '../../types/routerTypes' import { parseDeepLink } from '../../util/DeepLinkParser' import { consify } from '../../util/utils' import { ButtonsView } from '../buttons/ButtonsView' @@ -112,6 +114,27 @@ export function DevTestScene(props: Props) { )).catch(error => console.log(error)) } + const navigation2 = useNavigation() + + const handleAddressFormPress = () => { + navigation2.navigate('buyTab', { + screen: 'guiPluginAddressForm', + params: { + // Add any necessary props here + countryCode: 'US', + headerTitle: 'Address Form', + onSubmit: async (homeAddress: HomeAddress) => { + console.log('Address submitted:', homeAddress) + // Handle the submitted address + }, + onClose: () => { + console.log('Address form closed') + // Handle closing the form + } + } + }) + } + const coreWallet = selectedWallet?.wallet let balance = coreWallet?.balanceMap.get(tokenId) ?? '' if (eq(balance, '0')) balance = '' @@ -132,6 +155,10 @@ export function DevTestScene(props: Props) { + <> + + + <> Galore} /> { const mounted = React.useRef(true) const addressHintPress = (selectedAddressHint: HomeAddress) => () => { + handleHideAddressHints() setFormData({ ...selectedAddressHint }) if (rAddressInput.current != null) { rAddressInput.current.blur() @@ -243,7 +244,7 @@ export const AddressFormScene = React.memo((props: Props) => { onFocus={handleShowAddressHints} onBlur={handleHideAddressHints} /> - + Date: Thu, 12 Sep 2024 17:18:35 -0700 Subject: [PATCH 47/82] Minor changes to `SideMenu` dropdown Corner cleanups --- CHANGELOG.md | 4 ++++ src/components/themed/SideMenu.tsx | 12 +++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e032781c09..a14119d1ed1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # edge-react-gui +- added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` +- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` +- fixed: Inconsistent corners in `SideMenu` + ## Unreleased - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal diff --git a/src/components/themed/SideMenu.tsx b/src/components/themed/SideMenu.tsx index 271e5d8e33a..a1460cfcb13 100644 --- a/src/components/themed/SideMenu.tsx +++ b/src/components/themed/SideMenu.tsx @@ -176,7 +176,6 @@ export function SideMenu(props: DrawerContentComponentProps) { // Track the destination height of the dropdown const userListDesiredHeight = styles.rowContainer.height * sortedUsers.length + theme.rem(1) const userListHeight = Math.min(userListDesiredHeight, bottomPanelHeight) - const isUserListHeightOverflowing = userListDesiredHeight >= bottomPanelHeight // Height value above can change if users are added/removed const sMaxHeight = useSharedValue(userListHeight) @@ -196,11 +195,6 @@ export function SideMenu(props: DrawerContentComponentProps) { /// ---- Dynamic CSS ---- - const themeRem2 = theme.rem(2) // We cannot call theme.rem from within worklet - const aBorderBottomRightRadius = useAnimatedStyle(() => ({ - // Use a easeInCirc easing function for the border transition - borderBottomRightRadius: isUserListHeightOverflowing ? themeRem2 - themeRem2 * (1 - Math.sqrt(1 - sAnimationMult.value ** 4)) : themeRem2 - })) const aDropdown = useAnimatedStyle(() => ({ height: sMaxHeight.value * sAnimationMult.value })) @@ -320,7 +314,7 @@ export function SideMenu(props: DrawerContentComponentProps) { const usernameDropdown = ( <> - + {sortedUsers.map(userInfo => ( @@ -472,7 +466,7 @@ const getStyles = cacheStyles((theme: Theme) => ({ // Animation dropContainer: { backgroundColor: theme.modal, - borderBottomLeftRadius: theme.rem(2), + borderBottomLeftRadius: theme.rem(1), zIndex: 2, position: 'absolute', width: '100%' @@ -498,7 +492,7 @@ const getStyles = cacheStyles((theme: Theme) => ({ position: 'absolute', height: '100%', width: '100%', - borderBottomLeftRadius: theme.rem(2), + borderBottomLeftRadius: theme.rem(1), zIndex: 1 } })) From fc57d85e4e66f383af1727d65e69c9917816517d Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 16 Sep 2024 11:58:57 -0700 Subject: [PATCH 48/82] Update flashNotification - Add an icon prop - Update to UI4 standards --- .../navigation/FlashNotification.tsx | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/components/navigation/FlashNotification.tsx b/src/components/navigation/FlashNotification.tsx index acaa66c4813..0f7434c613f 100644 --- a/src/components/navigation/FlashNotification.tsx +++ b/src/components/navigation/FlashNotification.tsx @@ -1,28 +1,29 @@ import * as React from 'react' -import { Text, View } from 'react-native' +import { View } from 'react-native' import { AirshipBridge } from 'react-native-airship' import AntDesignIcon from 'react-native-vector-icons/AntDesign' -import { THEME } from '../../theme/variables/airbitz' import { AirshipDropdown } from '../common/AirshipDropdown' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' +import { Paragraph } from '../themed/EdgeText' interface Props { bridge: AirshipBridge message: string + icon?: React.ReactNode onPress?: () => void } export function FlashNotification(props: Props) { - const { bridge, message, onPress = () => {} } = props + const { bridge, message, icon, onPress = () => {} } = props const theme = useTheme() const styles = getStyles(theme) return ( - - {message} + {icon ?? } + {message} ) @@ -30,19 +31,12 @@ export function FlashNotification(props: Props) { const getStyles = cacheStyles((theme: Theme) => ({ container: { - paddingBottom: theme.rem(1) - }, - text: { - color: THEME.COLORS.WHITE, - flexShrink: 1, - fontFamily: THEME.FONTS.DEFAULT, - fontSize: THEME.rem(1), - padding: theme.rem(0.25), - textAlign: 'center' + margin: theme.rem(0.5), + alignItems: 'center' }, icon: { alignSelf: 'center', color: theme.iconTappable, - paddingTop: theme.rem(0.25) + margin: theme.rem(0.5) } })) From eae385d55d27301941aebae3b85b8f3e9fa34c5e Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 16 Sep 2024 11:59:56 -0700 Subject: [PATCH 49/82] Handle foreground push notifications --- CHANGELOG.md | 8 ++-- ...nkingManager.ts => DeepLinkingManager.tsx} | 46 +++++++++++++++++-- 2 files changed, 45 insertions(+), 9 deletions(-) rename src/components/services/{DeepLinkingManager.ts => DeepLinkingManager.tsx} (69%) diff --git a/CHANGELOG.md b/CHANGELOG.md index a14119d1ed1..49f07393141 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,5 @@ # edge-react-gui -- added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` -- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` -- fixed: Inconsistent corners in `SideMenu` - ## Unreleased - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal @@ -12,8 +8,12 @@ - added: Sell with Moonpay - added: Buy/sell with Paypal - added: Buy with Revolut +- added: Foreground push notifications displayed in app +- added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` - changed: Added Iraq to list of Visa/MC supported countries - changed: Updated ACH supported US states +- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` +- fixed: Inconsistent corners in `SideMenu` - fixed: Crash on HomeScene when logging while in airplane mode ## 4.13.0 diff --git a/src/components/services/DeepLinkingManager.ts b/src/components/services/DeepLinkingManager.tsx similarity index 69% rename from src/components/services/DeepLinkingManager.ts rename to src/components/services/DeepLinkingManager.tsx index 0e63f015849..a0246a67645 100644 --- a/src/components/services/DeepLinkingManager.ts +++ b/src/components/services/DeepLinkingManager.tsx @@ -1,6 +1,7 @@ import messaging, { FirebaseMessagingTypes } from '@react-native-firebase/messaging' import * as React from 'react' import { Linking } from 'react-native' +import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome' import { launchDeepLink } from '../../actions/DeepLinkingActions' import { ENV } from '../../env' @@ -12,7 +13,9 @@ import { useDispatch, useSelector } from '../../types/reactRedux' import { NavigationBase } from '../../types/routerTypes' import { parseDeepLink } from '../../util/DeepLinkParser' import { parsePushMessage } from '../../util/PushMessageParser' -import { showDevError, showError } from './AirshipInstance' +import { FlashNotification } from '../navigation/FlashNotification' +import { Airship, showDevError, showError } from './AirshipInstance' +import { cacheStyles, Theme, useTheme } from './ThemeContext' interface Props { navigation: NavigationBase @@ -21,6 +24,8 @@ interface Props { export function DeepLinkingManager(props: Props) { const { navigation } = props const dispatch = useDispatch() + const theme = useTheme() + const styles = getStyles(theme) const [pendingLink, setPendingLink] = React.useState() @@ -64,7 +69,8 @@ export function DeepLinkingManager(props: Props) { } } - function handlePushMessage(message: FirebaseMessagingTypes.RemoteMessage): void { + /** Handler for push messages received while app is in the background. */ + function handleBackgroundPushMessage(message: FirebaseMessagingTypes.RemoteMessage): void { try { const link = parsePushMessage(message) if (link != null) setPendingLink(link) @@ -74,15 +80,37 @@ export function DeepLinkingManager(props: Props) { } } + /** Handler for push messages received while app is in the foreground. */ + const handleForegroundPushMessage = (message: FirebaseMessagingTypes.RemoteMessage) => { + const body = message.notification?.body ?? '' + + if (body === '') { + console.warn('FirebaseMessagingTypes.RemoteMessage (foreground push message) has no body') + return + } + + // Show a FlashNotification: + Airship.show(bridge => ( + { + bridge.resolve() + }} + icon={} + /> + )).catch(error => showDevError(String(error))) + } + // Subscribe to various incoming events: const linkingCleanup = Linking.addEventListener('url', event => { handleDeepLink(event.url) }) const messageCleanup = messaging().onMessage(message => { - // do nothing for now except return the unsubscribe function + handleForegroundPushMessage(message) }) const launchCleanup = messaging().onNotificationOpenedApp(message => { - handlePushMessage(message) + handleBackgroundPushMessage(message) }) // Load any tapped links: @@ -91,7 +119,7 @@ export function DeepLinkingManager(props: Props) { // Load any links sent by push messages: const message = await messaging().getInitialNotification() - if (message != null) handlePushMessage(message) + if (message != null) handleBackgroundPushMessage(message) return () => { if (linkingCleanup != null) linkingCleanup.remove() @@ -105,3 +133,11 @@ export function DeepLinkingManager(props: Props) { return null } + +const getStyles = cacheStyles((theme: Theme) => ({ + icon: { + alignSelf: 'center', + color: theme.iconTappable, + margin: theme.rem(0.5) + } +})) From 710c70149c65272e383d45fe9fff8e9e7fd8169b Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Fri, 13 Sep 2024 17:55:43 -0700 Subject: [PATCH 50/82] Add new tracking param: `accountAgeMonths` --- CHANGELOG.md | 1 + src/util/tracking.ts | 8 ++++++-- src/util/utils.ts | 12 ++++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49f07393141..c63b3f6e26a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- added: New analytics tracking param: `accountAgeMonths` - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal - added: Include custom tokens within wallet data in log output - added: Warning message about risks of investing to all UK IPs diff --git a/src/util/tracking.ts b/src/util/tracking.ts index 9dec8d1d171..b07d00b3837 100644 --- a/src/util/tracking.ts +++ b/src/util/tracking.ts @@ -11,7 +11,7 @@ import { ThunkAction } from '../types/reduxTypes' import { CryptoAmount } from './CryptoAmount' import { fetchReferral } from './network' import { makeErrorLog } from './translateError' -import { consify } from './utils' +import { consify, monthsBetween } from './utils' export type TrackingEventName = | 'Activate_Wallet_Cancel' @@ -165,7 +165,7 @@ export function logEvent(event: TrackingEventName, values: TrackingValues = {}): // Populate referral params: const state = getState() - const { exchangeRates, account, deviceReferral } = state + const { exchangeRates, account, deviceReferral, core } = state const { accountReferral } = account params.refDeviceInstallerId = deviceReferral.installerId params.refDeviceCurrencyCodes = deviceReferral.currencyCodes @@ -175,6 +175,10 @@ export function logEvent(event: TrackingEventName, values: TrackingValues = {}): params.refAccountInstallerId = accountReferral.installerId params.refAccountCurrencyCodes = accountReferral.currencyCodes + // Get the account age in months: + const { created: accountCreatedDate } = core.account + params.accountAgeMonths = accountCreatedDate == null ? undefined : monthsBetween(accountCreatedDate, new Date()) + // Adjust params: if (createdWalletCurrencyCode != null) params.currency = createdWalletCurrencyCode if (error != null) params.error = makeErrorLog(error) diff --git a/src/util/utils.ts b/src/util/utils.ts index 70beb157da7..3c17cef0479 100644 --- a/src/util/utils.ts +++ b/src/util/utils.ts @@ -258,6 +258,18 @@ export const daysBetween = (DateInMsA: number, dateInMsB: number) => { const daysBetween = msBetween / MILLISECONDS_PER_DAY return daysBetween } +export const monthsBetween = (startDate: Date, endDate: Date): number => { + let months + months = (endDate.getFullYear() - startDate.getFullYear()) * 12 + months += endDate.getMonth() - startDate.getMonth() + + // Adjust for days in the month + if (endDate.getDate() < startDate.getDate()) { + months-- + } + + return months <= 0 ? 0 : months +} export async function runWithTimeout(promise: Promise, ms: number, error: Error = new Error(`Timeout of ${ms}ms exceeded`)): Promise { const timeout: Promise = new Promise((resolve, reject) => { From cb22e3e3daced4cd7f1ab0ffec50288bc01f0daf Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Fri, 13 Sep 2024 17:02:59 -0700 Subject: [PATCH 51/82] Add minReceiveAmount to SwapConfirmationScene/ExchangeQuoteComponent --- .../themed/ExchangeQuoteComponent.tsx | 20 ++++++++++++++++++- src/locales/en_US.ts | 1 + src/locales/strings/enUS.json | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/components/themed/ExchangeQuoteComponent.tsx b/src/components/themed/ExchangeQuoteComponent.tsx index 960d96dffbb..247976332f4 100644 --- a/src/components/themed/ExchangeQuoteComponent.tsx +++ b/src/components/themed/ExchangeQuoteComponent.tsx @@ -15,6 +15,7 @@ import { DECIMAL_PRECISION, removeIsoPrefix } from '../../util/utils' import { EdgeCard } from '../cards/EdgeCard' import { CurrencyRow } from '../rows/CurrencyRow' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' +import { FiatText } from '../text/FiatText' import { EdgeText } from './EdgeText' interface Props { @@ -71,6 +72,11 @@ export const ExchangeQuote = (props: Props) => { const fiatCurrencyCode = removeIsoPrefix(isoFiatCurrencyCode) const totalFiatText = `${formatFiatString({ fiatAmount: add(feeFiatAmount, fromFiatAmount) })} ${fiatCurrencyCode}` + const minCryptoAmountText = useCryptoText({ wallet: toWallet, tokenId: toTokenId, nativeAmount: quote.minReceiveAmount ?? '0', withSymbol: false }) + const minFiatAmountText = ( + + ) + const renderRow = (label: React.ReactNode, value: React.ReactNode, style: any = {}) => { return ( @@ -99,8 +105,20 @@ export const ExchangeQuote = (props: Props) => { )} ) + } else if (quote.minReceiveAmount != null) { + // Show the minimum receive amount + return ( + + {renderRow( + {lstrings.swap_minimum_receive_amount}, + {minCryptoAmountText} + )} + {renderRow(<>, ({minFiatAmountText}))} + + ) + } else { + return null } - return null } return ( diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 7cf0948ca23..68ea8701cb0 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -438,6 +438,7 @@ const strings = { swap_preferred_instructions: 'When multiple exchanges can fill an order, prefer:', swap_preferred_promo_instructions: 'When multiple exchanges can fill an order, the current promotion always prefers:', swap_token_no_enabled_exchanges_2s: 'No enabled exchanges support %1$s (on %2$s) at this time', + swap_minimum_receive_amount: 'Min Receive Amount', settings_button_clear_logs: 'Clear Logs', settings_button_send_logs: 'Send Logs to Edge', settings_button_export_logs: 'Export Logs', diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index ef67327d091..f866a56effd 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -371,6 +371,7 @@ "swap_preferred_instructions": "When multiple exchanges can fill an order, prefer:", "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", From 12ea4a7f2895a44896b81fe28362289709a592c0 Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Fri, 13 Sep 2024 17:18:42 -0700 Subject: [PATCH 52/82] Show variable and `minReceiveAmount` in `SwapProviderRow` --- CHANGELOG.md | 1 + src/components/rows/SwapProviderRow.tsx | 22 +++++++++++++++------- src/locales/en_US.ts | 1 + src/locales/strings/enUS.json | 1 + 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c63b3f6e26a..f810c4aaf4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- added: Minimum receive amount to `SwapConfirmationScene` - added: New analytics tracking param: `accountAgeMonths` - added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal - added: Include custom tokens within wallet data in log output diff --git a/src/components/rows/SwapProviderRow.tsx b/src/components/rows/SwapProviderRow.tsx index 924667a8758..83280bf0b77 100644 --- a/src/components/rows/SwapProviderRow.tsx +++ b/src/components/rows/SwapProviderRow.tsx @@ -1,12 +1,13 @@ import { EdgeSwapQuote } from 'edge-core-js' import React from 'react' import FastImage from 'react-native-fast-image' +import { sprintf } from 'sprintf-js' import { useCryptoText } from '../../hooks/useCryptoText' import { lstrings } from '../../locales/strings' import { getSwapPluginIconUri } from '../../util/CdnUris' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' -import { EdgeText } from '../themed/EdgeText' +import { SmallText, WarningText } from '../themed/EdgeText' import { IconDataRow } from './IconDataRow' export interface Props { @@ -28,13 +29,24 @@ export const SwapProviderRow = (props: Props) => { const costOrReceiveAmount = useCryptoText({ wallet, tokenId, nativeAmount }) + const minCryptoAmountText = useCryptoText({ wallet: toWallet, tokenId: toTokenId, nativeAmount: quote.minReceiveAmount ?? '0', withSymbol: false }) + const minReceiveAmountOrPartial = + quote.minReceiveAmount != null ? ( + sprintf(lstrings.swap_minimum_amount_1s, minCryptoAmountText) + ) : quote.canBePartial ? ( + + {lstrings.quote_partial_settlement} + + ) : undefined + const maybeVariableSymbol = quote.minReceiveAmount || quote.canBePartial ? '~ ' : '' + return ( } leftText={quote.swapInfo.displayName} leftSubtext={quote.swapInfo.isDex ? lstrings.quote_dex_provider : lstrings.quote_centralized_provider} - rightText={costOrReceiveAmount} - rightSubText={quote.canBePartial ? {lstrings.quote_partial_settlement} : ''} + rightText={`${maybeVariableSymbol}${costOrReceiveAmount}`} + rightSubText={minReceiveAmountOrPartial} /> ) } @@ -44,9 +56,5 @@ const getStyles = cacheStyles((theme: Theme) => ({ aspectRatio: 1, width: theme.rem(2), height: theme.rem(2) - }, - partialSettlementText: { - fontSize: theme.rem(0.75), - color: theme.warningText } })) diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 68ea8701cb0..c2f24acece1 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -439,6 +439,7 @@ const strings = { swap_preferred_promo_instructions: 'When multiple exchanges can fill an order, the current promotion always prefers:', swap_token_no_enabled_exchanges_2s: 'No enabled exchanges support %1$s (on %2$s) at this time', swap_minimum_receive_amount: 'Min Receive Amount', + swap_minimum_amount_1s: 'Min %1$s', settings_button_clear_logs: 'Clear Logs', settings_button_send_logs: 'Send Logs to Edge', settings_button_export_logs: 'Export Logs', diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index f866a56effd..6fb76745248 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -372,6 +372,7 @@ "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", From d3b0fc4ebfb0804ae3aa19e2de12051055818c55 Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 16 Sep 2024 19:17:54 -0700 Subject: [PATCH 53/82] Upgrade edge-login-ui-rn@^3.21.0 --- ios/Podfile.lock | 8 ++++---- package.json | 2 +- yarn.lock | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 27b4fd634ba..fc301aca637 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -23,7 +23,7 @@ PODS: - React-Core - edge-exchange-plugins (2.7.5): - React-Core - - edge-login-ui-rn (3.20.0): + - edge-login-ui-rn (3.21.0): - React-Core - EXApplication (5.1.1): - ExpoModulesCore @@ -1078,12 +1078,12 @@ SPEC CHECKSUMS: CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 edge-currency-accountbased: ce0080fd58e36b75677a1ec84319f2801cb96f61 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 - edge-login-ui-rn: e9053aeebcfdb1d093ea2bf32d0e53f274826233 + edge-login-ui-rn: d052c3c9a2265ba96a2436c170610d4601e04667 EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d @@ -1100,7 +1100,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b diff --git a/package.json b/package.json index 9320048e93b..4f34b026a69 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", "edge-info-server": "^2.6.0", - "edge-login-ui-rn": "^3.20.0", + "edge-login-ui-rn": "^3.21.0", "ethers": "^5.7.2", "expo": "^48.0.0", "jsrsasign": "^11.1.0", diff --git a/yarn.lock b/yarn.lock index e3a29e0a072..20a988b37d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2202,9 +2202,9 @@ randombytes "^2.1.0" text-encoding "0.7.0" -"@fioprotocol/fiosdk@git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": +"@fioprotocol/fiosdk@https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": version "1.9.0" - resolved "git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" + resolved "https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" dependencies: "@fioprotocol/fiojs" "1.0.1" "@types/text-encoding" "0.0.35" @@ -9232,10 +9232,10 @@ edge-info-server@^2.6.0: dependencies: cleaners "^0.3.16" -edge-login-ui-rn@^3.20.0: - version "3.20.0" - resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.20.0.tgz#51c3e2fba0cdd172b7ce0c22d8f7497adb2d3562" - integrity sha512-5ijiV/HfdWZwjHZVQq6/zUID28DMfZ/3/7wqCAVoarBjyTLUuV668yr0MMps3GR5qJC/bioAdQhfpUSWLVPVaQ== +edge-login-ui-rn@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.21.0.tgz#bb6c77621ffb8d763f9d88ad1bcfb44ebbc371ce" + integrity sha512-pcF0vH78AtozciY3dNkdPhvaMrMbQeCGN68Fz2bFCk2TmWjD2zYfqk+jeIov5GhlxUcK7AxSeU5nZsScVbqpOw== dependencies: base-x "^4.0.0" cleaners "^0.3.12" @@ -10459,9 +10459,9 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== -"eztz.js@git+https://github.com/EdgeApp/eztz.git#edge-fixes": +"eztz.js@https://github.com/EdgeApp/eztz.git#edge-fixes": version "0.0.1" - resolved "git+https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" + resolved "https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" dependencies: bignumber.js "^7.2.1" bip39 "^3.0.2" From c00a6b1df59c71feb2f05b255fdf59b65219d70b Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 16 Sep 2024 19:37:57 -0700 Subject: [PATCH 54/82] Upgrade edge-info-server@^2.7.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4f34b026a69..ef8c99749c6 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", - "edge-info-server": "^2.6.0", + "edge-info-server": "^2.7.0", "edge-login-ui-rn": "^3.21.0", "ethers": "^5.7.2", "expo": "^48.0.0", diff --git a/yarn.lock b/yarn.lock index 20a988b37d4..e1f5df663e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9225,10 +9225,10 @@ edge-exchange-plugins@^2.7.5: regenerator-runtime "0.13.11" xrpl "^2.10.0" -edge-info-server@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/edge-info-server/-/edge-info-server-2.6.0.tgz#944720cb98e90bf2ce5c8c75517b82677c8e886f" - integrity sha512-tA5MbnkVYihBje4hAr7CCsf5TVmcKMoTjxZDR+ijLSLO5TmWybVQdYVVE4bZabKv+FKq33tTZ0JJYHVDTSwXkA== +edge-info-server@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/edge-info-server/-/edge-info-server-2.7.0.tgz#dd59760a779b922285a3bb6108331f25d87395d0" + integrity sha512-6FecnV0nm1tufSZlai4nd0mRslrquTNMicQf9VTNOR0GJmXD55AZgm28GSjeQx/VIJdnwh+620BNfidQeqGc0w== dependencies: cleaners "^0.3.16" From 85003d4d3541d8149b97c7d3fb5fd594723f239f Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 16 Sep 2024 19:25:07 -0700 Subject: [PATCH 55/82] Change PromoCard components into more generic versions --- src/__tests__/components/PromoCards.test.tsx | 22 +++---- .../cards/{PromoCard.tsx => InfoCard.tsx} | 8 +-- .../{PromoCards.tsx => InfoCardCarousel.tsx} | 57 +++++++------------ src/components/scenes/GuiPluginListScene.tsx | 4 +- src/components/scenes/HomeScene.tsx | 4 +- src/hooks/useIsAccountFunded.ts | 32 +++++++++++ 6 files changed, 71 insertions(+), 56 deletions(-) rename src/components/cards/{PromoCard.tsx => InfoCard.tsx} (95%) rename src/components/cards/{PromoCards.tsx => InfoCardCarousel.tsx} (76%) create mode 100644 src/hooks/useIsAccountFunded.ts diff --git a/src/__tests__/components/PromoCards.test.tsx b/src/__tests__/components/PromoCards.test.tsx index 145ce6176b2..efbe9e5fdd2 100644 --- a/src/__tests__/components/PromoCards.test.tsx +++ b/src/__tests__/components/PromoCards.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, test } from '@jest/globals' import { PromoCard2 } from 'edge-info-server' -import { filterPromoCards } from '../../components/cards/PromoCards' +import { filterInfoCards } from '../../components/cards/InfoCardCarousel' const dummyCard: PromoCard2 = { localeMessages: { en: 'hello' }, @@ -33,12 +33,12 @@ const currentDate = new Date('2024-06-13T20:53:33.013Z') describe('filterPromoCards', () => { test('No cards', () => { const cards: PromoCard2[] = [] - const result = filterPromoCards({ cards, countryCode: 'US', buildNumber, osType, version, osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, osType, version, osVersion, currentDate }) expect(result.length).toBe(0) }) test('Card no filters', () => { const cards: PromoCard2[] = [{ ...dummyCard }] - const result = filterPromoCards({ cards, countryCode: 'US', buildNumber, osType, version, osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, osType, version, osVersion, currentDate }) expect(result.length).toBe(1) expect(result[0].localeMessages.en).toBe('hello') }) @@ -49,7 +49,7 @@ describe('filterPromoCards', () => { { ...dummyCard, osTypes: ['web'], localeMessages: { en: 'Web Message' } }, { ...dummyCard, osTypes: ['ios'], localeMessages: { en: 'Another iOS Message' } } ] - const result = filterPromoCards({ cards, countryCode: 'US', buildNumber, osType: 'ios', version, osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, osType: 'ios', version, osVersion, currentDate }) expect(result.length).toBe(2) expect(result[0].localeMessages.en).toBe('iOS Message') expect(result[1].localeMessages.en).toBe('Another iOS Message') @@ -61,7 +61,7 @@ describe('filterPromoCards', () => { { ...dummyCard, exactBuildNum: '432', osTypes: ['web'], localeMessages: { en: 'Web Message' } }, { ...dummyCard, exactBuildNum: '432', osTypes: ['android'], localeMessages: { en: 'Another Android Message' } } ] - const result = filterPromoCards({ cards, countryCode: 'US', buildNumber: '432', osType: 'android', version: '1.2.3', osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber: '432', osType: 'android', version: '1.2.3', osVersion, currentDate }) expect(result.length).toBe(1) expect(result[0].localeMessages.en).toBe('Another Android Message') }) @@ -72,7 +72,7 @@ describe('filterPromoCards', () => { { ...dummyCard, osTypes: ['web'], localeMessages: { en: 'Web Message' } }, { ...dummyCard, osTypes: ['android'], localeMessages: { en: 'Another Android Message' }, appVersion: '1.2.4' } ] - const result = filterPromoCards({ cards, countryCode: 'US', buildNumber: '432', osType: 'android', version: '1.2.3', osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber: '432', osType: 'android', version: '1.2.3', osVersion, currentDate }) expect(result.length).toBe(1) expect(result[0].localeMessages.en).toBe('Android message') }) @@ -83,7 +83,7 @@ describe('filterPromoCards', () => { { ...dummyCard, minBuildNum: '4', maxBuildNum: '5', localeMessages: { en: '4-5' } }, { ...dummyCard, minBuildNum: '1', maxBuildNum: '4', localeMessages: { en: '1-4' } } ] - const result = filterPromoCards({ cards, countryCode: 'US', buildNumber: '4', osType, version: '1.2.3', osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber: '4', osType, version: '1.2.3', osVersion, currentDate }) expect(result.length).toBe(3) expect(result[0].localeMessages.en).toBe('3-5') expect(result[1].localeMessages.en).toBe('4-5') @@ -97,7 +97,7 @@ describe('filterPromoCards', () => { { ...dummyCard, countryCodes: ['uk'], localeMessages: { en: 'UK message' } }, { ...dummyCard, countryCodes: ['es'], localeMessages: { en: 'ES message' } } ] - const result = filterPromoCards({ cards, buildNumber, osType, version, osVersion, currentDate }) + const result = filterInfoCards({ cards, buildNumber, osType, version, osVersion, currentDate }) expect(result.length).toBe(1) expect(result[0].localeMessages.en).toBe('no country') }) @@ -108,7 +108,7 @@ describe('filterPromoCards', () => { { ...dummyCard, excludeCountryCodes: ['uk'], localeMessages: { en: 'UK message' } }, { ...dummyCard, excludeCountryCodes: ['es'], localeMessages: { en: 'ES message' } } ] - const result = filterPromoCards({ cards, countryCode: 'us', buildNumber: '4', osType, version, osVersion, currentDate }) + const result = filterInfoCards({ cards, countryCode: 'us', buildNumber: '4', osType, version, osVersion, currentDate }) expect(result.length).toBe(2) expect(result[0].localeMessages.en).toBe('UK message') expect(result[1].localeMessages.en).toBe('ES message') @@ -120,7 +120,7 @@ describe('filterPromoCards', () => { { ...dummyCard, promoId: 'bob3', localeMessages: { en: 'Bob3 Message' } }, { ...dummyCard, promoId: 'bob4', localeMessages: { en: 'Bob4 Message' } } ] - const result = filterPromoCards({ + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, @@ -140,7 +140,7 @@ describe('filterPromoCards', () => { { ...dummyCard, promoId: 'bob3', localeMessages: { en: 'Bob3 Message' } }, { ...dummyCard, promoId: 'bob4', localeMessages: { en: 'Bob4 Message' } } ] - const result = filterPromoCards({ + const result = filterInfoCards({ cards, countryCode: 'US', buildNumber, diff --git a/src/components/cards/PromoCard.tsx b/src/components/cards/InfoCard.tsx similarity index 95% rename from src/components/cards/PromoCard.tsx rename to src/components/cards/InfoCard.tsx index 646f3a619ac..18800e669b3 100644 --- a/src/components/cards/PromoCard.tsx +++ b/src/components/cards/InfoCard.tsx @@ -15,7 +15,7 @@ import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' import { EdgeText } from '../themed/EdgeText' import { EdgeCard } from './EdgeCard' -export interface FilteredPromoCard { +export interface FilteredInfoCard { background: PromoCard2['background'] ctaButton: PromoCard2['ctaButton'] dismissable: PromoCard2['dismissable'] @@ -26,11 +26,11 @@ export interface FilteredPromoCard { interface Props { navigation: NavigationBase - promoInfo: FilteredPromoCard + promoInfo: FilteredInfoCard onClose: () => Promise } -export function PromoCard(props: Props) { +export function InfoCard(props: Props) { const theme = useTheme() const styles = getStyles(theme) const dispatch = useDispatch() @@ -49,7 +49,7 @@ export function PromoCard(props: Props) { const { localeUrls } = ctaButton const url = getLocaleOrDefaultString(localeUrls) if (url == null) { - showError('No PromoCard URL found') + showError('No Carousel Card URL found') return } diff --git a/src/components/cards/PromoCards.tsx b/src/components/cards/InfoCardCarousel.tsx similarity index 76% rename from src/components/cards/PromoCards.tsx rename to src/components/cards/InfoCardCarousel.tsx index 45a986008fb..366c3e454b4 100644 --- a/src/components/cards/PromoCards.tsx +++ b/src/components/cards/InfoCardCarousel.tsx @@ -1,5 +1,5 @@ import { asDate } from 'cleaners' -import { PromoCard2 } from 'edge-info-server' +import { AssetStatus2, PromoCard2 } from 'edge-info-server' import * as React from 'react' import { ListRenderItem, Platform } from 'react-native' import { getBuildNumber, getVersion } from 'react-native-device-info' @@ -7,55 +7,38 @@ import shajs from 'sha.js' import { hideMessageTweak } from '../../actions/AccountReferralActions' import { useHandler } from '../../hooks/useHandler' -import { useWatch } from '../../hooks/useWatch' +import { useIsAccountFunded } from '../../hooks/useIsAccountFunded' import { useDispatch, useSelector } from '../../types/reactRedux' import { AccountReferral } from '../../types/ReferralTypes' import { NavigationBase } from '../../types/routerTypes' -import { infoServerData } from '../../util/network' -import { getOsVersion, zeroString } from '../../util/utils' +import { getOsVersion } from '../../util/utils' import { EdgeAnim, fadeInUp110 } from '../common/EdgeAnim' import { EdgeCarousel } from '../common/EdgeCarousel' import { useTheme } from '../services/ThemeContext' -import { FilteredPromoCard, PromoCard } from './PromoCard' +import { FilteredInfoCard, InfoCard } from './InfoCard' interface Props { navigation: NavigationBase screenWidth: number + // TODO: Add info server InfoCard export + cards?: PromoCard2[] | AssetStatus2[] countryCode?: string } -export const PromoCards = (props: Props) => { - const { countryCode, navigation, screenWidth } = props +export const InfoCardCarousel = (props: Props) => { + const { countryCode, navigation, screenWidth, cards = [] } = props const theme = useTheme() const dispatch = useDispatch() - const account = useSelector(state => state.core.account) const accountReferral = useSelector(state => state.account.accountReferral) - const currencyWallets = useWatch(account, 'currencyWallets') - - const [filteredCards, setFilteredCards] = React.useState([]) - const [accountFunded, setAccountFunded] = React.useState() - - const walletsSynced = useSelector(state => { - const { currencyWallets } = state.core.account - const { userPausedWalletsSet } = state.ui.settings - const unPausedWallets = Object.values(currencyWallets).filter(wallet => !userPausedWalletsSet?.has(wallet.id)) - const unSyncedWallets = unPausedWallets.filter(wallet => wallet.syncRatio < 1) - - return unSyncedWallets.length === 0 - }) + const [filteredCards, setFilteredCards] = React.useState([]) // Set account funded status - React.useEffect(() => { - if (!walletsSynced) return - setAccountFunded(Object.values(currencyWallets).some(wallet => [...wallet.balanceMap.values()].some(balanceVal => !zeroString(balanceVal)))) - }, [currencyWallets, walletsSynced]) + const accountFunded = useIsAccountFunded() // Check for PromoCard2 from info server: React.useEffect(() => { - const cards = infoServerData.rollup?.promoCards2 ?? [] - // We want to show cards even if balances aren't ready yet. We'll just // skip over balance-dependent cards until balances are ready const currentDate = new Date() @@ -65,7 +48,7 @@ export const PromoCards = (props: Props) => { const osVersion = getOsVersion() setFilteredCards( - filterPromoCards({ + filterInfoCards({ cards, countryCode, accountFunded, @@ -77,18 +60,18 @@ export const PromoCards = (props: Props) => { currentDate }) ) - }, [accountFunded, accountReferral, countryCode]) + }, [accountFunded, accountReferral, cards, countryCode]) const hiddenAccountMessages = useSelector(state => state.account.accountReferral.hiddenAccountMessages) const activeCards = React.useMemo(() => filteredCards.filter(card => !hiddenAccountMessages[card.messageId]), [filteredCards, hiddenAccountMessages]) // List rendering methods: - const keyExtractor = useHandler((item: FilteredPromoCard) => item.messageId) - const renderItem: ListRenderItem = useHandler(({ item }) => { + const keyExtractor = useHandler((item: FilteredInfoCard) => item.messageId) + const renderItem: ListRenderItem = useHandler(({ item }) => { const handleClose = async (): Promise => { await dispatch(hideMessageTweak(item.messageId, { type: 'account' })) } - return + return }) if (activeCards == null || activeCards.length === 0) return null @@ -100,11 +83,11 @@ export const PromoCards = (props: Props) => { } /** - * Finds the promo cards that are relevant to our application version & + * Finds the info server cards that are relevant to our application version & * other factors. */ -export function filterPromoCards(params: { - cards: PromoCard2[] +export function filterInfoCards(params: { + cards: PromoCard2[] | AssetStatus2[] countryCode?: string buildNumber: string osType: string @@ -113,7 +96,7 @@ export function filterPromoCards(params: { currentDate: Date accountFunded?: boolean accountReferral?: Partial -}): FilteredPromoCard[] { +}): FilteredInfoCard[] { const { cards, countryCode, accountFunded, buildNumber, osType, version, osVersion, currentDate, accountReferral } = params let accountPromoIds: string[] | undefined @@ -125,7 +108,7 @@ export function filterPromoCards(params: { // Find relevant cards: const ccLowerCase = countryCode?.toLowerCase() - const filteredCards: FilteredPromoCard[] = [] + const filteredCards: FilteredInfoCard[] = [] for (const card of cards) { const { appVersion, diff --git a/src/components/scenes/GuiPluginListScene.tsx b/src/components/scenes/GuiPluginListScene.tsx index 070be86aef0..ae6b0f1e951 100644 --- a/src/components/scenes/GuiPluginListScene.tsx +++ b/src/components/scenes/GuiPluginListScene.tsx @@ -38,7 +38,7 @@ import { bestOfPlugins } from '../../util/ReferralHelpers' import { logEvent, OnLogEvent } from '../../util/tracking' import { base58ToUuid, getOsVersion } from '../../util/utils' import { EdgeCard } from '../cards/EdgeCard' -import { filterPromoCards } from '../cards/PromoCards' +import { filterInfoCards } from '../cards/InfoCardCarousel' import { EdgeAnim, fadeInUp20, fadeInUp30, fadeInUp60, fadeInUp90 } from '../common/EdgeAnim' import { InsetStyle, SceneWrapper } from '../common/SceneWrapper' import { SectionHeader } from '../common/SectionHeader' @@ -264,7 +264,7 @@ class GuiPluginList extends React.PureComponent { } if (plugin.nativePlugin != null) { const cards = infoServerData.rollup?.promoCards2 ?? [] - const promoCards = filterPromoCards({ + const promoCards = filterInfoCards({ accountReferral, cards, countryCode, diff --git a/src/components/scenes/HomeScene.tsx b/src/components/scenes/HomeScene.tsx index dbd0b9f01ce..27be723f0e4 100644 --- a/src/components/scenes/HomeScene.tsx +++ b/src/components/scenes/HomeScene.tsx @@ -19,8 +19,8 @@ import { infoServerData } from '../../util/network' import { BalanceCard } from '../cards/BalanceCard' import { ContentPostCarousel } from '../cards/ContentPostCarousel' import { HomeTileCard } from '../cards/HomeTileCard' +import { InfoCardCarousel } from '../cards/InfoCardCarousel' import { MarketsCard } from '../cards/MarketsCard' -import { PromoCards } from '../cards/PromoCards' import { SupportCard } from '../cards/SupportCard' import { EdgeAnim, fadeInUp30, fadeInUp60, fadeInUp80, fadeInUp140 } from '../common/EdgeAnim' import { SceneWrapper } from '../common/SceneWrapper' @@ -141,7 +141,7 @@ export const HomeScene = (props: Props) => { {/* Animation inside PromoCardsUi4 component */} - + state.core.account) + const currencyWallets = useWatch(account, 'currencyWallets') + + const walletsSynced = useSelector(state => { + const { currencyWallets } = state.core.account + const { userPausedWalletsSet } = state.ui.settings + const unPausedWallets = Object.values(currencyWallets).filter(wallet => !userPausedWalletsSet?.has(wallet.id)) + const unSyncedWallets = unPausedWallets.filter(wallet => wallet.syncRatio < 1) + + return unSyncedWallets.length === 0 + }) + + const [accountFunded, setAccountFunded] = React.useState(false) + + // Set account funded status + React.useEffect(() => { + if (!walletsSynced) return + setAccountFunded(Object.values(currencyWallets).some(wallet => [...wallet.balanceMap.values()].some(balanceVal => !zeroString(balanceVal)))) + }, [currencyWallets, walletsSynced]) + + return accountFunded +} From de1585067a9c5243bff2193a40350020d817d614 Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 16 Sep 2024 19:31:23 -0700 Subject: [PATCH 56/82] Use InfoCardCarousel and the new assetStatus2 endpoint in TransactionListScene --- CHANGELOG.md | 5 +- src/components/cards/AssetStatusCard.tsx | 47 ------------------- src/components/cards/InfoCardCarousel.tsx | 8 ++-- src/components/common/EdgeAnim.tsx | 2 +- src/components/scenes/HomeScene.tsx | 10 +++- .../scenes/TransactionListScene.tsx | 47 +++++-------------- src/components/themed/WalletListSwipeable.tsx | 5 +- .../themed/WalletListSwipeableCurrencyRow.tsx | 4 +- 8 files changed, 37 insertions(+), 91 deletions(-) delete mode 100644 src/components/cards/AssetStatusCard.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index f810c4aaf4f..b2b147e62d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,8 +13,9 @@ - added: Foreground push notifications displayed in app - added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` - changed: Added Iraq to list of Visa/MC supported countries -- changed: Updated ACH supported US states -- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` +- changed: Updated ACH supported US stat- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` +- changed: Use new platform-specific `assetStatsCards2` info server data +- changed: Display Asset Status cards in the same style as Promo Cards - fixed: Inconsistent corners in `SideMenu` - fixed: Crash on HomeScene when logging while in airplane mode diff --git a/src/components/cards/AssetStatusCard.tsx b/src/components/cards/AssetStatusCard.tsx deleted file mode 100644 index 7d72e50be0b..00000000000 --- a/src/components/cards/AssetStatusCard.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { AssetStatus } from 'edge-info-server' -import * as React from 'react' -import IonIcon from 'react-native-vector-icons/Ionicons' - -import { getLocaleOrDefaultString } from '../../locales/intl' -import { openBrowserUri } from '../../util/WebUtils' -import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' -import { IconMessageCard } from './IconMessageCard' -export const AssetStatusCard = (props: { assetStatus: AssetStatus }) => { - const { statusType, localeStatusTitle, localeStatusBody, iconUrl, statusUrl } = props.assetStatus - const theme = useTheme() - const styles = getStyles(theme) - - const title = getLocaleOrDefaultString(localeStatusTitle) - const message = getLocaleOrDefaultString(localeStatusBody) - const isValidText = title != null && message != null - - return isValidText ? ( - - ) : ( - // statusType === 'info' - - ) - ) : ( - iconUrl - ) - } - onPress={statusUrl ? () => openBrowserUri(statusUrl) : undefined} - /> - ) : null -} - -const getStyles = cacheStyles((theme: Theme) => ({ - icon: { - width: theme.rem(3), - height: theme.rem(3), - marginRight: theme.rem(0.5) - } -})) diff --git a/src/components/cards/InfoCardCarousel.tsx b/src/components/cards/InfoCardCarousel.tsx index 366c3e454b4..207e830878e 100644 --- a/src/components/cards/InfoCardCarousel.tsx +++ b/src/components/cards/InfoCardCarousel.tsx @@ -12,13 +12,14 @@ import { useDispatch, useSelector } from '../../types/reactRedux' import { AccountReferral } from '../../types/ReferralTypes' import { NavigationBase } from '../../types/routerTypes' import { getOsVersion } from '../../util/utils' -import { EdgeAnim, fadeInUp110 } from '../common/EdgeAnim' +import { Anim, EdgeAnim } from '../common/EdgeAnim' import { EdgeCarousel } from '../common/EdgeCarousel' import { useTheme } from '../services/ThemeContext' import { FilteredInfoCard, InfoCard } from './InfoCard' interface Props { navigation: NavigationBase + enterAnim: Anim screenWidth: number // TODO: Add info server InfoCard export cards?: PromoCard2[] | AssetStatus2[] @@ -26,7 +27,7 @@ interface Props { } export const InfoCardCarousel = (props: Props) => { - const { countryCode, navigation, screenWidth, cards = [] } = props + const { enterAnim, countryCode, navigation, screenWidth, cards } = props const theme = useTheme() const dispatch = useDispatch() @@ -39,6 +40,7 @@ export const InfoCardCarousel = (props: Props) => { // Check for PromoCard2 from info server: React.useEffect(() => { + if (cards == null) return // We want to show cards even if balances aren't ready yet. We'll just // skip over balance-dependent cards until balances are ready const currentDate = new Date() @@ -76,7 +78,7 @@ export const InfoCardCarousel = (props: Props) => { if (activeCards == null || activeCards.length === 0) return null return ( - + ) diff --git a/src/components/common/EdgeAnim.tsx b/src/components/common/EdgeAnim.tsx index 8e174564b99..2a65cfb2f79 100644 --- a/src/components/common/EdgeAnim.tsx +++ b/src/components/common/EdgeAnim.tsx @@ -63,7 +63,7 @@ type AnimTypeStretchIns = 'stretchInY' type AnimTypeStretchOuts = 'stretchOutY' type AnimType = AnimTypeFadeIns | AnimTypeFadeOuts | AnimTypeStretchIns | AnimTypeStretchOuts -interface Anim { +export interface Anim { type: AnimType delay?: number duration?: number diff --git a/src/components/scenes/HomeScene.tsx b/src/components/scenes/HomeScene.tsx index 27be723f0e4..9ee24a1a836 100644 --- a/src/components/scenes/HomeScene.tsx +++ b/src/components/scenes/HomeScene.tsx @@ -22,7 +22,7 @@ import { HomeTileCard } from '../cards/HomeTileCard' import { InfoCardCarousel } from '../cards/InfoCardCarousel' import { MarketsCard } from '../cards/MarketsCard' import { SupportCard } from '../cards/SupportCard' -import { EdgeAnim, fadeInUp30, fadeInUp60, fadeInUp80, fadeInUp140 } from '../common/EdgeAnim' +import { EdgeAnim, fadeInUp30, fadeInUp60, fadeInUp80, fadeInUp110, fadeInUp140 } from '../common/EdgeAnim' import { SceneWrapper } from '../common/SceneWrapper' import { SectionHeader } from '../common/SectionHeader' import { SectionView } from '../layout/SectionView' @@ -141,7 +141,13 @@ export const HomeScene = (props: Props) => { {/* Animation inside PromoCardsUi4 component */} - + (() => { - const pluginTokenId = `${pluginId}${tokenId == null ? '' : `_${tokenId}`}` - const allAssetStatuses = (infoServerData.rollup?.assetStatusCards ?? {})[pluginTokenId] ?? [] - const version = getVersion() - return allAssetStatuses.filter(assetStatus => { - const { appId, appVersions, localeStatusBody, localeStatusTitle, statusStartIsoDate, statusEndIsoDate } = assetStatus - const curDate = new Date().toISOString() - - const title = getLocaleOrDefaultString(localeStatusTitle) - const message = getLocaleOrDefaultString(localeStatusBody) - - if (title == null || message == null) return false - if (appId != null && appId !== config.appId) return false - if (appVersions != null && !appVersions.includes(version)) return false - if (statusEndIsoDate != null && statusEndIsoDate < curDate) return false - if (statusStartIsoDate != null && statusStartIsoDate > curDate) return false - return true - }) - }, [pluginId, tokenId]) - // // Handlers // @@ -217,16 +196,16 @@ function TransactionListComponent(props: Props) { onSearchingChange={setIsSearching} onSearchTextChange={setSearchText} /> - {assetStatuses.length > 0 && !isSearching - ? assetStatuses.map(assetStatus => ( - - - - )) - : null} + ) - }, [assetStatuses, isLightAccount, listItems.length, navigation, isSearching, tokenId, wallet]) + }, [listItems.length, navigation, isSearching, tokenId, wallet, isLightAccount, pluginId, route.params.countryCode, screenWidth]) const emptyComponent = React.useMemo(() => { if (isTransactionListUnsupported) { diff --git a/src/components/themed/WalletListSwipeable.tsx b/src/components/themed/WalletListSwipeable.tsx index 4d985c2326d..d804f6dfbc6 100644 --- a/src/components/themed/WalletListSwipeable.tsx +++ b/src/components/themed/WalletListSwipeable.tsx @@ -4,6 +4,7 @@ import { useMemo } from 'react' import { FlatList, RefreshControl } from 'react-native' import Animated from 'react-native-reanimated' +import { getCountryCodeByIp } from '../../actions/AccountReferralActions' import { selectWalletToken } from '../../actions/WalletActions' import { SCROLL_INDICATOR_INSET_FIX } from '../../constants/constantSettings' import { useHandler } from '../../hooks/useHandler' @@ -66,6 +67,7 @@ function WalletListSwipeableComponent(props: Props) { const handleCreateWallet = useHandler(async (walletId: string, tokenId: EdgeTokenId) => { const wallet = account.currencyWallets[walletId] + const countryCode = await getCountryCodeByIp().catch(() => '') dispatch(selectWalletToken({ navigation, walletId, tokenId })) .then( activationNotRequired => @@ -73,7 +75,8 @@ function WalletListSwipeableComponent(props: Props) { navigation.navigate('transactionList', { walletId, tokenId, - walletName: wallet.name ?? wallet.currencyInfo.displayName + walletName: wallet.name ?? wallet.currencyInfo.displayName, + countryCode }) ) .finally(onReset) diff --git a/src/components/themed/WalletListSwipeableCurrencyRow.tsx b/src/components/themed/WalletListSwipeableCurrencyRow.tsx index 9796b2dd93a..f8356a19af8 100644 --- a/src/components/themed/WalletListSwipeableCurrencyRow.tsx +++ b/src/components/themed/WalletListSwipeableCurrencyRow.tsx @@ -3,6 +3,7 @@ import * as React from 'react' import { Text } from 'react-native' import { SharedValue } from 'react-native-reanimated' +import { getCountryCodeByIp } from '../../actions/AccountReferralActions' import { checkAndShowLightBackupModal } from '../../actions/BackupModalActions' import { selectWalletToken } from '../../actions/WalletActions' import { Fontello } from '../../assets/vector/index' @@ -69,8 +70,9 @@ function WalletListSwipeableCurrencyRowComponent(props: Props) { closeRow() dispatch(selectWalletToken({ navigation, walletId: wallet.id, tokenId, alwaysActivate: true })) .then(async activated => { + const countryCode = await getCountryCodeByIp().catch(() => '') if (activated) { - navigation.navigate('transactionList', { tokenId, walletId: wallet.id, walletName: wallet.name ?? wallet.currencyInfo.displayName }) + navigation.navigate('transactionList', { tokenId, walletId: wallet.id, walletName: wallet.name ?? wallet.currencyInfo.displayName, countryCode }) } }) .catch(err => showError(err)) From 522cf0bd6d084ceb2d6f09554b11910e4f77b616 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:15 -0700 Subject: [PATCH 57/82] New translations enus.json (French) --- src/locales/strings/fr.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/fr.json b/src/locales/strings/fr.json index 5b0b3a3a839..3a3e174c3ed 100644 --- a/src/locales/strings/fr.json +++ b/src/locales/strings/fr.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Alert! ", "alert_dropdown_warning": "Warning! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "When multiple exchanges can fill an order, prefer:", "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From f54008ef2de7c4ef6174f4407e7c72c40840aa5b Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:16 -0700 Subject: [PATCH 58/82] New translations enus.json (Spanish) --- src/locales/strings/es.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/es.json b/src/locales/strings/es.json index c38a3447418..5233ca01c00 100644 --- a/src/locales/strings/es.json +++ b/src/locales/strings/es.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "La verificación de la transacción del protocolo de pago no coincide", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Tarifa baja seleccionada", "warning_custom_fee_selected": "Tarifa personalizada seleccionada", "warning_low_or_custom_fee": "Usar una comisión baja puede aumentar la cantidad de tiempo que tarda en confirmar tu transacción. En raras ocasiones tu transacción puede fallar.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "¡Alerta! ", "alert_dropdown_warning": "¡Advertencia! ", "azteco_success": "Has canjeado una tarjeta de bitcoin Azteco. Los fondos deberían llegar pronto.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "Cuando varias casas de cambio pueden ejecutar una orden, preferir:", "swap_preferred_promo_instructions": "Cuando varias casas de cambio pueden completar un pedido, la promoción actual prefiere:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Eliminar registros", "settings_button_send_logs": "Enviar registros a Edge", "settings_button_export_logs": "Exportar registros", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 1b9c5f5a9f3de51a83d1ff675028b75f4205bb7b Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:18 -0700 Subject: [PATCH 59/82] New translations enus.json (German) --- src/locales/strings/de.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/de.json b/src/locales/strings/de.json index 27540d48d9a..ab650a7b709 100644 --- a/src/locales/strings/de.json +++ b/src/locales/strings/de.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Überprüfung des Zahlungsprotokolls stimmt nicht überein", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Niedrige Gebühr ausgewählt", "warning_custom_fee_selected": "Eigene Gebühr ausgewählt", "warning_low_or_custom_fee": "Die Verwendung einer niedrigen Gebühr kann die Dauer der Bestätigung Ihrer Transaktion erhöhen. In seltenen Fällen kann Ihre Transaktion fehlschlagen.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Achtung!", "alert_dropdown_warning": "Warnung! ", "azteco_success": "Sie haben eine Azteco-Bitcoin-Karte eingelöst. Das Geld sollte in Kürze eintreffen.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "Wenn mehrere Börsen eine Order ausfüllen können, bevorzugen sie:", "swap_preferred_promo_instructions": "Wenn mehrere Börsen eine Bestellung ausfüllen können, bevorzugt die aktuelle Promotion immer:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From d9d458cb94d4e32fc36eabe0beca34dcd3fa7114 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:19 -0700 Subject: [PATCH 60/82] New translations enus.json (Italian) --- src/locales/strings/it.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/locales/strings/it.json b/src/locales/strings/it.json index 8d25c47254b..86eebaab519 100644 --- a/src/locales/strings/it.json +++ b/src/locales/strings/it.json @@ -63,7 +63,8 @@ "error_paymentprotocol_no_payment_option": "Nessuna valuta disponibile per questa invoice Payment Protocol. Valute supportate: %s", "error_paymentprotocol_tx_verification_failed": "Verifica della transazione Payment Protocol non corrispondente", "error_spend_amount_less_then_min_s": "L'importo che vuoi spendere è inferiore al minimo di %s", - "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_amount_too_low_to_stake_s": "L'importo %s è troppo basso per lo stake", + "error_balance_below_minimum_to_stake_2s": "Il tuo saldo di %1$s non soddisfa il minimo %2$s richiesto per lo stake.", "warning_low_fee_selected": "Commissione bassa selezionata", "warning_custom_fee_selected": "Hai selezionato Personalizzata", "warning_low_or_custom_fee": "L'utilizzo di una commissione bassa può aumentare il tempo necessario per la conferma della transazione. In rari casi la transazione può fallire.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "L'indirizzo del contratto inserito differisce dall'indirizzo del contratto del token integrato %1$s. Si prega di procedere con cautela e verificare che il contratto sia legittimo in quanto l'uso di questo token può comportare la perdita di fondi. Se hai domande su questa funzione o sul contratto contatta %2$s.", "warning_token_contract_override_3s": "Il token %1$s inserito esiste come token %2$s integrato con lo stesso indirizzo del contratto. Si prega di procedere con cautela e verificare che il contratto sia legittimo in quanto l'uso di questo token può comportare la perdita di fondi. Se hai domande su questa funzionalità, contatta %3$s.", "warning_token_exists_1s": "Il token inserito esiste già come token integrato %1$s", + "warning_uk_risk": "Non investire a meno che non sia disposto a perdere tutti i soldi che investi. Questo è un investimento ad alto rischio e non dovresti aspettarti di essere protetto se qualcosa va storto. Prenditi 2 minuti per saperne di più.", "alert_dropdown_alert": "Avviso! ", "alert_dropdown_warning": "Attenzione! ", "azteco_success": "Hai riscattato una carta bitcoin Azteco. I fondi dovrebbero arrivare a breve.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "Quando più cambi valuta possono eseguire un ordine, preferisci:", "swap_preferred_promo_instructions": "Quando più cambi valuta possono eseguire un ordine, la promozione corrente preferisce sempre:", "swap_token_no_enabled_exchanges_2s": "Nessun cambio valuta abilitato supporta %1$s (su %2$s) al momento", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Cancella i log", "settings_button_send_logs": "Invia i logs a Edge", "settings_button_export_logs": "Esporta i logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s e %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Ritorno stimato: %s", + "stake_estimated_apr_s": "APR stimato %s", "stake_s_staked": "%s in Stake", "stake_s_earned": "%s Guadagnato", "stake_s_unstaked": "%s tolti dallo stake", @@ -1244,7 +1249,7 @@ "stake_earn_button_label": "Guadagna", "stake_unable_to_query_locked": "Impossibile interrogare il saldo bloccato. Riprova più tardi.", "stake_liquid_staking_warning_title": "Avviso Staking Pool Liquido", - "stake_liquid_staking_warning_header": "This is a liquid-staking pool, meaning the entire wallet's balance is either staked/unstaked in the pool. Wallet funds will remain liquid (transferable), however all current and future funds will be exposed to the risks and rewards of the staking pool while staked.", + "stake_liquid_staking_warning_header": "Questa è una pool di staking liquido, il che significa che l'intero saldo del portafoglio è in stake / unstaked nella pool. I fondi del portafoglio rimarranno liquidi (trasferibili), tuttavia tutti i fondi attuali e futuri saranno esposti ai rischi e ai benefici della pool mentre si trovano in stake.", "stake_resource_display_name": "Risorse TRON", "stake_resource_display_name_v2": "Risorse TRON v2", "stake_resource_bandwidth": "Bandwidth", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Recupero degli asset supportati", "fiat_plugin_sell_cancelled": "Ordine di vendita annullato", "fiat_plugin_finalizing_quote": "Finalizzazione della quota di scambio. Potrebbe richiedere fino a un minuto", + "fiat_plugin_sell_complete_title": "Ordine di vendita completato", + "fiat_plugin_sell_complete_message_s": "Il tuo ordine di vendita di %1$s %2$s per %3$s %4$s è stato completato.", + "fiat_plugin_sell_complete_message_2_hour_s": "Si prega di attendere fino a %1$s ore perché i fondi appaiano nel tuo account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Si prega di attendere fino a %1$s ore perché i fondi appaiano nel tuo account.", + "fiat_plugin_sell_complete_message_3": "Una email di conferma è stata inviata al tuo indirizzo email registrato.", "fiat_plugin_sell_failed_try_again": "Ordine di vendita non riuscito. Riprova.", "fiat_plugin_sell_failed_to_send_try_again": "Impossibile inviare fondi per la transazione di vendita. Riprova.", "fiat_plugin_cannot_continue_camera_permission": "Impossibile continuare. Autorizzazione fotocamera necessaria per la verifica dell'ID", From 1d9118b8e06157ba34e0330f80c90e2f7c32fc81 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:20 -0700 Subject: [PATCH 61/82] New translations enus.json (Japanese) --- src/locales/strings/ja.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/ja.json b/src/locales/strings/ja.json index 19035e00721..b2b63f6d844 100644 --- a/src/locales/strings/ja.json +++ b/src/locales/strings/ja.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "ペイメント・プロトコルのトランザクション検証の不一致", "error_spend_amount_less_then_min_s": "使用金額が最低額の%s未満です", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "低料金が選択されました", "warning_custom_fee_selected": "カスタム料金が選択されました", "warning_low_or_custom_fee": "低い手数料を選択すると、トランザクションの承認にかかる時間が増える可能性がある上、まれにトランザクションが失敗することがあります。", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "警告! ", "alert_dropdown_warning": "注意! ", "azteco_success": "Aztecoビットコインカードを使用しました。資金はまもなく届きます。", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "複数の取引所が注文を発注できる場合は、以下を優先します:", "swap_preferred_promo_instructions": "複数の取引所が注文を成立させることができる場合、現在のプロモーションは常に下記を優先します:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "ログを消去", "settings_button_send_logs": "Edgeにログを送信", "settings_button_export_logs": "ログをエクスポート", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s と %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "推定リターン: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s ステーク済み", "stake_s_earned": "%s 獲得", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "サポートされている資産を取得中", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 346b6bf43f663d991e6fb5b5f28faa5e2be29647 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:22 -0700 Subject: [PATCH 62/82] New translations enus.json (Korean) --- src/locales/strings/ko.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/ko.json b/src/locales/strings/ko.json index f7b1e942cef..a333db0adf2 100644 --- a/src/locales/strings/ko.json +++ b/src/locales/strings/ko.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Alert! ", "alert_dropdown_warning": "Warning! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "When multiple exchanges can fill an order, prefer:", "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 639410276d12b75ee2b368423cc41e3c0261e900 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:23 -0700 Subject: [PATCH 63/82] New translations enus.json (Portuguese) --- src/locales/strings/pt.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/pt.json b/src/locales/strings/pt.json index d11111e876e..545f2b3af19 100644 --- a/src/locales/strings/pt.json +++ b/src/locales/strings/pt.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Incompatibilidade de verificação da transação do protocolo de pagamento", "error_spend_amount_less_then_min_s": "O valor gasto é menor que o mínimo de %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Taxa baixa selecionada", "warning_custom_fee_selected": "Taxa personalizada selecionada", "warning_low_or_custom_fee": "Usar uma taxa baixa pode aumentar o tempo necessário para a confirmação da sua transação. Em casos raros, sua transação pode falhar.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "O endereço do contrato informado difere do endereço do contrato do token %1$sincorporado. Proceda com cuidado e verifique se o contrato é legítimo, já que o uso desse token pode resultar em perda de fundos. Se você tiver dúvidas sobre este recurso ou contrato, entre em contato com %2$s.", "warning_token_contract_override_3s": "O token %1$s informado existe como um token %2$s interno com o mesmo endereço de contrato. Prossiga com cuidado e verifique se o contrato é legítimo, já que o uso desse token pode resultar em perda de fundos. Se você tiver dúvidas sobre este recurso, por favor contate %3$s.", "warning_token_exists_1s": "O token informado já existe como um token interno %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Alerta! ", "alert_dropdown_warning": "Atenção! ", "azteco_success": "Você resgatou um cartão bitcoin Azteco. Os fundos devem chegar em breve.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "Quando várias exchanges puderem preencher a uma ordem, prefira:", "swap_preferred_promo_instructions": "Quando várias exchanges podem preencher a uma ordem, a promoção atual sempre prefere:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Limpar Logs", "settings_button_send_logs": "Enviar Logs para o Edge", "settings_button_export_logs": "Exportar Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s e %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Retorno Estimado: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Ganhos", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Buscando ativos suportados", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 4708eeefcb95b70ed0e6e38857491d1de7974679 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:25 -0700 Subject: [PATCH 64/82] New translations enus.json (Russian) --- src/locales/strings/ru.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/ru.json b/src/locales/strings/ru.json index 71c1e599955..526ac5aa536 100644 --- a/src/locales/strings/ru.json +++ b/src/locales/strings/ru.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Внимание! ", "alert_dropdown_warning": "Внимание! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "При выполнении ордера предпочесть следующие биржи:", "swap_preferred_promo_instructions": "При выполнении обмена несколькими биржами предпочтение отдается текущим предложениям:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 180dde30b15d30859423075f9190faa4c542c1de Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:26 -0700 Subject: [PATCH 65/82] New translations enus.json (Chinese Simplified) --- src/locales/strings/zh.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/zh.json b/src/locales/strings/zh.json index a661ed5a4fd..e8c7452684d 100644 --- a/src/locales/strings/zh.json +++ b/src/locales/strings/zh.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Alert! ", "alert_dropdown_warning": "Warning! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "When multiple exchanges can fill an order, prefer:", "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From e5f13c1efec087c4220756f9ede88999f92edf16 Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:27 -0700 Subject: [PATCH 66/82] New translations enus.json (Vietnamese) --- src/locales/strings/vi.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/vi.json b/src/locales/strings/vi.json index 19de4e880ce..95b288e7330 100644 --- a/src/locales/strings/vi.json +++ b/src/locales/strings/vi.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Alert! ", "alert_dropdown_warning": "Warning! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "When multiple exchanges can fill an order, prefer:", "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 98f6a87c1118850c00193130fbdfc73d3f7cef5f Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:29 -0700 Subject: [PATCH 67/82] New translations enus.json (Spanish, Mexico) --- src/locales/strings/esMX.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/esMX.json b/src/locales/strings/esMX.json index 0ca30ea680c..56e00a17d96 100644 --- a/src/locales/strings/esMX.json +++ b/src/locales/strings/esMX.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "La verificación de la transacción del protocolo de pago no coincide", "error_spend_amount_less_then_min_s": "El importe del gasto es inferior al mínimo de %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Tarifa baja seleccionada", "warning_custom_fee_selected": "Tarifa personalizada seleccionada", "warning_low_or_custom_fee": "Usar una comisión baja puede aumentar la cantidad de tiempo que tarda en confirmar tu transacción. En raras ocasiones tu transacción puede fallar.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "La dirección del contrato ingresada difiere de la dirección del contrato del token integrado %1$s. Por favor. Proceda con precaución y verifique que el contrato sea legítimo, ya que el uso de este token puede provocar la pérdida de fondos. Si tiene preguntas sobre esta función o contrato, comuníquese con %2$s.", "warning_token_contract_override_3s": "El token ingresado %1$s existe como un token integrado %2$s con la misma dirección de contrato. Por favor. Proceda con precaución y verifique que el contrato sea legítimo, ya que el uso de este token puede provocar la pérdida de fondos. Si tiene preguntas sobre esta función, comuníquese con %3$s.", "warning_token_exists_1s": "El token ingresado ya existe como token integrado %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "¡Alerta! ", "alert_dropdown_warning": "¡Advertencia! ", "azteco_success": "Has canjeado una tarjeta de bitcoin Azteco. Los fondos deberían llegar pronto.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "Cuando varias casas de cambio pueden ejecutar una orden, preferir:", "swap_preferred_promo_instructions": "Cuando varias casas de cambio pueden completar un pedido, la promoción actual prefiere:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Eliminar registros", "settings_button_send_logs": "Enviar registros a Edge", "settings_button_export_logs": "Exportar registros", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 410bd3ffea8e48ee4f9a83aa6dcb50a56c0c669a Mon Sep 17 00:00:00 2001 From: Paul V Puey Date: Tue, 17 Sep 2024 12:14:30 -0700 Subject: [PATCH 68/82] New translations enus.json (Karakalpak) --- src/locales/strings/kaa.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/locales/strings/kaa.json b/src/locales/strings/kaa.json index 29261f23a14..cdffae793c4 100644 --- a/src/locales/strings/kaa.json +++ b/src/locales/strings/kaa.json @@ -64,6 +64,7 @@ "error_paymentprotocol_tx_verification_failed": "Payment Protocol transaction verification mismatch", "error_spend_amount_less_then_min_s": "Spend amount is less than minimum of %s", "error_amount_too_low_to_stake_s": "The amount %s is too low to stake successfully", + "error_balance_below_minimum_to_stake_2s": "Your balance of %1$s does not meet the minimum %2$s required to stake.", "warning_low_fee_selected": "Low Fee Selected", "warning_custom_fee_selected": "Custom Fee Selected", "warning_low_or_custom_fee": "Using a low fee may increase the amount of time it takes for your transaction to confirm. In rare instances your transaction can fail.", @@ -80,6 +81,7 @@ "warning_token_code_override_2s": "The entered contract address differs from the contract address of built-in token %1$s. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature or contract please contact %2$s.", "warning_token_contract_override_3s": "The entered token %1$s exists as a built-in token %2$s with the same contract address. Please proceed with caution and verify the contract is legitimate as use of this token can result in loss of funds. If you have questions about this feature please contact %3$s.", "warning_token_exists_1s": "The entered token already exists as a built-in token %1$s", + "warning_uk_risk": "Don't invest unless you're prepared to lose all the money you invest. This is a high-risk investment and you should not expect to be protected if something goes wrong. Take 2 min to learn more.", "alert_dropdown_alert": "Dıqqat! ", "alert_dropdown_warning": "Dıqqat! ", "azteco_success": "You've redeemed an Azteco bitcoin card. Funds should arrive shortly.", @@ -369,6 +371,8 @@ "swap_preferred_instructions": "When multiple exchanges can fill an order, prefer:", "swap_preferred_promo_instructions": "When multiple exchanges can fill an order, the current promotion always prefers:", "swap_token_no_enabled_exchanges_2s": "No enabled exchanges support %1$s (on %2$s) at this time", + "swap_minimum_receive_amount": "Min Receive Amount", + "swap_minimum_amount_1s": "Min %1$s", "settings_button_clear_logs": "Clear Logs", "settings_button_send_logs": "Send Logs to Edge", "settings_button_export_logs": "Export Logs", @@ -1202,6 +1206,7 @@ "util_s_and_s": "%1$s and %2$s", "util_truncate_delimeter": "...", "stake_estimated_return": "Estimated Return: %s", + "stake_estimated_apr_s": "%s Estimated APR", "stake_s_staked": "%s Staked", "stake_s_earned": "%s Earned", "stake_s_unstaked": "%s Unstaked", @@ -1272,6 +1277,11 @@ "fiat_plugin_fetching_assets": "Fetching supported assets", "fiat_plugin_sell_cancelled": "Sell order cancelled", "fiat_plugin_finalizing_quote": "Finalizing your exchange quote. Please wait as this may take up to a minute", + "fiat_plugin_sell_complete_title": "Sell Order Complete", + "fiat_plugin_sell_complete_message_s": "Your sell order of %1$s %2$s for %3$s %4$s has been completed.", + "fiat_plugin_sell_complete_message_2_hour_s": "Please allow up to %1$s hour for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_2_hours_s": "Please allow up to %1$s hours for the funds to appear in your account.", + "fiat_plugin_sell_complete_message_3": "A confirmation email has been sent to your registered email address.", "fiat_plugin_sell_failed_try_again": "Sell order failed. Please try again.", "fiat_plugin_sell_failed_to_send_try_again": "Failed to send funds for sell transaction. Please try again.", "fiat_plugin_cannot_continue_camera_permission": "Cannot continue. Camera permission needed for ID verifications", From 44c65442ae14d5d270949e479f61c4b707ccdb55 Mon Sep 17 00:00:00 2001 From: peachbits Date: Tue, 17 Sep 2024 12:51:07 -0700 Subject: [PATCH 69/82] Upgrade edge-login-ui-rn to v3.22.0 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fc301aca637..0fa199389ee 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -23,7 +23,7 @@ PODS: - React-Core - edge-exchange-plugins (2.7.5): - React-Core - - edge-login-ui-rn (3.21.0): + - edge-login-ui-rn (3.22.0): - React-Core - EXApplication (5.1.1): - ExpoModulesCore @@ -1083,7 +1083,7 @@ SPEC CHECKSUMS: edge-currency-accountbased: ce0080fd58e36b75677a1ec84319f2801cb96f61 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 - edge-login-ui-rn: d052c3c9a2265ba96a2436c170610d4601e04667 + edge-login-ui-rn: 4c40998f3f06cfe33911ea3e71f5fcb7ad87322c EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d diff --git a/package.json b/package.json index ef8c99749c6..0c82fe13a74 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", "edge-info-server": "^2.7.0", - "edge-login-ui-rn": "^3.21.0", + "edge-login-ui-rn": "^3.22.0", "ethers": "^5.7.2", "expo": "^48.0.0", "jsrsasign": "^11.1.0", diff --git a/yarn.lock b/yarn.lock index e1f5df663e6..96a32906077 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9232,10 +9232,10 @@ edge-info-server@^2.7.0: dependencies: cleaners "^0.3.16" -edge-login-ui-rn@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.21.0.tgz#bb6c77621ffb8d763f9d88ad1bcfb44ebbc371ce" - integrity sha512-pcF0vH78AtozciY3dNkdPhvaMrMbQeCGN68Fz2bFCk2TmWjD2zYfqk+jeIov5GhlxUcK7AxSeU5nZsScVbqpOw== +edge-login-ui-rn@^3.22.0: + version "3.22.0" + resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.0.tgz#eb27b9a3f4d6a0a3a5e42954444b80b3a9d80406" + integrity sha512-ufb+y79qHvjSMLsCaNLxuR6LEQo1c2PCM8e7UmSMfVzlDJmlF6esebvEh+YTxeceJg7qmBeBQzszZUfypxd7Nw== dependencies: base-x "^4.0.0" cleaners "^0.3.12" From d998bf17ac5d798854f6c9577bcb1a4662c43964 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Tue, 17 Sep 2024 14:38:14 -0700 Subject: [PATCH 70/82] Upgrade to edge-currency-accountbased v4.24.5 --- ios/Podfile.lock | 8 ++++---- package.json | 2 +- yarn.lock | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0fa199389ee..9611d2a2fdb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.18.0): - React-Core - - edge-currency-accountbased (4.24.4): + - edge-currency-accountbased (4.24.5): - React-Core - edge-currency-plugins (3.3.2): - React-Core @@ -1078,9 +1078,9 @@ SPEC CHECKSUMS: CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd - DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 - edge-currency-accountbased: ce0080fd58e36b75677a1ec84319f2801cb96f61 + edge-currency-accountbased: d84152fe36f84ff9cecff862fa57553eb2af994f edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: 4c40998f3f06cfe33911ea3e71f5fcb7ad87322c @@ -1100,7 +1100,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 + glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b diff --git a/package.json b/package.json index 0c82fe13a74..e54752efe69 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.18.0", - "edge-currency-accountbased": "^4.24.4", + "edge-currency-accountbased": "^4.24.5", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", diff --git a/yarn.lock b/yarn.lock index 96a32906077..5102bbe709d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2202,9 +2202,9 @@ randombytes "^2.1.0" text-encoding "0.7.0" -"@fioprotocol/fiosdk@https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": +"@fioprotocol/fiosdk@git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": version "1.9.0" - resolved "https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" + resolved "git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" dependencies: "@fioprotocol/fiojs" "1.0.1" "@types/text-encoding" "0.0.35" @@ -9126,10 +9126,10 @@ edge-core-js@^2.18.0: yaob "^0.3.12" yavent "^0.1.3" -edge-currency-accountbased@^4.24.4: - version "4.24.4" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.4.tgz#0836c597bc3971b1f73e82cd8e7164ce9507d600" - integrity sha512-dK41pCcw6lOnAwVpfs7DB7hdj4I3wiq+OhmRaOweD8o8wpjj6wOa8cqWA0jFkmpwTDVqKz9kULlxbOIibQvbbA== +edge-currency-accountbased@^4.24.5: + version "4.24.5" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.5.tgz#d65835f5befd23debac3d461dc9553949e571951" + integrity sha512-MX5B6cirw0mWlYCq3ap9bL9Kx1W4V4gXoE1gf8tGm9eERZxshy3H16x+Iy+PE6U3nmiM04xljSSQs2H5rijoeg== dependencies: "@binance-chain/javascript-sdk" "^4.2.0" "@chain-registry/client" "^1.15.0" @@ -10459,9 +10459,9 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== -"eztz.js@https://github.com/EdgeApp/eztz.git#edge-fixes": +"eztz.js@git+https://github.com/EdgeApp/eztz.git#edge-fixes": version "0.0.1" - resolved "https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" + resolved "git+https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" dependencies: bignumber.js "^7.2.1" bip39 "^3.0.2" From b0e2a9462aa282e52fccfbe13a101d2f3eb9dd5c Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Tue, 17 Sep 2024 15:03:29 -0700 Subject: [PATCH 71/82] Upgrade edge-login-ui-rn@^3.22.1 --- ios/Podfile.lock | 8 ++++---- package.json | 2 +- yarn.lock | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9611d2a2fdb..5e36084ab8a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -23,7 +23,7 @@ PODS: - React-Core - edge-exchange-plugins (2.7.5): - React-Core - - edge-login-ui-rn (3.22.0): + - edge-login-ui-rn (3.22.1): - React-Core - EXApplication (5.1.1): - ExpoModulesCore @@ -1078,12 +1078,12 @@ SPEC CHECKSUMS: CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 edge-currency-accountbased: d84152fe36f84ff9cecff862fa57553eb2af994f edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 - edge-login-ui-rn: 4c40998f3f06cfe33911ea3e71f5fcb7ad87322c + edge-login-ui-rn: 009262e08c507e3c0f18081269db11fb601e7831 EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d @@ -1100,7 +1100,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b diff --git a/package.json b/package.json index e54752efe69..fda5d390026 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", "edge-info-server": "^2.7.0", - "edge-login-ui-rn": "^3.22.0", + "edge-login-ui-rn": "^3.22.1", "ethers": "^5.7.2", "expo": "^48.0.0", "jsrsasign": "^11.1.0", diff --git a/yarn.lock b/yarn.lock index 5102bbe709d..f7f6b19dac3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2202,9 +2202,9 @@ randombytes "^2.1.0" text-encoding "0.7.0" -"@fioprotocol/fiosdk@git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": +"@fioprotocol/fiosdk@https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2": version "1.9.0" - resolved "git+https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" + resolved "https://github.com/jon-edge/fiosdk_typescript.git#92a0fb895b2ce57e5955cd30cb4b7fa2bcc66bf2" dependencies: "@fioprotocol/fiojs" "1.0.1" "@types/text-encoding" "0.0.35" @@ -9232,10 +9232,10 @@ edge-info-server@^2.7.0: dependencies: cleaners "^0.3.16" -edge-login-ui-rn@^3.22.0: - version "3.22.0" - resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.0.tgz#eb27b9a3f4d6a0a3a5e42954444b80b3a9d80406" - integrity sha512-ufb+y79qHvjSMLsCaNLxuR6LEQo1c2PCM8e7UmSMfVzlDJmlF6esebvEh+YTxeceJg7qmBeBQzszZUfypxd7Nw== +edge-login-ui-rn@^3.22.1: + version "3.22.1" + resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.1.tgz#3b3decccaa129ad4bb24418a3460c0ea8ce505a9" + integrity sha512-8JWKdha0d+5kkvguSTvnV6EXOuDYMaV/aOq19p1ID+JIX6NsJH9JSFDz8dObG9sNfAFYVdAxo6U5yi9jUTIj4Q== dependencies: base-x "^4.0.0" cleaners "^0.3.12" @@ -10459,9 +10459,9 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== -"eztz.js@git+https://github.com/EdgeApp/eztz.git#edge-fixes": +"eztz.js@https://github.com/EdgeApp/eztz.git#edge-fixes": version "0.0.1" - resolved "git+https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" + resolved "https://github.com/EdgeApp/eztz.git#eefa603586810c3d62f852e7f28cfe57c523b7db" dependencies: bignumber.js "^7.2.1" bip39 "^3.0.2" From 11880714d28728a5d3863bac2c45e602010f4605 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Wed, 18 Sep 2024 09:25:02 -0700 Subject: [PATCH 72/82] v4.14.0 --- CHANGELOG.md | 32 +++++++++++++++++--------------- package.json | 2 +- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2b147e62d7..899f4e49f32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,37 +2,39 @@ ## Unreleased +## 4.14.0 + +- added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` +- added: Buy with Revolut +- added: Buy/sell with Paypal +- added: Foreground push notifications displayed in app - added: Minimum receive amount to `SwapConfirmationScene` - added: New analytics tracking param: `accountAgeMonths` -- added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal -- added: Include custom tokens within wallet data in log output -- added: Warning message about risks of investing to all UK IPs - added: Sell with Moonpay -- added: Buy/sell with Paypal -- added: Buy with Revolut -- added: Foreground push notifications displayed in app -- added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` - changed: Added Iraq to list of Visa/MC supported countries +- changed: Display Asset Status cards in the same style as Promo Cards - changed: Updated ACH supported US stat- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` - changed: Use new platform-specific `assetStatsCards2` info server data -- changed: Display Asset Status cards in the same style as Promo Cards -- fixed: Inconsistent corners in `SideMenu` - fixed: Crash on HomeScene when logging while in airplane mode +- fixed: Inconsistent corners in `SideMenu` -## 4.13.0 +## 4.13.0 (2024-09-18) +- added: Add 'Free Talk Live' and 'Crypto Canal' options to survey modal - added: Cardano staking through Kiln staking pools +- added: Include custom tokens within wallet data in log output - added: Support for `isLiquidStaking` field on staking policies -- changed: Some unecessary `showError` dropdowns demoted to hidden `showDevError` -- changed: Restrict Bity buy/sell to no-KYC asset -- changed: Determine Moonpay asset support using chainCode/contractAddress +- added: Warning message about risks of investing to all UK IPs - changed: Allow private key sweep in light accounts for amounts less than $50 - changed: Allow reverse quotes for Kado - changed: Credit card allowed countries to add Botswana, Cambodia, Panama, and Sri Lanka -- fixed: Default swap pair logic from the trade modal was not prioritizing mainnet assets +- changed: Determine Moonpay asset support using chainCode/contractAddress +- changed: Restrict Bity buy/sell to no-KYC asset +- changed: Some unecessary `showError` dropdowns demoted to hidden `showDevError` - fixed: "FIO Address does not exist" error after transferring a FIO name -- fixed: Fix incorrect string comparison resulting in wrong rate used for 24 change calculation - fixed: Crypto amount display bug after flipping the wallet input on `SwapCreateScne` +- fixed: Default swap pair logic from the trade modal was not prioritizing mainnet assets +- fixed: Fix incorrect string comparison resulting in wrong rate used for 24 change calculation - removed: 'fasterpayments' payment type - removed: Turking bank transfer support diff --git a/package.json b/package.json index fda5d390026..15c1ce4c169 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "edge-react-gui", - "version": "4.13.0", + "version": "4.14.0", "private": true, "description": "Edge Wallet React GUI", "homepage": "https://edge.app", From ddf963372b1b31a142983fc0d29a5ebb2b47e47b Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Tue, 17 Sep 2024 14:49:01 -0700 Subject: [PATCH 73/82] Add Cris Cyborg to SurveyModal --- CHANGELOG.md | 1 + src/components/modals/SurveyModal.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 899f4e49f32..6408d9745c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - added: Foreground push notifications displayed in app - added: Minimum receive amount to `SwapConfirmationScene` - added: New analytics tracking param: `accountAgeMonths` +- added: Add 'Cris Cyborg,' 'Free Talk Live,' and 'Crypto Canal' options to survey modal - added: Sell with Moonpay - changed: Added Iraq to list of Visa/MC supported countries - changed: Display Asset Status cards in the same style as Promo Cards diff --git a/src/components/modals/SurveyModal.tsx b/src/components/modals/SurveyModal.tsx index 4770b6007f9..7f1d0a25804 100644 --- a/src/components/modals/SurveyModal.tsx +++ b/src/components/modals/SurveyModal.tsx @@ -29,6 +29,7 @@ const SURVEY_OPTS = [ // Show names intentionally left untranslated: { label: 'Free Talk Live', selected: false }, { label: 'Crypto Canal', selected: false }, + { label: 'Cris Cyborg', selected: false }, { label: lstrings.survey_opt_other_specify, selected: false } ] From 56483e86ea186755b92a9d3270fc2914c695c79c Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Wed, 18 Sep 2024 13:40:22 -0700 Subject: [PATCH 74/82] Update WalletListModal to always updateMostRecentWalletsSelected --- CHANGELOG.md | 1 + src/components/modals/WalletListModal.tsx | 6 +++++- src/components/scenes/SwapCreateScene.tsx | 2 -- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6408d9745c1..8cce55f441e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ - changed: Use new platform-specific `assetStatsCards2` info server data - fixed: Crash on HomeScene when logging while in airplane mode - fixed: Inconsistent corners in `SideMenu` +- fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin` ## 4.13.0 (2024-09-18) diff --git a/src/components/modals/WalletListModal.tsx b/src/components/modals/WalletListModal.tsx index 2bb02778274..6ece36090ef 100644 --- a/src/components/modals/WalletListModal.tsx +++ b/src/components/modals/WalletListModal.tsx @@ -5,13 +5,14 @@ import { AirshipBridge } from 'react-native-airship' import { FlatList } from 'react-native-gesture-handler' import { sprintf } from 'sprintf-js' +import { updateMostRecentWalletsSelected } from '../../actions/WalletActions' import { SPECIAL_CURRENCY_INFO } from '../../constants/WalletAndCurrencyConstants' import { PaymentMethod, PaymentMethodsMap } from '../../controllers/action-queue/PaymentMethod' import { useAsyncValue } from '../../hooks/useAsyncValue' import { useHandler } from '../../hooks/useHandler' import { lstrings } from '../../locales/strings' import { config } from '../../theme/appConfig' -import { useSelector } from '../../types/reactRedux' +import { useDispatch, useSelector } from '../../types/reactRedux' import { NavigationBase } from '../../types/routerTypes' import { EdgeAsset } from '../../types/types' import { getCurrencyCode, isKeysOnlyPlugin } from '../../util/CurrencyInfoHelpers' @@ -100,6 +101,7 @@ export function WalletListModal(props: Props) { const showCustomAssets = customAssets != null && customAssets.length > 0 + const dispatch = useDispatch() const account = useSelector(state => state.core.account) const theme = useTheme() const styles = getStyles(theme) @@ -144,6 +146,8 @@ export function WalletListModal(props: Props) { } else { const wallet = await account.waitForCurrencyWallet(walletId) const currencyCode = getCurrencyCode(wallet, tokenId) + + dispatch(updateMostRecentWalletsSelected(walletId, tokenId)) bridge.resolve({ type: 'wallet', walletId, currencyCode, tokenId }) } }) diff --git a/src/components/scenes/SwapCreateScene.tsx b/src/components/scenes/SwapCreateScene.tsx index 986e050363e..f47da88f2a1 100644 --- a/src/components/scenes/SwapCreateScene.tsx +++ b/src/components/scenes/SwapCreateScene.tsx @@ -7,7 +7,6 @@ import { sprintf } from 'sprintf-js' import { DisableAsset } from '../../actions/ExchangeInfoActions' import { checkEnabledExchanges } from '../../actions/SettingsActions' -import { updateMostRecentWalletsSelected } from '../../actions/WalletActions' import { getSpecialCurrencyInfo } from '../../constants/WalletAndCurrencyConstants' import { useSwapRequestOptions } from '../../hooks/swap/useSwapRequestOptions' import { useHandler } from '../../hooks/useHandler' @@ -242,7 +241,6 @@ export const SwapCreateScene = (props: Props) => { }) } navigation.setParams(params) - dispatch(updateMostRecentWalletsSelected(walletId, tokenId)) }) const handleMaxPress = useHandler(() => { From dd7291722af844c8eccd51d6719115e11f76621d Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Fri, 20 Sep 2024 10:57:21 -0700 Subject: [PATCH 75/82] Update Apple Pay branding --- CHANGELOG.md | 1 + src/__tests__/__snapshots__/GuiPlugins.test.ts.snap | 2 +- src/constants/plugins/buyPluginList.json | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cce55f441e..5c16af0374e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ - fixed: Crash on HomeScene when logging while in airplane mode - fixed: Inconsistent corners in `SideMenu` - fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin` +- fixed: "Apple Pay" renamed to "Pay with Apple Pay" to align with branding guidelines ## 4.13.0 (2024-09-18) diff --git a/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap b/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap index 6292d537266..3555fe4005c 100644 --- a/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap +++ b/src/__tests__/__snapshots__/GuiPlugins.test.ts.snap @@ -221,7 +221,7 @@ Settlement: 10 - 30 minutes", "credit", ], "pluginId": "creditcard", - "title": "Apple Pay", + "title": "Pay with Apple Pay", }, { "cryptoCodes": [], diff --git a/src/constants/plugins/buyPluginList.json b/src/constants/plugins/buyPluginList.json index 0719951d5db..5239fbee63a 100644 --- a/src/constants/plugins/buyPluginList.json +++ b/src/constants/plugins/buyPluginList.json @@ -319,7 +319,7 @@ "paymentType": "applepay", "description": "Fee: 5-7%\nSettlement: 10 - 30 minutes", "paymentTypes": ["credit"], - "title": "Apple Pay", + "title": "Pay with Apple Pay", "forCountries": [ "AD", "AE", "AF", "AG", "AI", "AL", "AM", "AO", "AQ", "AR", "AS", "AT", "AU", "AW", "AZ", "BA", "BB", "BD", "BE", "BF", From f83f20d77e2c629c754b12e4eaf81316b57200d2 Mon Sep 17 00:00:00 2001 From: peachbits Date: Fri, 20 Sep 2024 13:48:42 -0700 Subject: [PATCH 76/82] Upgrade edge-currency-accountbased to v4.24.6 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 5e36084ab8a..f6443e3817c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.18.0): - React-Core - - edge-currency-accountbased (4.24.5): + - edge-currency-accountbased (4.24.6): - React-Core - edge-currency-plugins (3.3.2): - React-Core @@ -1080,7 +1080,7 @@ SPEC CHECKSUMS: disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 - edge-currency-accountbased: d84152fe36f84ff9cecff862fa57553eb2af994f + edge-currency-accountbased: 86f333e5789a79adb7b47519104d72db21e1eb72 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 edge-login-ui-rn: 009262e08c507e3c0f18081269db11fb601e7831 diff --git a/package.json b/package.json index 15c1ce4c169..690752c2926 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.18.0", - "edge-currency-accountbased": "^4.24.5", + "edge-currency-accountbased": "^4.24.6", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", diff --git a/yarn.lock b/yarn.lock index f7f6b19dac3..b490262240a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9126,10 +9126,10 @@ edge-core-js@^2.18.0: yaob "^0.3.12" yavent "^0.1.3" -edge-currency-accountbased@^4.24.5: - version "4.24.5" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.5.tgz#d65835f5befd23debac3d461dc9553949e571951" - integrity sha512-MX5B6cirw0mWlYCq3ap9bL9Kx1W4V4gXoE1gf8tGm9eERZxshy3H16x+Iy+PE6U3nmiM04xljSSQs2H5rijoeg== +edge-currency-accountbased@^4.24.6: + version "4.24.6" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.24.6.tgz#a2201ce550c2361d93c8f30dca04885e12e05287" + integrity sha512-q0I00j2WMGj5xX3lMWLqZi6FiNatiSNiHL7nAulrygfgnrQbGKKxkR0HPR3kE4wL10aJugAxjak38brUCuAdFQ== dependencies: "@binance-chain/javascript-sdk" "^4.2.0" "@chain-registry/client" "^1.15.0" From e66ac81b48ba13f81a3becb6649cdacc2d399eac Mon Sep 17 00:00:00 2001 From: William Swanson Date: Tue, 24 Sep 2024 10:56:36 -0700 Subject: [PATCH 77/82] Parse messages from Kado more safely --- src/plugins/gui/providers/kadoProvider.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/plugins/gui/providers/kadoProvider.ts b/src/plugins/gui/providers/kadoProvider.ts index 5b8a3552e1d..a2f241611b4 100644 --- a/src/plugins/gui/providers/kadoProvider.ts +++ b/src/plugins/gui/providers/kadoProvider.ts @@ -1,5 +1,5 @@ import { gt, lt } from 'biggystring' -import { asArray, asBoolean, asNumber, asObject, asOptional, asString, asValue } from 'cleaners' +import { asArray, asBoolean, asMaybe, asNumber, asObject, asOptional, asString, asValue } from 'cleaners' import { EdgeAssetAction, EdgeSpendInfo, EdgeTokenId, EdgeTxActionFiat } from 'edge-core-js' import URL from 'url-parse' @@ -383,7 +383,12 @@ const asOrderData = asObject({ // settlementTimeInSeconds: asNumber }) -const asWebviewMessage = asObject({ type: asValue('PLAID_NEW_ACH_LINK'), payload: asObject({ link: asString }) }) +const asWebviewMessage = asObject({ + // We also see "RAMP_ORDER_ID" here, so we should eventually add + // some `asEither` logic to switch between various valid message types: + type: asValue('PLAID_NEW_ACH_LINK' as const), + payload: asObject({ link: asString }) +}) const asOrderInfo = asObject({ success: asBoolean, @@ -647,15 +652,10 @@ export const kadoProvider: FiatProviderFactory = { // webview to prevent some glitchiness. When needed, Kado will send an onMessage // trigger with the url to open. The below code is derived from Kado's sample code const onMessage = (data: string) => { - try { - datelog(`**** Kado onMessage ${data}`) - const message = asWebviewMessage(JSON.parse(data)) - showUi.openExternalWebView({ url: message.payload.link, redirectExternal: true }).catch(e => { - throw e - }) - } catch (error) { - // Handle parsing errors gracefully - showUi.showError(`Error parsing message: ${String(error)}`).catch(e => {}) + datelog(`**** Kado onMessage ${data}`) + const message = asMaybe(asWebviewMessage)(JSON.parse(data)) + if (message?.type === 'PLAID_NEW_ACH_LINK') { + showUi.openExternalWebView({ url: message.payload.link, redirectExternal: true }).catch(async error => await showUi.showError(error)) } } From 7106d6816c223f7055e1812b24d8c60d182d998a Mon Sep 17 00:00:00 2001 From: William Swanson Date: Wed, 25 Sep 2024 11:30:52 -0700 Subject: [PATCH 78/82] Round Kado-provided crypto amounts --- CHANGELOG.md | 10 ++++++---- src/plugins/gui/providers/kadoProvider.ts | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c16af0374e..dbb8333e571 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,21 +5,23 @@ ## 4.14.0 - added: `ExpandableList` component, replacing the address hint dropdown in `AddressFormScene` +- added: Add 'Cris Cyborg,' 'Free Talk Live,' and 'Crypto Canal' options to survey modal - added: Buy with Revolut - added: Buy/sell with Paypal - added: Foreground push notifications displayed in app - added: Minimum receive amount to `SwapConfirmationScene` - added: New analytics tracking param: `accountAgeMonths` -- added: Add 'Cris Cyborg,' 'Free Talk Live,' and 'Crypto Canal' options to survey modal - added: Sell with Moonpay - changed: Added Iraq to list of Visa/MC supported countries - changed: Display Asset Status cards in the same style as Promo Cards -- changed: Updated ACH supported US stat- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` +- changed: Updated ACH supported US states - changed: Use new platform-specific `assetStatsCards2` info server data +- fixed: "Apple Pay" renamed to "Pay with Apple Pay" to align with branding guidelines +- fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin` - fixed: Crash on HomeScene when logging while in airplane mode +- fixed: Inconsistent content of address hint dropdown between iOS and Android in `AddressFormScene` - fixed: Inconsistent corners in `SideMenu` -- fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin` -- fixed: "Apple Pay" renamed to "Pay with Apple Pay" to align with branding guidelines +- fixed: Round Kado-provided amounts during sell ## 4.13.0 (2024-09-18) diff --git a/src/plugins/gui/providers/kadoProvider.ts b/src/plugins/gui/providers/kadoProvider.ts index a2f241611b4..4f56e1d2cb7 100644 --- a/src/plugins/gui/providers/kadoProvider.ts +++ b/src/plugins/gui/providers/kadoProvider.ts @@ -1,4 +1,4 @@ -import { gt, lt } from 'biggystring' +import { gt, lt, round } from 'biggystring' import { asArray, asBoolean, asMaybe, asNumber, asObject, asOptional, asString, asValue } from 'cleaners' import { EdgeAssetAction, EdgeSpendInfo, EdgeTokenId, EdgeTxActionFiat } from 'edge-core-js' import URL from 'url-parse' @@ -759,7 +759,7 @@ export const kadoProvider: FiatProviderFactory = { console.log(` blockchain: ${blockchain}`) console.log(` pluginId: ${pluginId}`) console.log(` tokenId: ${tokenId}`) - const nativeAmount = await coreWallet.denominationToNative(paymentExchangeAmount, displayCurrencyCode) + const nativeAmount = round(await coreWallet.denominationToNative(paymentExchangeAmount, displayCurrencyCode), 0) const assetAction: EdgeAssetAction = { assetActionType: 'sell' From 6b6683e5c05e5ddcfbbeb0f240ef5f5820ae1f78 Mon Sep 17 00:00:00 2001 From: William Swanson Date: Fri, 27 Sep 2024 13:34:54 -0700 Subject: [PATCH 79/82] Upgrade to edge-login-ui-rn v3.22.3 --- ios/Podfile.lock | 8 ++++---- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f6443e3817c..7659218a769 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -23,7 +23,7 @@ PODS: - React-Core - edge-exchange-plugins (2.7.5): - React-Core - - edge-login-ui-rn (3.22.1): + - edge-login-ui-rn (3.22.3): - React-Core - EXApplication (5.1.1): - ExpoModulesCore @@ -1078,12 +1078,12 @@ SPEC CHECKSUMS: CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd - DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 edge-currency-accountbased: 86f333e5789a79adb7b47519104d72db21e1eb72 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 - edge-login-ui-rn: 009262e08c507e3c0f18081269db11fb601e7831 + edge-login-ui-rn: 42c2652b2bd8b9a98b7208368ecc2827eea23955 EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d @@ -1100,7 +1100,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 + glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b diff --git a/package.json b/package.json index 690752c2926..ac539ff671b 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "edge-currency-plugins": "^3.3.2", "edge-exchange-plugins": "^2.7.5", "edge-info-server": "^2.7.0", - "edge-login-ui-rn": "^3.22.1", + "edge-login-ui-rn": "^3.22.3", "ethers": "^5.7.2", "expo": "^48.0.0", "jsrsasign": "^11.1.0", diff --git a/yarn.lock b/yarn.lock index b490262240a..fb78dcb8765 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9232,10 +9232,10 @@ edge-info-server@^2.7.0: dependencies: cleaners "^0.3.16" -edge-login-ui-rn@^3.22.1: - version "3.22.1" - resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.1.tgz#3b3decccaa129ad4bb24418a3460c0ea8ce505a9" - integrity sha512-8JWKdha0d+5kkvguSTvnV6EXOuDYMaV/aOq19p1ID+JIX6NsJH9JSFDz8dObG9sNfAFYVdAxo6U5yi9jUTIj4Q== +edge-login-ui-rn@^3.22.3: + version "3.22.3" + resolved "https://registry.yarnpkg.com/edge-login-ui-rn/-/edge-login-ui-rn-3.22.3.tgz#e8f56e415b84e6e51c876bce2288d0bac49d158c" + integrity sha512-EZb18kdRQsOazHJh0nF1n9YetkDV1Hcf8Qx7/IQimFfn1Dllt2uyZU1+NXJPRwMu11MubaQk3aWMUsHad/Q5yA== dependencies: base-x "^4.0.0" cleaners "^0.3.12" From ef04397fc67ff0e902e5d7a6abfc7aaecc33c24e Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Fri, 27 Sep 2024 10:51:58 -0700 Subject: [PATCH 80/82] Fix long username cutoff not showing ellipses --- CHANGELOG.md | 1 + src/components/themed/SideMenu.tsx | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbb8333e571..1ec728ea279 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ - changed: Display Asset Status cards in the same style as Promo Cards - changed: Updated ACH supported US states - changed: Use new platform-specific `assetStatsCards2` info server data +- fixed: Missing ellipses for long usernames displayed in the `SideMenu` - fixed: "Apple Pay" renamed to "Pay with Apple Pay" to align with branding guidelines - fixed: "Most Recent Wallets" do not show those chosen through `fiatPlugin` - fixed: Crash on HomeScene when logging while in airplane mode diff --git a/src/components/themed/SideMenu.tsx b/src/components/themed/SideMenu.tsx index a1460cfcb13..eb84a1e7a0c 100644 --- a/src/components/themed/SideMenu.tsx +++ b/src/components/themed/SideMenu.tsx @@ -39,6 +39,7 @@ import { Services } from '../services/Services' import { cacheStyles, Theme, useTheme } from '../services/ThemeContext' import { TitleText } from '../text/TitleText' import { DividerLine } from './DividerLine' +import { EdgeText } from './EdgeText' const footerGradientStart = { x: 0, y: 0 } const footerGradientEnd = { x: 0, y: 0.75 } @@ -296,7 +297,9 @@ export function SideMenu(props: DrawerContentComponentProps) { - {displayUsername} + + {displayUsername} + {isMultiUsers ? ( @@ -321,9 +324,9 @@ export function SideMenu(props: DrawerContentComponentProps) { {/* This empty container is required to align the row contents properly */} - + {userInfo.username == null ? sprintf(lstrings.guest_account_id_1s, userInfo.loginId.slice(userInfo.loginId.length - 3)) : userInfo.username} - + From 694cdce269a2147a605b8dccfa5c8b08eb12bf19 Mon Sep 17 00:00:00 2001 From: peachbits Date: Mon, 30 Sep 2024 12:42:42 -0700 Subject: [PATCH 81/82] Enable Cardano staking --- CHANGELOG.md | 1 + src/plugins/stake-plugins/generic/pluginInfo.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ec728ea279..f419e0696df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - added: Minimum receive amount to `SwapConfirmationScene` - added: New analytics tracking param: `accountAgeMonths` - added: Sell with Moonpay +- changed: Enable Cardano staking - changed: Added Iraq to list of Visa/MC supported countries - changed: Display Asset Status cards in the same style as Promo Cards - changed: Updated ACH supported US states diff --git a/src/plugins/stake-plugins/generic/pluginInfo.ts b/src/plugins/stake-plugins/generic/pluginInfo.ts index 4d257d0cc7b..46aa3903532 100644 --- a/src/plugins/stake-plugins/generic/pluginInfo.ts +++ b/src/plugins/stake-plugins/generic/pluginInfo.ts @@ -1,8 +1,8 @@ -// import { kilncardanopool } from './pluginInfo/cardanoKilnPool' +import { kilncardanopool } from './pluginInfo/cardanoKilnPool' import { coreumnative } from './pluginInfo/coreumNativeStaking' // import { kilnpool } from './pluginInfo/ethereumKilnPool' import { glifpoolCalibration } from './pluginInfo/filecoinCalibrationGlifpool' import { glifpool } from './pluginInfo/filecoinGlifpool' import { tarotpool } from './pluginInfo/optimismTarotPool' -export const genericPlugins = [glifpool, glifpoolCalibration, tarotpool, coreumnative] +export const genericPlugins = [glifpool, glifpoolCalibration, tarotpool, coreumnative, kilncardanopool] From c89aa8fd523b1d498e573da3cde68f4fc2c6738e Mon Sep 17 00:00:00 2001 From: Jon Tzeng Date: Mon, 30 Sep 2024 12:59:17 -0700 Subject: [PATCH 82/82] Upgrade edge-exchange-plugins@^2.9.1 --- ios/Podfile.lock | 8 ++++---- package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 7659218a769..0dd829cb9e2 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -21,7 +21,7 @@ PODS: - React-Core - edge-currency-plugins (3.3.2): - React-Core - - edge-exchange-plugins (2.7.5): + - edge-exchange-plugins (2.9.1): - React-Core - edge-login-ui-rn (3.22.3): - React-Core @@ -1078,11 +1078,11 @@ SPEC CHECKSUMS: CNIOLinux: 62e3505f50de558c393dc2f273dde71dcce518da CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: e7ed3e673ccad9d175a1675f9f3589ffbf69a5fd - DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953 edge-core-js: 36f9eccd1b3e22ad3e1ca14773c9754c2bf83b63 edge-currency-accountbased: 86f333e5789a79adb7b47519104d72db21e1eb72 edge-currency-plugins: d2d7466f1215ffed6ff18d056fb5470dd2f86ab3 - edge-exchange-plugins: 6ed47d7adb64b432e787a9036f46ce947d488ad6 + edge-exchange-plugins: 5a0502c8ecc7691fe1b4ef682038ee7905620b41 edge-login-ui-rn: 42c2652b2bd8b9a98b7208368ecc2827eea23955 EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903 EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9 @@ -1100,7 +1100,7 @@ SPEC CHECKSUMS: FirebaseInstallations: 766dabca09fd94aef922538aaf144cc4a6fb6869 FirebaseMessaging: 585984d0a1df120617eb10b44cad8968b859815e fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 gRPC-Swift: 74adcaaa62ac5e0a018938840328cb1fdfb09e7b diff --git a/package.json b/package.json index ac539ff671b..b77311cfad8 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "edge-currency-accountbased": "^4.24.6", "edge-currency-monero": "^1.3.1", "edge-currency-plugins": "^3.3.2", - "edge-exchange-plugins": "^2.7.5", + "edge-exchange-plugins": "^2.9.1", "edge-info-server": "^2.7.0", "edge-login-ui-rn": "^3.22.3", "ethers": "^5.7.2", diff --git a/yarn.lock b/yarn.lock index fb78dcb8765..32b2623cf76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9213,10 +9213,10 @@ edge-currency-plugins@^3.3.2: wifgrs "^2.0.6" ws "^7.4.6" -edge-exchange-plugins@^2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/edge-exchange-plugins/-/edge-exchange-plugins-2.7.5.tgz#adcc53233aff46bcb6dd6df54aa642e3b72b2933" - integrity sha512-nvo2rwA6KSs4dzWd3HblupxSDC2ST/tnyhoRqLO6+IKM3n7sE7b4/UW6taquW57yHqD9+yeL6UwkJwW9gUrGtQ== +edge-exchange-plugins@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/edge-exchange-plugins/-/edge-exchange-plugins-2.9.1.tgz#4cead608d6091355dfa5eae88d63cc9843c5b97a" + integrity sha512-R8tQ7uIb6cM8WkRLTSD3UbNtSlo1x+FqIvMLaJJMX26YrndnZBxdNkSju6WyCBqgXkIlCnY9VjSERd98SmgKJQ== dependencies: "@cosmjs/encoding" "^0.32.2" biggystring "^4.1.3"