├── .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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/twitter.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/rightSign.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/upArrow.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/plus.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/downArrow.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/lightningCircle.svg:
--------------------------------------------------------------------------------
1 |
2 |
6 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/speedFast.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/__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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/speedSlow.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/burger.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/activity.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/back.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/sent.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/send.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/lightningHollow.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/timerIconAlt.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/receive.svg:
--------------------------------------------------------------------------------
1 |
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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/checkCircle.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/__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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/shareIos.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/src/assets/svgs/raw/price.svg:
--------------------------------------------------------------------------------
1 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
6 |
--------------------------------------------------------------------------------
/src/assets/svgs/shop/shoppingBag.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------