From bb55a8d863735b069091f579a746a2ca7136d398 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 27 Jan 2026 18:40:16 -0800 Subject: [PATCH 1/9] Upgrade edge-core-js@^2.41.0 --- ios/Podfile.lock | 4 ++-- package.json | 2 +- yarn.lock | 60 +++++++++++------------------------------------- 3 files changed, 17 insertions(+), 49 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index fa83c3ceaf3..b750fc609db 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.40.0): + - edge-core-js (2.41.0): - React-Core - edge-currency-accountbased (4.70.0): - React-Core @@ -3338,7 +3338,7 @@ SPEC CHECKSUMS: CNIOWindows: 3047f2d8165848a3936a0a755fee27c6b5ee479b disklet: 8a20bf8a568635b6e6bb8f93297dac13ee5cef98 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb - edge-core-js: 51d5b7a3084d4e82056f5591632a7872d86bd92b + edge-core-js: c4d5806062e266cc90054901887784a29b60be31 edge-currency-accountbased: b9407e907da1c2592b2b771c3be2a36d4dd3d597 edge-currency-plugins: 6b3341707a6a5c74f837a012768dd2f6c55a691b edge-exchange-plugins: f31912c54a50852bd02077b795aace0e0bee8365 diff --git a/package.json b/package.json index 1e7f07216b8..ba827345f15 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "deprecated-react-native-prop-types": "^5.0.0", "detect-bundler": "^1.1.0", "disklet": "^0.5.2", - "edge-core-js": "^2.40.0", + "edge-core-js": "^2.41.0", "edge-currency-accountbased": "^4.70.0", "edge-currency-monero": "^2.1.0", "edge-currency-plugins": "^3.8.10", diff --git a/yarn.lock b/yarn.lock index d8f652a6753..06eafbfc03c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1063,20 +1063,7 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" - integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.0" - debug "^4.3.1" - -"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.7.0": +"@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3", "@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.7.0": version "7.28.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== @@ -3468,6 +3455,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nymproject/mix-fetch@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@nymproject/mix-fetch/-/mix-fetch-1.4.1.tgz#6a923b40e09c4a571fb947297a3afd41cd2d5ea6" + integrity sha512-FN5UeCkje6fauCt2pd8kFGFYXj2kaNewEJVKRLWzI2/suxD+J2bmg/YvXBGLWMWglXNA3+YFHA/1Vjh6OGtgig== + "@open-draft/deferred-promise@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" @@ -9522,11 +9514,12 @@ ed25519@0.0.4: bindings "^1.2.1" nan "^2.0.9" -edge-core-js@^2.40.0: - version "2.40.0" - resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.40.0.tgz#9b44ef6c15ea42b93b7d4440897da04b525b53a2" - integrity sha512-S2SAAqL0OlKAGKz5CDTzJ+Vlpu4HzBlclq2yrGHRnFzwxCVIIcnPdpwVDQZhlA7eFHKipfULbXpQaSspYvI5Rg== +edge-core-js@^2.41.0: + version "2.41.0" + resolved "https://registry.yarnpkg.com/edge-core-js/-/edge-core-js-2.41.0.tgz#4262701cc0719a263b4132e72e7e1299ab363817" + integrity sha512-ntTT0yEtr6xF6+u4KbfLK7LX2kmXBvpwD8LU26B9+k3L3o1UsVZ36OjY8B6w1Wvo+jSNldxNyhTqyQYgX0ysoQ== dependencies: + "@nymproject/mix-fetch" "^1.4.1" aes-js "^3.1.0" base-x "^4.0.0" biggystring "^4.2.3" @@ -17751,16 +17744,7 @@ string-length@^4.0.2: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -17869,7 +17853,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -17883,13 +17867,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.0, strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -19603,7 +19580,7 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -19621,15 +19598,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From aea11120609e422ad8117efae4050bcadae063be Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 27 Jan 2026 18:54:19 -0800 Subject: [PATCH 2/9] Upgrade edge-currency-monero@^2.2.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index ba827345f15..2c941b17352 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "disklet": "^0.5.2", "edge-core-js": "^2.41.0", "edge-currency-accountbased": "^4.70.0", - "edge-currency-monero": "^2.1.0", + "edge-currency-monero": "^2.2.0", "edge-currency-plugins": "^3.8.10", "edge-exchange-plugins": "^2.40.4", "edge-info-server": "^3.10.0", diff --git a/yarn.lock b/yarn.lock index 06eafbfc03c..1b49aab3a74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9600,10 +9600,10 @@ edge-currency-accountbased@^4.70.0: xrpl "^2.10.0" yaob "^0.3.6" -edge-currency-monero@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/edge-currency-monero/-/edge-currency-monero-2.1.0.tgz#b2f677a46d98c75603685878e2df3fa050ab3156" - integrity sha512-wy8JxbqwilmnEsJXxbL6wagwUsDTrNXRb79TbPxM7R3w5+QGXo2LN85ipkh2nobrL0IPxNKvzWdKReEOf6bHBw== +edge-currency-monero@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/edge-currency-monero/-/edge-currency-monero-2.2.0.tgz#1cfee77e5d00c5a58148334066840f99aa59046e" + integrity sha512-id5HKde5U4cAo/xgD5skFFu4bMVwuyz6OoGd95+P+045NdFu13BFkjMCOvU1aQOaw0lQSygBbb0x8TkBAcURqw== dependencies: "@mymonero/mymonero-bigint" "^1.4.2" "@mymonero/mymonero-money-format" "^1.4.2" From ecaa2446adad9c22e6676eb916b83ff9acbea5a2 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 27 Jan 2026 19:36:35 -0800 Subject: [PATCH 3/9] Upgrade edge-currency-accountbased@^4.71.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 b750fc609db..b88e79a11d7 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -17,7 +17,7 @@ PODS: - DoubleConversion (1.1.6) - edge-core-js (2.41.0): - React-Core - - edge-currency-accountbased (4.70.0): + - edge-currency-accountbased (4.71.0): - React-Core - edge-currency-plugins (3.8.10): - React-Core @@ -3339,7 +3339,7 @@ SPEC CHECKSUMS: disklet: 8a20bf8a568635b6e6bb8f93297dac13ee5cef98 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb edge-core-js: c4d5806062e266cc90054901887784a29b60be31 - edge-currency-accountbased: b9407e907da1c2592b2b771c3be2a36d4dd3d597 + edge-currency-accountbased: ca9591b461e28c95324df828728066853724c770 edge-currency-plugins: 6b3341707a6a5c74f837a012768dd2f6c55a691b edge-exchange-plugins: f31912c54a50852bd02077b795aace0e0bee8365 edge-login-ui-rn: 74294715a31efa2f79a916a3f89bf47a99cec102 diff --git a/package.json b/package.json index 2c941b17352..55bfbc791ff 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "detect-bundler": "^1.1.0", "disklet": "^0.5.2", "edge-core-js": "^2.41.0", - "edge-currency-accountbased": "^4.70.0", + "edge-currency-accountbased": "^4.71.0", "edge-currency-monero": "^2.2.0", "edge-currency-plugins": "^3.8.10", "edge-exchange-plugins": "^2.40.4", diff --git a/yarn.lock b/yarn.lock index 1b49aab3a74..30665d347e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9540,10 +9540,10 @@ edge-core-js@^2.41.0: yaob "^0.3.12" yavent "^0.1.5" -edge-currency-accountbased@^4.70.0: - version "4.70.0" - resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.70.0.tgz#a67d35cc1a1361ad2493e8704ec2823553378308" - integrity sha512-Q0phsXPfpfnQVr3BtOWdy2OD4QSw70PqbKPrEYqzIllhjf5LmVL7nDQtJpHop1CnPxCzn92a+pfoM94ofmCCyA== +edge-currency-accountbased@^4.71.0: + version "4.71.0" + resolved "https://registry.yarnpkg.com/edge-currency-accountbased/-/edge-currency-accountbased-4.71.0.tgz#140bc15838ccc04941916ed29c5674aad74075b7" + integrity sha512-OTi121eUSWgLMLucAL7ZQoCgUtvJ7A4VTqqgohy1Tkzjzrk6aeUaiegdO4KsgqQ5aEJhvEpwrH0/VEnRbxoAog== dependencies: "@chain-registry/client" "^2.0.28" "@chain-registry/types" "^2.0.28" From 19a803839e19801d067fe8203fff619765d1bea7 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 22 Jan 2026 13:18:48 -0800 Subject: [PATCH 4/9] Fix lint errors for currency settings component files --- eslint.config.mjs | 3 - .../scenes/CurrencySettingsScene.tsx | 64 +++++++++---------- .../themed/MaybeCustomServersSetting.tsx | 4 +- .../themed/MaybeMoneroUserSettings.tsx | 2 +- src/util/corePlugins.ts | 2 +- 5 files changed, 34 insertions(+), 41 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 8513678f77d..2047169de72 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -253,7 +253,6 @@ export default [ 'src/components/scenes/CreateWalletImportScene.tsx', 'src/components/scenes/CurrencyNotificationScene.tsx', - 'src/components/scenes/CurrencySettingsScene.tsx', 'src/components/scenes/DefaultFiatSettingScene.tsx', 'src/components/scenes/DuressModeHowToScene.tsx', 'src/components/scenes/DuressModeSettingScene.tsx', @@ -365,8 +364,6 @@ export default [ 'src/components/themed/LineTextDivider.tsx', 'src/components/themed/MainButton.tsx', 'src/components/themed/ManageTokensRow.tsx', - 'src/components/themed/MaybeCustomServersSetting.tsx', - 'src/components/themed/MaybeMoneroUserSettings.tsx', 'src/components/themed/MenuTabs.tsx', 'src/components/themed/ModalParts.tsx', 'src/components/themed/PinDots.tsx', diff --git a/src/components/scenes/CurrencySettingsScene.tsx b/src/components/scenes/CurrencySettingsScene.tsx index 732bb73dda8..044427c2fc7 100644 --- a/src/components/scenes/CurrencySettingsScene.tsx +++ b/src/components/scenes/CurrencySettingsScene.tsx @@ -24,7 +24,7 @@ export interface CurrencySettingsParams { interface Props extends EdgeAppSceneProps<'currencySettings'> {} -export function CurrencySettingsScene(props: Props) { +export const CurrencySettingsScene: React.FC = props => { const { route } = props const { currencyInfo } = route.params const { currencyCode, denominations, pluginId } = currencyInfo @@ -39,41 +39,37 @@ export function CurrencySettingsScene(props: Props) { ).multiplier const currencyConfig = account.currencyConfig[pluginId] - function renderDenominations() { - return ( - <> - - {denominations.map(denomination => { - const key = denomination.multiplier - const isSelected = key === selectedDenominationMultiplier - const handlePress = async () => { - await dispatch( - setDenominationKeyRequest(pluginId, currencyCode, denomination) - ) - } - - return ( - - - - {denomination.symbol} - - {' - ' + denomination.name} - - - ) - })} - - ) - } - return ( - {denominations.length > 1 ? renderDenominations() : null} + {denominations.length > 1 ? ( + <> + + {denominations.map(denomination => { + const key = denomination.multiplier + const isSelected = key === selectedDenominationMultiplier + const handlePress = async (): Promise => { + await dispatch( + setDenominationKeyRequest(pluginId, currencyCode, denomination) + ) + } + + return ( + + + + {denomination.symbol} + + {' - ' + denomination.name} + + + ) + })} + + ) : null} diff --git a/src/components/themed/MaybeCustomServersSetting.tsx b/src/components/themed/MaybeCustomServersSetting.tsx index ff9fba07531..bfac1751312 100644 --- a/src/components/themed/MaybeCustomServersSetting.tsx +++ b/src/components/themed/MaybeCustomServersSetting.tsx @@ -34,7 +34,7 @@ interface CustomServersSetting { type Props = CurrencySettingProps -function CustomServersSettingComponent(props: Props) { +const CustomServersSettingComponent: React.FC = props => { const { defaultSetting, setting, extraInfo, onUpdate } = props const { enableCustomServers, customServers } = setting const theme = useTheme() @@ -94,7 +94,7 @@ function CustomServersSettingComponent(props: Props) { return true }} /> - )).catch(err => { + )).catch((err: unknown) => { showError(err) }) }) diff --git a/src/components/themed/MaybeMoneroUserSettings.tsx b/src/components/themed/MaybeMoneroUserSettings.tsx index f45f7e32348..7f8448fe66c 100644 --- a/src/components/themed/MaybeMoneroUserSettings.tsx +++ b/src/components/themed/MaybeMoneroUserSettings.tsx @@ -22,7 +22,7 @@ type MoneroUserSettings = ReturnType type Props = CurrencySettingProps -function MoneroUserSettingsComponent(props: Props) { +const MoneroUserSettingsComponent: React.FC = props => { const { defaultSetting, onUpdate, setting } = props const { enableCustomServers, moneroLightwalletServer } = setting const isEmpty = diff --git a/src/util/corePlugins.ts b/src/util/corePlugins.ts index 9b3e63d6641..2106deb3820 100644 --- a/src/util/corePlugins.ts +++ b/src/util/corePlugins.ts @@ -3,7 +3,7 @@ import type { EdgeCorePluginsInit } from 'edge-core-js' import { ENV } from '../env' export const currencyPlugins: EdgeCorePluginsInit = { - // // edge-currency-accountbased: + // edge-currency-accountbased: abstract: ENV.ABSTRACT_INIT, algorand: ENV.ALGORAND_INIT, amoy: ENV.AMOY_INIT, From e9713af4318a113afd3c6566c8063229d0d58e4b Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 27 Jan 2026 18:34:54 -0800 Subject: [PATCH 5/9] feat: Add network privacy settings for NYM Mixnet Add MaybePrivateNetworkingSetting component that allows users to configure network privacy options per currency. The setting uses an enum field ('none' | 'nym') for forward compatibility with future privacy options like Tor. The component follows the existing 'Maybe' pattern and will only render for currency plugins that include networkPrivacy in their defaultSettings. --- CHANGELOG.md | 3 +- src/components/hoc/MaybeCurrencySetting.tsx | 14 +++-- .../scenes/CurrencySettingsScene.tsx | 2 + .../themed/MaybePrivateNetworkingSetting.tsx | 56 +++++++++++++++++++ src/locales/en_US.ts | 3 + src/locales/strings/enUS.json | 3 + 6 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/components/themed/MaybePrivateNetworkingSetting.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c4bd8387e7..a13d81a134f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,9 @@ ## Unreleased (develop) - added: `chooseCaip19Asset` EdgeProvider API for precise wallet selection using CAIP-19 identifiers -- added: Pass OS and app version details to core context for v2/coreRollup endpoint - added: EdgeSpend feature for gift card purchase via Phaze +- added: Network privacy settings for Nym Mixnet in currency settings +- added: Pass OS and app version details to core context for v2/coreRollup endpoint - changed: Light mode persistence, theme colors, and images - changed: Append chain names to token codes in RampCreateScene - changed: ramps: Infinite buy support enabled diff --git a/src/components/hoc/MaybeCurrencySetting.tsx b/src/components/hoc/MaybeCurrencySetting.tsx index 76ede871c1f..b6a3e6973f5 100644 --- a/src/components/hoc/MaybeCurrencySetting.tsx +++ b/src/components/hoc/MaybeCurrencySetting.tsx @@ -12,15 +12,18 @@ export interface CurrencySettingProps { // The starting value, taken from the plugin's currency info: defaultSetting: T - // The current value, taken from disk: - setting: T - // Extra information passed to the component at creation time, // to customize its appearance or such: extraInfo: X // Called when the user tries to update the setting: onUpdate: (setting: T) => Promise + + // The currency plugin identifier: + pluginId: string + + // The current value, taken from disk: + setting: T } interface Props { @@ -59,12 +62,15 @@ export function maybeCurrencySetting( }) }) + const { pluginId } = currencyConfig.currencyInfo + return defaultSetting == null ? null : ( ) } diff --git a/src/components/scenes/CurrencySettingsScene.tsx b/src/components/scenes/CurrencySettingsScene.tsx index 044427c2fc7..ab520c87148 100644 --- a/src/components/scenes/CurrencySettingsScene.tsx +++ b/src/components/scenes/CurrencySettingsScene.tsx @@ -17,6 +17,7 @@ import { MaybeElectrumSetting } from '../themed/MaybeCustomServersSetting' import { MaybeMoneroUserSettings } from '../themed/MaybeMoneroUserSettings' +import { MaybePrivateNetworkingSetting } from '../themed/MaybePrivateNetworkingSetting' export interface CurrencySettingsParams { currencyInfo: EdgeCurrencyInfo @@ -70,6 +71,7 @@ export const CurrencySettingsScene: React.FC = props => { })} ) : null} + diff --git a/src/components/themed/MaybePrivateNetworkingSetting.tsx b/src/components/themed/MaybePrivateNetworkingSetting.tsx new file mode 100644 index 00000000000..3b1a23ba21b --- /dev/null +++ b/src/components/themed/MaybePrivateNetworkingSetting.tsx @@ -0,0 +1,56 @@ +import { asObject, asValue } from 'cleaners' +import * as React from 'react' + +import { useHandler } from '../../hooks/useHandler' +import { lstrings } from '../../locales/strings' +import { logActivity } from '../../util/logger' +import { + type CurrencySettingProps, + maybeCurrencySetting +} from '../hoc/MaybeCurrencySetting' +import { SettingsHeaderRow } from '../settings/SettingsHeaderRow' +import { SettingsRadioRow } from '../settings/SettingsRadioRow' + +const asPrivateNetworkingSetting = asObject({ + networkPrivacy: asValue('none', 'nym') +}) +type PrivateNetworkingSetting = ReturnType + +type Props = CurrencySettingProps + +const PrivateNetworkingSettingComponent: React.FC = props => { + const { onUpdate, pluginId, setting } = props + const { networkPrivacy } = setting + + const handleSelectNone = useHandler(async (): Promise => { + await onUpdate({ networkPrivacy: 'none' }) + logActivity(`Network privacy: none for ${pluginId}`) + }) + + const handleSelectNym = useHandler(async (): Promise => { + await onUpdate({ networkPrivacy: 'nym' }) + logActivity(`Network privacy: nym for ${pluginId}`) + }) + + return ( + <> + + + + + ) +} + +export const MaybePrivateNetworkingSetting = maybeCurrencySetting( + PrivateNetworkingSettingComponent, + asPrivateNetworkingSetting, + undefined +) diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 340cbdb2c15..51974d8f92d 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -558,6 +558,9 @@ const strings = { settings_monero_custom: 'Custom Light Wallet Server', settings_monero_lws_info: 'Edge uses Monero Light Wallet Servers (LWS) to scan for transactions. For enhanced privacy, you can run your own Monero LWS.', + settings_network_privacy_title: 'Network Privacy', + settings_network_privacy_default: 'Standard (No Privacy)', + settings_network_privacy_nym_mixnet: 'NYM Mixnet', settings_hours: 'Hour(s)', settings_minutes: 'Minute(s)', settings_modal_export_logs_warning: diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index ecc1f98188d..c2b976736de 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -407,6 +407,9 @@ "settings_monero_edge_lws": "Edge LWS", "settings_monero_custom": "Custom Light Wallet Server", "settings_monero_lws_info": "Edge uses Monero Light Wallet Servers (LWS) to scan for transactions. For enhanced privacy, you can run your own Monero LWS.", + "settings_network_privacy_title": "Network Privacy", + "settings_network_privacy_default": "Standard (No Privacy)", + "settings_network_privacy_nym_mixnet": "NYM Mixnet", "settings_hours": "Hour(s)", "settings_minutes": "Minute(s)", "settings_modal_export_logs_warning": "Do not enter seeds, private keys, password or other sensitive information", From 9c30892d9e3ff7f6b1379e4a2499464b596bc0b4 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Thu, 22 Jan 2026 14:17:36 -0800 Subject: [PATCH 6/9] feat: Add Cosmos-based currencies to currency settings Add axelar, coreum, cosmoshub, osmosis, thorchainrune, and thorchainrunestagenet to CURRENCY_SETTINGS_KEYS so they appear in the Asset Settings scene. --- CHANGELOG.md | 1 + src/constants/WalletAndCurrencyConstants.ts | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a13d81a134f..f06eb36c1db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - added: EdgeSpend feature for gift card purchase via Phaze - added: Network privacy settings for Nym Mixnet in currency settings - added: Pass OS and app version details to core context for v2/coreRollup endpoint +- changed: Add Cosmos-based currencies (axelar, coreum, cosmoshub, osmosis, thorchainrune, thorchainrunestagenet) to currency settings - changed: Light mode persistence, theme colors, and images - changed: Append chain names to token codes in RampCreateScene - changed: ramps: Infinite buy support enabled diff --git a/src/constants/WalletAndCurrencyConstants.ts b/src/constants/WalletAndCurrencyConstants.ts index 73764ca0044..aef2624ebd7 100644 --- a/src/constants/WalletAndCurrencyConstants.ts +++ b/src/constants/WalletAndCurrencyConstants.ts @@ -33,12 +33,15 @@ export const FEE_STRINGS = { * The order of this list sets the order of the rows. */ export const CURRENCY_SETTINGS_KEYS = [ + 'axelar', 'bitcoin', 'bitcoincash', 'bitcoingold', 'bitcoinsv', 'bitcointestnet', 'bitcointestnet4', + 'coreum', + 'cosmoshub', 'dash', 'digibyte', 'dogecoin', @@ -49,10 +52,13 @@ export const CURRENCY_SETTINGS_KEYS = [ 'groestlcoin', 'litecoin', 'monero', + 'osmosis', 'pivx', 'qtum', 'ravencoin', 'smartcash', + 'thorchainrune', + 'thorchainrunestagenet', 'ufo', 'vertcoin', 'zcoin' From 5daeced796492a98182fcbf6ece5444f83efbb58 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Tue, 27 Jan 2026 18:35:56 -0800 Subject: [PATCH 7/9] feat: Add Privacy Settings scene with NYM Mixnet toggles Add dedicated Privacy Settings scene accessible from Settings Options section. The scene displays a NYM Mixnet section with explanation text and toggle switches for each currency that supports network privacy settings. Users can enable/disable NYM Mixnet privacy per currency. - Export asPrivateNetworkingSetting cleaner for reuse - Create PrivacySettingsScene with currency toggle rows - Add privacySettings route to navigation - Register scene in Main.tsx with ifLoggedIn wrapper - Add Privacy Settings navigation row as first item in Options section - Add locale strings for privacy settings and NYM Mixnet description --- CHANGELOG.md | 3 +- eslint.config.mjs | 2 +- .../__snapshots__/SettingsScene.test.tsx.snap | 261 ++++++++++++++++-- src/components/Main.tsx | 10 + .../scenes/PrivacySettingsScene.tsx | 111 ++++++++ src/components/scenes/SettingsScene.tsx | 6 + src/components/settings/SettingsHeaderRow.tsx | 4 +- .../themed/MaybePrivateNetworkingSetting.tsx | 6 +- src/locales/en_US.ts | 6 +- src/locales/strings/enUS.json | 5 +- src/types/routerTypes.tsx | 1 + 11 files changed, 376 insertions(+), 39 deletions(-) create mode 100644 src/components/scenes/PrivacySettingsScene.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index f06eb36c1db..c7a514439e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,10 @@ - added: EdgeSpend feature for gift card purchase via Phaze - added: Network privacy settings for Nym Mixnet in currency settings - added: Pass OS and app version details to core context for v2/coreRollup endpoint +- added: New dedicated Privacy Settings scene for Nym Mixnet setting. - changed: Add Cosmos-based currencies (axelar, coreum, cosmoshub, osmosis, thorchainrune, thorchainrunestagenet) to currency settings -- changed: Light mode persistence, theme colors, and images - changed: Append chain names to token codes in RampCreateScene +- changed: Light mode persistence, theme colors, and images - changed: ramps: Infinite buy support enabled - fixed: iOS simulator builds for XCode 26 diff --git a/eslint.config.mjs b/eslint.config.mjs index 2047169de72..fa2df2718a3 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -339,7 +339,7 @@ export default [ 'src/components/services/WalletConnectService.tsx', 'src/components/services/WalletLifecycle.ts', 'src/components/services/WipeLogsService.tsx', - 'src/components/settings/SettingsHeaderRow.tsx', + 'src/components/settings/SettingsLabelRow.tsx', 'src/components/settings/SettingsRadioRow.tsx', 'src/components/settings/SettingsRow.tsx', diff --git a/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap b/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap index 496b99f3d66..c9f8020455f 100644 --- a/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap +++ b/src/__tests__/scenes/__snapshots__/SettingsScene.test.tsx.snap @@ -2381,7 +2381,7 @@ exports[`SettingsScene should render SettingsScene 1`] = ` } } > - Exchange Settings + Privacy Settings - Auto Log Off After + Exchange Settings + +  + + + + + + + + Auto Log Off After + + + + + + { headerRight: () => null }} /> + null + }} + /> {} + +const asMaybePrivateNetworkingSetting = asMaybe(asPrivateNetworkingSetting) +const wasPrivateNetworkingSetting = uncleaner(asPrivateNetworkingSetting) + +export const PrivacySettingsScene: React.FC = props => { + const account = useSelector(state => state.core.account) + const { currencyConfig } = account + + // Get list of pluginIds that support network privacy + const supportedPluginIds = React.useMemo(() => { + return Object.keys(currencyConfig).filter(pluginId => { + const config = currencyConfig[pluginId] + const defaultSetting = asMaybePrivateNetworkingSetting( + config.currencyInfo.defaultSettings + ) + return defaultSetting != null + }) + }, [currencyConfig]) + + return ( + + + + + {lstrings.settings_nym_mixnet_description} + + + {supportedPluginIds.map(pluginId => ( + + ))} + + + + ) +} + +interface ToggleRowProps { + pluginId: string +} + +const PrivacyToggleRow: React.FC = props => { + const { pluginId } = props + const account = useSelector(state => state.core.account) + const currencyConfig = account.currencyConfig[pluginId] + const { displayName } = currencyConfig.currencyInfo + + const userSettings = useWatch(currencyConfig, 'userSettings') + const setting = React.useMemo( + () => asMaybePrivateNetworkingSetting(userSettings), + [userSettings] + ) + + const defaultSetting = React.useMemo( + () => + asMaybePrivateNetworkingSetting( + currencyConfig.currencyInfo.defaultSettings + ), + [currencyConfig] + ) + + const isEnabled = (setting ?? defaultSetting)?.networkPrivacy === 'nym' + + const handleToggle = useHandler(async () => { + const currentSetting: PrivateNetworkingSetting = setting ?? + defaultSetting ?? { networkPrivacy: 'none' } + const newPrivacy = currentSetting.networkPrivacy === 'nym' ? 'none' : 'nym' + + await currencyConfig.changeUserSettings({ + ...currencyConfig.userSettings, + ...wasPrivateNetworkingSetting({ networkPrivacy: newPrivacy }) + }) + logActivity(`Network privacy for ${pluginId}: ${newPrivacy}`) + }) + + return ( + + + + ) +} diff --git a/src/components/scenes/SettingsScene.tsx b/src/components/scenes/SettingsScene.tsx index db5b3bd8440..0a5f073f494 100644 --- a/src/components/scenes/SettingsScene.tsx +++ b/src/components/scenes/SettingsScene.tsx @@ -551,6 +551,12 @@ export const SettingsScene: React.FC = props => { label={lstrings.settings_options_title_cap} /> + { + navigation.push('privacySettings') + }} + /> {config.disableSwaps !== true ? ( { +export const SettingsHeaderRow: React.FC = (props: Props) => { const { icon, label } = props const theme = useTheme() const styles = getStyles(theme) @@ -48,5 +48,3 @@ const getStyles = cacheStyles((theme: Theme) => ({ paddingRight: theme.rem(0.75) } })) - -export const SettingsHeaderRow = React.memo(SettingsHeaderRowComponent) diff --git a/src/components/themed/MaybePrivateNetworkingSetting.tsx b/src/components/themed/MaybePrivateNetworkingSetting.tsx index 3b1a23ba21b..06c2db620d1 100644 --- a/src/components/themed/MaybePrivateNetworkingSetting.tsx +++ b/src/components/themed/MaybePrivateNetworkingSetting.tsx @@ -11,10 +11,12 @@ import { import { SettingsHeaderRow } from '../settings/SettingsHeaderRow' import { SettingsRadioRow } from '../settings/SettingsRadioRow' -const asPrivateNetworkingSetting = asObject({ +export const asPrivateNetworkingSetting = asObject({ networkPrivacy: asValue('none', 'nym') }) -type PrivateNetworkingSetting = ReturnType +export type PrivateNetworkingSetting = ReturnType< + typeof asPrivateNetworkingSetting +> type Props = CurrencySettingProps diff --git a/src/locales/en_US.ts b/src/locales/en_US.ts index 51974d8f92d..b207db9a902 100644 --- a/src/locales/en_US.ts +++ b/src/locales/en_US.ts @@ -560,7 +560,11 @@ const strings = { 'Edge uses Monero Light Wallet Servers (LWS) to scan for transactions. For enhanced privacy, you can run your own Monero LWS.', settings_network_privacy_title: 'Network Privacy', settings_network_privacy_default: 'Standard (No Privacy)', - settings_network_privacy_nym_mixnet: 'NYM Mixnet', + settings_network_privacy_nym_mixnet: 'Nym Mixnet', + settings_privacy_settings: 'Privacy Settings', + settings_nym_mixnet_title: 'Nym Mixnet', + settings_nym_mixnet_description: + 'The Nym mixnet encrypts and routes your internet traffic through a decentralized network of nodes to obfuscate your data and IP address. Note that use of the mixnet may slow down network traffic and delay accurate balances and transactions. Select which services to use with the mixnet:', settings_hours: 'Hour(s)', settings_minutes: 'Minute(s)', settings_modal_export_logs_warning: diff --git a/src/locales/strings/enUS.json b/src/locales/strings/enUS.json index c2b976736de..c21266ea0ce 100644 --- a/src/locales/strings/enUS.json +++ b/src/locales/strings/enUS.json @@ -409,7 +409,10 @@ "settings_monero_lws_info": "Edge uses Monero Light Wallet Servers (LWS) to scan for transactions. For enhanced privacy, you can run your own Monero LWS.", "settings_network_privacy_title": "Network Privacy", "settings_network_privacy_default": "Standard (No Privacy)", - "settings_network_privacy_nym_mixnet": "NYM Mixnet", + "settings_network_privacy_nym_mixnet": "Nym Mixnet", + "settings_privacy_settings": "Privacy Settings", + "settings_nym_mixnet_title": "Nym Mixnet", + "settings_nym_mixnet_description": "The Nym mixnet encrypts and routes your internet traffic through a decentralized network of nodes to obfuscate your data and IP address. Note that use of the mixnet may slow down network traffic and delay accurate balances and transactions. Select which services to use with the mixnet:", "settings_hours": "Hour(s)", "settings_minutes": "Minute(s)", "settings_modal_export_logs_warning": "Do not enter seeds, private keys, password or other sensitive information", diff --git a/src/types/routerTypes.tsx b/src/types/routerTypes.tsx index a9c9d7bca5f..463f23d5754 100644 --- a/src/types/routerTypes.tsx +++ b/src/types/routerTypes.tsx @@ -163,6 +163,7 @@ export type EdgeAppStackParamList = {} & { assetSettings: undefined changeMiningFee2: ChangeMiningFeeParams + privacySettings: undefined changePassword: undefined changePin: undefined changeUsername: { password: string } From f6ec8c27482841118af9fe8b79090cdcdfc2780a Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Fri, 23 Jan 2026 11:20:50 -0800 Subject: [PATCH 8/9] Include CORS headers in plugin bundle This is to support the new edge-core-js BundleHTTPServer architecture. --- webpack.config.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/webpack.config.js b/webpack.config.js index 927a0501fc4..431385e1a32 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -18,6 +18,16 @@ module.exports = { devtool: debug ? 'source-map' : undefined, devServer: { allowedHosts: 'all', + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': + 'X-Requested-With, content-type, Authorization', + 'Cross-Origin-Resource-Policy': 'cross-origin', + // Cross-origin isolation headers required for SharedArrayBuffer (needed by mixFetch web workers) + 'Cross-Origin-Opener-Policy': 'same-origin', + 'Cross-Origin-Embedder-Policy': 'require-corp' + }, hot: false, static: false, port: 8101 From 8de34cd25d2fddd966bca3c77a6669b552f8b048 Mon Sep 17 00:00:00 2001 From: Sam Holmes Date: Fri, 23 Jan 2026 12:43:57 -0800 Subject: [PATCH 9/9] feat: Add Ethereum-based currencies to currency settings --- CHANGELOG.md | 1 + src/constants/WalletAndCurrencyConstants.ts | 25 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7a514439e0..69b51f5f6e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - added: Pass OS and app version details to core context for v2/coreRollup endpoint - added: New dedicated Privacy Settings scene for Nym Mixnet setting. - changed: Add Cosmos-based currencies (axelar, coreum, cosmoshub, osmosis, thorchainrune, thorchainrunestagenet) to currency settings +- changed: Add Ethereum-based currencies (abstract, amoy, arbitrum, avalanche, base, binancesmartchain, bobevm, botanix, celo, ethDev, ethereum, ethereumclassic, ethereumpow, fantom, filecoinfevm, filecoinfevmcalibration, holesky, hyperevm, optimism, polygon, pulsechain, rsk, sepolia, sonic, zksync) to currency settings - changed: Append chain names to token codes in RampCreateScene - changed: Light mode persistence, theme colors, and images - changed: ramps: Infinite buy support enabled diff --git a/src/constants/WalletAndCurrencyConstants.ts b/src/constants/WalletAndCurrencyConstants.ts index aef2624ebd7..213fcfb3c0f 100644 --- a/src/constants/WalletAndCurrencyConstants.ts +++ b/src/constants/WalletAndCurrencyConstants.ts @@ -33,35 +33,58 @@ export const FEE_STRINGS = { * The order of this list sets the order of the rows. */ export const CURRENCY_SETTINGS_KEYS = [ + 'abstract', + 'amoy', + 'arbitrum', + 'avalanche', 'axelar', + 'base', + 'binancesmartchain', 'bitcoin', 'bitcoincash', 'bitcoingold', 'bitcoinsv', 'bitcointestnet', 'bitcointestnet4', + 'bobevm', + 'botanix', + 'celo', 'coreum', 'cosmoshub', 'dash', 'digibyte', 'dogecoin', 'eboost', + 'ethDev', 'ethereum', 'ethereumclassic', + 'ethereumpow', + 'fantom', 'feathercoin', + 'filecoinfevm', + 'filecoinfevmcalibration', 'groestlcoin', + 'holesky', + 'hyperevm', 'litecoin', 'monero', + 'optimism', 'osmosis', 'pivx', + 'polygon', + 'pulsechain', 'qtum', 'ravencoin', + 'rsk', + 'sepolia', 'smartcash', + 'sonic', 'thorchainrune', 'thorchainrunestagenet', 'ufo', 'vertcoin', - 'zcoin' + 'zcoin', + 'zksync' ] /**