Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
24c46d9
Enable the namespace re-export transform
paullinator Oct 1, 2026
a22727e
Declare the hash.js dependency
paullinator Oct 1, 2026
2595441
Make network and utils Node-safe
paullinator Oct 1, 2026
934b7c7
Split exchange rates for Node safety
paullinator Oct 1, 2026
c23b2d8
Extract Node-safe locale detection
paullinator Oct 1, 2026
6256aad
Extract Node-safe transaction display metadata
paullinator Oct 1, 2026
5d94d84
Extract Node-safe denominations and settings
paullinator Oct 1, 2026
249c8da
Extract the Node-safe transaction export pipeline
paullinator Oct 1, 2026
a5219cc
Extract Node-safe transaction tagging
paullinator Oct 1, 2026
05f24fe
Add the Edge CLI engine and its REST API
paullinator Oct 1, 2026
63a5b95
Implement the remaining Edge CLI endpoints
paullinator Oct 1, 2026
66cdf19
Publish the CLI as its own npm package
paullinator Oct 1, 2026
ef9130d
Validate caller-supplied amounts and action types
paullinator Oct 2, 2026
5c1c1a7
Honour save-export-prefs and publish the real page size
paullinator Oct 2, 2026
feec94c
Reach every wallet a key export names, and guard save-tx
paullinator Oct 2, 2026
6ea0717
Authenticate before touching the engine clock
paullinator Oct 2, 2026
84180c9
Sweep a profile whose pid was recycled
paullinator Oct 2, 2026
4b2a802
Give a client the engine's real shutdown budget
paullinator Oct 2, 2026
99daa48
Escape OFX characters outside the BMP
paullinator Oct 2, 2026
40fd0a8
Stop loading six modules the client cannot reach
paullinator Oct 2, 2026
0f47d4a
Recover the rate queue from a failed pass
paullinator Oct 2, 2026
4d9e25b
Remember an unpriced rate key for a few minutes
paullinator Oct 2, 2026
df4edb7
Log a failed request, and bind the host a caller names
paullinator Oct 3, 2026
8be053a
Make the export and error-detail checks able to fail
paullinator Oct 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# The committed generated artifacts. They belong in the tree — a fresh clone
# needs no build step to run the CLI or read its reference — but they are
# output, so a review should not have to scroll them and the language
# statistics should not count them.
docs/api/dist/** linguist-generated=true
src/cli/generated/** linguist-generated=true
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ coverage/
/ios/EdgeApiSecret.h
/android/app/src/main/cpp/edge_api_secret.c
/android/app/src/main/cpp/edge_api_secret.h
/native/edge-api-signer/node/edge_api_secret.c
/native/edge-api-signer/node/edge_api_secret.h
/native/edge-api-signer/node/build/
/vendor/*.tgz
/vendor/edge-core-js-*.tgz
/*.tgz
Expand Down Expand Up @@ -140,3 +143,9 @@ yarn-error.log
!.yarn/sdks
!.yarn/versions
/.husky/_

# Edge CLI runtime
.edge-cli/

# Built CLI
/lib/
13 changes: 13 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,17 @@ install:
script:
- npm run lint
- npx tsc
# The five documentation gates, which are read-only and take seconds
# between them. `npm run prepare` above regenerates the committed
# artifacts, so without this nothing anywhere notices a stale
# `commands.json` — and that file is the table the CLI parses argv against.
- npm run docs:api:gates
# Not regenerated by `npm run prepare` above, so unlike the gates above this
# one does fail on a stale committed artifact: the published CLI's
# dependency list is derived from the module graph, and a new import that
# did not reach the manifest is an `npm install` that succeeds and a CLI
# that cannot resolve a module.
- npm run cli:manifest:check
- npm run test:cli:node-safe
- npm test
- npm run test:cli:offline
21 changes: 19 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,27 @@
- `npm test` - Run Jest tests (single run)
- `npm run watch` - Run Jest tests in watch mode
- `npm test -- --testNamePattern="test name"` - Run specific test by name
- `npm run verify` - Run lint, typechain, tsc, and test (full verification)
- `npm run precommit` - Full pre-commit check (localize, lint-staged, tsc, test)
- `npm run verify` - Full verification: lint, typechain, tsc, the five
documentation gates, the Node-safety smoke test, Jest, and the CLI's offline
suites against both the sources and the built bundle
- `npm run precommit` - Pre-commit check: localize, update-eslint-warnings,
lint-staged, the documentation gates, the Node-safety smoke test, tsc, Jest
and the CLI's offline suites
- `tsc` - TypeScript type checking (via package.json script)

### Edge CLI

The repository also builds `edge-cli` and `edge-engine` from `src/cli/`.
[`docs/EDGE_CLI.md`](docs/EDGE_CLI.md) is the guide; `docs/api/README.md`
covers the route declarations the reference is generated from.

- `npm run cli -- <command>` / `npm run engine` - run either half from source
- `npm run build:cli` - the single-file bundles in `lib/`
- `npm run docs:api` - regenerate the committed reference and command table
- `npm run docs:api:gates` - the five read-only checks that it is in step
- `npm run test:cli:offline` - the fake-world suites, no network
- `npm run test:cli:network` - the suites that need the tester servers

## Swap Provider Integration

The plugin itself lives in `edge-exchange-plugins`; this repo only wires it up, and every wiring point below fails SILENTLY when missed (no error, just a blank icon or a provider that never initializes). Registering a new swap `pluginId` means all of:
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

## Unreleased (develop)

- changed: Moved transaction display metadata, denominations, spam-threshold resolution, local settings, the transaction export pipeline, transaction tagging, locale selection, exchange rates and the network helpers out of GUI-only modules so they load under plain Node, with no behaviour change to the app.
- fixed: Historical rates no longer re-query a pair the server has answered but cannot price, which looped without delay and never settled the caller's promise.
- fixed: Historical rate requests are capped below the rates server's 100-asset limit, where the previous check let a batch reach 101 and the rejection priced the whole page at zero.
- fixed: An unusable OS number format no longer also falls the language back to English when resolving info-server localized strings.
- fixed: `splitCategory` keeps an unrecognised category prefix as part of the subcategory rather than discarding it, so opening and saving such a transaction no longer writes the prefix away.
- fixed: Transaction fiat amounts are fetched in one batch rather than in groups of ten, each of which paid a fresh one-second debounce.
- fixed: QBO exports escape a non-ASCII payee or memo, so the `ENCODING:USASCII` header the file declares is true.
- added: Edge CLI (`edge-cli`) and its engine daemon: a long-lived process owning an `EdgeContext`, a JSON REST API over a Unix socket with an optional loopback TCP listener, and a thin client that spawns the engine on demand. 117 routes, generated command table, help text and OpenAPI reference.
- added: `YOLO_OTP_KEY` env setting, which lets auto-login reach a 2FA-protected account on a device that has no login stash for it yet.
- added: Slow-sync explainer card on Bitcoin-family wallets with a long transaction history.
- added: Logbox disable option to env.json
Expand Down
4 changes: 4 additions & 0 deletions babel.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ module.exports = function (api) {
return {
presets: ['module:@react-native/babel-preset'],
plugins: [
// `typechain` emits `export * as factories from './factories'` in
// src/plugins/contracts, which the React Native preset does not
// transform on its own.
'@babel/plugin-transform-export-namespace-from',
isAndroid
? './node_modules/r3-hack/node_modules/react-native-reanimated/plugin'
: 'react-native-worklets/plugin'
Expand Down
Loading
Loading