Skip to content
Open
Show file tree
Hide file tree
Changes from 122 commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
a748188
Bind XCM evidence to Android release commit
takemiyamakoto Jul 2, 2026
b54b109
Stabilize runtime reconstruction test
takemiyamakoto Jul 2, 2026
f072baf
fix: default fearless utils composites to library only
takemiyamakoto Jul 26, 2026
38fb2f3
fix: subscribe to runtime sync before initialization
takemiyamakoto Jul 26, 2026
3d777a2
fix: preserve wallets across Android migrations
takemiyamakoto Jul 30, 2026
d3636b6
fix: harden wallet migration recovery
takemiyamakoto Jul 30, 2026
eb55de9
ci: isolate Internal App Sharing handoff
takemiyamakoto Jul 30, 2026
9666edd
docs: bind migration and IAS release gates
takemiyamakoto Jul 30, 2026
1b38215
ci: harden Gradle coverage cleanup
takemiyamakoto Jul 30, 2026
a34c79b
fix: clean generated coverage before IAS source checks
takemiyamakoto Jul 30, 2026
921da5f
ci: normalize IAS signer certificate export
takemiyamakoto Jul 30, 2026
b3e924b
fix(android): harden WalletConnect startup and IAS qualification
takemiyamakoto Jul 30, 2026
c2bd3b5
fix(android): harden IAS isolation and deferred registration
takemiyamakoto Jul 30, 2026
5d0b3c7
test(android): harden IAS read-only race fixtures
takemiyamakoto Jul 30, 2026
a00e9e1
fix(ci): replace blocked Android emulator action
takemiyamakoto Jul 30, 2026
f8c13d8
fix(ci): harden first-party emulator setup
takemiyamakoto Jul 30, 2026
4a1e69d
fix(build): verify cold dependency metadata
takemiyamakoto Jul 30, 2026
ca85460
fix(ci): install emulator runtime libraries
takemiyamakoto Jul 30, 2026
b032eae
fix(ci): inspect emulator backend with SDK libraries
takemiyamakoto Jul 30, 2026
dbca43c
test(runtime): make cache-miss verification deterministic
takemiyamakoto Jul 30, 2026
7f6cbc0
build: trust JUnit BOM module metadata
takemiyamakoto Jul 30, 2026
cbb9f34
ci: stage portable Android migration evidence
takemiyamakoto Jul 30, 2026
bcce813
docs: document portable migration evidence
takemiyamakoto Jul 30, 2026
6d19fac
ci: distinguish minified AAB metadata policy
takemiyamakoto Jul 30, 2026
f897c23
test: cover AAB synthesis boundaries
takemiyamakoto Jul 30, 2026
94b7a36
fix(android): consolidate migration-safe production release
takemiyamakoto Jul 31, 2026
7f3745c
fix(android): restore migration instrumentation source
takemiyamakoto Jul 31, 2026
9f5fd7e
fix(android): accept released migration cohorts safely
takemiyamakoto Jul 31, 2026
f523247
ci(android): reconcile frozen release evidence controls
takemiyamakoto Aug 1, 2026
0673f02
feat(android): integrate production readiness candidate
takemiyamakoto Sep 23, 2026
7398b61
docs(android): align release handoff with pinned Utils source
takemiyamakoto Sep 23, 2026
401d678
fix(ci): reconcile guarded release checkout inventory
takemiyamakoto Sep 23, 2026
20c0ac2
fix(ci): scope dependency audits and require mutation module tests
takemiyamakoto Sep 23, 2026
2bf8236
Restore Android static analysis and preflight IAS Git inputs
takemiyamakoto Sep 23, 2026
27d0379
Sanitize native passkey PRF results and serialize Iroha bridge audit
takemiyamakoto Sep 23, 2026
1a02c87
Guard local passkey PRF result from reflection serialization
takemiyamakoto Sep 23, 2026
0986721
fix(android): scope balanced line break lint compatibility
takemiyamakoto Sep 23, 2026
2a23224
Bind Android Drive backup operations to selected account and complete…
takemiyamakoto Sep 23, 2026
e119f19
Add disabled cross-platform passkey backup key wrapper primitive
takemiyamakoto Sep 23, 2026
0052fbe
Serialize passkey key wrappers and fix Android analysis
takemiyamakoto Sep 23, 2026
8ca7af2
Pin passkey HKDF exception in MoonPay secret audit
takemiyamakoto Sep 23, 2026
53d03b8
Add bounded WebAuthn PRF request options for portable backup
takemiyamakoto Sep 23, 2026
b322702
Bind local passkey PRF result to canonical credential identity
takemiyamakoto Sep 23, 2026
a8f2164
fix(backup): bind Drive requests to verified Google subject
takemiyamakoto Sep 23, 2026
8289942
feat(backup): add immutable Drive generation primitives
takemiyamakoto Sep 23, 2026
28562e0
feat(backup): require durable generation journal before upload
takemiyamakoto Sep 23, 2026
4c0d21c
Verify Drive account before Android upload admission
takemiyamakoto Sep 23, 2026
b93ce04
Verify journaled Drive generations before local recovery evidence
takemiyamakoto Sep 23, 2026
97bf278
Wait for emulator process-group isolation in CI
takemiyamakoto Sep 23, 2026
774ea1e
Accept consolidated worktrees in Android private overlay audit
takemiyamakoto Sep 23, 2026
62a6e57
Isolate private overlay Git inspection from ambient overrides
takemiyamakoto Sep 23, 2026
84c1d31
Correct Android migration gate count in release notes
takemiyamakoto Sep 23, 2026
8f9e2bd
Bind Android PRF assertions to credential-directed challenges
takemiyamakoto Sep 23, 2026
36a8c25
fix(android): satisfy passkey recovery static analysis
takemiyamakoto Sep 23, 2026
ea271c8
fix(android): bind unverified passkey rollback confirmation
takemiyamakoto Sep 23, 2026
94d994b
Block legacy Drive backup replacement
takemiyamakoto Sep 23, 2026
a102e48
fix: verify Android passkey backup after Drive upload
takemiyamakoto Sep 23, 2026
b323863
Bind Android backup restore reads to authenticated owner head
takemiyamakoto Sep 23, 2026
64ce2dd
Verify passkey generation with local PRF and wallet evidence
takemiyamakoto Sep 23, 2026
2ae7fe4
Preserve independent EVM key in legacy Google backup restore
takemiyamakoto Sep 23, 2026
49f58b4
Add fail-closed Android wallet material preflight
takemiyamakoto Sep 23, 2026
b15644d
Reject inexact XCM amounts at final transfer boundary
takemiyamakoto Sep 23, 2026
d086e85
Validate XCM confirmation with exact transfer units
takemiyamakoto Sep 23, 2026
7fbee1d
Make XCM amount property exact at every call site
takemiyamakoto Sep 23, 2026
93b58fc
Remove resolved XCM TODO from debt baseline
takemiyamakoto Sep 23, 2026
c705fe7
feat: capture versioned Android wallet material draft
takemiyamakoto Sep 23, 2026
86b4989
Capture guarded Android V1 wallet material in portable draft
takemiyamakoto Sep 23, 2026
a790e91
Define bounded local wallet material envelope
takemiyamakoto Sep 23, 2026
4895a51
Hide XCM send action when submission is unauthorized
takemiyamakoto Sep 23, 2026
3c43d9b
Validate XCM origin fees against the exact utility asset
takemiyamakoto Sep 23, 2026
08ed3f0
Add candidate portable semantic wallet material codec
takemiyamakoto Sep 23, 2026
7f0a04a
Restrict portable TON material to released V4R2 contract
takemiyamakoto Sep 23, 2026
ca12af9
Project guarded Android drafts into portable wallet material
takemiyamakoto Sep 23, 2026
33aa779
Record forward-only Android wallet custody provenance for portable dr…
takemiyamakoto Sep 24, 2026
23dab91
Prove Android portable wallet root signing identities
takemiyamakoto Sep 24, 2026
b1ff709
Verify iOS Substrate root formats in Android portable proof
takemiyamakoto Sep 24, 2026
1bb014a
feat: retain blocked portable receive intents
takemiyamakoto Sep 24, 2026
29bbd53
Add guarded Android cohort after-image schema
takemiyamakoto Sep 24, 2026
38b3e0a
Align Android migration evidence gate with schema 78
takemiyamakoto Sep 24, 2026
a1e7546
Add fail-closed Android portable cohort journal staging
takemiyamakoto Sep 24, 2026
e035326
Prove Android V2 chain original keys before receive
takemiyamakoto Sep 24, 2026
4e812d5
test(android): align migration assertions with schema 78
takemiyamakoto Sep 24, 2026
df22529
Add read-only Asset Hub USDt XCM gap inventory
takemiyamakoto Sep 24, 2026
1f52285
fix: use portable grep in XCM discovery CI test
takemiyamakoto Sep 24, 2026
4455185
Migrate Android Etherscan history to V2 with safe retries
takemiyamakoto Sep 24, 2026
72a4991
Preserve independent Android history providers on known chains
takemiyamakoto Sep 24, 2026
bbd9f34
Normalize Android history hosts before chain binding
takemiyamakoto Sep 24, 2026
9180bc5
fix: preserve Android history errors and X Layer explorer routes
takemiyamakoto Sep 24, 2026
0cc6614
fix: migrate Kaia history to chain-bound KaiaScan OAPI
takemiyamakoto Sep 24, 2026
83cf8a5
feat: project portable wallet cohort storage intents
takemiyamakoto Sep 24, 2026
32a2cf5
feat: project fresh restore wallet positions
takemiyamakoto Sep 24, 2026
448017a
feat: stage Android portable cohorts with reserved IDs
takemiyamakoto Sep 24, 2026
5b326c6
feat: reserve portable receive wallet IDs in Room
takemiyamakoto Sep 24, 2026
215d5a6
Fence abandoned portable wallet reservations with Room tombstones
takemiyamakoto Sep 24, 2026
29c49af
Keep migration safety tests bound to current schema version
takemiyamakoto Sep 24, 2026
ab6fb58
feat: add guarded passkey generation readback
takemiyamakoto Sep 24, 2026
a1338aa
Add disabled Android Play Integrity bootstrap request binding
takemiyamakoto Sep 24, 2026
137046b
Consume Android recovery PRF only after verified assertion
takemiyamakoto Sep 24, 2026
d30e027
Bind Android restore reservations to portable wallet origins
takemiyamakoto Sep 24, 2026
4aeec85
feat: stage encrypted portable original-source sidecar
takemiyamakoto Sep 24, 2026
f38a572
feat: add disabled Android owner passkey authentication client
takemiyamakoto Sep 24, 2026
8dd0378
feat: add disabled authenticated backup head reader
takemiyamakoto Sep 24, 2026
41b4c91
Add disabled owner backup generation metadata client
takemiyamakoto Sep 24, 2026
726884c
Add disabled verified Android backup generation promotion
takemiyamakoto Sep 24, 2026
9cddc56
Update wallet migration instrumentation for schema 80
takemiyamakoto Sep 24, 2026
374da84
Add disabled Android first-owner bootstrap candidate
takemiyamakoto Sep 24, 2026
68a4c3f
Gate first Android backup PRF on verified owner assertion
takemiyamakoto Sep 24, 2026
3817366
Prepare verified first passkey backup generation
takemiyamakoto Sep 24, 2026
fb2600d
feat: verify exact Android V3 portable root sources
takemiyamakoto Sep 24, 2026
4aa2ab9
Add fail-closed historical Android source proof
takemiyamakoto Sep 24, 2026
d6efdde
Clarify Android historical proof coverage
takemiyamakoto Sep 24, 2026
92dae82
feat: prove mixed Android wallet source cohorts
takemiyamakoto Sep 24, 2026
d540071
feat: capture verified Android wallet source cohorts
takemiyamakoto Sep 24, 2026
a74da1e
fix: reject globally orphaned wallet secret namespaces
takemiyamakoto Sep 24, 2026
2587da9
Preserve Android wallet display metadata in portable capture
takemiyamakoto Sep 25, 2026
54bb334
feat: preserve Android asset presentation in portable export
takemiyamakoto Sep 25, 2026
6f502d5
fix: verify Android watch identities before portable export
takemiyamakoto Sep 25, 2026
1093b13
fix: validate incoming watch identities before cohort staging
takemiyamakoto Sep 25, 2026
da0331f
fix: verify iOS TON watch JSON with shared V4R2 proof
takemiyamakoto Sep 25, 2026
56ca84b
fix: require approved Substrate genesis for received watch chains
takemiyamakoto Sep 25, 2026
b970980
fix: bind staged recovery cohorts to receiving chain policy
takemiyamakoto Sep 25, 2026
5e8b36a
fix: simplify coroutine checks and erase undelivered plaintext
takemiyamakoto Sep 28, 2026
8b38ca5
fix: restore missing universal wallet accounts on Android
takemiyamakoto Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .github/release/android-tag-signer-fingerprints.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Fail-closed production contract.
#
# Replace the line below, in a reviewed pull request, with the exact
# `ssh-keygen -l -E sha256` fingerprint authorized to sign Android release
# tags. Exactly one canonical SHA256 fingerprint is allowed. The matching
# one-line OpenSSH Ed25519 public key must be stored as one-line base64 in the
# ANDROID_RELEASE_TAG_SIGNER_PUBLIC_KEY_B64 GitHub Actions repository variable.
UNCONFIGURED_ANDROID_RELEASE_TAG_SIGNER_FINGERPRINT
232 changes: 209 additions & 23 deletions .github/workflows/android-ci.yml

Large diffs are not rendered by default.

1,849 changes: 1,849 additions & 0 deletions .github/workflows/android-internal-app-sharing.yml

Large diffs are not rendered by default.

2,207 changes: 2,110 additions & 97 deletions .github/workflows/android-release.yml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .github/workflows/branch-flow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4

- name: Branch flow audit self-test
run: bash scripts/test-branch-flow-audit.sh
Expand Down
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
app/src/main/aidl/
app/*.apk
/.idea/
__pycache__/
*.pyc

# ignore jacoco coverage reports
/coverage
Expand All @@ -26,3 +28,19 @@ debug-keystore.jks
*.pem
/.release-overlays/
/buildSrc/build

# Local temporary files and generated review artifacts
/tmp/
/.tmp/
/tmp-*/
/.tmp-*/
*.tmp
/output/
/.playwright-cli/
/playwright-report/
/test-results/
/review-output/
/review-artifacts/
# Dated local acceptance and review reports
/docs/validation/20*/
/docs/legacy-upgrade-audit-20*.md
33 changes: 26 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,22 @@
[![Android CI](https://github.com/soramitsu/fearless-Android/actions/workflows/android-ci.yml/badge.svg)](https://github.com/soramitsu/fearless-Android/actions/workflows/android-ci.yml)

## Project Structure & Modules
- `app/`: Android app entry; build types `debug/release/staging/develop/pr`.
- `app/`: Android app entry; build types
`debug/release/internalAppSharing/staging/develop/pr`.
`internalAppSharing` is a CI-only smoke variant signed by a run-bound
ephemeral Android Debug JKS; it is not a production distribution path. Its
Google Services task reads the checksum-pinned release placeholder directly,
and `app/src/internalAppSharing` must never be created.
- `feature-*/`: Split by domain with `-api` and `-impl` modules (e.g., `feature-wallet-api`, `feature-wallet-impl`).
- `core-api/`, `core-db/`, `runtime/`, `runtime-permission/`, `common/`: Shared foundations.
- `test-shared/`: Test-only utilities reused across modules.
- `buildSrc/`, `detekt/`, `scripts/`, `docs/`: Gradle plugins/config, static analysis, helper scripts, documentation.
- Per-module sources: `src/main/java|kotlin`, resources `src/main/res`, unit tests `src/test`, instrumentation tests `src/androidTest`.

## Build, Test, and Dev Commands
- Build app (APK): `./gradlew :app:assembleDebug` (use `assembleRelease` for release).
- Build a local debug APK: `./gradlew :app:assembleDebug`. Release artifacts
must follow the protected, source-bound procedure in
`docs/releases/PROCESS.md`; do not invoke a local release task for distribution.
- Full build + checks: `./gradlew clean build`.
- Static analysis: `./gradlew detektAll` (auto-fix formatting: `./gradlew detektFormat`).
- Unit tests (aggregated): `./gradlew runTest` (runs detekt, unit tests, JaCoCo report).
Expand Down Expand Up @@ -56,11 +63,23 @@
## Security & Configuration
- Secrets are read via `scripts/secrets.gradle`; set in env vars or `local.properties` (see `README.md`).
- Do not commit keys, keystores, provisioning files, or `local.properties`.
- Polkadot runtime sources: to align with a specific Polkadot SDK release (e.g., `polkadot-stable2503`), you can override chain/type registries without code changes:
- `TYPES_URL_OVERRIDE`, `DEFAULT_V13_TYPES_URL_OVERRIDE`, `CHAINS_URL_OVERRIDE`
- Internal App Sharing must run only through the dedicated
`android-internal-app-sharing.yml` CI path. Generate a new mode-`0600` JKS and
bind its certificate SHA-256 for that run; never commit or reuse the private
key. PR runs are non-distributable validation only and must not upload an
artifact. Only a manual run of the first-party workflow from the protected,
merged, current `develop` head may retain a seven-day verified GitHub Actions
handoff. The workflow must never upload to Google/Play or mutate a Play track.
Because IAS uses fake/empty public Firebase and OAuth values, do not claim it
qualifies live Firebase, Google sign-in, Drive/passkey backup, or restore.
When versioning changes, update the workflow/verifier hardcodes for
`4.2.0-ias` / `230` in the same reviewed commit.
- Polkadot runtime sources: to align debug builds with a specific Polkadot SDK release (e.g., `polkadot-stable2503`), you can override chain/type registries without code changes:
- `TYPES_URL_OVERRIDE`, `DEFAULT_V13_TYPES_URL_OVERRIDE`, `CHAINS_URL_DEBUG_OVERRIDE`
- Release chain discovery is intentionally pinned to the canonical production URL and does not accept a chain-registry override.
- Example in `local.properties`:
- `TYPES_URL_OVERRIDE=https://.../all_chains_types_android.json`
- `CHAINS_URL_OVERRIDE=https://.../chains.json`
- `CHAINS_URL_DEBUG_OVERRIDE=https://.../chains.json`
- After updating, run `./gradlew detektAll runTest :app:lint`.
- Library version pinning: to use a specific `shared_features` version compatible with a Polkadot SDK release, set
- `SHARED_FEATURES_VERSION_OVERRIDE=1.x.y`
Expand All @@ -69,12 +88,12 @@
## Local Properties (private)
- Create a root-level `local.properties` with the required secrets and service credentials. Do NOT commit this file.
- See `docs/samples/local.properties.example` and create a private `local.properties` at the repo root; replace placeholders with your real values.
- Typical keys include: MoonPay, X1 plugin, Google Web Client IDs, Ethereum providers (Blast, Etherscan/BscScan/PolygonScan/OKLink), WalletConnect, Alchemy, Dwellir, TON API.
- Typical keys include: MoonPay publishable keys, X1 plugin, Google Web Client IDs, Ethereum providers (Blast, Etherscan/BscScan/PolygonScan/OKLink), WalletConnect, Alchemy, Dwellir, TON API. Never put a MoonPay server secret in Android configuration.
- Formats: use `key=value` per line; avoid trailing spaces. Strings may be unquoted; if values contain special characters or spaces, wrap in double quotes. Set `sdk.dir=/absolute/path/to/Android/sdk` to avoid SDK lookup errors.
- Runtime overrides (mirrors recommended for first run):
- `TYPES_URL_OVERRIDE=https://cdn.jsdelivr.net/gh/soramitsu/shared-features-utils@master/chains/all_chains_types_android.json`
- `DEFAULT_V13_TYPES_URL_OVERRIDE=https://cdn.jsdelivr.net/gh/soramitsu/shared-features-utils@master/chains/default_v13_types.json`
- `CHAINS_URL_OVERRIDE=https://cdn.jsdelivr.net/gh/soramitsu/shared-features-utils@master/chains/v13/chains.json`
- `CHAINS_URL_DEBUG_OVERRIDE=https://cdn.jsdelivr.net/gh/soramitsu/shared-features-utils@master/chains/v13/chains.json`
- Verify config: `./gradlew printPolkadotSdkAlignment` prints effective URLs and any shared_features pin before you run the app/tests.

## Utils Integration
Expand Down
19 changes: 17 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,23 @@ All notable changes to this project will be documented in this file.

## 4.2.0

- Promote stable from 4.2.0‑beta.1; no functional differences
- Wallet safety: replace destructive database fallback with a complete,
fail-closed Room migration path and bounded recovery for incompatible legacy
wallet records.
- Startup recovery: distinguish retryable secure-storage failures, permanent
key loss, database failures, and restart-required state before PIN, export,
signing, or the wallet UI can open.
- Lifecycle stability: discard incompatible saved fragment state at the wallet
gate and restore security/export warnings through FragmentManager-safe
constructors.
- WalletConnect stability: defer Reown delegate registration until both clients
are ready, retry partial initialization safely, and keep startup, session
lookups, pairing, and actions nonfatal when the optional SDK is unavailable.
- Release safety: add an isolated, source-bound Internal App Sharing candidate
lane with zero-copy Firebase input, external one-run signing, and adversarial
artifact verification.
- Transfers: reject Bitcoin and Solana amounts outside the signed 64-bit range
before any network or broadcast call.

## 4.2.0‑beta.1

Expand All @@ -14,4 +30,3 @@ All notable changes to this project will be documented in this file.
- Platform: Android toolchain upgrades to meet Play requirements
- CI/CD: NDK r28; native libs verification; Polkadot alignment printing; Jenkins stability
- Fixes: banner closing (FLW‑5177); Ethereum recipient validation; confirmation/warnings UX; UI tweaks

Loading
Loading