74 Commits

Author SHA1 Message Date
pezkuwichain c965746f8f fix: use commit-count based versionCode to prevent downgrade on Firebase
CI_BUILD_ID was using github.run_number which is per-workflow, causing
different workflows to produce different versionCodes (144 vs 9).
Now computed from git commit count + offset, consistent across all workflows.
Also added bundle task to local auto-increment.
2026-03-10 02:18:55 +03:00
pezkuwichain 8d150266fb fix: detect on-chain dispatch errors for citizenship and staking extrinsics
Switch from submitExtrinsic (fire-and-forget) to submitExtrinsicAndAwaitExecution
which waits for block inclusion and checks ExtrinsicFailed events. Previously the
app showed success even when pallet-level errors occurred (e.g. ReferrerNotCitizen,
AlreadyExists). Now dispatch errors are properly surfaced to the user.
2026-03-09 02:46:49 +03:00
pezkuwichain 44fd64496b feat: add complete Pezkuwi/citizenship translations to all 14 languages
Added (KYC) suffix to Apply&Actions button label in all languages.
Added ~29 missing citizenship and dashboard string keys to 12 languages
that were missing them (ru, es, pt, fr, it, ko, ja, zh-rCN, in, vi, hu, pl).
Added 3 missing dashboard keys to TR and KU.
2026-03-08 23:57:41 +03:00
pezkuwichain 84d0f39f8a fix: replace setFragmentResult with interface callback for citizenship dismiss
setFragmentResult API not available in this project. Use CitizenshipDismissListener
interface instead for parent-child fragment communication.
2026-03-08 19:06:21 +03:00
pezkuwichain 138c0199c9 fix: auto-refresh Pezkuwi dashboard card after actions
Add dashboardRefreshSignal to trigger re-fetch on swipe-to-refresh,
onResume, citizenship bottom sheet dismiss, and score tracking.
Rename button label to "Apply & Actions (KYC)" for clarity.
2026-03-08 17:32:40 +03:00
pezkuwichain cbce1070b4 Bump version to 1.0.1 and add release notes 2026-03-05 16:46:23 +03:00
pezkuwichain ba057617d3 fix: ktlint multiline-if-else braces in PezkuwiDashboardAdapter 2026-03-05 02:40:08 +03:00
pezkuwichain 91f2b5d254 feat: add Start Tracking button for StakingScore on dashboard
Query StakingScore::StakingStartBlock from People Chain to check
tracking status. Show "Start Tracking" button for approved citizens
who haven't opted in yet. Submits start_score_tracking() extrinsic
with loading state and error handling to prevent duplicate calls.
2026-03-05 02:33:31 +03:00
pezkuwichain 6939dfd4c3 Fix auto-pr to not fail when branches are already in sync 2026-03-02 15:08:24 +03:00
pezkuwichain 2177683838 Replace force-push sync with PR-based auto-merge workflow 2026-03-02 14:22:29 +03:00
pezkuwichain 81b0491691 fix: use safe call for nullable String in ifBlank 2026-03-01 22:22:41 +03:00
pezkuwichain 5705d0d578 fix: resolve citizenship bottom sheet not opening on button tap
Event(null) was swallowed by EventObserver's ?.let pattern, preventing
the CitizenshipBottomSheet from opening when tapping dashboard buttons.
Changed to Event("") with ifBlank conversion to preserve null referrer
semantics while ensuring the observer callback fires.
2026-03-01 22:08:19 +03:00
pezkuwichain d33a0a6289 fix: use https telegram link in dashboard share referral button 2026-02-28 04:22:16 +03:00
pezkuwichain 5771fbc10b fix: use https telegram link instead of custom scheme for sharing
Custom scheme pezkuwiwallet:// is not clickable in WhatsApp and
other messaging apps. Use https://t.me/pezkuwichainBot?start=ADDRESS
which is universally clickable and auto-fills the referrer field.
2026-02-28 02:40:06 +03:00
pezkuwichain 66be33c43e fix: disable referrer input when pre-filled from deep link
Prevent user from editing or clearing the referrer address when it
comes from a referral deep link to ensure correct on-chain submission.
2026-02-28 02:00:08 +03:00
pezkuwichain 33c6559a41 fix: connect referral link to blockchain via deep link handler
When Alice shares a referral link, it now generates a deep link URL
(pezkuwiwallet://pezkuwi/open/citizenship?referrer=address) that
auto-opens the citizenship form with Alice's address pre-filled as
the referrer, fixing the bug where referrer defaulted to founder.
2026-02-27 22:11:34 +03:00
pezkuwichain 894e5dac22 fix: prevent staking dashboard hang when exposure flag not cached
isPagedExposuresUsed() called storageCache.getEntry() which suspends
forever if the entry doesn't exist. The flag is only written by
ValidatorExposureUpdater (staking detail flow), so the dashboard
would hang indefinitely waiting for it.

Check cache first with isFullKeyInCache() and default to paged
exposures when the flag is absent. Also remove debug log statements.
2026-02-27 13:41:26 +03:00
pezkuwichain 2d0d46688e fix: save exposure flag for uncertain state to prevent setup screen hang
When neither paged nor legacy exposures exist for the current era,
ValidatorExposureUpdater returned early without saving the
PagedExposuresUsed flag. This caused storageCache.getEntry() to
suspend indefinitely, blocking the staking setup screen.

Save the flag as false for UNCERTAIN state so downstream code
can proceed with empty exposure data instead of hanging.
2026-02-27 04:30:53 +03:00
pezkuwichain 40f1b9bcaa fix: correct Google OAuth client ID and add auth diagnostics
- Updated RELEASE_GOOGLE_OAUTH_ID GitHub secret to use web client ID
  (client_type 3) instead of Android client ID (client_type 1).
  requestIdToken() requires the web/server client ID.
- Added diagnostic logging to Google Sign-In flow to capture exact
  error codes (ApiException statusCode) and OAuth client ID in use.
2026-02-27 00:44:36 +03:00
pezkuwichain ef1c71a320 style: fix ktlint formatting in staking dashboard logs 2026-02-26 23:50:34 +03:00
pezkuwichain 415085b0d5 fix: prevent staking dashboard crash from missing assets
- Replace assets.getValue() with safe access in addPricesToDashboard
  to prevent NoSuchElementException crash that kills the entire
  dashboard flow when any chain asset is missing from the DB
- Log exception details in chain updater catch blocks (was only
  logging chain name, swallowing the actual error)
- Add diagnostic logging to track dashboard item counts and missing
  assets for debugging
2026-02-26 22:38:18 +03:00
pezkuwichain 2374dac2ad fix: prevent staking dashboard infinite loading
- Add maxAttempts parameter to retryUntilDone (default unlimited for
  backward compat), use 5 retries for staking stats fetch
- Catch fetchStakingStats failure in dashboard update system and
  fallback to empty stats instead of hanging forever
- Restore stale scope detection in ComputationalCache so cancelled
  aggregate scopes are recreated instead of returning stale entries
2026-02-26 20:49:12 +03:00
pezkuwichain 853bbf567e fix: auto-detect sdkmanager path for self-hosted runners 2026-02-26 13:38:30 +03:00
pezkuwichain 2462c2b306 fix: resolve CI workflow failures across multiple jobs
- balances_test: update macos-13 → macos-14 (13 no longer supported)
- balances_test: fix null branch ref on schedule triggers
- balances_test: fix typo anroid-results → android-results
- install: fix broken NDK path reference (steps.setup-ndk not defined)
- install: use cmdline-tools/latest instead of hardcoded 16.0
- Created pezkuwichain/balances_test_result repo with gh-pages
- Added ACTIONS_DEPLOY_KEY secret for report deployment
2026-02-26 13:29:43 +03:00
pezkuwichain e43bb7a595 fix: enable full debug symbols in Rust native bindings
Add debug = 2 to release profile in all three Rust binding crates
so AGP can generate native-debug-symbols.zip for Play Store.
Also updated RELEASE_GOOGLE_OAUTH_ID secret to correct Android
client ID (was incorrectly set to Web client type).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 23:24:26 +03:00
pezkuwichain 49bbb8cf51 fix: enable native debug symbols for Play Store
Set strip = false in all Rust binding Cargo.toml files so AGP can
extract debug symbols before stripping for the final APK.
Previously strip = "debuginfo" removed symbols during Rust compilation,
leaving nothing for AGP's debugSymbolLevel = FULL to extract.
2026-02-24 23:06:31 +03:00
pezkuwichain 8da8dd0088 fix: preserve symbol tables in Rust bindings for Play Store debug symbols
Rust Cargo.toml had strip=true which removes ALL symbols including the
symbol table needed by AGP to generate native-debug-symbols.zip for
Play Store. Changed to strip="debuginfo" which keeps symbol tables
(needed for crash symbolication) but removes debug info (keeps .so small).

Also made debugSymbols conditional in distribute workflow so missing
symbols don't fail the upload.
2026-02-24 20:51:08 +03:00
pezkuwichain abc624b57a fix: remove debugSymbols from Play Store upload
Build doesn't generate native debug symbols artifact, causing the
Market publication step to fail with ENOENT. Remove the parameter
to unblock the upload. Debug symbols can be added back when NDK
symbols are actually generated.
2026-02-24 20:45:26 +03:00
pezkuwichain d8810676a6 ci: upload native debug symbols to Play Store
Add native debug symbols artifact to build workflow and download/attach
them in the distribute workflow to resolve Play Console warning.
2026-02-24 20:09:31 +03:00
pezkuwichain e6a087f907 ci: change Play Store track from production to alpha for closed testing 2026-02-24 19:04:01 +03:00
pezkuwichain c30cdf2411 build: add native debug symbols for releaseMarket 2026-02-24 18:20:18 +03:00
pezkuwichain f746697d57 ci: remove unused setvars step from Play Store workflow
The tw3lveparsecs/github-actions-setvars action was loading env vars
from variables/android.env that are never referenced in this workflow.
It caused a build failure when GitHub services were unavailable.
2026-02-24 10:03:33 +03:00
pezkuwichain 94a567c672 fix: prevent crash when DApp address fails SS58/Ethereum decode
Wrap accountId() in runCatching with fallback for addresses that
cannot be decoded as either SS58 or Ethereum format. Prevents
InvalidChecksumException crash when DApp sends an address with
an unrecognized format to the external signing flow.
2026-02-24 09:33:36 +03:00
pezkuwichain e13cb18576 ci: fix Play Store workflow for AAB submission
- Switch from assembleReleaseMarket (APK) to bundleReleaseMarket (AAB)
  Google Play requires AAB for new app submissions since August 2021
- Add bundle and mapping artifact uploads to reusable build workflow
- Fix mapping file path: release → releaseMarket
- Remove debugSymbols (not included in build artifact)
- Remove userFraction (incompatible with draft status)
- Remove whatsnew-ku (Play Store does not support Kurdish locale)
- Add if-no-files-found: ignore to APK upload for bundle-only builds
2026-02-24 08:11:05 +03:00
pezkuwichain 7a1e7d8270 fix: Era type encoding, CheckMortality cleanup, and release log guard
- Add Era AliasTo in PezkuwiPathTypeMapping for correct SCALE encoding
- Remove redundant isPezkuwi CheckMortality logic from ExtrinsicBuilderFactory
  and PolkadotExternalSignInteractor (standard path now works for all chains)
- Remove payload/signature hex logs from PezkuwiKeyPairSigner (security)
- Wrap debug logs with BuildConfig.DEBUG in PezkuwiKeyPairSigner,
  MetadataShortenerService, and WalletConnectSessionsEvent
2026-02-24 04:25:37 +03:00
pezkuwichain 8ed1909dc1 fix: use PezkuwiCheckMortality for WalletConnect sign requests
PolkadotExternalSignInteractor and ExtrinsicSplitter were using standard
CheckMortality which fails with pezsp_runtime DictEnum Era type.
Added isPezkuwiChain detection and routing to custom extensions.
2026-02-23 08:29:51 +03:00
pezkuwichain a1ce3137a1 i18n: add Turkish and Kurdish release notes for Play Store 2026-02-23 02:44:43 +03:00
pezkuwichain 611a55599c ci: switch push workflow from debug to releaseMarket build 2026-02-22 18:11:43 +03:00
pezkuwichain ff19f88323 ci: run CodeQL on self-hosted runner (push only, not PRs) 2026-02-22 16:42:11 +03:00
pezkuwichain 652913da35 ci: mark CodeQL as non-blocking due to runner memory limits 2026-02-22 16:08:01 +03:00
pezkuwichain 8760a0b9da ci: add google-services.json setup to security workflow for CodeQL build 2026-02-22 05:44:03 +03:00
pezkuwichain 61451ca178 ci: fix security workflow - add secrets, install action, remove continue-on-error 2026-02-22 05:36:04 +03:00
pezkuwichain 31e0dcadb7 ci: use shared install action for code-quality workflow (NDK required) 2026-02-22 05:27:31 +03:00
pezkuwichain c794cbe5c4 ci: pass secrets to code-quality workflow and enforce ktlint 2026-02-22 05:25:24 +03:00
pezkuwichain b9fadbe6da fix: remove unused imports to pass ktlint 2026-02-22 05:15:10 +03:00
pezkuwichain 771c9c8877 feat: in-app citizenship application with referral system
- Add CitizenshipBottomSheet with form (name, father, grandfather, mother, tribe, region)
- Submit apply_for_citizenship extrinsic with referrer parameter to People Chain
- Query KYC status from IdentityKyc pallet and show appropriate UI state
- Referrer approval: query Referral + Applications entries, approve pending referrals
- Sign (confirm_citizenship) for applicants after referrer approval
- Share referral link for citizens to invite others
- Dashboard buttons adapt to citizenship status (hide Apply/Sign when approved)
- Balance check (1.1 HEZ) only before new applications, not for sign/approve
- i18n strings for en, tr, ku
2026-02-22 05:04:43 +03:00
pezkuwichain f6dc35b80e i18n: add missing Turkish translations, fix Kurdish action strings
Turkish: add Send, Receive, Buy, Sell, Swap, Bridge and related strings
Kurdish: translate Buy, Sell, Swap, Buy/Sell from English to Kurdish
2026-02-21 23:40:01 +03:00
pezkuwichain 11fd0a5d10 ci: copy PROD google-services.json to all release build types
releaseMarket and releaseGithub build types need their own copy
of the production google-services.json. Without this, the
google-services plugin falls back to the dev config in app/,
causing Google Sign-In to fail on release builds.
2026-02-21 23:07:15 +03:00
pezkuwichain 233d06da12 ci: use release Firebase credential for releaseMarket builds 2026-02-21 21:09:55 +03:00
pezkuwichain 11159e4ba9 ci: add release build support to Firebase distribution workflow
Support both develop and releaseMarket variants via build_variant
input. Release builds are signed with market_key and distributed
to testers for validation before Play Store upload.
2026-02-21 20:14:00 +03:00
pezkuwichain 7dbfc3b85e ci: use CREDENTIAL_FILE_CONTENT for Play Store upload 2026-02-21 19:42:01 +03:00
pezkuwichain 37829e30f0 style: fix ktlint no-multi-spaces violations in BridgeViewModel 2026-02-21 18:46:37 +03:00
pezkuwichain e06c5379dd config: remove staking endpoints from relay chain
Staking lives on Asset Hub, not relay chain. Remove staking and
staking-rewards SubQuery endpoints from relay chain config.
2026-02-21 18:17:02 +03:00
pezkuwichain 7f00c98359 fix: governance voting and default chain selection for Pezkuwi
Add pezpallet_* type paths to SiVoteTypeMapping so ConvictionVoting
vote encoding works on Pezkuwi chains. Set Pezkuwi relay as preferred
default chain for governance and crowdloan screens.
2026-02-20 05:16:04 +03:00
pezkuwichain eb2c6cda55 feat: add copy button to seed phrase backup screen
Allow users to copy their mnemonic phrase to clipboard from the manual
backup screen for easier migration to Welati Telegram mini app.
2026-02-20 05:15:47 +03:00
pezkuwichain 03075104b4 fix: reduce false positives in hardcoded secrets scan 2026-02-19 06:30:18 +03:00
pezkuwichain 3061555485 ci: add Code Quality and Security workflows (ktlint, CodeQL, secret scan) 2026-02-19 05:56:11 +03:00
pezkuwichain 6a16d0a04e config: update chains.json with governance-delegations endpoint 2026-02-19 01:43:27 +03:00
pezkuwichain 359cfb1eb3 fix: correct Welati counter URL to telegram.pezkiwi.app 2026-02-18 07:01:20 +03:00
pezkuwichain 326aa869ed fix: update Welati counter URL to telegram.pezkuwi.app/kurds 2026-02-18 06:58:09 +03:00
pezkuwichain 533aa9e831 feat: replace dashboard image with Welati counter (Hejmara Kurd Le Cihane)
Remove telegram_welcome image from dashboard card, add live Welati
citizen count fetched from kurds-counter API endpoint. Shows formatted
count with "Hejmara Kurd Le Cihane" label in green.
2026-02-18 06:52:01 +03:00
pezkuwichain d7f515aab2 config: update AH SubQuery URL to dedicated endpoint
Asset Hub staking/history/rewards queries now use
subquery.pezkuwichain.io/assethub for correct schema routing
2026-02-18 04:10:13 +03:00
pezkuwichain 14519d7818 Fix Polkadot staking, add USDT bridge, update dashboard card
- Restore staking module to Nova upstream (fix Polkadot ACTIVE/shimmer)
- Add USDT(DOT) <-> USDT(HEZ) bridge option to Buy/Sell screen
- Dashboard card: add telegram_welcome image, info text, Non-Citizen role
- Add non-citizen info text to all 12 locale files
- Simplify ComputationalCache (remove stale scope recreation)
2026-02-18 02:43:53 +03:00
pezkuwichain 9c7bb7c6e9 Prepare for Play Store release: simplify dashboard, clean debug logs
- Simplify dashboard card: remove referral/staking/perwerde fields (not yet on-chain), keep roles + trust score + action button
- Remove all debug Log.d/e/w calls added during development (PEZ_STAKE, RuntimeFactory, ExtrinsicBuilder, etc.)
- Change Play Store track from beta to production
- Add release notes (whatsnew-en-US)
2026-02-17 06:13:59 +03:00
pezkuwichain 93e94cbf15 feat: add Pezkuwi Dashboard card with live People Chain data
- Dashboard card on Assets page showing roles, trust score, referral,
  staking, and perwerde points from People Chain pallets
- Repository queries: Tiki, Trust, Referral, StakingScore, Perwerde
- CachedStakingDetails double map query (RelayChain + AssetHub sources)
- Full i18n support across all 15 locales including new Turkish locale
- "Apply & Actions" button opens Telegram bot
- Staking improvements for split ecosystem multi-endpoint stats
2026-02-17 00:10:23 +03:00
pezkuwichain 9899bb5c40 feat: multi-endpoint staking stats for split ecosystems 2026-02-16 06:16:26 +03:00
pezkuwichain 0a95d04e45 update Pezkuwi genesis hashes for mainnet relaunch
Update all hardcoded chain IDs across XCM, runtime, and wallet modules
to match the new mainnet genesis hashes.
2026-02-15 22:26:12 +03:00
pezkuwichain fa17968108 fix: resolve parentId for Asset Hub staking to relay chain
ValidatorProvider, DirectStakingProperties, and DirectStakingRecommendation
were querying Asset Hub chainId for staking data (validators, exposures,
minStake, maxNominations) but these live on the relay chain. Added
chain.parentId resolution so parachain staking correctly routes to relay.

Also:
- Add VoterBagsList pallet support (Pezkuwi naming)
- Wrap BagListRepository queries in runCatching for binding compat
- Remove debug logging
2026-02-15 22:25:48 +03:00
pezkuwichain ffae9159fe fix: wrap long log line to satisfy ktlint max-line-length 2026-02-14 18:32:09 +03:00
pezkuwichain f253686d10 fix: nomination pool exposure queries route to relay chain, graceful pending_rewards fallback
- StakeSummary and Alerts interactors now query elected exposures from
  relay chain (parentId) instead of parachain for correct staking status
- Pending rewards flow catches missing NominationPoolsApi and emits zero
- Update Telegram link to @pezkuwichainBot
2026-02-14 11:38:44 +03:00
pezkuwichain c461e61895 fix: resolve staking reward calculation for parachain (Asset Hub)
- Use remote RPC instead of local storage for era/exposure queries
- Resolve relay chain via parentId for exposure, totalIssuance, and parachains
- Remove StorageCache dependency, detect paged exposures via runtime metadata
- Add StakingRepository to NominationPoolRewardCalculatorFactory for direct queries
- Use storageOrNull for null-safety on chains without Paras pallet
2026-02-14 05:38:47 +03:00
pezkuwichain 921e6de224 prepare release: staking config, proguard fixes, icons and build cleanup
- Add subquery endpoints for staking-rewards, history, staking APIs
- Add identityChain, stakingWiki, pushSupport to chain config
- Remove versionNameSuffix/applicationIdSuffix from releaseMarket build
- Fix privacy/terms URLs to use .html extension
- Strengthen proguard rules for Retrofit, SR25519, Substrate SDK,
  WalletConnect, Google Drive, Navigation and crypto classes
- Update launcher icons for debug and release variants
2026-02-13 06:45:30 +03:00
pezkuwichain ec250adb07 fix: revert incompatible dependency updates, keep security improvements
- Reverted Navigation to 2.3.1 (2.7.7 has breaking API changes)
- Reverted Lifecycle to 2.2.0 (2.7.0 has breaking API changes)
- Reverted BouncyCastle to 1.70/jdk15on (1.77/jdk18on causes conflicts)
- Kept: OkHttp 4.12.0, Gson 2.10.1, ConstraintLayout 2.1.4
- Kept: minifyEnabled=true, ProGuard rules, Branch.io security
2026-02-12 05:30:22 +03:00
pezkuwichain a294aa1a6b Initial commit: Pezkuwi Wallet Android
Security hardened release:
- Code obfuscation enabled (minifyEnabled=true, shrinkResources=true)
- Sensitive files excluded (google-services.json, keystores)
- Branch.io key moved to BuildConfig placeholder
- Updated dependencies: OkHttp 4.12.0, Gson 2.10.1, BouncyCastle 1.77
- Comprehensive ProGuard rules for crypto wallet
- Navigation 2.7.7, Lifecycle 2.7.0, ConstraintLayout 2.1.4
2026-02-12 05:19:41 +03:00
1514 changed files with 4680 additions and 86482 deletions
+44 -3
View File
@@ -130,9 +130,7 @@ env:
POLKASSEMBLY_SUMMARY_API_KEY: ${{ secrets.POLKASSEMBLY_SUMMARY_API_KEY }}
CI_BUILD_ID: ${{ github.run_number }}
concurrency:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{inputs.upload-name}}
cancel-in-progress: true
@@ -146,6 +144,14 @@ jobs:
uses: actions/checkout@v4
with:
ref: ${{ inputs.branch }}
fetch-depth: 0
- name: Compute version code from commit count
run: |
COMMIT_COUNT=$(git rev-list --count HEAD)
VERSION_CODE=$((COMMIT_COUNT + 100))
echo "CI_BUILD_ID=$VERSION_CODE" >> $GITHUB_ENV
echo "Version code: $VERSION_CODE (commits: $COMMIT_COUNT + offset 100)"
- name: 📂 Set up DEV Google Services
uses: davidSchuppa/base64Secret-toFile-action@v3
@@ -161,6 +167,16 @@ jobs:
filename: google-services.json
destination-path: ./app/src/release/
- name: 📂 Copy PROD Google Services to releaseMarket
run: |
mkdir -p ./app/src/releaseMarket
cp ./app/src/release/google-services.json ./app/src/releaseMarket/google-services.json
- name: 📂 Copy PROD Google Services to releaseGithub
run: |
mkdir -p ./app/src/releaseGithub
cp ./app/src/release/google-services.json ./app/src/releaseGithub/google-services.json
- name: 🔧 Install dependencies
uses: ./.github/workflows/install/
@@ -202,3 +218,28 @@ jobs:
with:
name: ${{ inputs.upload-name }}
path: app/build/outputs/apk/
if-no-files-found: ignore
- name: ➡️ Upload bundle artifacts
if: ${{ !startsWith(inputs.gradlew-command, 'false') }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.upload-name }}-bundle
path: app/build/outputs/bundle/
if-no-files-found: ignore
- name: ➡️ Upload mapping file
if: ${{ !startsWith(inputs.gradlew-command, 'false') }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.upload-name }}-mapping
path: app/build/outputs/mapping/
if-no-files-found: ignore
- name: ➡️ Upload native debug symbols
if: ${{ !startsWith(inputs.gradlew-command, 'false') }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.upload-name }}-native-debug-symbols
path: app/build/outputs/native-debug-symbols/
if-no-files-found: ignore
+47
View File
@@ -0,0 +1,47 @@
name: Auto Merge
on:
workflow_run:
workflows: ["Code Quality"]
types: [completed]
jobs:
auto-merge:
runs-on: ubuntu-latest
if: >
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.event == 'pull_request'
permissions:
contents: write
pull-requests: write
steps:
- name: Find and merge master → main PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
HEAD_BRANCH="${{ github.event.workflow_run.head_branch }}"
echo "Workflow ran on branch: $HEAD_BRANCH"
if [ "$HEAD_BRANCH" != "master" ]; then
echo "Not a master branch PR, skipping"
exit 0
fi
PR_NUMBER=$(gh pr list \
--repo "$GITHUB_REPOSITORY" \
--base main \
--head master \
--state open \
--json number \
--jq '.[0].number')
if [ -z "$PR_NUMBER" ]; then
echo "No open PR from master to main found, skipping"
exit 0
fi
echo "Merging PR #$PR_NUMBER"
gh pr merge "$PR_NUMBER" \
--repo "$GITHUB_REPOSITORY" \
--merge \
--delete-branch=false
+40
View File
@@ -0,0 +1,40 @@
name: Auto PR (master → main)
on:
push:
branches: [master]
jobs:
create-pr:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create or update PR
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Check if there's already an open PR from master to main
EXISTING_PR=$(gh pr list --base main --head master --state open --json number --jq '.[0].number')
if [ -n "$EXISTING_PR" ]; then
echo "PR #$EXISTING_PR already exists — new commits will appear automatically"
exit 0
fi
echo "Creating new PR: master → main"
if gh pr create \
--base main \
--head master \
--title "Sync: master → main" \
--body "Automated PR to sync master branch changes to main.
This PR was created automatically and will be merged once CI checks pass."; then
echo "PR created successfully"
else
echo "PR creation skipped (branches may already be in sync)"
fi
+5 -5
View File
@@ -9,7 +9,7 @@ jobs:
build-app:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with:
branch: ${{github.head_ref}}
branch: ${{ github.head_ref || github.ref_name || 'main' }}
gradlew-command: assembleDebug
upload-name: develop-apk
run-tests: false
@@ -18,7 +18,7 @@ jobs:
run-tests:
needs: [build-app]
runs-on: macos-13
runs-on: macos-14
steps:
- uses: actions/checkout@v4
@@ -46,7 +46,7 @@ jobs:
- uses: actions/upload-artifact@v4
if: always()
with:
name: anroid-results
name: android-results
path: ./allure-results.tar
report:
@@ -63,7 +63,7 @@ jobs:
- name: Unzip results
run: |
find artifacts -name allure-results.tar -exec tar -xvf {} \;
- name: Debug path
run: |
ls -laR
@@ -89,5 +89,5 @@ jobs:
💸 Balances tests failed.
Test Results: https://pezkuwichain.github.io/balances_test_result/${{ github.run_number }}/index.html
Github run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
+52
View File
@@ -0,0 +1,52 @@
name: Code Quality
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: code-quality-${{ github.ref }}
cancel-in-progress: true
env:
ACALA_PROD_AUTH_TOKEN: ${{ secrets.ACALA_PROD_AUTH_TOKEN }}
ACALA_TEST_AUTH_TOKEN: ${{ secrets.ACALA_TEST_AUTH_TOKEN }}
MOONBEAM_PROD_AUTH_TOKEN: ${{ secrets.MOONBEAM_PROD_AUTH_TOKEN }}
MOONBEAM_TEST_AUTH_TOKEN: ${{ secrets.MOONBEAM_TEST_AUTH_TOKEN }}
MOONPAY_PRODUCTION_SECRET: ${{ secrets.MOONPAY_PRODUCTION_SECRET }}
MOONPAY_TEST_SECRET: ${{ secrets.MOONPAY_TEST_SECRET }}
MERCURYO_PRODUCTION_SECRET: ${{ secrets.MERCURYO_PRODUCTION_SECRET }}
MERCURYO_TEST_SECRET: ${{ secrets.MERCURYO_TEST_SECRET }}
EHTERSCAN_API_KEY_MOONBEAM: ${{ secrets.EHTERSCAN_API_KEY_MOONBEAM }}
EHTERSCAN_API_KEY_MOONRIVER: ${{ secrets.EHTERSCAN_API_KEY_MOONRIVER }}
EHTERSCAN_API_KEY_ETHEREUM: ${{ secrets.EHTERSCAN_API_KEY_ETHEREUM }}
INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }}
DWELLIR_API_KEY: ${{ secrets.DWELLIR_API_KEY }}
WALLET_CONNECT_PROJECT_ID: ${{ secrets.WALLET_CONNECT_PROJECT_ID }}
DEBUG_GOOGLE_OAUTH_ID: ${{ secrets.DEBUG_GOOGLE_OAUTH_ID }}
RELEASE_GOOGLE_OAUTH_ID: ${{ secrets.RELEASE_GOOGLE_OAUTH_ID }}
jobs:
ktlint:
name: Kotlin Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
uses: ./.github/workflows/install/
- name: Run ktlint
run: ./gradlew ktlint
- name: Upload ktlint report
if: always()
uses: actions/upload-artifact@v4
with:
name: ktlint-report
path: build/reports/checkstyle/ktlint.xml
if-no-files-found: ignore
@@ -4,9 +4,9 @@ on:
workflow_dispatch:
inputs:
app_version:
description: 'Version of application'
description: 'Version of application (e.g. v1.0.0)'
required: true
default: v*.*.*
default: v1.0.0
branch:
description: 'From which branch the application will be built'
required: true
@@ -17,7 +17,7 @@ jobs:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with:
branch: ${{ github.event.inputs.branch }}
gradlew-command: assembleReleaseMarket
gradlew-command: bundleReleaseMarket
keystore-file-name: market_key.jks
secrets: inherit
@@ -27,30 +27,46 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set Environment Variables
uses: tw3lveparsecs/github-actions-setvars@v0.1
with:
envFilePath: .github/workflows/variables/android.env
- name: Download built artifact
- name: Download bundle artifact
uses: actions/download-artifact@v4
with:
name: apk
path: app
name: apk-bundle
path: app/bundle
- name: Download mapping artifact
uses: actions/download-artifact@v4
with:
name: apk-mapping
path: app/mapping
continue-on-error: true
- name: Download native debug symbols
uses: actions/download-artifact@v4
with:
name: apk-native-debug-symbols
path: app/native-debug-symbols
continue-on-error: true
- name: Rename artifacts
run: mv app/releaseMarket/app-releaseMarket.apk app/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.apk
run: mv app/bundle/releaseMarket/app-releaseMarket.aab app/bundle/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.aab
- name: Check for native debug symbols
id: check-symbols
run: |
if [ -f "app/native-debug-symbols/releaseMarket/native-debug-symbols.zip" ]; then
echo "path=app/native-debug-symbols/releaseMarket/native-debug-symbols.zip" >> $GITHUB_OUTPUT
fi
- name: Market publication
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }} # The contents of your service-account.json
serviceAccountJsonPlainText: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
packageName: io.pezkuwichain.wallet
releaseFiles: app/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.apk
track: production # One of production, beta, alpha, internalsharing, internal, or a custom track name (case sensitive)
status: draft # One of "completed", "inProgress", "halted", "draft"
releaseFiles: app/bundle/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.aab
track: alpha
status: draft
inAppUpdatePriority: 2
userFraction: 1.0 # Percentage of users who should get the staged version of the app. Defaults to 1.0
whatsNewDirectory: distribution/whatsnew # The directory of localized "whats new" files to upload as the release notes. The files contained in the whatsNewDirectory MUST use the pattern whatsnew-<LOCALE> where LOCALE is using the BCP 47 format
mappingFile: app/build/outputs/mapping/release/mapping.txt # The mapping.txt file used to de-obfuscate your stack traces from crash reports
debugSymbols: app/intermediates/merged_native_libs/release/out/lib
whatsNewDirectory: distribution/whatsnew
mappingFile: app/mapping/releaseMarket/mapping.txt
debugSymbols: ${{ steps.check-symbols.outputs.path }}
+4 -2
View File
@@ -16,11 +16,13 @@ runs:
cmdline-tools-version: 12266719
- name: Install NDK
run: echo "y" | sudo ${ANDROID_SDK_ROOT}/cmdline-tools/16.0/bin/sdkmanager --install "ndk;26.1.10909125" --sdk_root=${ANDROID_SDK_ROOT}
run: |
SDKMANAGER=$(find ${ANDROID_SDK_ROOT}/cmdline-tools -name sdkmanager -type f 2>/dev/null | head -1)
echo "y" | sudo ${SDKMANAGER} --install "ndk;26.1.10909125" --sdk_root=${ANDROID_SDK_ROOT}
shell: bash
- name: Set ndk.dir in local.properties
run: echo "ndk.dir=${{ steps.setup-ndk.outputs.ndk-path }}" >> local.properties
run: echo "ndk.dir=${ANDROID_SDK_ROOT}/ndk/26.1.10909125" >> local.properties
shell: bash
- name: 🦀 Install Rust
@@ -3,6 +3,14 @@ name: Manual Firebase distribution
on:
workflow_dispatch:
inputs:
build_variant:
description: 'Build variant'
required: true
type: choice
options:
- develop
- releaseMarket
default: develop
firebase_group:
description: 'Firebase group'
required: true
@@ -17,7 +25,8 @@ jobs:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with:
branch: ${{ github.event.inputs.branch }}
gradlew-command: assembleDevelop
gradlew-command: assemble${{ github.event.inputs.build_variant == 'releaseMarket' && 'ReleaseMarket' || 'Develop' }}
keystore-file-name: ${{ github.event.inputs.build_variant == 'releaseMarket' && 'market_key.jks' || 'false' }}
secrets: inherit
upload:
@@ -35,8 +44,8 @@ jobs:
- name: 🗳 Upload to Firebase
uses: ./.github/workflows/upload-to-firebase
with:
appId: ${{ secrets.ANDROID_DEVELOP_FIREBASE_APP_ID }}
firebase-token: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
releaseNotes: ${{ github.event.head_commit.message }}
appId: ${{ github.event.inputs.build_variant == 'releaseMarket' && secrets.ANDROID_RELEASE_FIREBASE_APP_ID || secrets.ANDROID_DEVELOP_FIREBASE_APP_ID }}
firebase-token: ${{ github.event.inputs.build_variant == 'releaseMarket' && secrets.RELEASE_FIREBASE_CREDENTIAL || secrets.CREDENTIAL_FILE_CONTENT }}
releaseNotes: "v1.0.0 - ${{ github.event.inputs.build_variant }} build from ${{ github.event.inputs.branch }}"
test-groups: ${{ github.event.inputs.firebase_group }}
upload-file: app/develop/app-develop.apk
upload-file: ${{ github.event.inputs.build_variant == 'releaseMarket' && 'app/releaseMarket/app-releaseMarket.apk' || 'app/develop/app-develop.apk' }}
+7 -6
View File
@@ -1,4 +1,4 @@
name: Build test and deploy debug apk
name: Build and deploy release apk
on:
push:
@@ -10,7 +10,8 @@ jobs:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with:
branch: main
gradlew-command: assembleDebug
gradlew-command: assembleReleaseMarket
keystore-file-name: market_key.jks
secrets: inherit
upload-to-firebase:
@@ -28,11 +29,11 @@ jobs:
- name: 🗳 Upload to Firebase
uses: ./.github/workflows/upload-to-firebase
with:
appId: ${{ secrets.ANDROID_DEBUG_FIREBASE_APP_ID }}
firebase-token: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
appId: ${{ secrets.ANDROID_RELEASE_FIREBASE_APP_ID }}
firebase-token: ${{ secrets.RELEASE_FIREBASE_CREDENTIAL }}
releaseNotes: ${{ github.event.head_commit.message }}
test-groups: dev-team
upload-file: app/debug/app-debug.apk
upload-file: app/releaseMarket/app-releaseMarket.apk
upload-to-s3:
runs-on: ubuntu-latest
@@ -59,7 +60,7 @@ jobs:
s3_access_key: ${{ secrets.SCW_ACCESS_KEY }}
s3_secret_key: ${{ secrets.SCW_SECRET_KEY }}
s3_bucket: ${{ env.S3_BUCKET }}
upload_file: app/debug/app-debug.apk
upload_file: app/releaseMarket/app-releaseMarket.apk
- name: Show S3 URL
run: |
+132
View File
@@ -0,0 +1,132 @@
name: Security
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1'
permissions:
contents: read
security-events: write
env:
ACALA_PROD_AUTH_TOKEN: ${{ secrets.ACALA_PROD_AUTH_TOKEN }}
ACALA_TEST_AUTH_TOKEN: ${{ secrets.ACALA_TEST_AUTH_TOKEN }}
MOONBEAM_PROD_AUTH_TOKEN: ${{ secrets.MOONBEAM_PROD_AUTH_TOKEN }}
MOONBEAM_TEST_AUTH_TOKEN: ${{ secrets.MOONBEAM_TEST_AUTH_TOKEN }}
MOONPAY_PRODUCTION_SECRET: ${{ secrets.MOONPAY_PRODUCTION_SECRET }}
MOONPAY_TEST_SECRET: ${{ secrets.MOONPAY_TEST_SECRET }}
MERCURYO_PRODUCTION_SECRET: ${{ secrets.MERCURYO_PRODUCTION_SECRET }}
MERCURYO_TEST_SECRET: ${{ secrets.MERCURYO_TEST_SECRET }}
EHTERSCAN_API_KEY_MOONBEAM: ${{ secrets.EHTERSCAN_API_KEY_MOONBEAM }}
EHTERSCAN_API_KEY_MOONRIVER: ${{ secrets.EHTERSCAN_API_KEY_MOONRIVER }}
EHTERSCAN_API_KEY_ETHEREUM: ${{ secrets.EHTERSCAN_API_KEY_ETHEREUM }}
INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }}
DWELLIR_API_KEY: ${{ secrets.DWELLIR_API_KEY }}
WALLET_CONNECT_PROJECT_ID: ${{ secrets.WALLET_CONNECT_PROJECT_ID }}
DEBUG_GOOGLE_OAUTH_ID: ${{ secrets.DEBUG_GOOGLE_OAUTH_ID }}
RELEASE_GOOGLE_OAUTH_ID: ${{ secrets.RELEASE_GOOGLE_OAUTH_ID }}
jobs:
codeql:
name: CodeQL Analysis
runs-on: [self-hosted, wallet]
if: github.event_name == 'push' # Only run on push, not PRs (self-hosted security)
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install dependencies
uses: ./.github/workflows/install/
- name: Set up DEV Google Services
uses: davidSchuppa/base64Secret-toFile-action@v3
with:
secret: ${{ secrets.CI_DEVELOP_GOOGLE_SERVICES }}
filename: google-services.json
destination-path: ./app/
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: java-kotlin
- name: Build for CodeQL
run: ./gradlew assembleDebug -x test -x lint
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
dependency-review:
name: Dependency Review
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Dependency Review
uses: actions/dependency-review-action@v4
with:
fail-on-severity: critical
deny-licenses: GPL-3.0, AGPL-3.0
secret-scan:
name: Secret Scan
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: TruffleHog Secret Scan
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: ${{ github.event.repository.default_branch }}
extra_args: --only-verified
hardcoded-secrets:
name: Hardcoded Secret Detection
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Scan for hardcoded secrets
run: |
FOUND=0
echo "Checking for seed phrases / mnemonics..."
if grep -rn --include="*.kt" --include="*.java" --include="*.xml" -iE "(mnemonic|seed_phrase)\s*=\s*\"[a-z]+" . | grep -v /build/ | grep -v /test/ | grep -v /androidTest/ | grep -v "R.string" | grep -v "getString"; then
echo "::error::Possible seed phrase found in source"
FOUND=1
fi
echo "Checking for private keys..."
if grep -rn --include="*.kt" --include="*.java" -E "(private_key|privateKey|secret)\s*=\s*\"0x[a-fA-F0-9]{64}\"" . | grep -v /build/ | grep -v /test/ | grep -v /androidTest/; then
echo "::error::Possible private key found in source"
FOUND=1
fi
echo "Checking for API keys in source..."
if grep -rn --include="*.kt" --include="*.java" -iE "(api_key|apikey|secret_key|password)\s*=\s*\"[^\"]{16,}" . | grep -v /build/ | grep -v /test/ | grep -v /androidTest/ | grep -v BuildConfig | grep -v "process"; then
echo "::error::Possible API key or password found in source"
FOUND=1
fi
if [ "$FOUND" -eq 0 ]; then
echo "No hardcoded secrets found."
else
exit 1
fi
-34
View File
@@ -1,34 +0,0 @@
name: Sync main and master branches
on:
push:
branches:
- main
- master
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Sync branches
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
echo "main was updated, syncing master..."
git checkout master
git reset --hard origin/main
git push origin master --force
elif [ "${{ github.ref }}" = "refs/heads/master" ]; then
echo "master was updated, syncing main..."
git checkout main
git reset --hard origin/master
git push origin main --force
fi
+4 -1
View File
@@ -25,5 +25,8 @@ app/*.apk
!/core-db/schemas/io.novafoundation.nova.core_db.AppDatabase/8.json
!/core-db/schemas/io.novafoundation.nova.core_db.AppDatabase/9.json
google-services.jsonversion.properties
# Firebase config - contains sensitive API keys
google-services.json
**/google-services.json
.kotlin/
+2 -2
View File
@@ -1,5 +1,5 @@
/build
/release*
src/release*/google-services.json
!src/release/google-services.json
# Firebase config - sensitive API keys
**/google-services.json
+9 -9
View File
@@ -11,6 +11,10 @@ android {
versionCode computeVersionCode()
versionName computeVersionName()
// Branch.io key from local.properties or environment variable
manifestPlaceholders = [
BRANCH_KEY: readRawSecretOrNull('BRANCH_KEY') ?: "key_test_placeholder"
]
}
signingConfigs {
dev {
@@ -45,8 +49,9 @@ android {
signingConfig signingConfigs.debug
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
buildConfigField "String", "BuildType", "\"release\""
}
@@ -64,9 +69,7 @@ android {
initWith buildTypes.release
matchingFallbacks = ['release']
signingConfig signingConfigs.market
versionNameSuffix "-${releaseApplicationSuffix}"
applicationIdSuffix ".${releaseApplicationSuffix}"
ndk { debugSymbolLevel 'FULL' }
buildConfigField "String", "BuildType", "\"releaseMarket\""
}
@@ -75,9 +78,6 @@ android {
matchingFallbacks = ['release']
signingConfig signingConfigs.github
versionNameSuffix '-github'
applicationIdSuffix '.github'
buildConfigField "String", "BuildType", "\"releaseGithub\""
}
develop {
@@ -169,7 +169,7 @@ void createBindReleaseFileTask(String destination) {
play {
serviceAccountCredentials = file(System.env.CI_PLAY_KEY ?: "../key/fake.json")
track = "beta"
track = "production"
releaseStatus = "completed"
}
-39
View File
@@ -1,39 +0,0 @@
{
"project_info": {
"project_number": "783787781434",
"project_id": "pezkuwi-wallet",
"storage_bucket": "pezkuwi-wallet.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:783787781434:android:3645395a1f99c11c53b403",
"android_client_info": {
"package_name": "io.pezkuwichain.wallet"
}
},
"oauth_client": [
{
"client_id": "783787781434-6tn9gh3ko4u73ckjjbv336bbmdk4eefv.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDK_P0TE_QyomWlO1BN79qY4xUAKcei12g"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "783787781434-6tn9gh3ko4u73ckjjbv336bbmdk4eefv.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
+263 -18
View File
@@ -1,21 +1,266 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# ============================================================
# Pezkuwi Wallet ProGuard Rules
# ============================================================
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Keep line numbers for debugging crash reports
-keepattributes SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# ============================================================
# Kotlin
# ============================================================
-dontwarn kotlin.**
-keep class kotlin.Metadata { *; }
-keepclassmembers class kotlin.Metadata {
public <methods>;
}
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
# Kotlin Coroutines
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembers class kotlinx.coroutines.** {
volatile <fields>;
}
-dontwarn kotlinx.coroutines.**
# ============================================================
# Retrofit & OkHttp (Strict rules for generic type preservation)
# ============================================================
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
# Keep Retrofit library
-keep class retrofit2.** { *; }
-keepclassmembers class retrofit2.** { *; }
# Essential attributes for reflection
-keepattributes Signature
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes EnclosingMethod
-keepattributes RuntimeVisibleAnnotations
-keepattributes RuntimeInvisibleAnnotations
-keepattributes RuntimeVisibleParameterAnnotations
-keepattributes RuntimeInvisibleParameterAnnotations
-keepattributes AnnotationDefault
# Keep ALL interfaces with Retrofit annotations - NO allowshrinking/allowobfuscation
-keep interface * {
@retrofit2.http.* <methods>;
}
# Keep the method signatures including generic types
-keepclasseswithmembers interface * {
@retrofit2.http.* <methods>;
}
# ============================================================
# Gson
# ============================================================
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class com.google.gson.** { *; }
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# ============================================================
# BouncyCastle Crypto
# ============================================================
-keep class org.bouncycastle.** { *; }
-dontwarn org.bouncycastle.**
# ============================================================
# Native JNI Bindings (Rust)
# ============================================================
# SR25519 signing - keep the native methods and the class
-keep class io.novafoundation.nova.sr25519.BizinikiwSr25519 { *; }
-keep class io.novafoundation.nova.** { native <methods>; }
-keepclasseswithmembernames class * {
native <methods>;
}
# Keep all JNI related classes
-keep class io.parity.** { *; }
# Runtime signers
-keep class io.novafoundation.nova.runtime.extrinsic.signer.** { *; }
# ============================================================
# Substrate SDK
# ============================================================
-keep class jp.co.soramitsu.** { *; }
-dontwarn jp.co.soramitsu.**
# Nova Substrate SDK (io.novasama)
-keep class io.novasama.substrate_sdk_android.** { *; }
-keepclassmembers class io.novasama.substrate_sdk_android.** { *; }
-dontwarn io.novasama.substrate_sdk_android.**
# XXHash library (used by Substrate SDK hashing)
-keep class net.jpountz.** { *; }
-keepclassmembers class net.jpountz.** { *; }
-dontwarn net.jpountz.**
# Keep Schema objects and their delegated properties
-keep class * extends io.novasama.substrate_sdk_android.scale.Schema { *; }
-keepclassmembers class * extends io.novasama.substrate_sdk_android.scale.Schema {
<fields>;
<methods>;
}
# ============================================================
# Secrets & Crypto Classes
# ============================================================
-keep class io.novafoundation.nova.common.data.secrets.** { *; }
-keepclassmembers class io.novafoundation.nova.common.data.secrets.** { *; }
-keep class io.novafoundation.nova.feature_account_impl.data.secrets.** { *; }
-keep class io.novafoundation.nova.feature_account_impl.data.repository.datasource.** { *; }
-keep class io.novafoundation.nova.feature_account_impl.data.repository.addAccount.** { *; }
# ============================================================
# Firebase
# ============================================================
-keep class com.google.firebase.** { *; }
-dontwarn com.google.firebase.**
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**
# ============================================================
# Branch.io Deep Linking
# ============================================================
-keep class io.branch.** { *; }
-dontwarn io.branch.**
# ============================================================
# Web3j (Ethereum)
# ============================================================
-keep class org.web3j.** { *; }
-dontwarn org.web3j.**
# ============================================================
# SQLCipher
# ============================================================
-keep class net.sqlcipher.** { *; }
-dontwarn net.sqlcipher.**
# ============================================================
# Room Database
# ============================================================
-keep class * extends androidx.room.RoomDatabase
-keep @androidx.room.Entity class *
-dontwarn androidx.room.paging.**
# ============================================================
# Data Classes & Models (Keep for serialization)
# ============================================================
-keep class io.novafoundation.nova.**.model.** { *; }
-keep class io.novafoundation.nova.**.response.** { *; }
-keep class io.novafoundation.nova.**.request.** { *; }
-keep class io.novafoundation.nova.**.dto.** { *; }
-keep class io.novafoundation.nova.**.*Remote { *; }
-keep class io.novafoundation.nova.**.*Remote$* { *; }
# ============================================================
# Parcelable
# ============================================================
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# ============================================================
# Enums
# ============================================================
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# ============================================================
# Serializable
# ============================================================
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# ============================================================
# Ledger USB/Bluetooth
# ============================================================
-keep class io.novafoundation.nova.feature_ledger_impl.** { *; }
# ============================================================
# WalletConnect
# ============================================================
-keep class com.walletconnect.** { *; }
-keepclassmembers class com.walletconnect.** { *; }
-dontwarn com.walletconnect.**
# ============================================================
# Google API Client (Google Drive)
# ============================================================
-keep class com.google.api.** { *; }
-keepclassmembers class com.google.api.** { *; }
-keep class com.google.api.client.** { *; }
-keepclassmembers class com.google.api.client.** { *; }
-keep class com.google.api.services.** { *; }
-keepclassmembers class com.google.api.services.** { *; }
-dontwarn com.google.api.**
# ============================================================
# Navigation Component
# ============================================================
-keep class * extends androidx.navigation.Navigator { *; }
-keep @androidx.navigation.Navigator.Name class * { *; }
-keepnames class * extends androidx.navigation.Navigator
-keepattributes *Annotation*
-keep class androidx.navigation.** { *; }
-keep class * implements androidx.navigation.NavArgs { *; }
-keep class androidx.navigation.fragment.** { *; }
-keep class io.novafoundation.nova.**.navigation.** { *; }
-keep class * extends androidx.navigation.NavDestination { *; }
# Keep all Nova foundation classes (prevent aggressive obfuscation)
-keep class io.novafoundation.nova.** { *; }
-keepnames class io.novafoundation.nova.**
# ============================================================
# Optimization settings
# ============================================================
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*,!method/inlining/*
-optimizationpasses 5
-allowaccessmodification
# Don't optimize or obfuscate Retrofit interfaces - critical for type reflection
-keepnames,includedescriptorclasses interface * {
@retrofit2.http.* <methods>;
}
# ============================================================
# Don't warn about missing classes that we don't use
# ============================================================
-dontwarn org.conscrypt.**
-dontwarn org.slf4j.**
-dontwarn javax.naming.**
-dontwarn org.w3c.dom.traversal.**
-dontwarn org.apache.xerces.**
-dontwarn org.apache.xml.**
-dontwarn org.apache.xalan.**
-dontwarn org.ietf.jgss.**
-dontwarn org.apache.http.**
# ByteBuddy (test dependency)
-dontwarn net.bytebuddy.**
-dontwarn com.sun.jna.**
-dontwarn edu.umd.cs.findbugs.annotations.**
-84
View File
@@ -1,84 +0,0 @@
{
"project_info": {
"project_number": "633686702274",
"project_id": "pezkuwi-wallet-debug",
"storage_bucket": "pezkuwi-wallet-debug.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:633686702274:android:897282d4fda3f5ed7e635b",
"android_client_info": {
"package_name": "io.pezkuwichain.wallet"
}
},
"oauth_client": [
{
"client_id": "633686702274-42ktqav1laf6d4ol7f714ib3s6lka73f.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "io.pezkuwichain.wallet",
"certificate_hash": "8fb4f8977fc9b990e9d501a0041f5723f23b65d2"
}
},
{
"client_id": "633686702274-seee7qsisjmrps3npbnep2i8rtu44hdu.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBY_4wMnmyc8etnkyNOd_I-bCFAxO2Z-Os"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "633686702274-seee7qsisjmrps3npbnep2i8rtu44hdu.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:633686702274:android:018702ece3f601067e635b",
"android_client_info": {
"package_name": "io.pezkuwichain.wallet.debug"
}
},
"oauth_client": [
{
"client_id": "633686702274-3dduat8jpbqfnie9kvqr441np1gcbm90.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "io.pezkuwichain.wallet.debug",
"certificate_hash": "fc2d7bde71183e18377baf8076b35b3c68f9b02e"
}
},
{
"client_id": "633686702274-seee7qsisjmrps3npbnep2i8rtu44hdu.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBY_4wMnmyc8etnkyNOd_I-bCFAxO2Z-Os"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "633686702274-seee7qsisjmrps3npbnep2i8rtu44hdu.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
-39
View File
@@ -1,39 +0,0 @@
{
"project_info": {
"project_number": "633686702274",
"project_id": "pezkuwi-wallet-debug",
"storage_bucket": "pezkuwi-wallet-debug.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:633686702274:android:018702ece3f601067e635b",
"android_client_info": {
"package_name": "io.pezkuwichain.wallet.debug"
}
},
"oauth_client": [
{
"client_id": "633686702274-seee7qsisjmrps3npbnep2i8rtu44hdu.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBY_4wMnmyc8etnkyNOd_I-bCFAxO2Z-Os"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "633686702274-seee7qsisjmrps3npbnep2i8rtu44hdu.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
-38
View File
@@ -1,38 +0,0 @@
{
"project_info": {
"project_number": "815440502995",
"project_id": "pezkuwi-wallet-debug-dev",
"storage_bucket": "pezkuwi-wallet-debug-dev.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:815440502995:android:8383afc644e3feed7ff426",
"android_client_info": {
"package_name": "io.pezkuwichain.wallet.dev"
}
},
"oauth_client": [
{
"client_id": "815440502995-7v2lq2podh5i1uge0lfeo2gvbja708bf.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "io.pezkuwichain.wallet.dev",
"certificate_hash": "8fb4f8977fc9b990e9d501a0041f5723f23b65d2"
}
}
],
"api_key": [
{
"current_key": "AIzaSyCRYO6PKnKyzqWxR-O3tfVC5J6e44kTUZk"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": []
}
}
}
],
"configuration_version": "1"
}
+1 -1
View File
@@ -208,7 +208,7 @@
<meta-data
android:name="io.branch.sdk.BranchKey"
android:value="key_live_dsxlmUqNhbtOYX6e7cfgrpkbqsjGPYBf" />
android:value="${BRANCH_KEY}" />
<meta-data android:name="io.branch.sdk.TestMode" android:value="false" />
@@ -285,8 +285,8 @@ class Navigator(
.navigateInFirstAttachedContext()
}
override fun openSend(payload: SendPayload, initialRecipientAddress: String?) {
val extras = SelectSendFragment.getBundle(payload, initialRecipientAddress)
override fun openSend(payload: SendPayload, initialRecipientAddress: String?, initialAmount: Double?) {
val extras = SelectSendFragment.getBundle(payload, initialRecipientAddress, initialAmount)
navigationBuilder().cases()
.addCase(R.id.sendFlowFragment, R.id.action_sendFlow_to_send)
@@ -412,7 +412,9 @@ class Navigator(
}
override fun openSendFlow() {
navigationBuilder().action(R.id.action_mainFragment_to_sendFlow)
navigationBuilder().cases()
.addCase(R.id.mainFragment, R.id.action_mainFragment_to_sendFlow)
.addCase(R.id.bridgeFragment, R.id.action_bridge_to_sendFlow)
.navigateInFirstAttachedContext()
}
@@ -431,6 +433,11 @@ class Navigator(
.navigateInFirstAttachedContext()
}
override fun openBridgeFlow() {
navigationBuilder().action(R.id.action_mainFragment_to_bridgeFlow)
.navigateInFirstAttachedContext()
}
override fun openSelectGiftAmount(assetPayload: AssetPayload) {
navigationBuilder().action(R.id.action_selectGiftAmount)
.setArgs(SelectGiftAmountFragment.createPayload(SelectGiftAmountPayload(assetPayload)))
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1012 B

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 830 B

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 36 KiB

@@ -635,6 +635,14 @@
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />
<action
android:id="@+id/action_mainFragment_to_bridgeFlow"
app:destination="@id/bridgeFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />
<action
android:id="@+id/action_mainFragment_to_swapFlow"
app:destination="@id/select_swap_token_nav_graph"
@@ -1180,6 +1188,21 @@
</fragment>
<fragment
android:id="@+id/bridgeFragment"
android:name="io.novafoundation.nova.feature_assets.presentation.bridge.BridgeFragment"
android:label="BridgeFragment">
<action
android:id="@+id/action_bridge_to_sendFlow"
app:destination="@id/sendFlowFragment"
app:enterAnim="@anim/fragment_open_enter"
app:exitAnim="@anim/fragment_open_exit"
app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" />
</fragment>
<fragment
android:id="@+id/tradeProvidersFragment"
android:name="io.novafoundation.nova.feature_assets.presentation.trade.provider.TradeProviderListFragment"
-39
View File
@@ -1,39 +0,0 @@
{
"project_info": {
"project_number": "783787781434",
"project_id": "pezkuwi-wallet",
"storage_bucket": "pezkuwi-wallet.firebasestorage.app"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:783787781434:android:3645395a1f99c11c53b403",
"android_client_info": {
"package_name": "io.pezkuwichain.wallet"
}
},
"oauth_client": [
{
"client_id": "783787781434-6tn9gh3ko4u73ckjjbv336bbmdk4eefv.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyDK_P0TE_QyomWlO1BN79qY4xUAKcei12g"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "783787781434-6tn9gh3ko4u73ckjjbv336bbmdk4eefv.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 36 KiB

+2 -1
View File
@@ -15,7 +15,8 @@ hydra-dx-math = { git = "https://github.com/galacticcouncil/HydraDX-node", versi
jni = { version = "0.17.0", default-features = false }
[profile.release]
strip = true
strip = false
debug = 2
lto = true
opt-level = "s"
+2 -1
View File
@@ -14,7 +14,8 @@ frame-metadata = { version = "16.0.0", features = [ "current" ] }
codec = { package = "parity-scale-codec", version = "3.6.9", features = [ "derive" ] }
[profile.release]
strip = true
strip = false
debug = 2
lto = true
opt-level = "s"
+2 -1
View File
@@ -11,7 +11,8 @@ jni = { version = "0.21", default-features = false }
zeroize = "1.7"
[profile.release]
strip = true
strip = false
debug = 2
lto = true
opt-level = "s"
@@ -1 +0,0 @@
{"rustc_fingerprint":947953012485338828,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.91.1 (ed61e7d7e 2025-11-07)\nbinary: rustc\ncommit-hash: ed61e7d7e242494fb7057f2657300d9e77bb4fcb\ncommit-date: 2025-11-07\nhost: x86_64-unknown-linux-gnu\nrelease: 1.91.1\nLLVM version: 21.1.2\n","stderr":""},"4004168384107719125":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/mamostehp/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_feature=\"ssse3\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"8677832667160982921":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/mamostehp/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"eabi\"\ntarget_arch=\"arm\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"3586398789307949181":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/mamostehp/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"neon\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/mamostehp/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"4581980744397837174":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/mamostehp/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"popcnt\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_feature=\"sse4.1\"\ntarget_feature=\"ssse3\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""}},"successes":{}}
@@ -1,3 +0,0 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/
@@ -1,3 +0,0 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":14855336370480542997,"profile":9543526985319441559,"path":12353749080186086568,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/arrayref-a9b7d8ef855a2e2b/dep-lib-arrayref","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"borsh\", \"default\", \"serde\", \"std\", \"zeroize\"]","target":12564975964323158710,"profile":9543526985319441559,"path":1724913712469643321,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/arrayvec-322676fb79f1f7b6/dep-lib-arrayvec","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[]","target":4098124618827574291,"profile":9543526985319441559,"path":12534702432912567667,"deps":[[10520923840501062997,"generic_array",false,4330921556552244557]],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/block-buffer-2f25abd1b92445cb/dep-lib-block_buffer","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"default\", \"i128\", \"std\"]","target":8344828840634961491,"profile":9543526985319441559,"path":4250400978350000770,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/byteorder-7f29c8117d257097/dep-lib-byteorder","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":1366226183757803652,"path":11243253845427179361,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/bytes-90d66cd49f71777f/dep-lib-bytes","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"unstable\"]","target":18397703399226382178,"profile":9543526985319441559,"path":14842312227340866347,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/cesu8-607ed38c91714364/dep-lib-cesu8","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":4826714390000139368,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":9543526985319441559,"path":8008196845016587709,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"aarch64-linux-android/release/.fingerprint/cfg-if-5c5dcbb7c6b2e158/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":919189206985233260,"compile_kind":6373778340919622063}

Some files were not shown because too many files have changed in this diff Show More