Skip to content

Commit 255aa4b

Browse files
committed
Merge branch 'staging'
2 parents e63bcfb + 53a9151 commit 255aa4b

89 files changed

Lines changed: 31232 additions & 20002 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.npmrc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
@jsr:registry=https://npm.jsr.io
2+
ignore-scripts=true
3+
legacy-peer-deps=true

.travis.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ node_js:
99
before_install:
1010
- node scripts/hack-travis.mjs
1111
install:
12-
- yarn install --frozen-lockfile --network-concurrency 1
13-
- yarn prepare
12+
- npm ci
13+
- npm run prepare
1414
script:
15-
- yarn lint
16-
- yarn tsc
17-
- yarn test
15+
- npm run lint
16+
- npx tsc
17+
- npm test

.yarnrc

Lines changed: 0 additions & 1 deletion
This file was deleted.

AGENTS.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22

33
## Package Manager
44

5-
- **Use Yarn v1** instead of npm for all package management and script execution
6-
- `yarn install` - Install dependencies
7-
- `yarn add <package>` - Add new dependency
8-
- `yarn add -D <package>` - Add dev dependency
5+
- **Use npm** for all package management and script execution
6+
- `npm ci` - Install dependencies from the lockfile (CI-style, reproducible)
7+
- `npm install <package>` - Add new dependency
8+
- `npm install -D <package>` - Add dev dependency
99

1010
## Build/Test/Lint Commands
1111

12-
- `yarn lint` - Run ESLint on entire codebase
13-
- `yarn fix` - Auto-fix linting issues and deduplicate yarn
14-
- `yarn test` - Run Jest tests (single run)
15-
- `yarn watch` - Run Jest tests in watch mode
16-
- `yarn test --testNamePattern="test name"` - Run specific test by name
17-
- `yarn verify` - Run lint, typechain, tsc, and test (full verification)
18-
- `yarn precommit` - Full pre-commit check (localize, lint-staged, tsc, test)
12+
- `npm run lint` - Run ESLint on entire codebase
13+
- `npm run fix` - Auto-fix linting issues and dedupe the dependency tree
14+
- `npm test` - Run Jest tests (single run)
15+
- `npm run watch` - Run Jest tests in watch mode
16+
- `npm test -- --testNamePattern="test name"` - Run specific test by name
17+
- `npm run verify` - Run lint, typechain, tsc, and test (full verification)
18+
- `npm run precommit` - Full pre-commit check (localize, lint-staged, tsc, test)
1919
- `tsc` - TypeScript type checking (via package.json script)
2020

2121
## Code Style Guidelines

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22

33
## Unreleased (develop)
44

5+
## 4.49.0 (staging)
6+
7+
- added: Monero wallet import support
8+
- added: Monero wallet settings to choose between a Light Wallet Server and a monerod full node backend
9+
- added: Home screen long-press shortcuts for "⚠️ Save 2FA First!" warning and "Contact Support".
10+
- added: Honor `af` affiliate parameter on `deep.edge.app` deep links, activating the promotion alongside any inner payload (e.g. private-key import).
11+
- added: Show swap KYC/terms modal for NExchange
12+
- added: Nym mixnet warning in Stake, Unstake, and Claim Rewards scenes
13+
- added: Logbox disable option to env.json
14+
- added: Reverse-resolve recipient addresses to ENS / Unstoppable Domains / ZNS names in the send flow, address modal, and transaction history.
15+
- added: Remote enable/disable of gift card providers via the info server's giftCardInfo config, supporting whole-provider disabling for Phaze and Bitrefill and per-brand disabling for Phaze.
16+
- changed: Migrate Monero to the react-native-monero implementation, replacing edge-currency-monero
17+
- changed: Migrate package manager from yarn to npm.
18+
- changed: Deprecate Botanix by switching it to keys-only mode on July 9, 2026.
19+
- changed: Reorganize the wallet list menu so Asset Settings is reached through Wallet Settings, and rename the Monero "Backend" card to "Server Settings".
20+
- fixed: Android build failure from the home screen long-press shortcuts feature, caused by an expo-quick-actions Kotlin compile error under Kotlin 2.3.
21+
- fixed: Use Biometrics toggle in Settings reverting to its previous state after leaving and re-entering the scene.
22+
- fixed: Prevent imported Monero wallets from using the Edge LWS backend. Choosing to import now prompts the user to continue with a full node or configure a custom LWS server, matching the wallet settings rule.
23+
524
## 4.48.2 (2026-06-03)
625

726
- changed: Upgrade Zcash sdks for NU6.2 support

Jenkinsfile

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def preBuildStages(String stageName, versionFile) {
1111
writeJSON file: './release-version.json', json: versionFile
1212
currentBuild.description = versionString
1313

14-
sh 'yarn'
14+
sh 'npm ci'
1515

1616
// Import the settings files
1717
withCredentials([file(credentialsId: 'githubSshKey', variable: 'id_github')]) {
@@ -24,13 +24,13 @@ def preBuildStages(String stageName, versionFile) {
2424
// Pick the new build number and version from git:
2525
sh 'node -r sucrase/register ./scripts/updateVersion.ts'
2626

27-
sh 'yarn prepare'
27+
sh 'npm run prepare'
2828
}
2929
}
3030

3131
def preTest(String stageName) {
3232
stage("${stageName}: preTest") {
33-
sh 'yarn test --ci'
33+
sh 'npm test -- --ci'
3434
}
3535
}
3636

@@ -108,8 +108,8 @@ pipeline {
108108
sh "cp ${id_github} ./id_github"
109109
}
110110

111-
// Use npm to install Sucrase globally
112-
sh 'yarn add --dev sucrase'
111+
// Install Sucrase so gitVersionFile.ts can run before the full npm ci below
112+
sh 'npm install --save-dev sucrase'
113113
sh "node -r sucrase/register ./scripts/gitVersionFile.ts ${BRANCH_NAME}"
114114

115115
def versionFile = readJSON file: './release-version.json'

README.md

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,17 @@ The React Native documentation contains [detailed instructions on how to prepare
2727

2828
If you are using a Mac, follow both the iOS and Android target instructions. Otherwise, you only need the Android target instructions.
2929

30-
### Install Yarn
31-
32-
This project uses Yarn to manage Javascript dependencies:
33-
34-
https://yarnpkg.com
35-
36-
Do not use NPM to install dependencies, since that will not work.
37-
3830
### Checkout develop branch & install node_modules
3931

32+
This project uses npm to manage Javascript dependencies (npm ships with Node).
33+
4034
cd edge-react-gui
41-
yarn
42-
yarn prepare
35+
npm ci
36+
npm run prepare
4337

4438
### Run the bundler
4539

46-
yarn start
40+
npm start
4741

4842
This bundler process needs to run in the background, so feel free to run this in its own terminal window.
4943

@@ -57,15 +51,15 @@ Change the `AIRBITZ_API_KEY` in `env.json` to the API key you received from Edge
5751

5852
#### iOS
5953

60-
- Run `yarn prepare.ios` to generate the CocoaPods files. You will need to do this after the first install, and any time Xcode produces a `The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.` error.
54+
- Run `npm run prepare.ios` to generate the CocoaPods files. You will need to do this after the first install, and any time Xcode produces a `The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.` error.
6155
- Open `edge-react-gui/ios/edge.xcworkspace` in Xcode
6256
- Choose a target device or simulator and tap the Play button on the top nav bar
6357

6458
#### Android
6559

6660
To build, install, and start the app on a simulator or physical phone with USB debugging, run:
6761

68-
yarn android
62+
npm run android
6963

7064
Otherwise, to get an APK, do:
7165

@@ -109,11 +103,11 @@ Set `BUILD_REPO_URL` to the URL of an empty Git repo that will hold a version
109103
file that will be auto updated to increment the version and build number. Then
110104
run the following to update a local `release-version.json` file
111105

112-
yarn gitVersionFile
106+
npm run gitVersionFile
113107

114108
Update the project files based on the version in `release-version.json`
115109

116-
yarn updateVersion
110+
npm run updateVersion
117111

118112
### Build, sign, and deploy
119113

@@ -132,32 +126,51 @@ The included `deploy.ts` is a script to automate building, signing, and deployin
132126
- Set the `bundleToolPath` in `deploy-config.json` to the path to the bundle tool `.jar` file
133127
- Put any Android keystore files into `edge-react-gui/keystores/`
134128
- If using Firebase, put your account's `google-services.json` and `GoogleService-Info.plist` into `edge-react-gui/`
135-
- Install xcpretty `sudo gem install xcpretty`
129+
- Install CocoaPods `brew install cocoapods` (use Homebrew, not `gem install`, so it survives Ruby upgrades)
130+
- Install xcbeautify `brew install xcbeautify`
136131

137132
Run deploy
138133

139134
```sh
140-
yarn deploy edge ios master
141-
yarn deploy edge android master
135+
npm run deploy edge ios master
136+
npm run deploy edge android master
142137
```
143138

144139
## Fastlane support
145140

146-
This repo supports utilizing Fastlane to automate updates to iOS Provisioning
147-
Profiles. To use Fastlane, set the following environment variables and run
148-
`yarn deploy` as mentioned above
141+
This repo uses Fastlane to automate iOS code signing. The deploy script uses
142+
`fastlane match` to install the signing certificates and provisioning profiles,
143+
and to renew them automatically when they expire (see Certificate renewal
144+
below).
145+
146+
Fastlane must be version 2.235.0 or newer (install or upgrade with
147+
`brew install fastlane`). Older versions ignore `--skip_confirmation` during
148+
`match nuke`, which blocks the automatic certificate renewal on an interactive
149+
prompt.
150+
151+
Authentication uses an App Store Connect API key, not an Apple ID. Place the key
152+
JSON at `fastlane.json` in the repo root (see the
153+
[App Store Connect API docs](https://docs.fastlane.tools/app-store-connect-api/)).
154+
Then set the following environment variables and run `npm run deploy` as mentioned
155+
above
149156

150157
BUILD_REPO_URL // Git repo used to store encrypted provisioning
151158
// keys.
152159
// Will be shared with the gitVersionFile.ts script
153-
FASTLANE_USER // Apple ID email
154-
FASTLANE_PASSWORD // Apple ID password
155160
GITHUB_SSH_KEY // (Optional) SSH Key file to use when accessing
156161
// BUILD_REPO_URL
157162
MATCH_KEYCHAIN_PASSWORD // Password to unlock the current users keychain
158163
MATCH_PASSWORD // Password used to encrypt profile information
159164
// before being saved to the BUILD_REPO_URL
160165

166+
### Certificate renewal
167+
168+
Apple signing certificates expire once a year. When `fastlane match` fails
169+
because a certificate is no longer valid, the deploy script automatically nukes
170+
that certificate type (revoking it on the Apple Developer Portal and wiping it
171+
from `BUILD_REPO_URL`) and re-runs match to generate a fresh certificate and
172+
provisioning profiles.
173+
161174
---
162175

163176
## Debugging

android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
<data android:scheme="ethereum" />
8686
<data android:scheme="dash" />
8787
<data android:scheme="litecoin" />
88+
<data android:scheme="zcash" />
8889
</intent-filter>
8990
<intent-filter android:label="Wallet Connect">
9091
<action android:name="android.intent.action.VIEW" />

android/app/src/main/java/co/edgesecure/app/MainActivity.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.facebook.react.ReactActivityDelegate
88
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
99
import com.facebook.react.defaults.DefaultReactActivityDelegate
1010
import com.zoontek.rnbootsplash.RNBootSplash
11+
import expo.modules.ReactActivityDelegateWrapper
1112

1213
class MainActivity : ReactActivity() {
1314
/**
@@ -18,10 +19,16 @@ class MainActivity : ReactActivity() {
1819

1920
/**
2021
* Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
21-
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
22+
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled].
23+
* The Expo wrapper forwards activity lifecycle events (onCreate intent capture, onNewIntent)
24+
* to expo modules; expo-quick-actions needs it to deliver shortcut taps on cold start.
2225
*/
2326
override fun createReactActivityDelegate(): ReactActivityDelegate =
24-
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
27+
ReactActivityDelegateWrapper(
28+
this,
29+
BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
30+
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
31+
)
2532

2633
// Edge addition
2734
override fun onCreate(savedInstanceState: Bundle?) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<inset xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:drawable="@mipmap/ic_launcher_foreground"
4+
android:inset="18dp" />

0 commit comments

Comments
 (0)