74 Commits

Author SHA1 Message Date
pezkuwichain cfe50a252a fix: update_tag workflow - use GITHUB_TOKEN instead of PAT
- Removed dependency on WRITE_SECRET_PAT
- Use built-in GITHUB_TOKEN with contents:write permission
- Check existing tags via git instead of secrets
2026-02-11 12:15:44 +03:00
pezkuwichain 1fac88b573 revert: restore original Nova staking code
Removed custom staking modifications - use Nova's original implementation.
Chain config (A+B=C) handles Polkadot 2.0 correctly via timelineChain.
2026-02-11 12:07:51 +03:00
pezkuwichain 20bf60fd3a feat: update splash logo, add missing string resources, add stakingBackingChainId 2026-02-10 17:01:24 +03:00
pezkuwichain f475ff858b feat: sync chains config, rebrand assets icon, update onboarding image
- Sync chains.json from pezkuwi-wallet-utils (staking on Asset Hub)
- Replace Nova star with Nevruz fire icon on Assets bottom nav tab
- Update onboarding welcome background image (all DPI variants)
- Fix build URLs to point to pezkuwi-wallet-utils GitHub raw
- Update staking reward calculator and era computation
- Bump version code to 159
2026-02-10 16:05:57 +03:00
pezkuwichain 62ffa5d959 Fix duplicate ChainRegistry import 2026-02-09 21:35:32 +03:00
pezkuwichain 4cd4999e04 Fix nomination pool interactors to use parent chain for exposures
For Asset Hub nomination pools, elected exposures must be queried from
the parent relay chain where validators actually exist.
2026-02-09 21:06:14 +03:00
pezkuwichain 97d2c803bf Fix nomination pools staking data query: use parent chain for exposures
For Asset Hub nomination pools, validator exposures and prefs must be
fetched from the parent relay chain, not Asset Hub itself.
2026-02-09 20:58:39 +03:00
pezkuwichain 66879ae3c1 feat(staking): prepare for Polkadot 2.0 nomination pools on Asset Hub
- ChainExt.kt: Handle nomination-pools without local backing type (Polkadot 2.0)
- Add hasLocalNominationPoolsBacking() helper function
- Default to RELAYCHAIN when no local backing type exists
- StakingDashboardUpdateSystem: Improved error logging
- StakingDashboardViewModel: Show toast when item is syncing
- Update chains.json: relay chain only has relaychain staking
2026-02-09 08:47:53 +03:00
pezkuwichain 6f8a8b9511 fix: ktlint - remove unused import and extra whitespace 2026-02-09 03:16:55 +03:00
pezkuwichain 8c74b537d0 fix: Add safety improvements for swap and XCM functionality
- Add independent chain warm-up with error handling
- Add fallback fee estimation when dry run fails
- Handle empty forwarded XCMs in dry run gracefully
- Support both legacy and new XCM config destination formats
- Use xcmPalletNameOrNull for safer pallet detection
- Add Teyrchain junction support for legacy cross-chain config
- Recover from dry run failures in cross-chain transfers
- Add Pezkuwi Asset Hub to swap warm-up chains
2026-02-09 03:03:06 +03:00
pezkuwichain 0457819ba4 chore: update gift icon with Pezkuwi branding 2026-02-09 02:27:29 +03:00
pezkuwichain 3539f47722 fix: ktlint issues - remove unused import and extra spaces 2026-02-09 01:37:45 +03:00
pezkuwichain 35ce943f65 feat(xcm): Add Pezkuwi Teyrchain junction support for cross-chain transfers
- Add TEYRCHAIN_INFO constant and TeyrchainInfo pallet lookup
- Add PezkuwiXcm pallet support in xcmPalletName functions
- Update ParachainInfoRepository to query TeyrchainId storage
- Add junctionTypeName to ParachainId for Teyrchain encoding
- Update MultiLocationEncoding to handle both Parachain and Teyrchain
- Detect Pezkuwi chains by genesis hash for correct junction type

Fixes cross-chain transfers between Pezkuwi, Asset Hub, and People chains.
2026-02-09 01:01:48 +03:00
pezkuwichain 9babf454c9 Fix cross-chain XCM config parsing for destination field
The XCM config JSON has a nested structure where chainId and assetId
are inside a "destination" object, but the Kotlin class expected them
at the root level. This was causing NullPointerException when parsing
cross-chain transfer configurations.

Changes:
- Add XcmTransferDestinationRemote class to represent nested destination
- Update DynamicXcmTransferRemote to use destination object instead of
  flat chainId/assetId fields
- Update Dynamic.kt mapping to access transfer.destination.chainId/assetId

This fixes cross-chain transfers between Pezkuwi, Pezkuwi Asset Hub,
and Pezkuwi People chains.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 05:23:23 +03:00
pezkuwichain 81c3e1bbaa fix: Fix ktlint errors (unused imports, line length, formatting) 2026-02-07 05:38:04 +03:00
pezkuwichain caa5e0f463 fix: Use actual seed from SecretStoreV2 for Pezkuwi bizinikiwi signing
The keypair.privateKey from SecretStoreV2 is NOT the original 32-byte seed.
This was causing public key mismatch when expanding the keypair.

Changes:
- SecretsSigner now gets seed via getAccountSecrets().seed()
- PezkuwiKeyPairSigner.fromSeed() expands seed to proper keypair
- Fixes "bad signature" error on HEZ transfers
2026-02-07 04:59:27 +03:00
pezkuwichain c12dd79c74 feat: Add bizinikiwi signing context for Pezkuwi ecosystem
Pezkuwi chains use "bizinikiwi" signing context instead of standard
"substrate" context used by Polkadot ecosystem. This was causing
"bad signature" errors on HEZ transfers.

Changes:
- Add sr25519-bizinikiwi native Rust binding with bizinikiwi context
- Add isPezkuwiChain extension to detect Pezkuwi ecosystem chains
- Add PezkuwiKeyPairSigner for signing with bizinikiwi context
- Modify SecretsSigner to use correct context based on chain:
  - Pezkuwi chains (3) -> BizinikiwSr25519 (bizinikiwi)
  - Other chains (98+) -> KeyPairSigner (substrate)
- Add live transfer test for Pezkuwi mainnet

Tested with successful HEZ transfer on Pezkuwi mainnet:
TX: 0xe25a4eaaeaa04122cca130582dba3cacb2280dea5d908924b45757ea67c27996
2026-02-07 03:41:52 +03:00
pezkuwichain 7542046890 docs: Update changelog with recent changes and current status 2026-02-03 06:21:36 +03:00
pezkuwichain 14973798e9 debug: Add detailed logging for extrinsic build failures 2026-02-03 06:18:03 +03:00
pezkuwichain b107c1bd1a fix: Fix ktlint errors in debug logging statements 2026-02-03 06:08:53 +03:00
pezkuwichain 58e6fca23d test: Add Pezkuwi integration tests for runtime type verification 2026-02-03 05:56:16 +03:00
pezkuwichain d70ee29442 ci: Add GitHub Action to auto-sync main and master branches 2026-02-03 05:44:20 +03:00
pezkuwichain 032cbde2d6 feat: Add Pezkuwi chain support with custom signed extensions
- Add PezkuwiAddressConstructor for custom address type handling
- Add custom signed extensions (CheckNonZeroSender, CheckWeight, WeightReclaim, PezkuwiCheckMortality)
- Add pezkuwi.json type definitions
- Update RuntimeSnapshotExt for multiple address type lookups
- Update CHAINS_URL to use GitHub-hosted chains.json with types config
- Add feeViaRuntimeCall support for Pezkuwi chains
- Add debug diagnostics for runtime type issues (to be cleaned before production)
- Add CHANGELOG_PEZKUWI.md documenting all changes
2026-02-03 05:41:52 +03:00
pezkuwichain bb189aeb8a fix: add AuthorizeCall signed extension for PezkuwiChain
PezkuwiChain requires AuthorizeCall as the first signed extension in
the TxExtension tuple. This commit adds:

- AuthorizeCall.kt: FixedValueTransactionExtension with empty payload
  (PhantomData equivalent)
- CustomTransactionExtensions: Detects PezkuwiChain via metadata and
  adds AuthorizeCall extension
- ExtrinsicBuilderFactory/ExtrinsicSplitter: Uses CustomTransactionExtensions

Without this fix, transactions fail with "bad signature" errors and
fee calculation (payment_queryInfo) fails with WASM trap errors.
2026-02-02 17:43:59 +03:00
pezkuwichain a5cc31f82c fix: Use lowercase type values in chains.json (native, statemine) 2026-02-02 06:30:10 +03:00
pezkuwichain 92c33641b1 feat: Add fullSyncByDefault to Pezkuwi chains and fix chain sorting
- Added fullSyncByDefault option to all Pezkuwi chains (mainnet, Asset Hub,
  People, Zagros) to enable automatic balance sync
- Fixed chain sorting to include Polkadot and Kusama relay chains
- Pezkuwi ecosystem now correctly appears first in network lists
2026-02-02 05:55:38 +03:00
pezkuwichain ee09983ff1 Fix ktlint spacing error in ChainExt.kt 2026-02-02 03:28:12 +03:00
pezkuwichain e412f49c0d Security: remove keystore files from repo and fix Kurdish translations
- Remove .jks files from git tracking (security)
- Fix duplicate string entries in values-ku/strings.xml
- Remove Turkish translations (values-tr)
- Update launcher icons and chain config
2026-02-02 03:13:48 +03:00
pezkuwichain b1d1aed538 Fix Pezkuwi mainnet chainId and teyrchain parentIds
Updated chainId from old testnet genesis to correct mainnet genesis:
- Pezkuwi: bb4a61ab0c4b8c12f5eab71d0c86c482e03a275ecdafee678dea712474d33d75
- Asset Hub parentId: updated to match mainnet
- People Chain parentId: updated to match mainnet

This fixes the issue where wallet was showing 0 balance for accounts
because it was looking for the wrong chain genesis hash.
2026-01-31 07:09:44 +03:00
pezkuwichain 817c1748f2 feat: add VPS deploy step for wallet.pezkuwichain.io 2026-01-27 20:46:52 +03:00
pezkuwichain 95c68744da Update app launcher icons and add crash prevention
- Update Pezkuwi launcher icon design for all density buckets
- Resize icons to correct Android dimensions (mdpi to xxxhdpi)
- Add error handling to BalanceDetailViewModel flows to prevent crashes
- Handle RPC failures gracefully with logging instead of crashing
2026-01-25 18:00:22 +03:00
pezkuwichain a506a85d37 Add crowdloans option to Pezkuwi chain for Coming Soon state 2026-01-25 17:34:25 +03:00
pezkuwichain 0ffa9ac7a0 Fix workflow: remove invalid secret reference from with block 2026-01-25 17:00:26 +03:00
pezkuwichain a1ec9a8b9b Add graceful error handling for RPC connection failures
- StatemineAssetBalance: Handle connection errors in queryAccountBalance,
  existentialDeposit, subscribeAccountBalanceUpdatePoint, and startSyncingBalance
- NativeAssetBalance: Handle connection errors in all balance query and sync methods
- Return safe defaults (zero balance, empty flows) instead of crashing
- Log errors for debugging without interrupting user experience
2026-01-25 16:45:13 +03:00
pezkuwichain fa41ffb4d4 Switch CI from assembleDevelop to assembleDebug for proper OAuth
- Changed build type from develop (.dev) to debug (.debug)
- Updated Firebase App ID secret reference
- Updated APK paths for debug build
- This aligns with pezkuwi-wallet-debug Firebase project setup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 14:15:16 +03:00
pezkuwichain 429fc1ee43 Fix Google Drive backup OAuth configuration
- Add new debug keystore with unique SHA-1 fingerprint
- Update google-services.json with proper OAuth clients
- Configure debug build to use new keystore
- Both Android OAuth client (type 1) and Web client (type 3) now present

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 07:19:51 +03:00
pezkuwichain c1b4855d2c Enable Google Drive backup with OAuth 2026-01-25 04:57:05 +03:00
pezkuwichain 360627d836 Update version properties and add .kotlin to gitignore 2026-01-25 04:03:59 +03:00
pezkuwichain a6b10f932f Remove unused Nova branding assets for Play Store compliance
- Delete 19 unused ic_nova_*.png files from drawable folders
- Delete 4 Nova reference files from docs folder
- These files were not referenced anywhere in code
2026-01-25 02:49:36 +03:00
pezkuwichain bc876396c9 Update welcome screen background and fix misplaced assets
- Update ic_create_wallet_background for all densities
- Update ic_launcher_round
- Remove wrongly placed PNG files from res root folder
2026-01-25 02:37:00 +03:00
pezkuwichain 6a051ec9e0 Add project assets and debug configuration
- Add Pezkuwi brand logos and icons to docs folder
- Add debug Firebase configuration
- Add version properties
2026-01-25 00:18:56 +03:00
pezkuwichain a8c89e8267 Add Kurdish language to language selection 2026-01-24 23:04:32 +03:00
pezkuwichain 096587f11b Update logos and add HEZ/PEZ price fallback mechanism
- Update launcher icons (ic_launcher, ic_launcher_round, ic_launcher_foreground)
- Update ic_pezkuwi_logo for all density buckets
- Add priceId for HEZ (hezkurd) and PEZ (pezkuwi) tokens
- Implement price fallback: if CoinGecko price is 0 or missing:
  - HEZ = DOT price / 3
  - PEZ = DOT price / 10

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 19:52:18 +03:00
pezkuwichain 7e68d94a98 Update Pezkuwi logos and fix chain ordering
- Update ic_pezkuwi_logo with correct logo from docs
- Update ic_pezkuwi_card_logo with correct card logo
- Update app launcher icons (ic_launcher, ic_launcher_round, ic_launcher_foreground)
- ChainExt.kt and TokenSorting.kt changes for Pezkuwi chain priority

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 17:39:43 +03:00
pezkuwichain 4f5e65291f Set CI_BUILD_ID from github.run_number for auto version increment 2026-01-24 15:32:46 +03:00
pezkuwichain 15478b5fd4 Auto-increment versionCode on each build
- Reads/writes VERSION_CODE from version.properties
- Increments on assemble/install tasks
- CI builds still use CI_BUILD_ID
2026-01-24 09:34:15 +03:00
pezkuwichain 4d91cbd392 Fix Google Drive auth: add Android OAuth client 2026-01-24 09:31:37 +03:00
pezkuwichain 19f24fe706 Fix Pezkuwi chain ordering and logos
- Remove 0x prefix from Pezkuwi chainIds to match ChainGeneses constants
- Update chain icons to use pezkuwi-wallet-utils URLs
- Pezkuwi, Asset Hub, People now sorted correctly (0, 1, 2)
2026-01-24 08:55:58 +03:00
pezkuwichain b8b8deef06 Rebrand wallet provider: nova-wallet -> pezkuwi-wallet
- Replaced nova-wallet with pezkuwi-wallet
- Added pezkuwi-js provider for SDK compatibility
- Kept polkadot-js for Polkadot ecosystem compatibility
- Changed isNovaWallet to isPezkuwiWallet

Provider now registers as:
- polkadot-js (Polkadot ecosystem)
- pezkuwi-wallet (Pezkuwi wallet)
- pezkuwi-js (Pezkuwi JS SDK)
2026-01-24 08:18:47 +03:00
pezkuwichain bc21958a76 feat: update app launcher icon with Pezkuwi branding
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 05:20:15 +03:00
pezkuwichain 05d56cacc1 fix: re-enable appium mobile tests
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 04:40:26 +03:00
pezkuwichain f1bc3f9a9f chore: add missing android.env variables file
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 04:34:46 +03:00
pezkuwichain 61eeeb5be9 fix: update GitHub Actions workflows and add Kurdish translation
- Update deprecated actions:
  - actions/checkout@v2 -> v4
  - actions-rs/toolchain@v1 -> dtolnay/rust-toolchain@stable
  - peter-evans/find-comment@v2 -> v3
  - tibdex/github-app-token@v1 -> v2
  - peter-evans/repository-dispatch@v2 -> v3

- Temporarily disable appium-mobile-tests trigger (PAT_TOKEN needs workflow scope)

- Add Kurdish (Kurmancî) translation (values-ku/strings.xml)
  - 1996 strings translated from English
  - Key UI terms in Kurdish (Wallet=Cîzdan, Account=Hesab, etc.)

- Update Pezkuwi branding images

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 04:32:13 +03:00
pezkuwichain 8b05fed73c feat: expand Kurdish (Kurmancî) translation coverage
- Add ~480 translated strings (up from ~100)
- Cover main UI: onboarding, wallet, settings, staking, swap
- Include governance, NFT, transaction, security strings
2026-01-24 04:02:55 +03:00
pezkuwichain 634d2a1125 rebrand: change 'Building for Polkadot' to 'Building for Pezkuwichain' 2026-01-24 03:55:34 +03:00
pezkuwichain dde2b99e3f feat: prioritize Pezkuwi chains and tokens in sorting
- Add PEZKUWI, PEZKUWI_ASSET_HUB, PEZKUWI_PEOPLE genesis hashes
- Chain order: Pezkuwi > Polkadot > Kusama > others
- Token order: HEZ > PEZ > DOT > KSM > USDT > USDC > others
2026-01-24 03:54:52 +03:00
pezkuwichain 3208f7fb57 rebrand: replace Trust Wallet import icon with Pezkuwi branding 2026-01-24 03:48:37 +03:00
pezkuwichain 6f9073043d rebrand: replace Nova assets with Pezkuwi branding
- Replace ic_create_wallet_background with Pezkuwi design
- Replace ic_nova_logo with Pezkuwi logo
- Replace drawable_nova_logo with Pezkuwi branding
- Replace ic_nova_card_logo with Pezkuwi card logo
- Update YouTube URL to @SatoshiQazi
2026-01-24 03:38:06 +03:00
pezkuwichain be6c01939c fix: correct Play Store workflow filename and YAML syntax 2026-01-23 20:23:21 +03:00
pezkuwichain 4082d847e9 fix: replace deprecated set-output with GITHUB_OUTPUT 2026-01-23 20:12:23 +03:00
pezkuwichain fba9ba678f feat: add full Polkadot ecosystem support (102 chains)
- Pezkuwi, Pezkuwi Asset Hub, Pezkuwi People (priority)
- Polkadot, Kusama and all parachains
- Full compatibility with Polkadot ecosystem
2026-01-23 20:05:30 +03:00
pezkuwichain f8311dfe4b fix: resolve ktlint errors in bridge feature module 2026-01-23 15:15:43 +03:00
pezkuwichain 71ca24cbdb feat: add wUSDT bridge feature module
- Add feature-bridge-api module with domain models:
  - BridgeConfig: bridge configuration (addresses, fees, limits)
  - BridgeStatus: backing ratio, reserves, operational status
  - BridgeTransaction: deposit/withdrawal records

- Add feature-bridge-impl module with UI:
  - BridgeDepositFragment: shows Polkadot deposit address with QR code
  - BridgeStatusFragment: shows backing ratio and transparency info

Bridge enables 1:1 backed wUSDT on Pezkuwi Asset Hub,
backed by real USDT on Polkadot Asset Hub.

Bridge wallet: 16dSTc3BexjQKiPta7yNncF8nio4YgDQiPbudHzkuh7XJi8K (Polkadot)
wUSDT Asset ID: 1000, Min deposit: 10 USDT, Fee: 0.1%
2026-01-23 09:36:22 +03:00
pezkuwichain 50c9beb8e1 ci: add workflow_dispatch trigger for develop builds 2026-01-23 06:34:59 +03:00
pezkuwichain 9466aec5e7 feat: add develop signing key for CI builds 2026-01-23 05:12:17 +03:00
pezkuwichain 728ebea8fe feat: add Firebase config for develop variant 2026-01-23 04:39:58 +03:00
pezkuwichain 01f4372b31 feat: add OAuth client to google-services.json for Google Sign-In 2026-01-23 04:03:30 +03:00
pezkuwichain baf627ccf2 fix: update workflow secrets for Pezkuwi
- Make crowdloan secrets optional (Acala, Moonbeam) - not needed for own blockchain
- Make fiat on-ramp secrets optional (MoonPay, Mercuryo) - future update
- Keep EVM secrets required (Infura, Etherscan) - for cross-chain support
- Keep WalletConnect required - for dApp connections
- Keep Google OAuth required - for cloud backup
- Use main branch instead of develop
2026-01-23 03:11:11 +03:00
pezkuwichain 2f96c19e45 fix: update workflows to use main branch instead of develop 2026-01-23 02:57:30 +03:00
pezkuwichain 198d39214f feat: new Pezkuwi launcher icon + token config
- New launcher icon design: 21-rayed Kurdistan sun with 6 Nevroz fires
- Generated all density variants (mdpi to xxxhdpi)
- Added adaptive icon foreground/background
- Updated chains.json with complete token list:
  - HEZ (native, relay chain)
  - PEZ (Asset ID 1, governance token)
  - wHEZ (Asset ID 2, wrapped HEZ)
  - wUSDT (Asset ID 1984, 6 decimals, isSufficient: false)
- Added source SVG design file
2026-01-23 02:54:15 +03:00
pezkuwichain a42190f25b fix: revert gradle namespaces, add release Firebase config
Reverted gradle namespace changes (io.pezkuwichain.wallet -> io.novafoundation.nova)
because they break R class references in Kotlin code.

Internal namespaces are NOT user-visible, so this is acceptable for minimum rebrand.
User-visible elements are all properly branded as Pezkuwi.

Added google-services.json for release variant.
2026-01-23 02:36:47 +03:00
pezkuwichain 5a58a6620e fix: add Firebase configs (release + debug) 2026-01-23 02:16:56 +03:00
pezkuwichain bc76590b34 Complete Pezkuwi rebrand for Play Store release
User-visible changes:
- All strings.xml: Nova → Pezkuwi (12 languages, 721 references)
- App name: Pezkuwi Wallet
- Deep links: pezkuwiwallet://
- WalletConnect: Pezkuwi Wallet metadata
- Backup files: pezkuwiwallet_backup.json
- Push notifications: Pezkuwi Wallet branding

Technical changes:
- Gradle namespaces: io.pezkuwichain.wallet.*
- JS interface prefix: Pezkuwi_*
- User-Agent: Pezkuwi Wallet (Android)
- Firebase: pezkuwi-wallet project config

Assets:
- Nevroz fire logo (Kurdish colors theme)
- 6 density PNG files

Documentation:
- PACKAGE_STRUCTURE_REBRAND.md for future refactoring
2026-01-23 02:15:34 +03:00
pezkuwichain 31c8c5995f Initial commit: Pezkuwi Wallet Android
Complete rebrand of Nova Wallet for Pezkuwichain ecosystem.

## Features
- Full Pezkuwichain support (HEZ & PEZ tokens)
- Polkadot ecosystem compatibility
- Staking, Governance, DeFi, NFTs
- XCM cross-chain transfers
- Hardware wallet support (Ledger, Polkadot Vault)
- WalletConnect v2
- Push notifications

## Languages
- English, Turkish, Kurmanci (Kurdish), Spanish, French, German, Russian, Japanese, Chinese, Korean, Portuguese, Vietnamese

Based on Nova Wallet by Novasama Technologies GmbH
© Dijital Kurdistan Tech Institute 2026
2026-01-23 01:31:12 +03:00
1514 changed files with 86482 additions and 4680 deletions
+2 -43
View File
@@ -130,6 +130,8 @@ env:
POLKASSEMBLY_SUMMARY_API_KEY: ${{ secrets.POLKASSEMBLY_SUMMARY_API_KEY }} 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}} group: ${{ github.workflow }}-${{ github.ref }}-${{inputs.upload-name}}
cancel-in-progress: true cancel-in-progress: true
@@ -144,14 +146,6 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
ref: ${{ inputs.branch }} 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 - name: 📂 Set up DEV Google Services
uses: davidSchuppa/base64Secret-toFile-action@v3 uses: davidSchuppa/base64Secret-toFile-action@v3
@@ -167,16 +161,6 @@ jobs:
filename: google-services.json filename: google-services.json
destination-path: ./app/src/release/ 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 - name: 🔧 Install dependencies
uses: ./.github/workflows/install/ uses: ./.github/workflows/install/
@@ -218,28 +202,3 @@ jobs:
with: with:
name: ${{ inputs.upload-name }} name: ${{ inputs.upload-name }}
path: app/build/outputs/apk/ 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
@@ -1,47 +0,0 @@
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
@@ -1,40 +0,0 @@
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
+3 -3
View File
@@ -9,7 +9,7 @@ jobs:
build-app: build-app:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with: with:
branch: ${{ github.head_ref || github.ref_name || 'main' }} branch: ${{github.head_ref}}
gradlew-command: assembleDebug gradlew-command: assembleDebug
upload-name: develop-apk upload-name: develop-apk
run-tests: false run-tests: false
@@ -18,7 +18,7 @@ jobs:
run-tests: run-tests:
needs: [build-app] needs: [build-app]
runs-on: macos-14 runs-on: macos-13
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -46,7 +46,7 @@ jobs:
- uses: actions/upload-artifact@v4 - uses: actions/upload-artifact@v4
if: always() if: always()
with: with:
name: android-results name: anroid-results
path: ./allure-results.tar path: ./allure-results.tar
report: report:
-52
View File
@@ -1,52 +0,0 @@
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: workflow_dispatch:
inputs: inputs:
app_version: app_version:
description: 'Version of application (e.g. v1.0.0)' description: 'Version of application'
required: true required: true
default: v1.0.0 default: v*.*.*
branch: branch:
description: 'From which branch the application will be built' description: 'From which branch the application will be built'
required: true required: true
@@ -17,7 +17,7 @@ jobs:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with: with:
branch: ${{ github.event.inputs.branch }} branch: ${{ github.event.inputs.branch }}
gradlew-command: bundleReleaseMarket gradlew-command: assembleReleaseMarket
keystore-file-name: market_key.jks keystore-file-name: market_key.jks
secrets: inherit secrets: inherit
@@ -27,46 +27,30 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set Environment Variables
uses: tw3lveparsecs/github-actions-setvars@v0.1
with:
envFilePath: .github/workflows/variables/android.env
- name: Download bundle artifact - name: Download built artifact
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: apk-bundle name: apk
path: app/bundle path: app
- 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 - name: Rename artifacts
run: mv app/bundle/releaseMarket/app-releaseMarket.aab app/bundle/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.aab run: mv app/releaseMarket/app-releaseMarket.apk app/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.apk
- 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 - name: Market publication
uses: r0adkll/upload-google-play@v1 uses: r0adkll/upload-google-play@v1
with: with:
serviceAccountJsonPlainText: ${{ secrets.CREDENTIAL_FILE_CONTENT }} serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }} # The contents of your service-account.json
packageName: io.pezkuwichain.wallet packageName: io.pezkuwichain.wallet
releaseFiles: app/bundle/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.aab releaseFiles: app/releaseMarket/pezkuwi-wallet-android-${{ github.event.inputs.app_version }}.apk
track: alpha track: production # One of production, beta, alpha, internalsharing, internal, or a custom track name (case sensitive)
status: draft status: draft # One of "completed", "inProgress", "halted", "draft"
inAppUpdatePriority: 2 inAppUpdatePriority: 2
whatsNewDirectory: distribution/whatsnew userFraction: 1.0 # Percentage of users who should get the staged version of the app. Defaults to 1.0
mappingFile: app/mapping/releaseMarket/mapping.txt 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
debugSymbols: ${{ steps.check-symbols.outputs.path }} 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
+2 -4
View File
@@ -16,13 +16,11 @@ runs:
cmdline-tools-version: 12266719 cmdline-tools-version: 12266719
- name: Install NDK - name: Install NDK
run: | run: echo "y" | sudo ${ANDROID_SDK_ROOT}/cmdline-tools/16.0/bin/sdkmanager --install "ndk;26.1.10909125" --sdk_root=${ANDROID_SDK_ROOT}
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 shell: bash
- name: Set ndk.dir in local.properties - name: Set ndk.dir in local.properties
run: echo "ndk.dir=${ANDROID_SDK_ROOT}/ndk/26.1.10909125" >> local.properties run: echo "ndk.dir=${{ steps.setup-ndk.outputs.ndk-path }}" >> local.properties
shell: bash shell: bash
- name: 🦀 Install Rust - name: 🦀 Install Rust
@@ -3,14 +3,6 @@ name: Manual Firebase distribution
on: on:
workflow_dispatch: workflow_dispatch:
inputs: inputs:
build_variant:
description: 'Build variant'
required: true
type: choice
options:
- develop
- releaseMarket
default: develop
firebase_group: firebase_group:
description: 'Firebase group' description: 'Firebase group'
required: true required: true
@@ -25,8 +17,7 @@ jobs:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with: with:
branch: ${{ github.event.inputs.branch }} branch: ${{ github.event.inputs.branch }}
gradlew-command: assemble${{ github.event.inputs.build_variant == 'releaseMarket' && 'ReleaseMarket' || 'Develop' }} gradlew-command: assembleDevelop
keystore-file-name: ${{ github.event.inputs.build_variant == 'releaseMarket' && 'market_key.jks' || 'false' }}
secrets: inherit secrets: inherit
upload: upload:
@@ -44,8 +35,8 @@ jobs:
- name: 🗳 Upload to Firebase - name: 🗳 Upload to Firebase
uses: ./.github/workflows/upload-to-firebase uses: ./.github/workflows/upload-to-firebase
with: with:
appId: ${{ github.event.inputs.build_variant == 'releaseMarket' && secrets.ANDROID_RELEASE_FIREBASE_APP_ID || secrets.ANDROID_DEVELOP_FIREBASE_APP_ID }} appId: ${{ secrets.ANDROID_DEVELOP_FIREBASE_APP_ID }}
firebase-token: ${{ github.event.inputs.build_variant == 'releaseMarket' && secrets.RELEASE_FIREBASE_CREDENTIAL || secrets.CREDENTIAL_FILE_CONTENT }} firebase-token: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
releaseNotes: "v1.0.0 - ${{ github.event.inputs.build_variant }} build from ${{ github.event.inputs.branch }}" releaseNotes: ${{ github.event.head_commit.message }}
test-groups: ${{ github.event.inputs.firebase_group }} test-groups: ${{ github.event.inputs.firebase_group }}
upload-file: ${{ github.event.inputs.build_variant == 'releaseMarket' && 'app/releaseMarket/app-releaseMarket.apk' || 'app/develop/app-develop.apk' }} upload-file: app/develop/app-develop.apk
+6 -7
View File
@@ -1,4 +1,4 @@
name: Build and deploy release apk name: Build test and deploy debug apk
on: on:
push: push:
@@ -10,8 +10,7 @@ jobs:
uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main uses: pezkuwichain/pezkuwi-wallet-android/.github/workflows/android_build.yml@main
with: with:
branch: main branch: main
gradlew-command: assembleReleaseMarket gradlew-command: assembleDebug
keystore-file-name: market_key.jks
secrets: inherit secrets: inherit
upload-to-firebase: upload-to-firebase:
@@ -29,11 +28,11 @@ jobs:
- name: 🗳 Upload to Firebase - name: 🗳 Upload to Firebase
uses: ./.github/workflows/upload-to-firebase uses: ./.github/workflows/upload-to-firebase
with: with:
appId: ${{ secrets.ANDROID_RELEASE_FIREBASE_APP_ID }} appId: ${{ secrets.ANDROID_DEBUG_FIREBASE_APP_ID }}
firebase-token: ${{ secrets.RELEASE_FIREBASE_CREDENTIAL }} firebase-token: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
releaseNotes: ${{ github.event.head_commit.message }} releaseNotes: ${{ github.event.head_commit.message }}
test-groups: dev-team test-groups: dev-team
upload-file: app/releaseMarket/app-releaseMarket.apk upload-file: app/debug/app-debug.apk
upload-to-s3: upload-to-s3:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -60,7 +59,7 @@ jobs:
s3_access_key: ${{ secrets.SCW_ACCESS_KEY }} s3_access_key: ${{ secrets.SCW_ACCESS_KEY }}
s3_secret_key: ${{ secrets.SCW_SECRET_KEY }} s3_secret_key: ${{ secrets.SCW_SECRET_KEY }}
s3_bucket: ${{ env.S3_BUCKET }} s3_bucket: ${{ env.S3_BUCKET }}
upload_file: app/releaseMarket/app-releaseMarket.apk upload_file: app/debug/app-debug.apk
- name: Show S3 URL - name: Show S3 URL
run: | run: |
-132
View File
@@ -1,132 +0,0 @@
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
@@ -0,0 +1,34 @@
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
+1 -4
View File
@@ -25,8 +25,5 @@ app/*.apk
!/core-db/schemas/io.novafoundation.nova.core_db.AppDatabase/8.json !/core-db/schemas/io.novafoundation.nova.core_db.AppDatabase/8.json
!/core-db/schemas/io.novafoundation.nova.core_db.AppDatabase/9.json !/core-db/schemas/io.novafoundation.nova.core_db.AppDatabase/9.json
# Firebase config - contains sensitive API keys google-services.jsonversion.properties
google-services.json
**/google-services.json
.kotlin/ .kotlin/
+2 -2
View File
@@ -1,5 +1,5 @@
/build /build
/release* /release*
# Firebase config - sensitive API keys src/release*/google-services.json
**/google-services.json !src/release/google-services.json
+9 -9
View File
@@ -11,10 +11,6 @@ android {
versionCode computeVersionCode() versionCode computeVersionCode()
versionName computeVersionName() versionName computeVersionName()
// Branch.io key from local.properties or environment variable
manifestPlaceholders = [
BRANCH_KEY: readRawSecretOrNull('BRANCH_KEY') ?: "key_test_placeholder"
]
} }
signingConfigs { signingConfigs {
dev { dev {
@@ -49,9 +45,8 @@ android {
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
} }
release { release {
minifyEnabled true minifyEnabled false
shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
buildConfigField "String", "BuildType", "\"release\"" buildConfigField "String", "BuildType", "\"release\""
} }
@@ -69,7 +64,9 @@ android {
initWith buildTypes.release initWith buildTypes.release
matchingFallbacks = ['release'] matchingFallbacks = ['release']
signingConfig signingConfigs.market signingConfig signingConfigs.market
ndk { debugSymbolLevel 'FULL' }
versionNameSuffix "-${releaseApplicationSuffix}"
applicationIdSuffix ".${releaseApplicationSuffix}"
buildConfigField "String", "BuildType", "\"releaseMarket\"" buildConfigField "String", "BuildType", "\"releaseMarket\""
} }
@@ -78,6 +75,9 @@ android {
matchingFallbacks = ['release'] matchingFallbacks = ['release']
signingConfig signingConfigs.github signingConfig signingConfigs.github
versionNameSuffix '-github'
applicationIdSuffix '.github'
buildConfigField "String", "BuildType", "\"releaseGithub\"" buildConfigField "String", "BuildType", "\"releaseGithub\""
} }
develop { develop {
@@ -169,7 +169,7 @@ void createBindReleaseFileTask(String destination) {
play { play {
serviceAccountCredentials = file(System.env.CI_PLAY_KEY ?: "../key/fake.json") serviceAccountCredentials = file(System.env.CI_PLAY_KEY ?: "../key/fake.json")
track = "production" track = "beta"
releaseStatus = "completed" releaseStatus = "completed"
} }
+39
View File
@@ -0,0 +1,39 @@
{
"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"
}
+18 -263
View File
@@ -1,266 +1,21 @@
# ============================================================ # Add project specific ProGuard rules here.
# Pezkuwi Wallet ProGuard Rules # 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
# Keep line numbers for debugging crash reports # If your project uses WebView with JS, uncomment the following
-keepattributes SourceFile,LineNumberTable # and specify the fully qualified class name to the JavaScript interface
-renamesourcefileattribute SourceFile # class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# ============================================================ # Uncomment this to preserve the line number information for
# Kotlin # debugging stack traces.
# ============================================================ #-keepattributes SourceFile,LineNumberTable
-dontwarn kotlin.**
-keep class kotlin.Metadata { *; }
-keepclassmembers class kotlin.Metadata {
public <methods>;
}
# Kotlin Coroutines # If you keep the line number information, uncomment this to
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {} # hide the original source file name.
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {} #-renamesourcefileattribute SourceFile
-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
@@ -0,0 +1,84 @@
{
"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
@@ -0,0 +1,39 @@
{
"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
@@ -0,0 +1,38 @@
{
"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 <meta-data
android:name="io.branch.sdk.BranchKey" android:name="io.branch.sdk.BranchKey"
android:value="${BRANCH_KEY}" /> android:value="key_live_dsxlmUqNhbtOYX6e7cfgrpkbqsjGPYBf" />
<meta-data android:name="io.branch.sdk.TestMode" android:value="false" /> <meta-data android:name="io.branch.sdk.TestMode" android:value="false" />
@@ -285,8 +285,8 @@ class Navigator(
.navigateInFirstAttachedContext() .navigateInFirstAttachedContext()
} }
override fun openSend(payload: SendPayload, initialRecipientAddress: String?, initialAmount: Double?) { override fun openSend(payload: SendPayload, initialRecipientAddress: String?) {
val extras = SelectSendFragment.getBundle(payload, initialRecipientAddress, initialAmount) val extras = SelectSendFragment.getBundle(payload, initialRecipientAddress)
navigationBuilder().cases() navigationBuilder().cases()
.addCase(R.id.sendFlowFragment, R.id.action_sendFlow_to_send) .addCase(R.id.sendFlowFragment, R.id.action_sendFlow_to_send)
@@ -412,9 +412,7 @@ class Navigator(
} }
override fun openSendFlow() { override fun openSendFlow() {
navigationBuilder().cases() navigationBuilder().action(R.id.action_mainFragment_to_sendFlow)
.addCase(R.id.mainFragment, R.id.action_mainFragment_to_sendFlow)
.addCase(R.id.bridgeFragment, R.id.action_bridge_to_sendFlow)
.navigateInFirstAttachedContext() .navigateInFirstAttachedContext()
} }
@@ -433,11 +431,6 @@ class Navigator(
.navigateInFirstAttachedContext() .navigateInFirstAttachedContext()
} }
override fun openBridgeFlow() {
navigationBuilder().action(R.id.action_mainFragment_to_bridgeFlow)
.navigateInFirstAttachedContext()
}
override fun openSelectGiftAmount(assetPayload: AssetPayload) { override fun openSelectGiftAmount(assetPayload: AssetPayload) {
navigationBuilder().action(R.id.action_selectGiftAmount) navigationBuilder().action(R.id.action_selectGiftAmount)
.setArgs(SelectGiftAmountFragment.createPayload(SelectGiftAmountPayload(assetPayload))) .setArgs(SelectGiftAmountFragment.createPayload(SelectGiftAmountPayload(assetPayload)))
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

After

Width:  |  Height:  |  Size: 830 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 40 KiB

@@ -635,14 +635,6 @@
app:popEnterAnim="@anim/fragment_close_enter" app:popEnterAnim="@anim/fragment_close_enter"
app:popExitAnim="@anim/fragment_close_exit" /> 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 <action
android:id="@+id/action_mainFragment_to_swapFlow" android:id="@+id/action_mainFragment_to_swapFlow"
app:destination="@id/select_swap_token_nav_graph" app:destination="@id/select_swap_token_nav_graph"
@@ -1188,21 +1180,6 @@
</fragment> </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 <fragment
android:id="@+id/tradeProvidersFragment" android:id="@+id/tradeProvidersFragment"
android:name="io.novafoundation.nova.feature_assets.presentation.trade.provider.TradeProviderListFragment" android:name="io.novafoundation.nova.feature_assets.presentation.trade.provider.TradeProviderListFragment"
+39
View File
@@ -0,0 +1,39 @@
{
"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"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/> <background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon> </adaptive-icon>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 14 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: 187 B

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 73 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: 36 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 29 KiB

+1 -2
View File
@@ -15,8 +15,7 @@ hydra-dx-math = { git = "https://github.com/galacticcouncil/HydraDX-node", versi
jni = { version = "0.17.0", default-features = false } jni = { version = "0.17.0", default-features = false }
[profile.release] [profile.release]
strip = false strip = true
debug = 2
lto = true lto = true
opt-level = "s" opt-level = "s"
+1 -2
View File
@@ -14,8 +14,7 @@ frame-metadata = { version = "16.0.0", features = [ "current" ] }
codec = { package = "parity-scale-codec", version = "3.6.9", features = [ "derive" ] } codec = { package = "parity-scale-codec", version = "3.6.9", features = [ "derive" ] }
[profile.release] [profile.release]
strip = false strip = true
debug = 2
lto = true lto = true
opt-level = "s" opt-level = "s"
+1 -2
View File
@@ -11,8 +11,7 @@ jni = { version = "0.21", default-features = false }
zeroize = "1.7" zeroize = "1.7"
[profile.release] [profile.release]
strip = false strip = true
debug = 2
lto = true lto = true
opt-level = "s" opt-level = "s"
@@ -0,0 +1 @@
{"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":{}}
@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/
@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"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