├── .watchmanconfig ├── .node-version ├── .husky ├── pre-commit └── commit-msg ├── src ├── utils │ ├── i18n │ │ ├── locales │ │ │ ├── arb │ │ │ │ ├── fee.json │ │ │ │ ├── cards.json │ │ │ │ ├── lightning.json │ │ │ │ ├── other.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── widgets.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── common.json │ │ │ │ ├── wallet.json │ │ │ │ └── index.ts │ │ │ ├── fa │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── ja │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── ko │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── no │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── ro │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── uk │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── yo │ │ │ │ ├── cards.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── common.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── security.json │ │ │ │ ├── settings.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── wallet.json │ │ │ │ ├── widgets.json │ │ │ │ └── index.ts │ │ │ ├── el │ │ │ │ ├── security.json │ │ │ │ ├── wallet.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── widgets.json │ │ │ │ ├── lightning.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── other.json │ │ │ │ ├── index.ts │ │ │ │ ├── cards.json │ │ │ │ └── settings.json │ │ │ ├── pt_PT │ │ │ │ ├── cards.json │ │ │ │ ├── common.json │ │ │ │ ├── fee.json │ │ │ │ ├── other.json │ │ │ │ ├── widgets.json │ │ │ │ ├── lightning.json │ │ │ │ ├── onboarding.json │ │ │ │ ├── wallet.json │ │ │ │ ├── security.json │ │ │ │ ├── slashtags.json │ │ │ │ ├── settings.json │ │ │ │ └── index.ts │ │ │ ├── ca │ │ │ │ ├── index.ts │ │ │ │ └── widgets.json │ │ │ ├── cs │ │ │ │ └── index.ts │ │ │ ├── de │ │ │ │ └── index.ts │ │ │ ├── en │ │ │ │ └── index.ts │ │ │ ├── fr │ │ │ │ └── index.ts │ │ │ ├── it │ │ │ │ └── index.ts │ │ │ ├── nl │ │ │ │ ├── index.ts │ │ │ │ └── widgets.json │ │ │ ├── pl │ │ │ │ └── index.ts │ │ │ ├── ru │ │ │ │ └── index.ts │ │ │ ├── es_419 │ │ │ │ └── index.ts │ │ │ ├── es_ES │ │ │ │ └── index.ts │ │ │ └── pt_BR │ │ │ │ └── index.ts │ │ ├── helpers.ts │ │ └── convert.ts │ ├── biometrics.ts │ ├── quick-actions.ts │ ├── fetch.ts │ ├── fetch-polyfill.ts │ ├── types │ │ ├── electrum.ts │ │ └── index.ts │ ├── color.ts │ ├── converters.ts │ ├── wallet │ │ └── constants.ts │ ├── exchange-rate │ │ └── currencies.ts │ ├── notifications.ts │ ├── appState.ts │ ├── pubky │ │ └── index.ts │ ├── receive │ │ └── index.ts │ ├── clipboard.ts │ └── displayValues │ │ └── types.ts ├── assets │ ├── logo.png │ ├── bottom-sheet-bg.png │ ├── illustrations │ │ ├── cog.png │ │ ├── card.png │ │ ├── check.png │ │ ├── cross.png │ │ ├── crown.png │ │ ├── email.png │ │ ├── folder.png │ │ ├── gift.png │ │ ├── globe.png │ │ ├── group.png │ │ ├── phone.png │ │ ├── puzzle.png │ │ ├── rocket.png │ │ ├── safe.png │ │ ├── shield.png │ │ ├── spark.png │ │ ├── switch.png │ │ ├── wallet.png │ │ ├── wand.png │ │ ├── b-emboss.png │ │ ├── figures.png │ │ ├── keyring.png │ │ ├── padlock.png │ │ ├── padlock2.png │ │ ├── restore.png │ │ ├── rocket2.png │ │ ├── transfer.png │ │ ├── coin-stack.png │ │ ├── hourglass.png │ │ ├── lightbulb.png │ │ ├── lightning.png │ │ ├── piggybank.png │ │ ├── coin-stack-1.png │ │ ├── coin-stack-2.png │ │ ├── coin-stack-3.png │ │ ├── coin-stack-4.png │ │ ├── coin-stack-x.png │ │ ├── fast-forward.png │ │ ├── ln-sync-large.png │ │ ├── ln-sync-small.png │ │ ├── question-mark.png │ │ ├── shopping-bag.png │ │ ├── bitcoin-emboss.png │ │ ├── coin-stack-logo.png │ │ ├── coin-stack-x-2.png │ │ ├── coin-transparent.png │ │ ├── crown-no-margins.png │ │ ├── exclamation-mark.png │ │ └── loading-circle.png │ ├── spinner-gradient.png │ ├── fonts │ │ ├── Damion-Regular.ttf │ │ ├── InterTight-Black.ttf │ │ ├── InterTight-Bold.ttf │ │ ├── InterTight-Medium.ttf │ │ ├── InterTight-Regular.ttf │ │ ├── InterTight-SemiBold.ttf │ │ └── InterTight-ExtraBold.ttf │ ├── treasure-hunt │ │ ├── empty.jpg │ │ ├── error.jpg │ │ ├── prize.jpg │ │ ├── airdrop.jpg │ │ ├── loading.jpg │ │ ├── treasure.jpg │ │ ├── consolation-1.jpg │ │ ├── consolation-2.jpg │ │ ├── consolation-3.jpg │ │ ├── consolation-4.jpg │ │ ├── consolation-5.jpg │ │ └── consolation-6.jpg │ └── svgs │ │ ├── raw │ │ ├── chevronRight.svg │ │ ├── twitter.svg │ │ ├── exclamation.svg │ │ ├── minusCircled.svg │ │ ├── checkmark.svg │ │ ├── telegram.svg │ │ ├── rightSign.svg │ │ ├── upArrow.svg │ │ ├── leftSign.svg │ │ ├── plus.svg │ │ ├── downArrow.svg │ │ ├── lightning.svg │ │ ├── backspace.svg │ │ ├── x.svg │ │ ├── lightningCircle.svg │ │ ├── speedFast.svg │ │ ├── speedNormal.svg │ │ ├── speedSlow.svg │ │ ├── burger.svg │ │ ├── rightArrow.svg │ │ ├── copy.svg │ │ ├── plusCircled.svg │ │ ├── timer.svg │ │ ├── clock.svg │ │ ├── pencil.svg │ │ ├── rectanglesTwo.svg │ │ ├── activity.svg │ │ ├── back.svg │ │ ├── list.svg │ │ ├── received.svg │ │ ├── sent.svg │ │ ├── send.svg │ │ ├── lightningHollow.svg │ │ ├── timerIconAlt.svg │ │ ├── receive.svg │ │ ├── arrowsClockwise.svg │ │ ├── checkCircle.svg │ │ ├── timerSpeed.svg │ │ ├── sortAscending.svg │ │ ├── paste.svg │ │ ├── shareIos.svg │ │ ├── camera.svg │ │ ├── price.svg │ │ ├── magnifyingGlass.svg │ │ ├── gitBranch.svg │ │ ├── user.svg │ │ ├── cornersOut.svg │ │ ├── shoppingBag.svg │ │ └── arrowClockwise.svg │ │ └── shop │ │ └── shoppingBag.svg ├── store │ ├── actions │ │ └── actions.ts │ ├── reselect │ │ ├── backup.ts │ │ ├── receive.ts │ │ ├── utils.ts │ │ ├── fees.ts │ │ ├── checks.ts │ │ ├── widgets.ts │ │ └── activity.ts │ ├── types │ │ ├── fees.ts │ │ ├── blocktank.ts │ │ ├── metadata.ts │ │ ├── todos.ts │ │ ├── backup.ts │ │ └── settings.ts │ ├── utils │ │ └── user.ts │ └── shapes │ │ ├── backup.ts │ │ ├── lightning.ts │ │ ├── ui.ts │ │ └── blocktank.ts ├── @types │ ├── styled-components.d.ts │ ├── declarations.d.ts │ ├── react-i18next.d.ts │ ├── i18next.d.ts │ └── env.d.ts ├── hooks │ ├── colors.ts │ ├── redux.ts │ ├── screen.ts │ ├── helpers.ts │ ├── blocktank.ts │ ├── useAppStatus.ts │ └── fees.ts ├── sheets │ ├── BottomSheetsLazy.tsx │ └── BottomSheetNavigationContainer.tsx ├── styles │ ├── styled-components.ts │ └── breakpoints.ts ├── components │ ├── widgets │ │ └── edit │ │ │ ├── types.ts │ │ │ └── FactsItems.tsx │ ├── Jdenticon.tsx │ ├── TwoFingerPressable.tsx │ ├── ContactImage.tsx │ ├── buttons │ │ └── ButtonTertiary.tsx │ ├── Divider.tsx │ ├── BottomSheetNavigationHeader.tsx │ ├── SafeAreaInset.tsx │ ├── GradientView.tsx │ ├── CameraGradientView.tsx │ ├── KeyboardAvoidingView.tsx │ ├── Amount.tsx │ ├── BlurView.tsx │ └── BottomSheetBackground.tsx ├── storage │ ├── index.ts │ ├── redux-storage.ts │ ├── widgets-cache.ts │ └── received-tx-cache.ts ├── constants │ └── app.ts ├── ErrorBoundary.tsx └── screens │ ├── TreasureHunt │ └── GradientText.tsx │ └── Wallets │ └── MainOnboarding.tsx ├── __mocks__ ├── fileMock.js ├── rn-qr-generator.ts ├── react-native-localize.ts ├── react-native-share │ └── index.ts ├── @notifee │ └── react-native │ │ └── index.ts ├── react-native-camera-kit.ts ├── @shopify │ └── react-native-skia │ │ └── index.ts ├── react-native-haptic-feedback.ts ├── @react-native-clipboard │ └── clipboard │ │ └── index.ts ├── react-native-fs.ts ├── react-native-zip-archive.ts ├── react-native-tcp-socket │ └── index.ts ├── reactotron-react-native.ts ├── react-native-toast-message.ts ├── react-native-mmkv │ └── index.ts └── react-native-address-generator │ └── index.ts ├── docker ├── electrs.toml └── btc-fee-estimates.json ├── app.json ├── nano-staged.js ├── .yarnrc.yml ├── android ├── app │ ├── debug.keystore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values │ │ │ │ │ ├── strings.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── drawable │ │ │ │ │ ├── recovery.png │ │ │ │ │ └── splash_screen.xml │ │ │ │ ├── drawable-hdpi │ │ │ │ │ └── splash_logo.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ └── splash_logo.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ └── splash_logo.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ └── splash_logo.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ └── splash_logo.png │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher_black.webp │ │ │ │ │ ├── ic_launcher_orange.webp │ │ │ │ │ ├── ic_launcher_black_round.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ ├── ic_launcher_transparent.png │ │ │ │ │ └── ic_launcher_orange_round.webp │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher_black.webp │ │ │ │ │ ├── ic_launcher_orange.webp │ │ │ │ │ ├── ic_launcher_black_round.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ ├── ic_launcher_transparent.png │ │ │ │ │ └── ic_launcher_orange_round.webp │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher_black.webp │ │ │ │ │ ├── ic_launcher_orange.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ ├── ic_launcher_transparent.png │ │ │ │ │ ├── ic_launcher_black_round.webp │ │ │ │ │ └── ic_launcher_orange_round.webp │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher_black.webp │ │ │ │ │ ├── ic_launcher_orange.webp │ │ │ │ │ ├── ic_launcher_black_round.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ ├── ic_launcher_transparent.png │ │ │ │ │ └── ic_launcher_orange_round.webp │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher_black.webp │ │ │ │ │ ├── ic_launcher_orange.webp │ │ │ │ │ ├── ic_launcher_foreground.webp │ │ │ │ │ ├── ic_launcher_transparent.png │ │ │ │ │ ├── ic_launcher_black_round.webp │ │ │ │ │ └── ic_launcher_orange_round.webp │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher_transparent.png │ │ │ │ │ ├── ic_launcher_black.xml │ │ │ │ │ ├── ic_launcher_orange.xml │ │ │ │ │ ├── ic_launcher_black_round.xml │ │ │ │ │ └── ic_launcher_orange_round.xml │ │ │ │ ├── layout │ │ │ │ │ └── splash_screen.xml │ │ │ │ └── xml │ │ │ │ │ └── network_security_config.xml │ │ │ ├── assets │ │ │ │ └── fonts │ │ │ │ │ ├── Damion-Regular.ttf │ │ │ │ │ ├── InterTight-Black.ttf │ │ │ │ │ ├── InterTight-Bold.ttf │ │ │ │ │ ├── InterTight-Medium.ttf │ │ │ │ │ ├── InterTight-Regular.ttf │ │ │ │ │ ├── InterTight-SemiBold.ttf │ │ │ │ │ └── InterTight-ExtraBold.ttf │ │ │ ├── ic_launcher_black-playstore.png │ │ │ ├── ic_launcher_orange-playstore.png │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── bitkit │ │ │ │ └── modules │ │ │ │ └── SplashScreen │ │ │ │ └── SplashScreenPackage.java │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── androidTest │ │ │ └── java │ │ │ └── com │ │ │ └── bitkit │ │ │ └── DetoxTest.java │ └── proguard-rules.pro ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── build.gradle └── settings.gradle ├── ios ├── Fonts │ └── FontAwesome5_Brands.ttf ├── bitkit │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── iTunesArtwork@1x.png │ │ ├── iTunesArtwork@2x.png │ │ ├── iTunesArtwork@3x.png │ │ ├── Splash.imageset │ │ │ ├── Splash.png │ │ │ ├── Splash@2x.png │ │ │ ├── Splash@3x.png │ │ │ └── Contents.json │ │ ├── recovery.imageset │ │ │ ├── recovery.png │ │ │ ├── recovery 1.png │ │ │ ├── recovery 2.png │ │ │ └── Contents.json │ │ └── AppIconOrange.appiconset │ │ │ ├── ItunesArtwork@2x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ └── bitkit.entitlements ├── bitkit.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── .xcode.env ├── react-native.config.js ├── .buckconfig ├── .gitattributes ├── .github ├── workflows │ ├── gradle.properties │ ├── react-native-skia-stub.patch │ ├── lint-check.yml │ └── type-check.yml ├── CODEOWNERS └── pull_request_template.md ├── svgo.config.js ├── .tx └── transifex.yaml ├── e2e └── jest.config.js ├── ReactotronConfig.js ├── Gemfile ├── jest.config.js ├── __tests__ ├── slashtags.test.ts └── wallet.test.ts ├── commitlint.config.js ├── babel.config.js ├── tsconfig.json ├── postinstall.js ├── .env.production.template ├── index.js ├── biome.json └── jest.setup.js /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 18 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | yarn nano-staged 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = ''; 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/cards.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/fee.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/other.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/security.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/slashtags.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/wallet.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/widgets.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /docker/electrs.toml: -------------------------------------------------------------------------------- 1 | auth = "polaruser:polarpass" 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/lightning.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/onboarding.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | npx --no -- commitlint --edit "$1" 2 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bitkit", 3 | "displayName": "bitkit" 4 | } 5 | -------------------------------------------------------------------------------- /__mocks__/rn-qr-generator.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | detect: jest.fn(), 3 | }; 4 | -------------------------------------------------------------------------------- /__mocks__/react-native-localize.ts: -------------------------------------------------------------------------------- 1 | export * from "react-native-localize/mock/jest"; 2 | -------------------------------------------------------------------------------- /nano-staged.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "src/**/*.{ts,tsx}": ["biome check"], 3 | }; 4 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | yarnPath: .yarn/releases/yarn-3.6.4.cjs 4 | -------------------------------------------------------------------------------- /__mocks__/react-native-share/index.ts: -------------------------------------------------------------------------------- 1 | module.exports = jest.mock('react-native-share'); 2 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /__mocks__/@notifee/react-native/index.ts: -------------------------------------------------------------------------------- 1 | module.exports = jest.mock('@notifee/react-native'); 2 | -------------------------------------------------------------------------------- /__mocks__/react-native-camera-kit.ts: -------------------------------------------------------------------------------- 1 | module.exports = jest.mock('react-native-camera-kit'); 2 | -------------------------------------------------------------------------------- /__mocks__/@shopify/react-native-skia/index.ts: -------------------------------------------------------------------------------- 1 | module.exports = jest.mock('@shopify/react-native-skia'); 2 | -------------------------------------------------------------------------------- /__mocks__/react-native-haptic-feedback.ts: -------------------------------------------------------------------------------- 1 | export default { trigger: (type: any, options?: any) => {} }; 2 | -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/debug.keystore -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/onboarding.json: -------------------------------------------------------------------------------- 1 | { 2 | "skip": { 3 | "string": "Παράλειψη" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/bottom-sheet-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/bottom-sheet-bg.png -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "delete_yes": { 3 | "string": "نعم، احذف" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/assets/illustrations/cog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/cog.png -------------------------------------------------------------------------------- /src/assets/spinner-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/spinner-gradient.png -------------------------------------------------------------------------------- /src/store/actions/actions.ts: -------------------------------------------------------------------------------- 1 | const actions = { 2 | WIPE_APP: 'WIPE_APP', 3 | }; 4 | 5 | export default actions; 6 | -------------------------------------------------------------------------------- /__mocks__/@react-native-clipboard/clipboard/index.ts: -------------------------------------------------------------------------------- 1 | module.exports = jest.mock('@react-native-clipboard/clipboard'); 2 | -------------------------------------------------------------------------------- /ios/Fonts/FontAwesome5_Brands.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/Fonts/FontAwesome5_Brands.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Damion-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/Damion-Regular.ttf -------------------------------------------------------------------------------- /src/assets/illustrations/card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/card.png -------------------------------------------------------------------------------- /src/assets/illustrations/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/check.png -------------------------------------------------------------------------------- /src/assets/illustrations/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/cross.png -------------------------------------------------------------------------------- /src/assets/illustrations/crown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/crown.png -------------------------------------------------------------------------------- /src/assets/illustrations/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/email.png -------------------------------------------------------------------------------- /src/assets/illustrations/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/folder.png -------------------------------------------------------------------------------- /src/assets/illustrations/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/gift.png -------------------------------------------------------------------------------- /src/assets/illustrations/globe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/globe.png -------------------------------------------------------------------------------- /src/assets/illustrations/group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/group.png -------------------------------------------------------------------------------- /src/assets/illustrations/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/phone.png -------------------------------------------------------------------------------- /src/assets/illustrations/puzzle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/puzzle.png -------------------------------------------------------------------------------- /src/assets/illustrations/rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/rocket.png -------------------------------------------------------------------------------- /src/assets/illustrations/safe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/safe.png -------------------------------------------------------------------------------- /src/assets/illustrations/shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/shield.png -------------------------------------------------------------------------------- /src/assets/illustrations/spark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/spark.png -------------------------------------------------------------------------------- /src/assets/illustrations/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/switch.png -------------------------------------------------------------------------------- /src/assets/illustrations/wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/wallet.png -------------------------------------------------------------------------------- /src/assets/illustrations/wand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/wand.png -------------------------------------------------------------------------------- /src/assets/treasure-hunt/empty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/empty.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/error.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/error.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/prize.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/prize.jpg -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Bitkit 3 | 4 | -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/assets/fonts/InterTight-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/InterTight-Black.ttf -------------------------------------------------------------------------------- /src/assets/fonts/InterTight-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/InterTight-Bold.ttf -------------------------------------------------------------------------------- /src/assets/illustrations/b-emboss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/b-emboss.png -------------------------------------------------------------------------------- /src/assets/illustrations/figures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/figures.png -------------------------------------------------------------------------------- /src/assets/illustrations/keyring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/keyring.png -------------------------------------------------------------------------------- /src/assets/illustrations/padlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/padlock.png -------------------------------------------------------------------------------- /src/assets/illustrations/padlock2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/padlock2.png -------------------------------------------------------------------------------- /src/assets/illustrations/restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/restore.png -------------------------------------------------------------------------------- /src/assets/illustrations/rocket2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/rocket2.png -------------------------------------------------------------------------------- /src/assets/illustrations/transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/transfer.png -------------------------------------------------------------------------------- /src/assets/treasure-hunt/airdrop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/airdrop.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/loading.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/loading.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/treasure.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/treasure.jpg -------------------------------------------------------------------------------- /__mocks__/react-native-fs.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | mkdir: jest.fn(), 3 | moveFile: jest.fn(), 4 | copyFile: jest.fn(), 5 | }; 6 | -------------------------------------------------------------------------------- /__mocks__/react-native-zip-archive.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | unzipWithPassword: jest.fn(), 3 | zipWithPassword: jest.fn(), 4 | }; 5 | -------------------------------------------------------------------------------- /docker/btc-fee-estimates.json: -------------------------------------------------------------------------------- 1 | { 2 | "fee_by_block_target": { 3 | "1": 300, 4 | "2": 200, 5 | "3": 100 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/assets/fonts/InterTight-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/InterTight-Medium.ttf -------------------------------------------------------------------------------- /src/assets/fonts/InterTight-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/InterTight-Regular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/InterTight-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/InterTight-SemiBold.ttf -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack.png -------------------------------------------------------------------------------- /src/assets/illustrations/hourglass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/hourglass.png -------------------------------------------------------------------------------- /src/assets/illustrations/lightbulb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/lightbulb.png -------------------------------------------------------------------------------- /src/assets/illustrations/lightning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/lightning.png -------------------------------------------------------------------------------- /src/assets/illustrations/piggybank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/piggybank.png -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/assets/fonts/InterTight-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/fonts/InterTight-ExtraBold.ttf -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-1.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-2.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-3.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-4.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-x.png -------------------------------------------------------------------------------- /src/assets/illustrations/fast-forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/fast-forward.png -------------------------------------------------------------------------------- /src/assets/illustrations/ln-sync-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/ln-sync-large.png -------------------------------------------------------------------------------- /src/assets/illustrations/ln-sync-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/ln-sync-small.png -------------------------------------------------------------------------------- /src/assets/illustrations/question-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/question-mark.png -------------------------------------------------------------------------------- /src/assets/illustrations/shopping-bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/shopping-bag.png -------------------------------------------------------------------------------- /src/assets/treasure-hunt/consolation-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/consolation-1.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/consolation-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/consolation-2.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/consolation-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/consolation-3.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/consolation-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/consolation-4.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/consolation-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/consolation-5.jpg -------------------------------------------------------------------------------- /src/assets/treasure-hunt/consolation-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/treasure-hunt/consolation-6.jpg -------------------------------------------------------------------------------- /__mocks__/react-native-tcp-socket/index.ts: -------------------------------------------------------------------------------- 1 | const mockedModule = jest.mock('react-native-tcp-socket'); 2 | module.exports = mockedModule; 3 | -------------------------------------------------------------------------------- /src/assets/illustrations/bitcoin-emboss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/bitcoin-emboss.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-logo.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-stack-x-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-stack-x-2.png -------------------------------------------------------------------------------- /src/assets/illustrations/coin-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/coin-transparent.png -------------------------------------------------------------------------------- /src/assets/illustrations/crown-no-margins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/crown-no-margins.png -------------------------------------------------------------------------------- /src/assets/illustrations/exclamation-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/exclamation-mark.png -------------------------------------------------------------------------------- /src/assets/illustrations/loading-circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/src/assets/illustrations/loading-circle.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/recovery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/drawable/recovery.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/iTunesArtwork@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/iTunesArtwork@1x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/iTunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/iTunesArtwork@2x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/iTunesArtwork@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/iTunesArtwork@3x.png -------------------------------------------------------------------------------- /react-native.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | project: { 3 | ios: {}, 4 | android: {}, 5 | }, 6 | assets: ['./src/assets/fonts/'], 7 | }; 8 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/widgets.json: -------------------------------------------------------------------------------- 1 | { 2 | "widget": { 3 | "edit_custom": { 4 | "string": "Προσαρμοσμένο" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Windows files should use crlf line endings 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | *.bat text eol=crlf 4 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Damion-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/Damion-Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher_black-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/ic_launcher_black-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/InterTight-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/InterTight-Black.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/InterTight-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/InterTight-Bold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/InterTight-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/InterTight-Medium.ttf -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher_orange-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/ic_launcher_orange-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/drawable-hdpi/splash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/drawable-mdpi/splash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/drawable-xhdpi/splash_logo.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/Splash.imageset/Splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/Splash.imageset/Splash.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/InterTight-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/InterTight-Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/InterTight-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/InterTight-SemiBold.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/drawable-xxhdpi/splash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/drawable-xxxhdpi/splash_logo.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/Splash.imageset/Splash@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/Splash.imageset/Splash@2x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/Splash.imageset/Splash@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/Splash.imageset/Splash@3x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/recovery.imageset/recovery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/recovery.imageset/recovery.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/InterTight-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/assets/fonts/InterTight-ExtraBold.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_black.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_black.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_black.webp -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/recovery.imageset/recovery 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/recovery.imageset/recovery 1.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/recovery.imageset/recovery 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/recovery.imageset/recovery 2.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_black.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_black.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_black_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_black_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_transparent.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_black_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_black_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_transparent.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_transparent.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_orange_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_orange_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_orange_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_orange_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_black_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_black_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_orange_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_orange_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_black_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_black_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_transparent.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_transparent.png -------------------------------------------------------------------------------- /src/utils/biometrics.ts: -------------------------------------------------------------------------------- 1 | import ReactNativeBiometrics from 'react-native-biometrics'; 2 | 3 | const rnBiometrics = new ReactNativeBiometrics(); 4 | 5 | export default rnBiometrics; 6 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/wallet.json: -------------------------------------------------------------------------------- 1 | { 2 | "error_broadcast_tx_connection": { 3 | "string": "Por favor, verifique sua conexão e tente novamente.\n{message}" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_transparent.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_orange_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_orange_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_black_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_black_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_orange_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_orange_round.webp -------------------------------------------------------------------------------- /src/@types/styled-components.d.ts: -------------------------------------------------------------------------------- 1 | import { ITheme } from '../styles/themes'; 2 | 3 | declare module 'styled-components/native' { 4 | export interface DefaultTheme extends ITheme {} 5 | } 6 | -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/ItunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/ItunesArtwork@2x.png -------------------------------------------------------------------------------- /.github/workflows/gradle.properties: -------------------------------------------------------------------------------- 1 | BITKIT_UPLOAD_STORE_FILE=debug.keystore 2 | BITKIT_UPLOAD_STORE_PASSWORD=android 3 | BITKIT_UPLOAD_KEY_ALIAS=androiddebugkey 4 | BITKIT_UPLOAD_KEY_PASSWORD=android 5 | -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /svgo.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | 'preset-default', 4 | 'removeDimensions', // remove width and height attributes 5 | 'removeXMLNS', // remove xmlns attribute 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | #FF4400 5 | 6 | -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/synonymdev/bitkit/HEAD/ios/bitkit/Images.xcassets/AppIconOrange.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /src/store/reselect/backup.ts: -------------------------------------------------------------------------------- 1 | import { RootState } from '..'; 2 | import { TBackupState } from '../types/backup'; 3 | 4 | export const backupSelector = (state: RootState): TBackupState => state.backup; 5 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # More details are here: https://help.github.com/articles/about-codeowners/ 5 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/security.json: -------------------------------------------------------------------------------- 1 | { 2 | "cp_text": { 3 | "string": "Você pode alterar seu código PIN para uma nova\ncombinação de 4 dígitos. Primeiro, digite seu código PIN atual." 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/store/reselect/receive.ts: -------------------------------------------------------------------------------- 1 | import { RootState } from '..'; 2 | import { TReceiveState } from '../slices/receive'; 3 | 4 | export const receiveSelector = (state: RootState): TReceiveState => { 5 | return state.receive; 6 | }; 7 | -------------------------------------------------------------------------------- /src/utils/i18n/helpers.ts: -------------------------------------------------------------------------------- 1 | import i18n from '../i18n'; 2 | 3 | export const getRandomOkText = (): string => { 4 | const words = i18n.t('ok_random').split('\n'); 5 | return words[Math.floor(Math.random() * words.length)]; 6 | }; 7 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/lightning.json: -------------------------------------------------------------------------------- 1 | { 2 | "transfer_failed": { 3 | "continue": { 4 | "string": "Προσπαθείστε Ξανά" 5 | } 6 | }, 7 | "close_button": { 8 | "string": "Κλείσιμο" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /__mocks__/reactotron-react-native.ts: -------------------------------------------------------------------------------- 1 | const reactotron = { 2 | configure: () => reactotron, 3 | useReactNative: () => reactotron, 4 | use: () => reactotron, 5 | connect: () => reactotron, 6 | }; 7 | 8 | module.exports = reactotron; 9 | -------------------------------------------------------------------------------- /__mocks__/react-native-toast-message.ts: -------------------------------------------------------------------------------- 1 | export type ToastPosition = 'top' | 'bottom' 2 | 3 | export default class Toast { 4 | static show = (options: any): void => {} 5 | static hide = (): void => {} 6 | static setRef = (ref: any): any => {}; 7 | }; 8 | -------------------------------------------------------------------------------- /src/utils/quick-actions.ts: -------------------------------------------------------------------------------- 1 | import QuickActions from 'react-native-quick-actions'; 2 | 3 | QuickActions.setShortcutItems([ 4 | { 5 | type: 'Recovery', 6 | title: 'Recovery', 7 | icon: 'recovery', 8 | userInfo: { url: '' }, 9 | }, 10 | ]); 11 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/slashtags.json: -------------------------------------------------------------------------------- 1 | { 2 | "profile_save": { 3 | "string": "Καταχώρηση" 4 | }, 5 | "profile_link_suggestions": { 6 | "string": "Προτάσεις" 7 | }, 8 | "profile_delete": { 9 | "string": "Διαγραφή" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.tx/transifex.yaml: -------------------------------------------------------------------------------- 1 | filters: 2 | - filter_type: dir 3 | file_format: STRUCTURED_JSON 4 | source_file_extension: json 5 | source_language: en 6 | source_file_dir: src/utils/i18n/locales/en/ 7 | translation_files_expression: src/utils/i18n/locales// 8 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/chevronRight.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/utils/fetch.ts: -------------------------------------------------------------------------------- 1 | // Add text streaming support via react-native-fetch-api 2 | global.fetch = (url, options): Promise => { 3 | return global.fetch(url, { 4 | ...options, 5 | reactNative: { textStreaming: true }, 6 | }); 7 | }; 8 | 9 | export default global.fetch; 10 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/wallet.json: -------------------------------------------------------------------------------- 1 | { 2 | "drawer": { 3 | "contacts": { 4 | "string": "جهات الاتصال" 5 | } 6 | }, 7 | "recipient_contact": { 8 | "string": "جهة الاتصال" 9 | }, 10 | "activity_contact": { 11 | "string": "جهة الاتصال" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/@types/declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg' { 2 | import React from 'react'; 3 | import { SvgProps } from 'react-native-svg'; 4 | const content: React.FC; 5 | export default content; 6 | } 7 | 8 | declare module '*.mp4' { 9 | const src: string; 10 | export default src; 11 | } 12 | -------------------------------------------------------------------------------- /src/@types/react-i18next.d.ts: -------------------------------------------------------------------------------- 1 | // import resources from '../utils/i18n/locales'; // TODO 2 | import { defaultNS } from '../utils/i18n'; 3 | 4 | declare module 'react-i18next' { 5 | interface CustomTypeOptions { 6 | defaultNS: typeof defaultNS; 7 | // resources: typeof resources['en']; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /ios/bitkit.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /src/store/reselect/utils.ts: -------------------------------------------------------------------------------- 1 | import { createSelectorCreator, lruMemoize } from '@reduxjs/toolkit'; 2 | import { shallowEqual } from 'react-redux'; 3 | import { RootState } from '..'; 4 | 5 | export const createShallowEqualSelector = createSelectorCreator( 6 | lruMemoize, 7 | shallowEqual, 8 | ).withTypes(); 9 | -------------------------------------------------------------------------------- /ios/bitkit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/exclamation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/slashtags.json: -------------------------------------------------------------------------------- 1 | { 2 | "contact_your_name": { 3 | "string": "Nome público\ndo seu perfil" 4 | }, 5 | "contact_retrieving": { 6 | "string": "Recebimento\ninformações de contato..." 7 | }, 8 | "profile_link_label_placeholder": { 9 | "string": "Por exemplo, \"Website\"." 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/splash_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "addr": { 3 | "no_addrs_with_funds": { 4 | "string": "Não foi encontrado nenhum endereço contendo \"{searchTxt}\" com fundos " 5 | }, 6 | "no_addrs_str": { 7 | "string": "Nenhum endereço foi encontrado ao pesquisar por \"{searchTxt}\"" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/store/reselect/fees.ts: -------------------------------------------------------------------------------- 1 | import { IOnchainFees } from 'beignet'; 2 | import { RootState } from '..'; 3 | 4 | export const onChainFeesSelector = (state: RootState): IOnchainFees => { 5 | return state.fees.onchain; 6 | }; 7 | 8 | export const overrideFeeSelector = (state: RootState): boolean => { 9 | return state.fees.override; 10 | }; 11 | -------------------------------------------------------------------------------- /src/@types/i18next.d.ts: -------------------------------------------------------------------------------- 1 | import 'i18next'; 2 | // import resources from '../utils/i18n/locales'; // TODO 3 | import { defaultNS } from '../utils/i18n'; 4 | 5 | declare module 'i18next' { 6 | interface CustomTypeOptions { 7 | defaultNS: typeof defaultNS; 8 | returnNull: false; 9 | // resources: typeof resources['en']; // TODO 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/hooks/colors.ts: -------------------------------------------------------------------------------- 1 | import { useAppSelector } from '../hooks/redux'; 2 | import { themeColorsSelector } from '../store/reselect/settings'; 3 | import { IColors } from '../styles/colors'; 4 | import { IThemeColors } from '../styles/themes'; 5 | 6 | export default function useColors(): IColors & IThemeColors { 7 | return useAppSelector(themeColorsSelector); 8 | } 9 | -------------------------------------------------------------------------------- /src/sheets/BottomSheetsLazy.tsx: -------------------------------------------------------------------------------- 1 | import React, { JSX, Suspense, lazy } from 'react'; 2 | 3 | const BottomSheets = lazy(() => import('./BottomSheets')); 4 | 5 | const BottomSheetsLazy = (): JSX.Element => { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | }; 12 | 13 | export default BottomSheetsLazy; 14 | -------------------------------------------------------------------------------- /src/store/types/fees.ts: -------------------------------------------------------------------------------- 1 | import { IOnchainFees } from 'beignet'; 2 | 3 | export enum EFeeId { 4 | instant = 'instant', 5 | fast = 'fast', 6 | normal = 'normal', 7 | slow = 'slow', 8 | minimum = 'minimum', 9 | custom = 'custom', 10 | none = 'none', 11 | } 12 | 13 | export interface IFees { 14 | onchain: IOnchainFees; 15 | override: boolean; 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/fetch-polyfill.ts: -------------------------------------------------------------------------------- 1 | // Polyfill fetch text streaming 2 | // NOTE: TextDecoder is polyfilled in shim.js 3 | 4 | import { polyfill as polyfillFetch } from 'react-native-polyfill-globals/src/fetch'; 5 | import { polyfill as polyfillReadableStream } from 'react-native-polyfill-globals/src/readable-stream'; 6 | 7 | polyfillReadableStream(); 8 | polyfillFetch(); 9 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/other.json: -------------------------------------------------------------------------------- 1 | { 2 | "high_balance": { 3 | "continue": { 4 | "string": "Κατανοητό" 5 | } 6 | }, 7 | "gift": { 8 | "error": { 9 | "button": { 10 | "string": "ΟΚ" 11 | } 12 | }, 13 | "used": { 14 | "button": { 15 | "string": "ΟΚ" 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/store/utils/user.ts: -------------------------------------------------------------------------------- 1 | import { isGeoBlocked } from '../../utils/blocktank'; 2 | import { dispatch } from '../helpers'; 3 | import { updateUser } from '../slices/user'; 4 | 5 | export const setGeoBlock = async (): Promise => { 6 | const isBlocked = await isGeoBlocked(); 7 | dispatch(updateUser({ isGeoBlocked: isBlocked })); 8 | return isBlocked; 9 | }; 10 | -------------------------------------------------------------------------------- /src/hooks/redux.ts: -------------------------------------------------------------------------------- 1 | import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; 2 | import type { AppDispatch, RootState } from '../store'; 3 | 4 | // Use throughout the app instead of plain `useDispatch` and `useSelector` 5 | export const useAppDispatch: () => AppDispatch = useDispatch; 6 | export const useAppSelector: TypedUseSelectorHook = useSelector; 7 | -------------------------------------------------------------------------------- /src/styles/styled-components.ts: -------------------------------------------------------------------------------- 1 | import * as styledComponents from 'styled-components/native'; 2 | import { ITheme } from './themes'; 3 | 4 | const { 5 | default: styled, 6 | css, 7 | ThemeProvider, 8 | } = styledComponents as unknown as styledComponents.ReactNativeThemedStyledComponentsModule; 9 | 10 | export { css, ThemeProvider }; 11 | export default styled; 12 | -------------------------------------------------------------------------------- /src/components/widgets/edit/types.ts: -------------------------------------------------------------------------------- 1 | import { ReactElement } from 'react'; 2 | 3 | export enum EWidgetItemType { 4 | static = 'static', 5 | toggle = 'toggle', 6 | radio = 'radio', 7 | } 8 | 9 | export type TWidgetItem = { 10 | key: string; 11 | type: EWidgetItemType; 12 | title: string | ReactElement; 13 | value?: string | ReactElement; 14 | isChecked?: boolean; 15 | }; 16 | -------------------------------------------------------------------------------- /.github/workflows/react-native-skia-stub.patch: -------------------------------------------------------------------------------- 1 | diff --git a/package.json b/package.json 2 | index 34d9af05..f30d8004 100644 3 | --- a/package.json 4 | +++ b/package.json 5 | @@ -180,5 +180,8 @@ 6 | "react-native-svg-transformer": "^1.3.0", 7 | "typescript": "5.3.3" 8 | + }, 9 | + "react-native": { 10 | + "@shopify/react-native-skia": "react-native-skia-stub" 11 | } 12 | } -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splash_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_black_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_orange_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /e2e/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | maxWorkers: 1, 3 | testTimeout: 240000, 4 | rootDir: '..', 5 | testMatch: ['/e2e/**/*.e2e.js'], 6 | verbose: true, 7 | reporters: ['detox/runners/jest/reporter'], 8 | globalSetup: 'detox/runners/jest/globalSetup', 9 | globalTeardown: 'detox/runners/jest/globalTeardown', 10 | testEnvironment: 'detox/runners/jest/testEnvironment', 11 | }; 12 | -------------------------------------------------------------------------------- /src/storage/index.ts: -------------------------------------------------------------------------------- 1 | import { MMKV } from 'react-native-mmkv'; 2 | import { receivedTxIds } from './received-tx-cache'; 3 | import { reduxStorage } from './redux-storage'; 4 | import { WebRelayCache } from './webrelay-cache'; 5 | import { widgetsCache } from './widgets-cache'; 6 | 7 | export const storage = new MMKV(); 8 | 9 | export { reduxStorage, receivedTxIds, WebRelayCache, widgetsCache }; 10 | -------------------------------------------------------------------------------- /src/constants/app.ts: -------------------------------------------------------------------------------- 1 | import { getBundleId } from 'react-native-device-info'; 2 | 3 | export const appName = 'Bitkit'; 4 | export const appStoreUrl = 5 | 'https://apps.apple.com/app/bitkit-wallet/id6502440655'; 6 | export const playStoreUrl = `https://play.google.com/store/apps/details?id=${getBundleId()}`; 7 | 8 | export const PIN_ATTEMPTS = '8'; 9 | 10 | export const BITREFILL_REF = 'AL6dyZYt'; 11 | -------------------------------------------------------------------------------- /ios/bitkit/bitkit.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.associated-domains 6 | 7 | applinks:bitkit.to 8 | applinks:www.bitkit.to 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/minusCircled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10.0.2.2 5 | localhost 6 | 127.0.0.1 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/checkmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /ReactotronConfig.js: -------------------------------------------------------------------------------- 1 | import Reactotron from 'reactotron-react-native'; 2 | import { reactotronRedux } from 'reactotron-redux'; 3 | import mmkvPlugin from 'reactotron-react-native-mmkv'; 4 | import { storage } from './src/storage'; 5 | 6 | const reactotron = Reactotron.configure() 7 | .use(reactotronRedux()) 8 | .use(mmkvPlugin({ storage })) 9 | .useReactNative() 10 | .connect(); 11 | 12 | export default reactotron; 13 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version 4 | ruby ">= 2.6.10" 5 | 6 | # Exclude problematic versions of cocoapods and activesupport that causes build failures. 7 | gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1' 8 | gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0' 9 | gem 'xcodeproj', '< 1.26.0' 10 | gem 'concurrent-ruby', '< 1.3.4' 11 | -------------------------------------------------------------------------------- /src/utils/types/electrum.ts: -------------------------------------------------------------------------------- 1 | import { EAvailableNetwork } from '../networks'; 2 | 3 | export interface IHeader { 4 | height: number; 5 | hash: string; 6 | hex: string; 7 | } 8 | 9 | export interface IGetHeaderResponse { 10 | id: number; 11 | error: boolean; 12 | method: 'getHeader'; 13 | data: string; 14 | network: EAvailableNetwork; 15 | } 16 | 17 | export type TGetAddressHistory = { txid: string; height: number }; 18 | -------------------------------------------------------------------------------- /__mocks__/react-native-mmkv/index.ts: -------------------------------------------------------------------------------- 1 | export class MMKV { 2 | private __INTERNAL_MOCK_STORAGE__: {[key: string]: string;} = {} 3 | 4 | set(key: string, value: string): void { 5 | this.__INTERNAL_MOCK_STORAGE__[key] = value; 6 | } 7 | 8 | getString(key: string): string { 9 | return this.__INTERNAL_MOCK_STORAGE__[key]; 10 | } 11 | 12 | delete(key: string): void { 13 | delete this.__INTERNAL_MOCK_STORAGE__[key]; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/color.ts: -------------------------------------------------------------------------------- 1 | import Color from 'color'; 2 | 3 | const white = '#FFFFFF'; 4 | 5 | export const lighten = (color?: string): string => { 6 | const parsed = Color(color); 7 | 8 | let lightened = parsed.hsl().whiten(0.5).rgb().string(); 9 | 10 | // If the color is white, adjust opacity instead 11 | if (parsed.hex() === white) { 12 | lightened = parsed.hsl().opaquer(1).rgb().string(); 13 | } 14 | 15 | return lightened; 16 | }; 17 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/telegram.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/rightSign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/upArrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/Jdenticon.tsx: -------------------------------------------------------------------------------- 1 | import jdenticon, { JdenticonConfig } from 'jdenticon'; 2 | import React, { ReactElement } from 'react'; 3 | import { SvgXml } from 'react-native-svg'; 4 | 5 | const Jdenticon = ({ 6 | value, 7 | size = 32, 8 | config, 9 | }: { 10 | value: string; 11 | size?: number; 12 | config?: JdenticonConfig; 13 | }): ReactElement => { 14 | const svg = jdenticon.toSvg(value, size, config); 15 | return ; 16 | }; 17 | 18 | export default Jdenticon; 19 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/leftSign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/downArrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/hooks/screen.ts: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useSafeAreaFrame } from 'react-native-safe-area-context'; 3 | 4 | export const useScreenSize = (): { isSmallScreen: boolean } => { 5 | const { height } = useSafeAreaFrame(); 6 | 7 | const isSmallScreen = useMemo(() => { 8 | if (height > 812) { 9 | // iPhone 11 Pro and larger 10 | return false; 11 | } 12 | 13 | // iPhone SE and smaller 14 | return true; 15 | }, [height]); 16 | 17 | return { isSmallScreen }; 18 | }; 19 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/lightning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'react-native', 3 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], 4 | transformIgnorePatterns: ['/__mocks__', 'jest-runner'], 5 | setupFiles: [ 6 | '/jest.setup.js', 7 | './node_modules/react-native-gesture-handler/jestSetup.js', 8 | 'dotenv/config', 9 | ], 10 | testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"], 11 | moduleNameMapper: { 12 | '\\.(jpg|jpeg|svg|png)$': '/__mocks__/fileMock.js', 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/components/TwoFingerPressable.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from 'react'; 2 | import { Gesture, GestureDetector } from 'react-native-gesture-handler'; 3 | 4 | const TwoFingerPressable = ({ 5 | children, 6 | onGesture, 7 | }: { 8 | children: ReactElement; 9 | onGesture: () => void; 10 | }): ReactElement => { 11 | const gesture = Gesture.Tap().minPointers(2).onStart(onGesture); 12 | return {children}; 13 | }; 14 | 15 | export default TwoFingerPressable; 16 | -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/Splash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Splash.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Splash@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Splash@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | 6 | # NODE_BINARY variable contains the PATH to the node executable. 7 | # 8 | # Customize the NODE_BINARY variable here. 9 | # For example, to use nvm with brew, add the following line 10 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 11 | export NODE_BINARY=$(command -v node) 12 | -------------------------------------------------------------------------------- /ios/bitkit/Images.xcassets/recovery.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "recovery.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "recovery 1.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "recovery 2.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/storage/redux-storage.ts: -------------------------------------------------------------------------------- 1 | import { Storage } from 'redux-persist'; 2 | import { storage } from '.'; 3 | 4 | export const reduxStorage: Storage = { 5 | setItem: (key, value): Promise => { 6 | storage.set(key, value); 7 | return Promise.resolve(true); 8 | }, 9 | getItem: (key): Promise => { 10 | const value = storage.getString(key); 11 | return Promise.resolve(value); 12 | }, 13 | removeItem: (key): Promise => { 14 | storage.delete(key); 15 | return Promise.resolve(); 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /src/utils/converters.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Convert readable string to bytes 3 | * @param str 4 | * @returns {Uint8Array} 5 | */ 6 | export const stringToBytes = (str: string): Uint8Array => { 7 | const encoder = new TextEncoder(); 8 | return encoder.encode(str); 9 | }; 10 | 11 | /** 12 | * Converts bytes to readable string 13 | * @param {Uint8Array} bytes 14 | * @returns {string} 15 | */ 16 | export const bytesToString = (bytes: Uint8Array): string => { 17 | const decoder = new TextDecoder(); 18 | return decoder.decode(bytes); 19 | }; 20 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/backspace.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/store/types/blocktank.ts: -------------------------------------------------------------------------------- 1 | import { 2 | IBtInfo, 3 | IBtOrder, 4 | ICJitEntry, 5 | ICreateOrderOptions, 6 | } from '@synonymdev/blocktank-lsp-http-client'; 7 | 8 | export interface IBlocktank { 9 | orders: IBtOrder[]; 10 | paidOrders: TPaidBlocktankOrders; 11 | info: IBtInfo; 12 | cJitEntries: ICJitEntry[]; 13 | } 14 | 15 | export type TPaidBlocktankOrders = { 16 | [orderId: string]: string; 17 | }; 18 | 19 | export interface ICreateOrderRequest { 20 | lspBalance: number; 21 | channelExpiryWeeks?: number; 22 | options?: Partial; 23 | } 24 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/lightningCircle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/speedFast.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /__tests__/slashtags.test.ts: -------------------------------------------------------------------------------- 1 | import { getNewProfileUrl } from '../src/utils/slashtags'; 2 | 3 | describe('Slashtags', () => { 4 | it('profile url convert function woks', () => { 5 | expect( 6 | getNewProfileUrl( 7 | 'slash:c7xk1b11o8k8jw6cn9a8asjcau77aenf7iq79tbc9u933wyoyjxy', 8 | 'https://dht-relay.synonym.to/staging/web-relay', 9 | ), 10 | ).toEqual( 11 | 'slash:c7xk1b11o8k8jw6cn9a8asjcau77aenf7iq79tbc9u933wyoyjxy?relay=https://dht-relay.synonym.to/staging/web-relay', 12 | ); 13 | expect(() => getNewProfileUrl('xxx', 'yyy')).toThrow(Error); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/speedNormal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/speedSlow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/burger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/utils/wallet/constants.ts: -------------------------------------------------------------------------------- 1 | export const BITKIT_WALLET_SEED_HASH_PREFIX = Buffer.from( 2 | '@Bitkit/wallet-uuid', 3 | ); 4 | 5 | export const TRANSACTION_DEFAULTS = { 6 | recommendedBaseFee: 256, // Total recommended tx base fee in sats 7 | dustLimit: 546, // Minimum value in sats for an output. Outputs below the dust limit may not be processed because the fees required to include them in a block would be greater than the value of the transaction itself. 8 | }; 9 | 10 | // Default duration before a channel is closed by the LSP (in weeks) 11 | export const DEFAULT_CHANNEL_DURATION = 6; 12 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/rightArrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/ContactImage.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from 'react'; 2 | import { StyleProp, ViewStyle } from 'react-native'; 3 | import { useProfile } from '../hooks/slashtags'; 4 | import ProfileImage from './ProfileImage'; 5 | 6 | const ContactImage = ({ 7 | url, 8 | size = 24, 9 | style, 10 | }: { 11 | url: string; 12 | size?: number; 13 | style?: StyleProp; 14 | }): ReactElement => { 15 | const { profile } = useProfile(url); 16 | return ( 17 | 18 | ); 19 | }; 20 | 21 | export default ContactImage; 22 | -------------------------------------------------------------------------------- /src/components/buttons/ButtonTertiary.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from 'react'; 2 | import { Pressable } from 'react-native'; 3 | import { BodyMSB } from '../../styles/text'; 4 | 5 | const ButtonTertiary = ({ 6 | text, 7 | testID, 8 | onPress, 9 | }: { 10 | text: string; 11 | testID?: string; 12 | onPress: () => void; 13 | }): ReactElement => { 14 | return ( 15 | 16 | {({ pressed }) => ( 17 | {text} 18 | )} 19 | 20 | ); 21 | }; 22 | 23 | export default ButtonTertiary; 24 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/store/shapes/backup.ts: -------------------------------------------------------------------------------- 1 | import { EBackupCategory, TBackupItem, TBackupState } from '../types/backup'; 2 | 3 | const item: TBackupItem = { 4 | required: Date.now() - 1000, 5 | synced: Date.now(), 6 | running: false, 7 | }; 8 | 9 | export const initialBackupState: TBackupState = { 10 | [EBackupCategory.wallet]: { ...item }, 11 | [EBackupCategory.widgets]: { ...item }, 12 | [EBackupCategory.settings]: { ...item }, 13 | [EBackupCategory.metadata]: { ...item }, 14 | [EBackupCategory.blocktank]: { ...item }, 15 | [EBackupCategory.slashtags]: { ...item }, 16 | [EBackupCategory.ldkActivity]: { ...item }, 17 | }; 18 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/plusCircled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/components/Divider.tsx: -------------------------------------------------------------------------------- 1 | import React, { PropsWithChildren, ReactElement } from 'react'; 2 | import { StyleProp, StyleSheet, ViewStyle } from 'react-native'; 3 | import { View } from '../styles/components'; 4 | 5 | interface DividerProps extends PropsWithChildren { 6 | style?: StyleProp; 7 | } 8 | 9 | const Divider = ({ style }: DividerProps): ReactElement => { 10 | return ; 11 | }; 12 | 13 | const styles = StyleSheet.create({ 14 | root: { 15 | height: 1, 16 | marginTop: 16, 17 | marginBottom: 16, 18 | }, 19 | }); 20 | 21 | export default Divider; 22 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@ptsecurity/commitlint-config'], 3 | rules: { 4 | 'scope-enum': [ 5 | 2, 6 | 'always', 7 | [ 8 | 'activity', 9 | 'backup', 10 | 'boost', 11 | 'contacts', 12 | 'lang', 13 | 'lightning', 14 | 'onboarding', 15 | 'profile', 16 | 'receive', 17 | 'recovery', 18 | 'restore', 19 | 'scan', 20 | 'security', 21 | 'send', 22 | 'settings', 23 | 'shop', 24 | 'suggestions', 25 | 'transfer', 26 | 'ui', 27 | 'wallet', 28 | 'widgets', 29 | ], 30 | ], 31 | }, 32 | ignores: [(msg) => /\bWIP\b/i.test(msg)], 33 | }; 34 | -------------------------------------------------------------------------------- /__tests__/wallet.test.ts: -------------------------------------------------------------------------------- 1 | import * as bip39 from 'bip39'; 2 | import { slashtagsPrimaryKey } from '../src/utils/wallet'; 3 | 4 | const mnemonic = 5 | 'soon engine text scissors ready twelve paper raven merge skate north park broccoli acquire result broom ozone rigid huge taxi celery history sudden anchor'; 6 | 7 | describe('Wallet Methods', () => { 8 | it('Derive slashtags primay key from the Seed', async () => { 9 | const seed = await bip39.mnemonicToSeed(mnemonic); 10 | const slashtags = await slashtagsPrimaryKey(seed); 11 | expect(slashtags).toEqual( 12 | 'be6d74439798f3217043a38de8c4da5a7e2b73714ace0811163105731ff0a066', 13 | ); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | const { E2E_TESTS } = process.env; 2 | 3 | module.exports = { 4 | presets: ['module:@react-native/babel-preset'], 5 | plugins: [ 6 | // Support `for await () {}` 7 | '@babel/plugin-proposal-async-generator-functions', 8 | [ 9 | 'module:react-native-dotenv', 10 | { 11 | safe: true, 12 | allowUndefined: false, 13 | }, 14 | ], 15 | 'react-native-reanimated/plugin', // NOTE: this plugin MUST be last 16 | ], 17 | env: { 18 | production: { 19 | // do not use `transform-remove-console` in e2e tests 20 | // so we can see all the logs 21 | plugins: E2E_TESTS ? [] : ['transform-remove-console'], 22 | }, 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/timer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/store/shapes/lightning.ts: -------------------------------------------------------------------------------- 1 | import { TLightningState, TNode } from '../types/lightning'; 2 | import { defaultWalletShape, getNetworkContent } from './wallet'; 3 | 4 | export const defaultLightningShape: TNode = { 5 | nodeId: getNetworkContent(''), 6 | info: getNetworkContent({}), 7 | channels: getNetworkContent({}), 8 | peers: getNetworkContent([]), 9 | backup: getNetworkContent({}), 10 | }; 11 | 12 | export const initialLightningState: TLightningState = { 13 | accountVersion: 3, 14 | version: { 15 | ldk: '', 16 | c_bindings: '', 17 | }, 18 | nodes: { 19 | [defaultWalletShape.name]: defaultLightningShape, 20 | }, 21 | pendingPayments: [], 22 | }; 23 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/hooks/helpers.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | export const useRenderCount = (): number => { 4 | const renderCount = useRef(0); 5 | renderCount.current++; 6 | return renderCount.current; 7 | }; 8 | 9 | // https://stackoverflow.com/a/61127960/1231070 10 | export const useDebouncedEffect = ( 11 | effect: () => void, 12 | deps: Array, 13 | delay: number, 14 | ): void => { 15 | // biome-ignore lint/correctness/useExhaustiveDependencies: 16 | useEffect(() => { 17 | const handler = setTimeout(effect, delay); 18 | 19 | return (): void => { 20 | clearTimeout(handler); 21 | }; 22 | }, [...(deps || []), delay]); 23 | }; 24 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/arb/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ca/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/cs/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/de/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/en/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fa/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/fr/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/it/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ja/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ko/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/nl/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/no/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pl/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ro/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ru/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/uk/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/yo/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/pencil.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/store/reselect/checks.ts: -------------------------------------------------------------------------------- 1 | import { createSelector } from '@reduxjs/toolkit'; 2 | import { RootState } from '..'; 3 | import { IChecksShape, TStorageWarning } from '../types/checks'; 4 | import { selectedNetworkSelector, selectedWalletSelector } from './wallet'; 5 | 6 | export const checksState = (state: RootState): IChecksShape => state.checks; 7 | 8 | /** 9 | * Returns the warnings for a given wallet. 10 | */ 11 | export const warningsSelector = createSelector( 12 | [checksState, selectedWalletSelector, selectedNetworkSelector], 13 | (checks, selectedWallet, selectedNetwork): TStorageWarning[] => { 14 | return checks[selectedWallet].warnings[selectedNetwork]; 15 | }, 16 | ); 17 | -------------------------------------------------------------------------------- /src/store/shapes/ui.ts: -------------------------------------------------------------------------------- 1 | // NOTE: 'ui' reducer is not persisted to storage 2 | 3 | import { TUiState } from '../types/ui'; 4 | 5 | export const initialUiState: TUiState = { 6 | appState: 'active', 7 | availableUpdate: null, 8 | isAuthenticated: false, 9 | isConnectedToElectrum: true, 10 | isElectrumThrottled: false, 11 | isOnline: true, 12 | isLDKReady: false, // LDK node running and connected 13 | language: 'en', 14 | profileLink: { title: '', url: '' }, 15 | sendTransaction: { 16 | fromAddressViewer: false, // When true, ensures tx inputs are not cleared when sweeping from address viewer. 17 | paymentMethod: 'onchain', 18 | uri: '', 19 | }, 20 | timeZone: 'UTC', 21 | }; 22 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/es_419/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/es_ES/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_BR/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/pt_PT/index.ts: -------------------------------------------------------------------------------- 1 | import cards from './cards.json'; 2 | import common from './common.json'; 3 | import fee from './fee.json'; 4 | import lightning from './lightning.json'; 5 | import onboarding from './onboarding.json'; 6 | import other from './other.json'; 7 | import security from './security.json'; 8 | import settings from './settings.json'; 9 | import slashtags from './slashtags.json'; 10 | import wallet from './wallet.json'; 11 | import widgets from './widgets.json'; 12 | 13 | export default { 14 | cards, 15 | common, 16 | fee, 17 | lightning, 18 | onboarding, 19 | other, 20 | security, 21 | settings, 22 | slashtags, 23 | wallet, 24 | widgets, 25 | }; 26 | -------------------------------------------------------------------------------- /src/sheets/BottomSheetNavigationContainer.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | DarkTheme, 3 | NavigationContainer, 4 | NavigationContainerProps, 5 | NavigationContainerRef, 6 | } from '@react-navigation/native'; 7 | import React, { forwardRef, ReactElement } from 'react'; 8 | 9 | const theme = { 10 | ...DarkTheme, 11 | colors: { 12 | ...DarkTheme.colors, 13 | background: 'transparent', 14 | }, 15 | }; 16 | 17 | const BottomSheetNavigationContainer = forwardRef< 18 | NavigationContainerRef, 19 | NavigationContainerProps 20 | >((props, ref): ReactElement => { 21 | return ; 22 | }); 23 | 24 | export default BottomSheetNavigationContainer; 25 | -------------------------------------------------------------------------------- /src/storage/widgets-cache.ts: -------------------------------------------------------------------------------- 1 | import { storage } from '.'; 2 | 3 | const PREFIX = 'widget_'; 4 | 5 | export const widgetsCache = { 6 | set(key: string, data: T): void { 7 | storage.set(PREFIX + key, JSON.stringify(data)); 8 | }, 9 | 10 | get(key: string): T | null { 11 | const stored = storage.getString(PREFIX + key); 12 | if (!stored) return null; 13 | try { 14 | return JSON.parse(stored); 15 | } catch { 16 | return null; 17 | } 18 | }, 19 | 20 | clear(): void { 21 | const keys = storage.getAllKeys(); 22 | console.log({ keys }); 23 | for (const key of keys) { 24 | if (key.startsWith(PREFIX)) { 25 | storage.delete(key); 26 | } 27 | } 28 | }, 29 | }; 30 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@react-native/typescript-config/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": false, 5 | "alwaysStrict": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "lib": ["esnext"], 8 | "module": "esnext", 9 | "noEmit": true, 10 | "noImplicitThis": true, 11 | "strictNullChecks": true, 12 | "strictFunctionTypes": true, 13 | "strictPropertyInitialization": true, 14 | 15 | // TODO: add these rules & fix errors 16 | // "noUncheckedIndexedAccess": true, 17 | 18 | // TODO: remove these rules & add types 19 | "noImplicitAny": false, 20 | "useUnknownInCatchVariables": false, 21 | }, 22 | "exclude": ["**/node_modules", "**/.*/"], 23 | } 24 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/rectanglesTwo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/activity.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /postinstall.js: -------------------------------------------------------------------------------- 1 | const exec = require('child_process').exec; 2 | const fs = require('fs'); 3 | const os = require('os'); 4 | 5 | const devEnvFile = './.env.development'; 6 | const createDevEnvFile = 'cp .env.development.template .env.development'; 7 | 8 | // Create development environment file if it doesn't exist 9 | fs.access(devEnvFile, fs.constants.F_OK, (err) => { 10 | if (err && !process.env.CI) { 11 | console.log(`File '${devEnvFile}' not found, creating...`); 12 | exec(createDevEnvFile); 13 | } 14 | }); 15 | 16 | if (os.type() === 'Darwin') { 17 | let cmd = 'react-native setup-ios-permissions'; 18 | if (!process.env.CI) { 19 | cmd += '&& pod install --project-directory=ios'; 20 | } 21 | exec(cmd); 22 | } 23 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/components/BottomSheetNavigationHeader.tsx: -------------------------------------------------------------------------------- 1 | import React, { memo, ReactElement } from 'react'; 2 | import { StyleSheet } from 'react-native'; 3 | 4 | import NavigationHeader, { 5 | NavigationHeaderProps, 6 | } from '../components/NavigationHeader'; 7 | 8 | type Props = Omit & { 9 | title: string; 10 | }; 11 | 12 | const BottomSheetNavigationHeader = (props: Props): ReactElement => ( 13 | 19 | ); 20 | 21 | const styles = StyleSheet.create({ 22 | container: { 23 | paddingBottom: 32, 24 | }, 25 | }); 26 | 27 | export default memo(BottomSheetNavigationHeader); 28 | -------------------------------------------------------------------------------- /src/utils/types/index.ts: -------------------------------------------------------------------------------- 1 | import { EAddressType, IKeyDerivationPath } from 'beignet'; 2 | import { 3 | TKeyDerivationAccountType, 4 | TWalletName, 5 | } from '../../store/types/wallet'; 6 | import { EAvailableNetwork } from '../networks'; 7 | 8 | export interface IGetAddress { 9 | path: string; 10 | selectedNetwork?: EAvailableNetwork; 11 | } 12 | 13 | export interface IGenerateAddresses { 14 | selectedWallet?: TWalletName; 15 | addressAmount?: number; 16 | changeAddressAmount?: number; 17 | addressIndex?: number; 18 | changeAddressIndex?: number; 19 | selectedNetwork?: EAvailableNetwork; 20 | keyDerivationPath?: IKeyDerivationPath; 21 | accountType?: TKeyDerivationAccountType; 22 | addressType?: EAddressType; 23 | seed?: Buffer; 24 | } 25 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/received.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/sent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/send.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/lightningHollow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/timerIconAlt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/receive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/hooks/blocktank.ts: -------------------------------------------------------------------------------- 1 | import { IBtOrder } from '@synonymdev/blocktank-lsp-http-client'; 2 | import { useAppSelector } from '../hooks/redux'; 3 | import { 4 | blocktankOrdersSelector, 5 | blocktankPaidOrdersSelector, 6 | } from '../store/reselect/blocktank'; 7 | 8 | /** 9 | * Returns the list of blocktank orders that have been paid. 10 | * @returns {IBtOrder[]} paid Blocktank orders 11 | */ 12 | export const usePaidBlocktankOrders = (): IBtOrder[] => { 13 | const orders = useAppSelector(blocktankOrdersSelector); 14 | const paidOrders = useAppSelector(blocktankPaidOrdersSelector); 15 | 16 | const paidBlocktankOrders = orders.filter((order) => { 17 | return Object.keys(paidOrders).find((orderId) => orderId === order.id); 18 | }); 19 | 20 | return paidBlocktankOrders; 21 | }; 22 | -------------------------------------------------------------------------------- /src/utils/exchange-rate/currencies.ts: -------------------------------------------------------------------------------- 1 | // The currencies that are supported by the exchange rate API 2 | // https://blocktank.synonym.to/fx/rates/btc/ 3 | 4 | export const currencies = [ 5 | 'ARS', 6 | 'AUD', 7 | 'BHD', 8 | 'BDT', 9 | 'BMD', 10 | 'BRL', 11 | 'CAD', 12 | 'CLP', 13 | 'CNY', 14 | 'CZK', 15 | 'DKK', 16 | 'EUR', 17 | 'GEL', 18 | 'GBP', 19 | 'HKD', 20 | 'HUF', 21 | 'XDR', 22 | 'INR', 23 | 'IDR', 24 | 'ILS', 25 | 'JPY', 26 | 'KWD', 27 | 'MYR', 28 | 'MXN', 29 | 'MMK', 30 | 'TWD', 31 | 'NZD', 32 | 'NOK', 33 | 'PKR', 34 | 'PHP', 35 | 'PLN', 36 | 'RUB', 37 | 'SAR', 38 | 'SGD', 39 | 'ZAR', 40 | 'KRW', 41 | 'LKR', 42 | 'SEK', 43 | 'CHF', 44 | 'USDT', 45 | 'THB', 46 | 'TRY', 47 | 'USD', 48 | 'UAH', 49 | 'AED', 50 | 'VEF', 51 | 'VND', 52 | ]; 53 | -------------------------------------------------------------------------------- /.env.production.template: -------------------------------------------------------------------------------- 1 | # Bitkit Backend 2 | BACKEND_HOST=https://blocktank.synonym.to 3 | 4 | # Backup Server 5 | BACKUPS_SERVER_HOST=https://blocktank.synonym.to/backups-ldk 6 | BACKUPS_SERVER_PUBKEY=0236efd76e37f96cf2dced9d52ff84c97e5b3d4a75e7d494807291971783f38377 7 | 8 | # LSP API 9 | BLOCKTANK_HOST=https://api1.blocktank.to/api 10 | 11 | # bitcoin | bitcoinTestnet | bitcoinRegtest 12 | DEFAULT_BITCOIN_NETWORK=bitcoin 13 | 14 | # Default Electrum Peer (Regtest) 15 | ELECTRUM_REGTEST_HOST=34.65.252.32 16 | ELECTRUM_REGTEST_TCP_PORT=18483 17 | ELECTRUM_REGTEST_SSL_PORT=18484 18 | ELECTRUM_REGTEST_PROTO=tcp 19 | 20 | # Default Slashtags Web Relay 21 | WEB_RELAY=https://webrelay.slashtags.to 22 | 23 | TREASURE_HUNT_HOST=" " 24 | CHATWOOT_API=https://synonym.to/api/chatwoot 25 | E2E=false 26 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/arrowsClockwise.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/checkCircle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/store/types/metadata.ts: -------------------------------------------------------------------------------- 1 | export type TTags = { [txId: string]: string[] }; 2 | export type TLastUsedTags = string[]; 3 | export type TSlashTagsUrls = { [txId: string]: string | undefined }; 4 | export type TTxComments = { [txId: string]: string }; 5 | 6 | export type TPendingInvoice = { 7 | id: string; // uuid used to identify the invoice 'session' 8 | address: string; 9 | payReq?: string; 10 | tags: string[]; 11 | timestamp: number; // TODO: used to remove old unpaid pending invoices; 12 | }; 13 | 14 | export type TMetadataState = { 15 | tags: TTags; 16 | lastUsedTags: TLastUsedTags; 17 | // Keep track of pending invoices, right now this is only used to map tags to incoming transactions 18 | pendingInvoices: TPendingInvoice[]; 19 | slashTagsUrls: TSlashTagsUrls; 20 | comments: TTxComments; 21 | }; 22 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/cards.json: -------------------------------------------------------------------------------- 1 | { 2 | "lightningConnecting": { 3 | "title": { 4 | "string": "Σύνδεση" 5 | }, 6 | "description": { 7 | "string": "Έτοιμο σε ±10 λεπτά" 8 | } 9 | }, 10 | "lightningReady": { 11 | "title": { 12 | "string": "Έτοιμο" 13 | }, 14 | "description": { 15 | "string": "Συνδέθηκε!" 16 | } 17 | }, 18 | "transferClosingChannel": { 19 | "description": { 20 | "string": "Κρατήστε την εφαρμογή ανοιχτή" 21 | } 22 | }, 23 | "pin": { 24 | "description": { 25 | "string": "Καταχωρήστε κωδικό PIN" 26 | } 27 | }, 28 | "slashtagsProfile": { 29 | "description": { 30 | "string": "Προσθέστε τα στοιχεία σας" 31 | } 32 | }, 33 | "suggestions": { 34 | "string": "Προτάσεις" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/timerSpeed.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /__mocks__/react-native-address-generator/index.ts: -------------------------------------------------------------------------------- 1 | import { ok } from "@synonymdev/result"; 2 | 3 | const AddressGeneratorMock = { 4 | getAddress: jest.fn(async (mnemonic, path, network) => { 5 | return ok({ 6 | address: 'bcrt1q6rz28mcfaxtmd6v789l9rrlrusdprr9pz3cppk', 7 | path: path, 8 | publicKey: '02e7ab2537b5d49e970309aae06e9e49f36ce1c9febbd44ec8e0d1cca0b4f9c319', 9 | }); 10 | }), 11 | 12 | getScriptHash: jest.fn(async (address, network) => { 13 | return ok('34dad6f450d0a21a999fc2158132141d4ba4c75e510e6b2e62cda4257af71d9a'); 14 | }), 15 | 16 | getPrivateKey: jest.fn(async (mnemonic, path, network, passphrase = '') => { 17 | return ok('cTGhosGriPpuGA586jemcuH9pE9spwUmneMBmYYzrQEbY92DJrbo'); 18 | }), 19 | }; 20 | 21 | module.exports = AddressGeneratorMock; 22 | -------------------------------------------------------------------------------- /src/hooks/useAppStatus.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { appStatusSelector } from '../store/reselect/ui'; 3 | import { THealthState } from '../store/types/ui'; 4 | import { useAppSelector } from './redux'; 5 | 6 | // Give the app some time to initialize before showing the status 7 | const INIT_DELAY = 5000; 8 | 9 | export const useAppStatus = (): THealthState => { 10 | const [showStatus, setShowStatus] = useState(false); 11 | const appStatus = useAppSelector(appStatusSelector); 12 | 13 | useEffect(() => { 14 | const timer = setTimeout(() => { 15 | setShowStatus(true); 16 | }, INIT_DELAY); 17 | 18 | return () => clearTimeout(timer); 19 | }, []); 20 | 21 | // During initialization, return 'ready' instead of error 22 | if (!showStatus) { 23 | return 'ready'; 24 | } 25 | 26 | return appStatus; 27 | }; 28 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // NOTE: import order matters 2 | import 'react-native-gesture-handler' // must be first 3 | import './shim'; 4 | import './src/utils/fetch'; 5 | import './src/utils/ignoreLogs'; 6 | 7 | import { AppRegistry, Text, TextInput } from 'react-native'; 8 | import Root from './src/Root'; 9 | import { name as appName } from './app.json'; 10 | import './src/utils/fetch-polyfill'; 11 | import { __E2E__, __JEST__ } from './src/constants/env'; 12 | 13 | // TEMP: disable font scaling globally 14 | Text.defaultProps = Text.defaultProps || {}; 15 | Text.defaultProps.allowFontScaling = false; 16 | TextInput.defaultProps = TextInput.defaultProps || {}; 17 | TextInput.defaultProps.allowFontScaling = false; 18 | 19 | if (__DEV__ && !__JEST__ && !__E2E__) { 20 | require('./ReactotronConfig'); 21 | } 22 | 23 | AppRegistry.registerComponent(appName, () => Root); 24 | -------------------------------------------------------------------------------- /src/components/SafeAreaInset.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from 'react'; 2 | import { View } from 'react-native'; 3 | import { useSafeAreaInsets } from 'react-native-safe-area-context'; 4 | import useKeyboard from '../hooks/keyboard'; 5 | 6 | const SafeAreaInset = ({ 7 | type, 8 | minPadding = 0, 9 | }: { 10 | type: 'top' | 'bottom'; 11 | minPadding?: number; 12 | }): ReactElement => { 13 | const insets = useSafeAreaInsets(); 14 | const { keyboardShown } = useKeyboard(); 15 | const padding = Math.max(insets[type], minPadding); 16 | 17 | // if the keyboard is shown, we don't need to account for SafeArea at the bottom 18 | if (keyboardShown && type === 'bottom') { 19 | return ; 20 | } 21 | 22 | return ; 23 | }; 24 | 25 | export default SafeAreaInset; 26 | -------------------------------------------------------------------------------- /src/hooks/fees.ts: -------------------------------------------------------------------------------- 1 | import { useAppSelector } from '../hooks/redux'; 2 | import { onChainFeesSelector } from '../store/reselect/fees'; 3 | import { FeeText, TFeeText } from '../utils/fees'; 4 | 5 | /** 6 | * Returns the FeeText for a given fee amount. 7 | * @param {number} satsPerByte 8 | * @returns {TFeeText} 9 | */ 10 | export const useFeeText = (satsPerByte: number): TFeeText => { 11 | const feeEstimates = useAppSelector(onChainFeesSelector); 12 | 13 | let feeText = FeeText.none; 14 | 15 | if (satsPerByte >= feeEstimates.minimum) { 16 | feeText = FeeText.minimum; 17 | } 18 | if (satsPerByte >= feeEstimates.slow) { 19 | feeText = FeeText.slow; 20 | } 21 | if (satsPerByte >= feeEstimates.normal) { 22 | feeText = FeeText.normal; 23 | } 24 | if (satsPerByte >= feeEstimates.fast) { 25 | feeText = FeeText.fast; 26 | } 27 | 28 | return feeText; 29 | }; 30 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/sortAscending.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/el/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "about": { 3 | "share": { 4 | "string": "Διαμοιρασμός" 5 | } 6 | }, 7 | "support": { 8 | "text_success_button": { 9 | "string": "ΟΚ" 10 | }, 11 | "text_unsuccess_button": { 12 | "string": "Προσπαθείστε Ξανά" 13 | } 14 | }, 15 | "fee": { 16 | "fast": { 17 | "value": { 18 | "string": "Γρήγορα" 19 | } 20 | }, 21 | "normal": { 22 | "label": { 23 | "string": "Κανονικά" 24 | }, 25 | "value": { 26 | "string": "Κανονικά" 27 | } 28 | }, 29 | "custom": { 30 | "label": { 31 | "string": "Προσαρμοσμένο" 32 | }, 33 | "value": { 34 | "string": "Προσαρμοσμένο" 35 | } 36 | } 37 | }, 38 | "gap": { 39 | "save": { 40 | "string": "Καταχώρηση" 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/paste.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/shareIos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/@types/env.d.ts: -------------------------------------------------------------------------------- 1 | declare module '@env' { 2 | export const BACKEND_HOST: string; 3 | export const BACKUPS_SERVER_HOST: string; 4 | export const BACKUPS_SERVER_PUBKEY: string; 5 | export const BLOCKTANK_HOST: string; 6 | 7 | export const DEFAULT_BITCOIN_NETWORK: string; 8 | 9 | export const ELECTRUM_REGTEST_HOST: string; 10 | export const ELECTRUM_REGTEST_SSL_PORT: number; 11 | export const ELECTRUM_REGTEST_TCP_PORT: number; 12 | export const ELECTRUM_REGTEST_PROTO: string; 13 | 14 | export const WEB_RELAY: string; 15 | export const TREASURE_HUNT_HOST: string; 16 | export const CHATWOOT_API: string; 17 | 18 | export const ENABLE_REDUX_LOGGER: string; 19 | export const ENABLE_REDUX_IMMUTABLE_CHECK: string; 20 | export const ENABLE_I18NEXT_DEBUGGER: string; 21 | export const ENABLE_MIGRATION_DEBUG: string; 22 | export const ENABLE_LDK_LOGS: string; 23 | export const E2E: string; 24 | } 25 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/camera.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/price.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/nl/widgets.json: -------------------------------------------------------------------------------- 1 | { 2 | "widgets": { 3 | "string": "Widgets" 4 | }, 5 | "widget": { 6 | "edit": { 7 | "string": "Widget Feed" 8 | }, 9 | "edit_custom": { 10 | "string": "Op maat" 11 | } 12 | }, 13 | "add": { 14 | "string": "Widget Toevoegen" 15 | }, 16 | "delete": { 17 | "title": { 18 | "string": "Widget Verwijderen?" 19 | }, 20 | "description": { 21 | "string": "Weet u zeker dat u '{name}' wilt wissen van uw widgetlijst?" 22 | } 23 | }, 24 | "price": { 25 | "name": { 26 | "string": "Bitcoinprijs" 27 | } 28 | }, 29 | "news": { 30 | "name": { 31 | "string": "Bitcoin Nieuwes" 32 | } 33 | }, 34 | "blocks": { 35 | "name": { 36 | "string": "Bitcoin Blokken" 37 | } 38 | }, 39 | "facts": { 40 | "name": { 41 | "string": "Bitcoin Feiten" 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/utils/notifications.ts: -------------------------------------------------------------------------------- 1 | import Toast from 'react-native-toast-message'; 2 | import { __E2E__ } from '../constants/env'; 3 | 4 | export type ToastOptions = { 5 | type: 'success' | 'info' | 'lightning' | 'warning' | 'error'; 6 | title: string; 7 | description: string; 8 | autoHide?: boolean; 9 | visibilityTime?: number; 10 | }; 11 | 12 | const defaultOptions = { 13 | autoHide: true, 14 | visibilityTime: 4000, 15 | topOffset: 40, 16 | bottomOffset: 120, 17 | }; 18 | 19 | export const showToast = ({ 20 | type, 21 | title, 22 | description, 23 | autoHide, 24 | visibilityTime, 25 | }: ToastOptions): void => { 26 | if (__E2E__) { 27 | console.log('showToast', { type, title, description }); 28 | return; 29 | } 30 | 31 | Toast.show({ 32 | ...defaultOptions, 33 | type, 34 | text1: title, 35 | text2: description, 36 | position: 'top', 37 | autoHide, 38 | visibilityTime, 39 | }); 40 | }; 41 | -------------------------------------------------------------------------------- /.github/workflows/lint-check.yml: -------------------------------------------------------------------------------- 1 | name: lint-check 2 | 3 | on: 4 | workflow_dispatch: 5 | pull_request: 6 | 7 | jobs: 8 | lint: 9 | name: Run lint check 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Check out Git repository 14 | uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 1 17 | 18 | - name: Set up Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: 20 22 | 23 | - name: Configure npm authentication 24 | run: | 25 | echo "" >> .yarnrc.yml 26 | echo "npmScopes:" >> .yarnrc.yml 27 | echo " synonymdev:" >> .yarnrc.yml 28 | echo ' npmAuthToken: "${{ secrets.NPMJS_READ_RN_PUBKY }}"' >> .yarnrc.yml 29 | 30 | - name: Install Node.js dependencies 31 | run: yarn install 32 | 33 | - name: Lint check 34 | run: yarn lint:check 35 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/magnifyingGlass.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/store/types/todos.ts: -------------------------------------------------------------------------------- 1 | import { ImageSourcePropType } from 'react-native'; 2 | import { IColors } from '../../styles/colors'; 3 | 4 | export type TTodoType = 5 | | 'backupSeedPhrase' 6 | | 'btFailed' 7 | | 'buyBitcoin' 8 | | 'discount' 9 | | 'invite' 10 | | 'lightning' 11 | | 'lightningSettingUp' 12 | | 'lightningConnecting' 13 | | 'lightningReady' 14 | | 'quickpay' 15 | | 'shop' 16 | | 'slashtagsProfile' 17 | | 'support' 18 | | 'transferPending' 19 | | 'transferClosingChannel' 20 | | 'pin'; 21 | 22 | export interface ITodo { 23 | id: TTodoType; 24 | color: keyof IColors; 25 | image: ImageSourcePropType; 26 | dismissable: boolean; 27 | confirmsIn?: number; 28 | } 29 | 30 | export interface IOpenChannelNotification { 31 | [key: string]: number; 32 | } 33 | 34 | export type TTodosState = { 35 | hide: Partial<{ [K in TTodoType]: number }>; 36 | newChannelsNotifications: IOpenChannelNotification; 37 | }; 38 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/gitBranch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/workflows/type-check.yml: -------------------------------------------------------------------------------- 1 | name: type-check 2 | 3 | on: 4 | workflow_dispatch: 5 | pull_request: 6 | 7 | jobs: 8 | typescript: 9 | name: Run type check 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Check out Git repository 14 | uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 1 17 | 18 | - name: Set up Node.js 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: 20 22 | 23 | - name: Configure npm authentication 24 | run: | 25 | echo "" >> .yarnrc.yml 26 | echo "npmScopes:" >> .yarnrc.yml 27 | echo " synonymdev:" >> .yarnrc.yml 28 | echo ' npmAuthToken: "${{ secrets.NPMJS_READ_RN_PUBKY }}"' >> .yarnrc.yml 29 | 30 | - name: Install Node.js dependencies 31 | run: yarn install || yarn install 32 | 33 | - name: Type check 34 | run: yarn tsc:check 35 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = "35.0.0" 6 | minSdkVersion = 28 7 | compileSdkVersion = 35 8 | targetSdkVersion = 35 9 | ndkVersion = "27.1.12297006" 10 | kotlin_version = "2.0.21" 11 | kotlinVersion = "2.0.21" 12 | } 13 | repositories { 14 | google() 15 | mavenCentral() 16 | } 17 | dependencies { 18 | classpath("com.android.tools.build:gradle") 19 | classpath("com.facebook.react:react-native-gradle-plugin") 20 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") 21 | } 22 | } 23 | 24 | apply plugin: "com.facebook.react.rootproject" 25 | 26 | allprojects { 27 | repositories { 28 | maven { url("$rootDir/../node_modules/detox/Detox-android") } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/utils/appState.ts: -------------------------------------------------------------------------------- 1 | import { AppState } from 'react-native'; 2 | 3 | export const appStateTracker = { 4 | lastAppState: AppState.currentState, 5 | lastBackgroundTime: 0, 6 | 7 | init() { 8 | AppState.addEventListener('change', (nextAppState) => { 9 | if (['background', 'inactive'].includes(nextAppState)) { 10 | this.lastBackgroundTime = Date.now(); 11 | } else if (['background', 'inactive'].includes(this.lastAppState)) { 12 | // If we're leaving background state, update the time 13 | this.lastBackgroundTime = Date.now(); 14 | } 15 | this.lastAppState = nextAppState; 16 | }); 17 | }, 18 | 19 | wasRecentlyInBackground(): boolean { 20 | const currentState = AppState.currentState; 21 | const inBackground = ['background', 'inactive'].includes(currentState); 22 | const timeSinceLastBackground = Date.now() - this.lastBackgroundTime; 23 | 24 | return inBackground || timeSinceLastBackground < 3000; 25 | }, 26 | }; 27 | -------------------------------------------------------------------------------- /src/utils/pubky/index.ts: -------------------------------------------------------------------------------- 1 | import { Result, err, ok } from '@synonymdev/result'; 2 | import { getSha256 } from 'beignet'; 3 | import { EAvailableNetwork } from '../networks.ts'; 4 | import { getPrivateKeyFromPath, getSelectedNetwork } from '../wallet'; 5 | 6 | export const getPubkySecretKey = async ({ 7 | selectedNetwork = getSelectedNetwork(), 8 | version = 1, 9 | }: { 10 | selectedNetwork?: EAvailableNetwork; 11 | version?: number; 12 | } = {}): Promise> => { 13 | switch (version) { 14 | case 1: { 15 | // TODO: Update path/key derivation accordingly 16 | const privateKey = await getPrivateKeyFromPath({ 17 | path: "m/184'/0'/0'/0/0", 18 | selectedNetwork, 19 | }); 20 | if (privateKey.isErr()) { 21 | return err(privateKey.error.message); 22 | } 23 | const hash = getSha256(privateKey.value); 24 | return ok(hash); 25 | } 26 | default: { 27 | return err('Invalid version'); 28 | } 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /src/ErrorBoundary.tsx: -------------------------------------------------------------------------------- 1 | import React, { 2 | Component, 3 | ErrorInfo, 4 | PropsWithChildren, 5 | ReactNode, 6 | } from 'react'; 7 | import AppError from './screens/AppError'; 8 | 9 | type ReactError = Error & ErrorInfo; 10 | type State = { 11 | error: ReactError | null; 12 | }; 13 | 14 | class ErrorBoundary extends Component { 15 | constructor(props) { 16 | super(props); 17 | this.state = { error: null }; 18 | } 19 | 20 | static getDerivedStateFromError(error: Error): { error: Error } { 21 | return { error }; 22 | } 23 | 24 | componentDidCatch(error: Error, errorInfo: ErrorInfo): void { 25 | console.error('ErrorBoundary componentDidCatch', error, errorInfo); 26 | } 27 | 28 | render(): ReactNode { 29 | const { error } = this.state; 30 | 31 | if (!error || __DEV__) { 32 | return this.props.children; 33 | } 34 | 35 | return ; 36 | } 37 | } 38 | 39 | export default ErrorBoundary; 40 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/store/reselect/widgets.ts: -------------------------------------------------------------------------------- 1 | import { createSelector } from '@reduxjs/toolkit'; 2 | import { RootState } from '..'; 3 | import { TWidgetsState } from '../slices/widgets'; 4 | import { TWidgetOptions, TWidgets } from '../types/widgets'; 5 | 6 | export const widgetsState = (state: RootState): TWidgetsState => state.widgets; 7 | 8 | export const widgetsSelector = createSelector( 9 | [widgetsState], 10 | (widgets): TWidgets => widgets.widgets, 11 | ); 12 | 13 | /** 14 | * Return specified widget by id 15 | */ 16 | export const widgetSelector = createSelector( 17 | [widgetsState, (_state, id: string): string => id], 18 | (widgets, id): TWidgetOptions | undefined => widgets.widgets[id], 19 | ); 20 | 21 | export const widgetsOrderSelector = createSelector( 22 | [widgetsState], 23 | (widgets) => widgets.sortOrder, 24 | ); 25 | 26 | export const onboardedWidgetsSelector = (state: RootState): boolean => { 27 | return state.widgets.onboardedWidgets; 28 | }; 29 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": { 3 | "ignore": ["src/polyfills/**", "src/assets/icons/index.ts"] 4 | }, 5 | "linter": { 6 | "rules": { 7 | "complexity": { 8 | "noBannedTypes": "off", 9 | "noForEach": "off" 10 | }, 11 | "nursery": { 12 | "useExplicitType": "off" 13 | }, 14 | "correctness": { 15 | "noUnusedFunctionParameters": "error", 16 | "noUnusedImports": "error", 17 | "noUnusedVariables": "error" 18 | }, 19 | "performance": { 20 | "noAccumulatingSpread": "off" 21 | }, 22 | "suspicious": { 23 | "noExplicitAny": "off", 24 | "noArrayIndexKey": "off" 25 | }, 26 | "style": { 27 | "noNonNullAssertion": "off", 28 | "noParameterAssign": "off", 29 | "useImportType": "off", 30 | "useNodejsImportProtocol": "off" 31 | } 32 | } 33 | }, 34 | "javascript": { 35 | "formatter": { 36 | "bracketSameLine": true, 37 | "quoteStyle": "single" 38 | }, 39 | "jsxRuntime": "reactClassic" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/cornersOut.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/components/GradientView.tsx: -------------------------------------------------------------------------------- 1 | import React, { memo, ReactElement, ReactNode } from 'react'; 2 | import { 3 | Image, 4 | ImageSourcePropType, 5 | StyleProp, 6 | StyleSheet, 7 | View, 8 | ViewStyle, 9 | } from 'react-native'; 10 | 11 | const imageSrc = require('../assets/bottom-sheet-bg.png'); 12 | 13 | const GradientView = ({ 14 | style, 15 | image = imageSrc, 16 | children, 17 | }: { 18 | style?: StyleProp; 19 | image?: ImageSourcePropType; 20 | children?: ReactNode; 21 | }): ReactElement => ( 22 | 23 | 24 | {children} 25 | 26 | ); 27 | 28 | const styles = StyleSheet.create({ 29 | root: { 30 | flex: 1, 31 | position: 'relative', 32 | }, 33 | background: { 34 | position: 'absolute', 35 | resizeMode: 'stretch', 36 | top: 0, 37 | bottom: 0, 38 | width: '100%', 39 | height: undefined, 40 | }, 41 | }); 42 | 43 | export default memo(GradientView); 44 | -------------------------------------------------------------------------------- /src/components/CameraGradientView.tsx: -------------------------------------------------------------------------------- 1 | import React, { memo, ReactElement, ReactNode } from 'react'; 2 | import { Image, StyleProp, StyleSheet, ViewStyle } from 'react-native'; 3 | import { View as ThemedView } from '../styles/components'; 4 | 5 | const imageSrc = require('../assets/bottom-sheet-bg.png'); 6 | 7 | const CameraGradientView = ({ 8 | style, 9 | children, 10 | }: { 11 | style?: StyleProp; 12 | children?: ReactNode; 13 | }): ReactElement => { 14 | return ( 15 | 16 | 17 | {children} 18 | 19 | ); 20 | }; 21 | 22 | const styles = StyleSheet.create({ 23 | root: { 24 | position: 'relative', 25 | }, 26 | background: { 27 | resizeMode: 'stretch', 28 | position: 'absolute', 29 | top: 0, 30 | left: '-2%', 31 | bottom: '15%', 32 | width: '105%', 33 | height: undefined, 34 | }, 35 | }); 36 | 37 | export default memo(CameraGradientView); 38 | -------------------------------------------------------------------------------- /src/components/KeyboardAvoidingView.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from 'react'; 2 | import { 3 | KeyboardAvoidingViewProps, 4 | Platform, 5 | KeyboardAvoidingView as RNKeyboardAvoidingView, 6 | } from 'react-native'; 7 | import Animated from 'react-native-reanimated'; 8 | 9 | import useKeyboard from '../hooks/keyboard'; 10 | 11 | /** 12 | * Custom component because on Android the height 13 | * of the 'AvoidingView' is not always correct 14 | */ 15 | const KeyboardAvoidingView = ({ 16 | children, 17 | behavior = 'padding', 18 | ...props 19 | }: KeyboardAvoidingViewProps): ReactElement => { 20 | const { keyboardHeight } = useKeyboard(); 21 | const isAndroid = Platform.OS === 'android'; 22 | 23 | return ( 24 | 25 | {children} 26 | {isAndroid && } 27 | 28 | ); 29 | }; 30 | 31 | export default KeyboardAvoidingView; 32 | -------------------------------------------------------------------------------- /src/store/types/backup.ts: -------------------------------------------------------------------------------- 1 | import { ENetworks, TAccount } from '@synonymdev/react-native-ldk'; 2 | 3 | export enum EBackupCategory { 4 | wallet = 'bitkit_wallet', 5 | settings = 'bitkit_settings', 6 | widgets = 'bitkit_widgets', 7 | metadata = 'bitkit_metadata', 8 | blocktank = 'bitkit_blocktank_orders', 9 | slashtags = 'bitkit_slashtags_contacts', 10 | ldkActivity = 'bitkit_lightning_activity', 11 | } 12 | 13 | export type TBackupItem = { 14 | running: boolean; 15 | required: number; // timestamp of last time this backup was required 16 | synced: number; // timestamp of last time this backup was synced 17 | }; 18 | 19 | export type TBackupState = { 20 | [key in EBackupCategory]: TBackupItem; 21 | }; 22 | 23 | export declare type TAccountBackup = { 24 | account: TAccount; 25 | package_version: string; 26 | network: ENetworks; 27 | data: T; 28 | }; 29 | 30 | export type TBackupMetadata = { 31 | category: EBackupCategory; 32 | timestamp: number; 33 | version: number; 34 | }; 35 | -------------------------------------------------------------------------------- /src/storage/received-tx-cache.ts: -------------------------------------------------------------------------------- 1 | // Used to prevent duplicate notifications for the same txId that seems to occur when: 2 | // - when Bitkit is brought from background to foreground 3 | 4 | import { storage } from '.'; 5 | 6 | // - connection to electrum server is lost and then re-established 7 | export const receivedTxIds = { 8 | STORAGE_KEY: 'receivedTxIds', 9 | 10 | // Get stored txIds 11 | get: (): string[] => { 12 | return JSON.parse(storage.getString(receivedTxIds.STORAGE_KEY) || '[]'); 13 | }, 14 | 15 | // Save txIds to storage 16 | save: (txIds: string[]): void => { 17 | storage.set(receivedTxIds.STORAGE_KEY, JSON.stringify(txIds)); 18 | }, 19 | 20 | // Add a new txId 21 | add: (txId: string): void => { 22 | const txIds = receivedTxIds.get(); 23 | txIds.push(txId); 24 | receivedTxIds.save(txIds); 25 | }, 26 | 27 | // Check if txId exists 28 | has: (txId: string): boolean => { 29 | const txIds = receivedTxIds.get(); 30 | return txIds.includes(txId); 31 | }, 32 | }; 33 | -------------------------------------------------------------------------------- /src/utils/receive/index.ts: -------------------------------------------------------------------------------- 1 | import { encode } from 'bip21'; 2 | import bitcoinUnits from 'bitcoin-units'; 3 | 4 | /** 5 | * Creates a BIP21 URI w/ Lightning PaymentRequest 6 | */ 7 | export const getUnifiedUri = ({ 8 | address, 9 | amount, 10 | label, 11 | message, 12 | lightning = '', 13 | }: { 14 | address: string; 15 | amount: number | string; 16 | label: string; 17 | message: string; 18 | lightning?: string; 19 | }): string => { 20 | const amountBTC = bitcoinUnits(amount, 'satoshi') 21 | .to('btc') 22 | .value() 23 | // convert to string without scientific notation and trailing zeros 24 | .toFixed(10) 25 | .replace(/\.?0+$/, ''); 26 | 27 | return encode(address, { 28 | // only attach non-empty params 29 | ...(amount ? { amount: amountBTC } : {}), 30 | ...(label !== '' ? { label } : {}), 31 | // do wallet apps still use "message"? 32 | ...(message !== '' ? { message } : {}), 33 | ...(lightning !== '' ? { lightning: lightning.toUpperCase() } : {}), 34 | }); 35 | }; 36 | -------------------------------------------------------------------------------- /src/styles/breakpoints.ts: -------------------------------------------------------------------------------- 1 | import memoize from 'lodash/memoize'; 2 | import { Dimensions } from 'react-native'; 3 | 4 | const { width } = Dimensions.get('window'); 5 | 6 | enum BREAKPOINTS { 7 | // xs = 320, 8 | sm = 360, // small android phone 9 | // md = 375, // iphoneSE and up 10 | // lg = 390, // iphone15 and up 11 | // xl = 400, 12 | } 13 | 14 | /** 15 | * Check if the screen is at least the specified breakpoint 16 | **/ 17 | const up = (min: keyof typeof BREAKPOINTS): boolean => { 18 | return width > BREAKPOINTS[min]; 19 | }; 20 | 21 | /** 22 | * Check if the screen is at most the specified breakpoint 23 | **/ 24 | const down = (max: keyof typeof BREAKPOINTS): boolean => { 25 | return width <= BREAKPOINTS[max]; 26 | }; 27 | 28 | const breakpoints = { 29 | up: memoize(up), 30 | down: memoize(down), 31 | }; 32 | 33 | type TBreakpoints = typeof breakpoints; 34 | 35 | const useBreakpoints = (): TBreakpoints => { 36 | return breakpoints; 37 | }; 38 | 39 | export default useBreakpoints; 40 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } 2 | plugins { id("com.facebook.react.settings") } 3 | extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } 4 | rootProject.name = 'bitkit' 5 | include ':rn-android-keyboard-adjust' 6 | project(':rn-android-keyboard-adjust').projectDir = new File(rootProject.projectDir, '../node_modules/rn-android-keyboard-adjust/android') 7 | include ':rn-qr-generator' 8 | project(':rn-qr-generator').projectDir = new File(rootProject.projectDir, '../node_modules/rn-qr-generator/android') 9 | include ':react-native-fs' 10 | project(':react-native-fs').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fs/android') 11 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 12 | include ':app' 13 | includeBuild('../node_modules/@react-native/gradle-plugin') 14 | 15 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/shoppingBag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/assets/svgs/shop/shoppingBag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/store/reselect/activity.ts: -------------------------------------------------------------------------------- 1 | import { createSelector } from '@reduxjs/toolkit'; 2 | import { RootState } from '..'; 3 | import { TActivity } from '../slices/activity'; 4 | import { IActivityItem } from '../types/activity'; 5 | import { createShallowEqualSelector } from './utils'; 6 | 7 | export const activitySelector = (state: RootState): TActivity => { 8 | return state.activity; 9 | }; 10 | 11 | export const activityItemsSelector = createShallowEqualSelector( 12 | [(state): TActivity => state.activity], 13 | (activity): IActivityItem[] => activity.items, 14 | ); 15 | 16 | /** 17 | * Returns an individual activity item by the provided id. 18 | * @param {RootState} state 19 | * @param {string} activityId 20 | * @returns {string} 21 | */ 22 | export const activityItemSelector = createSelector( 23 | [activityItemsSelector, (_state, activityId: string): string => activityId], 24 | (activityItems, activityId): IActivityItem | undefined => { 25 | return activityItems.find((item) => item.id === activityId); 26 | }, 27 | ); 28 | -------------------------------------------------------------------------------- /android/app/src/androidTest/java/com/bitkit/DetoxTest.java: -------------------------------------------------------------------------------- 1 | package com.bitkit; 2 | 3 | import com.wix.detox.Detox; 4 | import com.wix.detox.config.DetoxConfig; 5 | 6 | import org.junit.Rule; 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import androidx.test.ext.junit.runners.AndroidJUnit4; 11 | import androidx.test.filters.LargeTest; 12 | import androidx.test.rule.ActivityTestRule; 13 | 14 | @RunWith(AndroidJUnit4.class) 15 | @LargeTest 16 | public class DetoxTest { 17 | @Rule 18 | public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); 19 | 20 | @Test 21 | public void runDetoxTests() { 22 | DetoxConfig detoxConfig = new DetoxConfig(); 23 | detoxConfig.idlePolicyConfig.masterTimeoutSec = 90; 24 | detoxConfig.idlePolicyConfig.idleResourceTimeoutSec = 60; 25 | detoxConfig.rnContextLoadTimeoutSec = (BuildConfig.DEBUG ? 180 : 60); 26 | 27 | Detox.runTests(mActivityRule, detoxConfig); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/components/widgets/edit/FactsItems.tsx: -------------------------------------------------------------------------------- 1 | import { useMemo } from 'react'; 2 | import { useTranslation } from 'react-i18next'; 3 | import { TFactsWidgetOptions } from '../../../store/types/widgets'; 4 | import { BodySSB, Title } from '../../../styles/text'; 5 | import { getRandomFact } from '../../../utils/widgets'; 6 | import { EWidgetItemType, TWidgetItem } from './types'; 7 | 8 | export const getFactsItems = (options: TFactsWidgetOptions): TWidgetItem[] => { 9 | const { t } = useTranslation('widgets'); 10 | const fact = useMemo(() => getRandomFact(), []); 11 | 12 | return [ 13 | { 14 | key: 'showTitle', 15 | type: EWidgetItemType.static, 16 | title: {fact}, 17 | isChecked: true, 18 | }, 19 | { 20 | key: 'showSource', 21 | type: EWidgetItemType.toggle, 22 | title: t('widget.source'), 23 | value: ( 24 | 25 | synonym.to 26 | 27 | ), 28 | isChecked: options.showSource, 29 | }, 30 | ]; 31 | }; 32 | -------------------------------------------------------------------------------- /src/utils/clipboard.ts: -------------------------------------------------------------------------------- 1 | import Clipboard from '@react-native-clipboard/clipboard'; 2 | import { Result, err, ok } from '@synonymdev/result'; 3 | import { Platform } from 'react-native'; 4 | 5 | import { getSettingsStore } from '../store/helpers'; 6 | import { sleep } from './helpers'; 7 | import { parseUri } from './scanner/scanner'; 8 | 9 | export const checkClipboardData = async (): Promise> => { 10 | const { enableAutoReadClipboard } = getSettingsStore(); 11 | 12 | if (!enableAutoReadClipboard) { 13 | return err('Read clipboard not enabled'); 14 | } 15 | 16 | // Add delay otherwise clipboard is empty on Android app to foreground 17 | if (Platform.OS === 'android') { 18 | await sleep(1000); 19 | } 20 | 21 | const clipboardData = await Clipboard.getString(); 22 | if (!clipboardData) { 23 | return err('Clipboard is empty'); 24 | } 25 | 26 | const decodeRes = await parseUri(clipboardData); 27 | if (decodeRes.isErr()) { 28 | return err('Invalid clipboard data'); 29 | } 30 | 31 | return ok(clipboardData); 32 | }; 33 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/bitkit/modules/SplashScreen/SplashScreenPackage.java: -------------------------------------------------------------------------------- 1 | package com.bitkit.modules.SplashScreen; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.facebook.react.ReactPackage; 6 | import com.facebook.react.bridge.NativeModule; 7 | import com.facebook.react.bridge.ReactApplicationContext; 8 | import com.facebook.react.uimanager.ViewManager; 9 | 10 | import java.util.ArrayList; 11 | import java.util.Collections; 12 | import java.util.List; 13 | 14 | public class SplashScreenPackage implements ReactPackage { 15 | @Override 16 | @NonNull 17 | public List createViewManagers(@NonNull ReactApplicationContext reactContext) { 18 | return Collections.emptyList(); 19 | } 20 | 21 | @Override 22 | @NonNull 23 | public List createNativeModules(@NonNull ReactApplicationContext reactContext) { 24 | List modules = new ArrayList<>(); 25 | 26 | modules.add(new SplashScreenModule(reactContext)); 27 | 28 | return modules; 29 | } 30 | } -------------------------------------------------------------------------------- /src/utils/displayValues/types.ts: -------------------------------------------------------------------------------- 1 | export interface IBitcoinDisplayValues { 2 | bitcoinFormatted: string; 3 | bitcoinWhole: string; // Value before decimal point 4 | bitcoinDecimal: string; // Value after decimal point 5 | } 6 | 7 | export interface IFiatDisplayValues { 8 | fiatFormatted: string; 9 | fiatWhole: string; // Value before decimal point 10 | fiatDecimal: string; // Value after decimal point 11 | fiatSymbol: string; // $,€,£ 12 | fiatDecimalSymbol: string; // Decimal point "." or "," 13 | fiatTicker: string; // USD, EUR etc. 14 | fiatValue: number; 15 | } 16 | 17 | export type IDisplayValues = IBitcoinDisplayValues & IFiatDisplayValues; 18 | 19 | export const defaultBitcoinDisplayValues: IBitcoinDisplayValues = { 20 | bitcoinFormatted: '—', 21 | bitcoinWhole: '', 22 | bitcoinDecimal: '', 23 | }; 24 | 25 | export const defaultFiatDisplayValues: IFiatDisplayValues = { 26 | fiatFormatted: '—', 27 | fiatWhole: '', 28 | fiatDecimalSymbol: '.', 29 | fiatDecimal: '00', 30 | fiatSymbol: '', 31 | fiatTicker: '', 32 | fiatValue: 0, 33 | }; 34 | -------------------------------------------------------------------------------- /src/components/Amount.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from 'react'; 2 | import { StyleProp, StyleSheet, View, ViewStyle } from 'react-native'; 3 | 4 | import { useCurrency } from '../hooks/displayValues'; 5 | import { EUnit } from '../store/types/wallet'; 6 | import { Display } from '../styles/text'; 7 | 8 | const Amount = ({ 9 | value, 10 | unit = EUnit.BTC, 11 | style, 12 | }: { 13 | value: number; 14 | unit?: EUnit; 15 | style?: StyleProp; 16 | }): ReactElement => { 17 | const { fiatSymbol } = useCurrency(); 18 | return ( 19 | 20 | 21 | {unit === EUnit.BTC ? '₿' : fiatSymbol} 22 | 23 | {value} 24 | 25 | ); 26 | }; 27 | 28 | const styles = StyleSheet.create({ 29 | row: { 30 | flexDirection: 'row', 31 | alignItems: 'center', 32 | }, 33 | symbol: { 34 | fontFamily: 'InterTight-Bold', 35 | marginRight: 6, 36 | }, 37 | }); 38 | 39 | export default Amount; 40 | -------------------------------------------------------------------------------- /src/components/BlurView.tsx: -------------------------------------------------------------------------------- 1 | import { BlurView as Blur } from '@react-native-community/blur'; 2 | import React, { ReactElement, ReactNode } from 'react'; 3 | import { Platform, StyleProp, StyleSheet, ViewStyle } from 'react-native'; 4 | import { View } from '../styles/components'; 5 | 6 | type BlurViewProps = { 7 | pressed?: boolean; 8 | style?: StyleProp; 9 | children?: ReactNode; 10 | }; 11 | 12 | const BlurView = ({ 13 | pressed, 14 | style, 15 | ...props 16 | }: BlurViewProps): ReactElement => { 17 | return Platform.OS === 'ios' ? ( 18 | 23 | ) : ( 24 | 28 | ); 29 | }; 30 | 31 | const styles = StyleSheet.create({ 32 | ios: {}, 33 | android: { 34 | backgroundColor: 'rgba(20, 20, 20, 0.95)', 35 | }, 36 | androidPressed: { 37 | backgroundColor: 'rgba(20, 20, 20, 1)', 38 | }, 39 | }); 40 | 41 | export default BlurView; 42 | -------------------------------------------------------------------------------- /jest.setup.js: -------------------------------------------------------------------------------- 1 | import mockRNDeviceInfo from 'react-native-device-info/jest/react-native-device-info-mock'; 2 | import mockRNCNetInfo from '@react-native-community/netinfo/jest/netinfo-mock'; 3 | import * as mockLDK from '@synonymdev/react-native-ldk/dist/mock'; 4 | 5 | jest.mock('react-native-reanimated', () => 6 | require('react-native-reanimated/mock'), 7 | ); 8 | jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter'); 9 | jest.mock('react-native-device-info', () => mockRNDeviceInfo); 10 | jest.mock('react-native-permissions', () => 11 | require('react-native-permissions/mock'), 12 | ); 13 | jest.mock('@react-native-community/netinfo', () => mockRNCNetInfo); 14 | jest.mock('@synonymdev/react-native-ldk', () => mockLDK); 15 | 16 | global.net = require('net'); // needed by Electrum client. For RN it is proviced in shim.js 17 | global.tls = require('tls'); // needed by Electrum client. For RN it is proviced in shim.js 18 | global.fetch = require('node-fetch'); // TODO: replace with native api, when will be available 19 | global.crypto = require('node:crypto'); 20 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | 3 | Please include a summary of changes and which issues are fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. 4 | 5 | ### Linked Issues/Tasks 6 | 7 | Add any links to GitHub issues or Asana tasks that are relevant to this pull request. 8 | 9 | ### Type of change 10 | 11 | - [ ] Bug fix (non-breaking change which fixes an issue) 12 | - [ ] New feature (non-breaking change which adds functionality) 13 | - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) 14 | - [ ] Refactoring (improving code without creating new functionality) 15 | 16 | ### Tests 17 | 18 | - [ ] Detox test 19 | - [ ] Unit test 20 | - [ ] No test 21 | 22 | ### Screenshot / Video 23 | 24 | Insert relevant screenshot / recording 25 | 26 | ### QA Notes 27 | 28 | Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce during the Bitkit testing session. You can also leave a video of the PR in action. 29 | -------------------------------------------------------------------------------- /src/screens/TreasureHunt/GradientText.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Canvas, 3 | LinearGradient, 4 | Text, 5 | useFont, 6 | vec, 7 | } from '@shopify/react-native-skia'; 8 | import React, { ReactElement } from 'react'; 9 | import { StyleProp, ViewStyle } from 'react-native'; 10 | 11 | export const GradientText = ({ 12 | text, 13 | style, 14 | }: { 15 | text: string; 16 | style?: StyleProp; 17 | }): ReactElement => { 18 | const fontSize = 54; 19 | 20 | const font = useFont( 21 | require('../../assets/fonts/Damion-Regular.ttf'), 22 | fontSize, 23 | ); 24 | 25 | if (!font) { 26 | return <>; 27 | } 28 | 29 | const gradient = ['#FF4400', '#FFD200']; 30 | const textWidth = font.getTextWidth(text); 31 | 32 | return ( 33 | 34 | 35 | 41 | 42 | 43 | ); 44 | }; 45 | 46 | export default GradientText; 47 | -------------------------------------------------------------------------------- /src/store/shapes/blocktank.ts: -------------------------------------------------------------------------------- 1 | import { IBtInfo } from '@synonymdev/blocktank-lsp-http-client'; 2 | import { IBlocktank } from '../types/blocktank'; 3 | 4 | export const defaultBlocktankInfoShape: IBtInfo = { 5 | version: 2, 6 | nodes: [ 7 | { 8 | alias: '', 9 | pubkey: '', 10 | connectionStrings: [], 11 | }, 12 | ], 13 | options: { 14 | minChannelSizeSat: 0, 15 | maxChannelSizeSat: 50000000, 16 | minExpiryWeeks: 1, 17 | maxExpiryWeeks: 12, 18 | minPaymentConfirmations: 0, 19 | minHighRiskPaymentConfirmations: 1, 20 | max0ConfClientBalanceSat: 856487, 21 | maxClientBalanceSat: 856487, 22 | }, 23 | versions: { 24 | http: '0.0.0', 25 | btc: '0.0.0', 26 | ln2: '0.0.0', 27 | }, 28 | onchain: { 29 | // @ts-ignore enum not exported from blocktank-lsp-http-client 30 | network: 'mainnet', 31 | feeRates: { 32 | fast: 0, 33 | mid: 0, 34 | slow: 0, 35 | }, 36 | }, 37 | }; 38 | 39 | export const initialBlocktankState: IBlocktank = { 40 | orders: [], 41 | paidOrders: {}, 42 | info: defaultBlocktankInfoShape, 43 | cJitEntries: [], 44 | }; 45 | -------------------------------------------------------------------------------- /src/screens/Wallets/MainOnboarding.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement, memo } from 'react'; 2 | import { Trans, useTranslation } from 'react-i18next'; 3 | import { StyleProp, ViewStyle } from 'react-native'; 4 | 5 | import WalletOnboarding from '../../components/WalletOnboarding'; 6 | import { useAppDispatch } from '../../hooks/redux'; 7 | import { updateSettings } from '../../store/slices/settings'; 8 | import { Display } from '../../styles/text'; 9 | 10 | const MainOnboarding = ({ 11 | style, 12 | }: { 13 | style: StyleProp; 14 | }): ReactElement => { 15 | const dispatch = useAppDispatch(); 16 | const { t } = useTranslation('onboarding'); 17 | 18 | const onHideOnboarding = (): void => { 19 | dispatch(updateSettings({ hideOnboardingMessage: true })); 20 | }; 21 | 22 | return ( 23 | }} 31 | /> 32 | } 33 | /> 34 | ); 35 | }; 36 | 37 | export default memo(MainOnboarding); 38 | -------------------------------------------------------------------------------- /src/store/types/settings.ts: -------------------------------------------------------------------------------- 1 | import { EProtocol } from 'beignet'; 2 | import { IWalletItem } from './wallet'; 3 | 4 | export type TTheme = 'dark' | 'light'; 5 | 6 | export const isProtocol = (protocol: unknown): protocol is EProtocol => { 7 | if (typeof protocol === 'string') { 8 | return Object.values(EProtocol).includes(protocol as EProtocol); 9 | } 10 | return false; 11 | }; 12 | 13 | export enum ETransactionSpeed { 14 | fast = 'fast', 15 | normal = 'normal', 16 | slow = 'slow', 17 | custom = 'custom', 18 | } 19 | 20 | export interface ICustomElectrumPeer { 21 | host: string; 22 | ssl: number; //ssl port 23 | tcp: number; //tcp port 24 | protocol: EProtocol; 25 | } 26 | 27 | export type TReceiveOption = { 28 | key: string; 29 | title: string; 30 | }; 31 | 32 | export type TCustomElectrumPeers = IWalletItem; 33 | 34 | export type TChest = { 35 | chestId: string; 36 | state: 'found' | 'opened' | 'claimed' | 'success' | 'failed'; 37 | isAirdrop?: boolean; 38 | shortId?: string; 39 | attemptId?: string; 40 | winType?: 'winning' | 'consolation' | 'empty'; 41 | }; 42 | -------------------------------------------------------------------------------- /src/utils/i18n/convert.ts: -------------------------------------------------------------------------------- 1 | // https://help.transifex.com/en/articles/6220899-structured-json 2 | type SJItem = 3 | | { 4 | string: string; 5 | context?: string; 6 | developer_comment?: string; 7 | character_limit?: number; 8 | } 9 | | { 10 | [key: string]: SJItem; 11 | }; 12 | 13 | type StructuredJson = { 14 | [lang: string]: { 15 | [ns: string]: SJItem; 16 | }; 17 | }; 18 | 19 | type KVItem = { [k: string]: string } | { [k: string]: KVItem }; 20 | type KeyValueJson = { 21 | [lang: string]: { 22 | [ns: string]: KVItem; 23 | }; 24 | }; 25 | 26 | const recursion = (resources: Object): {} => { 27 | const res = {}; 28 | 29 | for (const [key, value] of Object.entries(resources)) { 30 | if (typeof value.string === 'string') { 31 | res[key] = value.string; 32 | } else { 33 | res[key] = recursion(value); 34 | } 35 | } 36 | 37 | return res; 38 | }; 39 | 40 | /** 41 | * Converts structured JSON to key-value JSON. 42 | **/ 43 | const convert = (resources: StructuredJson): KeyValueJson => { 44 | return recursion(resources); 45 | }; 46 | 47 | export default convert; 48 | -------------------------------------------------------------------------------- /src/components/BottomSheetBackground.tsx: -------------------------------------------------------------------------------- 1 | import React, { memo, ReactElement } from 'react'; 2 | import { Image, StyleProp, StyleSheet, ViewStyle } from 'react-native'; 3 | import { View as ThemedView } from '../styles/components'; 4 | 5 | const imageSrc = require('../assets/bottom-sheet-bg.png'); 6 | 7 | const BottomSheetBackground = ({ 8 | style, 9 | }: { 10 | style: StyleProp; 11 | }): ReactElement => ( 12 | 13 | 14 | 15 | 16 | ); 17 | 18 | const styles = StyleSheet.create({ 19 | root: { 20 | borderTopLeftRadius: 32, 21 | borderTopRightRadius: 32, 22 | overflow: 'hidden', 23 | position: 'relative', 24 | }, 25 | handleBackground: { 26 | height: 32, 27 | }, 28 | background: { 29 | resizeMode: 'stretch', 30 | position: 'absolute', 31 | top: 31, 32 | left: '-2%', 33 | bottom: '60%', 34 | width: '105%', 35 | height: undefined, 36 | }, 37 | }); 38 | 39 | export default memo(BottomSheetBackground); 40 | -------------------------------------------------------------------------------- /src/assets/svgs/raw/arrowClockwise.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/utils/i18n/locales/ca/widgets.json: -------------------------------------------------------------------------------- 1 | { 2 | "widgets": { 3 | "string": "Ginys" 4 | }, 5 | "widget": { 6 | "nav_title": { 7 | "string": "Giny" 8 | }, 9 | "edit": { 10 | "string": "Alimentar el Giny" 11 | }, 12 | "edit_default": { 13 | "string": "Predeterminat" 14 | }, 15 | "edit_custom": { 16 | "string": "Personalitzat" 17 | }, 18 | "source": { 19 | "string": "Origen" 20 | } 21 | }, 22 | "add": { 23 | "string": "Afegir ginys" 24 | }, 25 | "delete": { 26 | "title": { 27 | "string": "Esborrar el giny?" 28 | }, 29 | "description": { 30 | "string": "Estàs segur que vols eliminar '{name}' dels teus ginys?" 31 | } 32 | }, 33 | "price": { 34 | "name": { 35 | "string": "Preu de Bitcoin" 36 | } 37 | }, 38 | "news": { 39 | "name": { 40 | "string": "Capçaleres de Bitcoin" 41 | } 42 | }, 43 | "blocks": { 44 | "name": { 45 | "string": "Blocs de Bitcoin" 46 | } 47 | }, 48 | "facts": { 49 | "name": { 50 | "string": "Bitcoin Fets" 51 | } 52 | } 53 | } 54 | --------------------------------------------------------------------------------