├── .bundle └── config ├── .detoxrc.js ├── .editorconfig ├── .envrc ├── .eslintrc.json ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── dependabot.yml └── workflows │ ├── audit.yml │ ├── check-code.yml │ ├── codeql.yml │ ├── conventional.yaml │ ├── e2e.yml │ ├── spelling.yml │ ├── test.yml │ ├── update_pods.yml │ └── vendor │ ├── nodejs-audit.yml │ ├── nodejs-check-code.yml │ └── spelling.yml ├── .gitignore ├── .prettierignore ├── .readme ├── galoy-logo.png ├── screenshot-1.png ├── screenshot-2.png ├── screenshot-3.png └── screenshot-4.png ├── .ruby-version ├── .solidarity ├── .storybook ├── index.ts ├── main.js ├── storybook.requires.js ├── storybook.tsx └── views │ ├── index.ts │ ├── story-screen.tsx │ ├── story.tsx │ └── use-case.tsx ├── .storybook_server └── main.js ├── .svgrrc ├── .typesafe-i18n.json ├── .watchmanconfig ├── CONTRIBUTING.MD ├── Gemfile ├── LICENSE ├── Makefile ├── README.md ├── __mocks__ ├── @react-native-async-storage │ └── async-storage.js ├── @react-native-clipboard │ └── clipboard.js ├── @react-native-firebase │ ├── analytics.js │ ├── crashlytics.js │ └── messaging.js ├── react-native-device-info.js ├── react-native-keyboard-aware-scroll-view.js ├── react-native-localize.js ├── react-native-qrcode-svg.js ├── react-native-rate.js └── react-native-share.js ├── __tests__ ├── components │ └── app-update.spec.tsx ├── config │ └── galoy-instances.spec.ts ├── currencies │ └── match-currencies.spec.ts ├── hooks │ ├── use-display-currency.spec.tsx │ ├── use-price-conversion.spec.ts │ └── use-show-warning-secure-account.spec.tsx ├── lnurl.spec.ts ├── payment-destination │ ├── helpers.ts │ ├── intraledger.spec.ts │ ├── lightning.spec.ts │ ├── lnurl.spec.ts │ └── onchain.spec.ts ├── payment-details │ ├── amount-lightning-payment-details.spec.ts │ ├── amount-onchain.spec.ts │ ├── helpers.ts │ ├── intraledger-payment-details.spec.ts │ ├── lnurl-payment-details.spec.ts │ ├── no-amount-lightning-payment-details.spec.ts │ └── no-amount-onchain.spec.ts ├── payment-request │ ├── helpers.ts │ ├── payment-request-creation-data.spec.ts │ └── payment-request.spec.ts ├── persistent-storage.spec.ts ├── receive-bitcoin │ └── helpers.spec.ts ├── screens │ ├── helper.tsx │ ├── home.spec.tsx │ ├── receive.spec.tsx │ ├── send-bitcoin-completed-screen.spec.tsx │ ├── send-confirmation.spec.tsx │ ├── send-destination.spec.tsx │ ├── send-details.spec.tsx │ ├── settings-screen │ │ ├── settings-screen.spec.tsx │ │ └── settings.spec.tsx │ ├── telegram-auth.spec.tsx │ └── telegram-login-validate.spec.tsx ├── timer.spec.ts └── utils │ ├── earns-utils.test.ts │ ├── locale-detector.test.ts │ ├── phone-number-parser.test.ts │ └── transaction-date.spec.tsx ├── android ├── Gemfile ├── Gemfile.lock ├── app │ ├── BUCK │ ├── build.gradle │ ├── google-services.json │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── galoyapp │ │ │ └── DetoxTest.java │ │ ├── debug │ │ └── AndroidManifest.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── fonts │ │ │ ├── DMSans-Bold.ttf │ │ │ ├── Montserrat-Black.ttf │ │ │ ├── Montserrat-BlackItalic.ttf │ │ │ ├── Montserrat-Bold.ttf │ │ │ ├── Montserrat-BoldItalic.ttf │ │ │ ├── Montserrat-ExtraBold.ttf │ │ │ ├── Montserrat-ExtraBoldItalic.ttf │ │ │ ├── Montserrat-ExtraLight.ttf │ │ │ ├── Montserrat-ExtraLightItalic.ttf │ │ │ ├── Montserrat-Italic.ttf │ │ │ ├── Montserrat-Light.ttf │ │ │ ├── Montserrat-LightItalic.ttf │ │ │ ├── Montserrat-Medium.ttf │ │ │ ├── Montserrat-MediumItalic.ttf │ │ │ ├── Montserrat-Regular.ttf │ │ │ ├── Montserrat-SemiBold.ttf │ │ │ ├── Montserrat-SemiBoldItalic.ttf │ │ │ ├── Montserrat-Thin.ttf │ │ │ ├── Montserrat-ThinItalic.ttf │ │ │ ├── SourceSansPro-Bold.ttf │ │ │ ├── SourceSansPro-BoldItalic.ttf │ │ │ ├── SourceSansPro-Italic.ttf │ │ │ ├── SourceSansPro-Regular.ttf │ │ │ ├── SourceSansPro-SemiBold.ttf │ │ │ └── SourceSansPro-SemiBoldItalic.ttf │ │ ├── ic_launcher-playstore.png │ │ ├── java │ │ └── com │ │ │ └── galoyapp │ │ │ ├── BitcoinPriceWidget.kt │ │ │ ├── MainActivity.kt │ │ │ └── MainApplication.kt │ │ └── res │ │ ├── drawable-hdpi │ │ └── bootsplash_logo.png │ │ ├── drawable-mdpi │ │ └── bootsplash_logo.png │ │ ├── drawable-v21 │ │ ├── bitcoin_price_widget.png │ │ └── bitcoin_price_widget_chart_gradient.xml │ │ ├── drawable-xhdpi │ │ └── bootsplash_logo.png │ │ ├── drawable-xxhdpi │ │ └── bootsplash_logo.png │ │ ├── drawable-xxxhdpi │ │ └── bootsplash_logo.png │ │ ├── layout │ │ └── bitcoin_price_widget.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── values-night │ │ └── colors.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── bitcoin_price_widget_info.xml │ │ └── network_security_config.xml ├── build.gradle ├── fastlane │ ├── Appfile │ ├── Fastfile │ ├── Pluginfile │ └── README.md ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── link-assets-manifest.json └── settings.gradle ├── apollo.client.js ├── app.json ├── app ├── app.tsx ├── assets │ ├── fonts │ │ ├── DMSans-Bold.ttf │ │ ├── SourceSansPro-Bold.ttf │ │ ├── SourceSansPro-BoldItalic.ttf │ │ ├── SourceSansPro-Italic.ttf │ │ ├── SourceSansPro-Regular.ttf │ │ ├── SourceSansPro-SemiBold.ttf │ │ └── SourceSansPro-SemiBoldItalic.ttf │ ├── icons-redesign │ │ ├── arrow-left.svg │ │ ├── arrow-right.svg │ │ ├── back-space.svg │ │ ├── bank.svg │ │ ├── bell.svg │ │ ├── bitcoin.svg │ │ ├── book.svg │ │ ├── btc-book.svg │ │ ├── caret-down.svg │ │ ├── caret-left.svg │ │ ├── caret-right.svg │ │ ├── caret-up.svg │ │ ├── check-circle.svg │ │ ├── check.svg │ │ ├── close-cross-with-background.svg │ │ ├── close.svg │ │ ├── coins.svg │ │ ├── contact.svg │ │ ├── copy-paste.svg │ │ ├── dollar.svg │ │ ├── eye-slash.svg │ │ ├── eye.svg │ │ ├── filter.svg │ │ ├── globe.svg │ │ ├── graph.svg │ │ ├── image.svg │ │ ├── info.svg │ │ ├── lightning.svg │ │ ├── link.svg │ │ ├── loading.svg │ │ ├── magnifying-glass.svg │ │ ├── map.svg │ │ ├── menu.svg │ │ ├── payment-error.svg │ │ ├── payment-pending.svg │ │ ├── payment-success.svg │ │ ├── pencil.svg │ │ ├── qr-code.svg │ │ ├── question.svg │ │ ├── receive.svg │ │ ├── send.svg │ │ ├── settings.svg │ │ ├── share.svg │ │ ├── telegram.svg │ │ ├── transfer.svg │ │ ├── user.svg │ │ ├── video.svg │ │ ├── warning-with-background.svg │ │ └── warning.svg │ ├── icons │ │ ├── calculator.svg │ │ ├── cancel.svg │ │ ├── center-location-android.svg │ │ ├── chain.svg │ │ ├── chevron-down.svg │ │ ├── chevron.svg │ │ ├── copy.svg │ │ ├── default.svg │ │ ├── destination.svg │ │ ├── dollar.svg │ │ ├── downarrow.svg │ │ ├── error.svg │ │ ├── fee.svg │ │ ├── home.svg │ │ ├── info.svg │ │ ├── learn.svg │ │ ├── lightning-sats.png │ │ ├── lightning-sats.svg │ │ ├── lightning-usd.png │ │ ├── lightning-usd.svg │ │ ├── lightning.svg │ │ ├── map.svg │ │ ├── merchant.svg │ │ ├── nfc.svg │ │ ├── note.svg │ │ ├── onchain-btc.png │ │ ├── onchain-sats.svg │ │ ├── onchain.svg │ │ ├── people.svg │ │ ├── qr-code.svg │ │ ├── rank.svg │ │ ├── receive-bitcoin.svg │ │ ├── receive.svg │ │ ├── receive_bitcoin.svg │ │ ├── receive_usd.svg │ │ ├── refresh.svg │ │ ├── sat.svg │ │ ├── scan.svg │ │ ├── send.svg │ │ ├── share.svg │ │ ├── switch.svg │ │ ├── transfer.svg │ │ └── web-link.svg │ ├── images │ │ └── stable-sats.png │ └── logo │ │ ├── app-logo-dark.svg │ │ ├── app-logo-light.svg │ │ ├── blink-logo-icon.png │ │ ├── blink-logo-icon.svg │ │ └── blink-logo-light.svg ├── components │ ├── actions │ │ └── index.tsx │ ├── amount-input-screen │ │ ├── amount-input-screen-ui.tsx │ │ ├── amount-input-screen.stories.tsx │ │ ├── amount-input-screen.tsx │ │ ├── index.ts │ │ └── number-pad-reducer.ts │ ├── amount-input │ │ ├── amount-input-button.tsx │ │ ├── amount-input-modal.tsx │ │ ├── amount-input.stories.tsx │ │ ├── amount-input.tsx │ │ └── index.ts │ ├── app-update │ │ ├── app-update.logic.ts │ │ ├── app-update.stories.tsx │ │ └── app-update.tsx │ ├── atomic │ │ ├── galoy-button-field │ │ │ ├── galoy-button-field.stories.tsx │ │ │ ├── galoy-button-field.tsx │ │ │ └── index.ts │ │ ├── galoy-currency-bubble │ │ │ ├── galoy-currency-bubble.stories.tsx │ │ │ ├── galoy-currency-bubble.tsx │ │ │ └── index.ts │ │ ├── galoy-error-box │ │ │ ├── galoy-error-box.stories.tsx │ │ │ ├── galoy-error-box.tsx │ │ │ └── index.ts │ │ ├── galoy-icon-button │ │ │ ├── galoy-icon-button.stories.tsx │ │ │ ├── galoy-icon-button.tsx │ │ │ └── index.ts │ │ ├── galoy-icon │ │ │ ├── galoy-icon.stories.tsx │ │ │ ├── galoy-icon.tsx │ │ │ └── index.ts │ │ ├── galoy-info │ │ │ ├── galoy-info.stories.tsx │ │ │ ├── galoy-info.tsx │ │ │ └── index.ts │ │ ├── galoy-input │ │ │ ├── galoy-input.stories.tsx │ │ │ ├── galoy-input.tsx │ │ │ ├── galoy-redesigned-input.tsx │ │ │ └── index.ts │ │ ├── galoy-primary-button │ │ │ ├── galoy-primary-button.stories.tsx │ │ │ ├── galoy-primary-button.tsx │ │ │ └── index.ts │ │ ├── galoy-secondary-button │ │ │ ├── galoy-secondary-button.stories.tsx │ │ │ ├── galoy-secondary-button.tsx │ │ │ └── index.ts │ │ ├── galoy-slider-button │ │ │ ├── galoy-slider-button.stories.tsx │ │ │ ├── galoy-slider-button.tsx │ │ │ └── index.ts │ │ └── galoy-tertiary-button │ │ │ ├── galoy-tertiary-button.stories.tsx │ │ │ ├── galoy-tertiary-button.tsx │ │ │ └── index.ts │ ├── balance-header │ │ ├── balance-header.stories.tsx │ │ ├── balance-header.tsx │ │ └── index.ts │ ├── button-group │ │ ├── button-group.stories.tsx │ │ ├── button-group.tsx │ │ └── index.ts │ ├── circle │ │ ├── circle.tsx │ │ └── index.ts │ ├── close-cross │ │ ├── close-cross.tsx │ │ └── index.ts │ ├── code-input │ │ ├── code-input.tsx │ │ └── index.ts │ ├── contact-modal │ │ ├── contact-modal.tsx │ │ ├── index.ts │ │ └── telegram.svg │ ├── contact-support-button │ │ └── contact-support-button.tsx │ ├── currency-keyboard │ │ ├── currency-keyboard.stories.tsx │ │ ├── currency-keyboard.tsx │ │ └── index.ts │ ├── currency-tag │ │ ├── currency-tag.tsx │ │ └── index.ts │ ├── custom-icon │ │ ├── custom-icon.tsx │ │ └── index.ts │ ├── custom-modal │ │ ├── custom-modal.stories.tsx │ │ ├── custom-modal.tsx │ │ └── index.ts │ ├── galoy-theme-provider │ │ └── index.tsx │ ├── galoy-toast │ │ ├── galoy-toast.tsx │ │ └── index.ts │ ├── icon-transactions │ │ ├── icon-transactions.tsx │ │ └── index.ts │ ├── input-payment │ │ └── input-payment.types.d.ts │ ├── introducing-circles-modal │ │ ├── index.tsx │ │ └── introducing-circles-modal.tsx │ ├── invite-modal │ │ ├── index.tsx │ │ └── invite-modal.tsx │ ├── june-challenge │ │ ├── card.tsx │ │ ├── index.tsx │ │ └── modal.tsx │ ├── map-component │ │ ├── index.tsx │ │ ├── location-button-copy.tsx │ │ ├── map-styles.json │ │ └── open-settings-modal.tsx │ ├── map-marker-component │ │ └── index.tsx │ ├── may-challenge │ │ ├── card.tsx │ │ ├── index.tsx │ │ └── modal.tsx │ ├── menu-select │ │ ├── index.ts │ │ ├── item.tsx │ │ ├── menu-select-item.tsx │ │ ├── menu-select.stories.tsx │ │ └── menu-select.tsx │ ├── modal-nfc │ │ ├── index.tsx │ │ ├── modal-nfc.stories.tsx │ │ └── modal-nfc.tsx │ ├── modal-tooltip │ │ └── modal-tooltip.tsx │ ├── mountain-header │ │ ├── index.ts │ │ ├── mointains-cloud-01.svg │ │ └── mountain-header.tsx │ ├── note-input │ │ ├── index.ts │ │ └── note-input.tsx │ ├── notifications │ │ ├── bulletins.tsx │ │ ├── index.tsx │ │ ├── notification-card-ui.stories.tsx │ │ ├── notification-card-ui.tsx │ │ └── notification.stories.tsx │ ├── pagination │ │ ├── index.ts │ │ └── pagination-item.tsx │ ├── payment-destination-display │ │ ├── index.ts │ │ └── payment-destination-display.tsx │ ├── pressable-card │ │ ├── index.ts │ │ └── pressable-card.tsx │ ├── price-history │ │ ├── index.ts │ │ └── price-history.tsx │ ├── push-notification │ │ ├── index.ts │ │ └── push-notification.tsx │ ├── screen │ │ ├── index.ts │ │ ├── screen.presets.ts │ │ ├── screen.props.ts │ │ └── screen.tsx │ ├── set-default-account-modal │ │ ├── index.ts │ │ ├── set-default-account-modal.stories.tsx │ │ └── set-default-account-modal.tsx │ ├── set-lightning-address-modal │ │ ├── index.ts │ │ ├── set-lightning-address-modal.stories.tsx │ │ └── set-lightning-address-modal.tsx │ ├── stablesats-modal │ │ ├── index.ts │ │ └── stablesats-modal.tsx │ ├── success-action │ │ ├── field-with-copy.props.tsx │ │ ├── field-with-copy.tsx │ │ ├── index.tsx │ │ ├── success-action.props.tsx │ │ └── success-action.tsx │ ├── success-animation │ │ ├── config.ts │ │ ├── index.ts │ │ ├── success-icon-animation.tsx │ │ └── success-text-animation.tsx │ ├── telegram-login │ │ ├── index.ts │ │ └── telegram-button.tsx │ ├── totp-export │ │ ├── index.ts │ │ ├── totp-copy.stories.tsx │ │ ├── totp-copy.tsx │ │ ├── totp-qr.stories.tsx │ │ └── totp-qr.tsx │ ├── transaction-date │ │ ├── index.ts │ │ └── transaction-date.tsx │ ├── transaction-item │ │ ├── index.ts │ │ ├── index.types.d.ts │ │ └── transaction-item.tsx │ ├── upgrade-account-modal │ │ ├── index.ts │ │ ├── upgrade-account-modal.stories.tsx │ │ └── upgrade-account-modal.tsx │ ├── version │ │ ├── index.ts │ │ └── version.tsx │ ├── wallet-overview │ │ ├── index.tsx │ │ ├── wallet-overview.stories.tsx │ │ └── wallet-overview.tsx │ └── wallet-summary │ │ ├── index.tsx │ │ ├── wallet-summary.stories.tsx │ │ └── wallet-summary.tsx ├── config │ ├── appinfo.ts │ ├── feature-flags-context.tsx │ ├── galoy-instances.ts │ └── index.ts ├── graphql │ ├── analytics.tsx │ ├── cache.ts │ ├── client-only-query.ts │ ├── client.tsx │ ├── error-code.ts │ ├── fragments.ts │ ├── generated.gql │ ├── generated.ts │ ├── hide-amount-component.tsx │ ├── hide-amount-context.tsx │ ├── is-authed-context.ts │ ├── level-component.tsx │ ├── level-context.ts │ ├── ln-update-context.ts │ ├── local-schema.gql │ ├── messaging.tsx │ ├── mocks.ts │ ├── network-error-component.tsx │ ├── network-error-context.ts │ ├── transactions.ts │ ├── utils.ts │ └── wallets-utils.ts ├── hooks │ ├── index.ts │ ├── use-app-config.ts │ ├── use-device-location.ts │ ├── use-display-currency.ts │ ├── use-geetest-captcha.ts │ ├── use-logout.ts │ ├── use-price-conversion.ts │ └── use-save-session-profile.ts ├── i18n │ ├── README.md │ ├── af │ │ └── index.ts │ ├── ar │ │ └── index.ts │ ├── ca │ │ └── index.ts │ ├── cs │ │ └── index.ts │ ├── da │ │ └── index.ts │ ├── de │ │ └── index.ts │ ├── el │ │ └── index.ts │ ├── en │ │ └── index.ts │ ├── es │ │ └── index.ts │ ├── formatters.ts │ ├── fr │ │ └── index.ts │ ├── hr │ │ └── index.ts │ ├── hu │ │ └── index.ts │ ├── hy │ │ └── index.ts │ ├── i18n-react.tsx │ ├── i18n-types.ts │ ├── i18n-util.async.ts │ ├── i18n-util.sync.ts │ ├── i18n-util.ts │ ├── it │ │ └── index.ts │ ├── ja │ │ └── index.ts │ ├── lg │ │ └── index.ts │ ├── mapping.ts │ ├── ms │ │ └── index.ts │ ├── nl │ │ └── index.ts │ ├── pt │ │ └── index.ts │ ├── qu │ │ └── index.ts │ ├── raw-i18n │ │ ├── source │ │ │ └── en.json │ │ └── translations │ │ │ ├── af.json │ │ │ ├── ar.json │ │ │ ├── ca.json │ │ │ ├── cs.json │ │ │ ├── da.json │ │ │ ├── de.json │ │ │ ├── el.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── hr.json │ │ │ ├── hu.json │ │ │ ├── hy.json │ │ │ ├── id.json │ │ │ ├── it.json │ │ │ ├── ja.json │ │ │ ├── lg.json │ │ │ ├── ms.json │ │ │ ├── nl.json │ │ │ ├── pt.json │ │ │ ├── qu.json │ │ │ ├── ro.json │ │ │ ├── sk.json │ │ │ ├── sr.json │ │ │ ├── sw.json │ │ │ ├── th.json │ │ │ ├── tr.json │ │ │ ├── vi.json │ │ │ └── xh.json │ ├── ro │ │ └── index.ts │ ├── sk │ │ └── index.ts │ ├── sr │ │ └── index.ts │ ├── sw │ │ └── index.ts │ ├── th │ │ └── index.ts │ ├── tr │ │ └── index.ts │ └── vi │ │ └── index.ts ├── navigation │ ├── app-state.tsx │ ├── navigation-container-wrapper.tsx │ ├── root-navigator.tsx │ └── stack-param-lists.ts ├── rne-theme │ ├── colors.stories.tsx │ ├── colors.ts │ ├── text.stories.tsx │ ├── theme.stories.tsx │ ├── theme.ts │ ├── themed.d.ts │ └── timing.ts ├── screens │ ├── accept-t-and-c │ │ ├── accept-t-and-c.stories.tsx │ │ ├── accept-t-and-c.tsx │ │ └── index.ts │ ├── authentication-screen │ │ ├── authentication-check-screen.stories.tsx │ │ ├── authentication-check-screen.tsx │ │ ├── authentication-screen.stories.tsx │ │ ├── authentication-screen.tsx │ │ ├── index.ts │ │ ├── pin-screen.stories.tsx │ │ └── pin-screen.tsx │ ├── conversion-flow │ │ ├── conversion-confirmation-screen.tsx │ │ ├── conversion-details-screen.tsx │ │ ├── conversion-success-screen.stories.tsx │ │ ├── conversion-success-screen.tsx │ │ ├── index.ts │ │ └── use-convert-money-details.ts │ ├── developer-screen │ │ ├── developer-screen.tsx │ │ └── index.ts │ ├── earns-map-screen │ │ ├── bitcoin-circle-01.svg │ │ ├── bottom-start-01.svg │ │ ├── earns-map-screen.stories.tsx │ │ ├── earns-map-screen.tsx │ │ ├── index.ts │ │ ├── left-finished-01.svg │ │ ├── left-first-section-to-do-01.svg │ │ ├── left-last-section-completed-01.svg │ │ ├── left-last-section-ongoing-01.svg │ │ ├── left-last-section-to-do-01.svg │ │ ├── left-next-section-to-do-01.svg │ │ ├── left-section-completed-01.svg │ │ ├── left-section-ongoing-01.svg │ │ ├── left-section-to-do-01.svg │ │ ├── right-finished-01.svg │ │ ├── right-first-section-to-do-01.svg │ │ ├── right-last-section-completed-01.svg │ │ ├── right-last-section-ongoing-01.svg │ │ ├── right-last-section-to-do-01.svg │ │ ├── right-next-section-to-do-01.svg │ │ ├── right-section-completed-01.svg │ │ ├── right-section-ongoing-01.svg │ │ ├── right-section-to-do-01.svg │ │ ├── text-block-large.svg │ │ ├── text-block-medium.svg │ │ ├── text-block-small.svg │ │ ├── top-01.svg │ │ └── use-quiz-server.tsx │ ├── earns-screen │ │ ├── 01-fiat-currency-01.svg │ │ ├── 01-limited-supply-01.svg │ │ ├── 01-money-is-a-social-agreement-01.svg │ │ ├── 01-money-is-a-social-agreement-02.svg │ │ ├── 01-so-what-exactly-is-bitcoin-01.svg │ │ ├── 02-coincidence-of-wants-01.svg │ │ ├── 02-decentralized-01.svg │ │ ├── 02-decentralized-02.svg │ │ ├── 02-i-just-earned-a-sat-01.svg │ │ ├── 02-i-trust-my-government-01.svg │ │ ├── 03-money-has-evolved-01.svg │ │ ├── 03-no-counterfeit-money-01.svg │ │ ├── 03-no-counterfeit-money-02.svg │ │ ├── 03-print-unlimited-money-01.svg │ │ ├── 03-print-unlimited-money-02.svg │ │ ├── 03-where-do-the-bitcoins-exist-01.svg │ │ ├── 04-fiat-money-loses-value-01.svg │ │ ├── 04-fiat-money-loses-value-02.svg │ │ ├── 04-highly-divisible-01.svg │ │ ├── 04-who-controls-Bitcoin-01.svg │ │ ├── 04-why-used-as-money-01.svg │ │ ├── 04-why-used-as-money-02.svg │ │ ├── 05-are-there-other-issues-01.svg │ │ ├── 05-are-there-other-issues-02.svg │ │ ├── 05-cant-copy-bitcoin-01.svg │ │ ├── 05-money-is-important-01.svg │ │ ├── 05-secure-part-i-01.svg │ │ ├── 05-secure-part-i-02.svg │ │ ├── 06-important-to-governments-01.svg │ │ ├── 06-important-to-governments-03.svg │ │ ├── 06-secure-part-ii-01.svg │ │ ├── 06-secure-part-ii-02.svg │ │ ├── 201-01-origins-of-money.svg │ │ ├── 201-02-primitive-money.svg │ │ ├── 201-03-anticipating-demand.svg │ │ ├── 201-04-nash-equilibrium.svg │ │ ├── 201-05-single-store-of-value.svg │ │ ├── 202-01-what-is-good-sov.svg │ │ ├── 202-02-durability.svg │ │ ├── 202-03-portability.svg │ │ ├── 202-04-fungibility.svg │ │ ├── 202-05-verifiability.svg │ │ ├── 202-06-devisibility.svg │ │ ├── 202-07-scarce.svg │ │ ├── 202-08-established-history.svg │ │ ├── 202-09-censorship-resistance.svg │ │ ├── 203-01-evolution-money.svg │ │ ├── 203-02-collectible.svg │ │ ├── 203-03-store-of-value.svg │ │ ├── 203-04-medium-of-exchange.svg │ │ ├── 203-05-unit-of-account.svg │ │ ├── 203-06-partly-monetized.svg │ │ ├── 203-07-monetization-stage.svg │ │ ├── 204-01-not-from-government.svg │ │ ├── 204-02-primary-function.svg │ │ ├── 204-03-monetary-metals.svg │ │ ├── 204-05-stock-to-flow.svg │ │ ├── 204-06-hard-money.svg │ │ ├── 205-01-converging-on-gold.svg │ │ ├── 205-02-origins-of-paper-money.svg │ │ ├── 205-03-fractional-reserve.svg │ │ ├── 205-04-bank-run.svg │ │ ├── 205-05-modern-central-banking.svg │ │ ├── 205-06-gold-backed.svg │ │ ├── 205-07-bretton-woods.svg │ │ ├── 205-08-global-reserve.svg │ │ ├── 206-01-nixon-shock.svg │ │ ├── 206-02-fiat-era.svg │ │ ├── 206-03-digital-fiat.svg │ │ ├── 206-04-plastic-credit.svg │ │ ├── 206-05-double-spend-problem.svg │ │ ├── 206-06-Satoshis-breakthrough.svg │ │ ├── 206-07-natively-digital.svg │ │ ├── 206-08-CBDCs.svg │ │ ├── 301-01-root-problem.svg │ │ ├── 301-02-bitcoin-creator.svg │ │ ├── 301-02b-fiat-requires-trust.svg │ │ ├── 301-03-money-printing.svg │ │ ├── 301-04-genesis-block.svg │ │ ├── 301-05-cypherpunks.svg │ │ ├── 302-01-peer-to-peer.svg │ │ ├── 302-02-blockchain.svg │ │ ├── 302-03-private-key.svg │ │ ├── 302-04-public-key.svg │ │ ├── 302-05-mining.svg │ │ ├── 302-06-proof-of-work.svg │ │ ├── 302-07-difficulty-adjustment.svg │ │ ├── 302-08-halving.svg │ │ ├── 401-01-bitcoin-drawbacks.svg │ │ ├── 401-02-blocksize-wars.svg │ │ ├── 401-03-lightning-network.svg │ │ ├── 401-04-instant-payments.svg │ │ ├── 401-05-micro-payments.svg │ │ ├── 401-06-scalability.svg │ │ ├── 401-07-payment-channels.svg │ │ ├── 401-08-routing.svg │ │ ├── 501-01-its-a-bubble.svg │ │ ├── 501-02-its-too-volatile.svg │ │ ├── 501-03-its-not-backed.svg │ │ ├── 501-04-will-become-obsolete.svg │ │ ├── 501-05-too-much-energy.svg │ │ ├── 501-06-stranded-energy.svg │ │ ├── 502-01-internet-dependent.svg │ │ ├── 502-02-for-crime-only.svg │ │ ├── 502-03-ponzi-scheme.svg │ │ ├── 502-04-bitcoin-is-too-slow.svg │ │ ├── 502-05-supply-limit.svg │ │ ├── 502-06-government-ban.svg │ │ ├── 503-01-concentrated-ownership.svg │ │ ├── 503-02-centralized-mining.svg │ │ ├── 503-03-too-expensive.svg │ │ ├── 503-04-prohibitively-high.svg │ │ ├── 503-05-will-be-hoarded.svg │ │ ├── 503-06-can-be-duplicated.svg │ │ ├── 601-01-scarcity.svg │ │ ├── 601-02-monetary-premium.svg │ │ ├── 601-03-greshams-law.svg │ │ ├── 601-04-thiers-law.svg │ │ ├── 601-05-cantillon-effect.svg │ │ ├── 601-06-schelling-point.svg │ │ ├── 602-01-opportunity-cost.svg │ │ ├── 602-02-time-preference.svg │ │ ├── 602-03-impossible-trinity.svg │ │ ├── 602-04-jevons-paradox.svg │ │ ├── 602-05-power-laws.svg │ │ ├── 602-06-winner-take-all.svg │ │ ├── 603-01-unit-bias.svg │ │ ├── 603-02-veblen-good.svg │ │ ├── 603-03-malinvestment.svg │ │ ├── 603-04-asymmetric-payoff.svg │ │ ├── 603-05-ansoff-matrix.svg │ │ ├── PopcornLogo.png │ │ ├── badger-shovel-01.svg │ │ ├── earn-svg-factory.tsx │ │ ├── earns-quiz.stories.tsx │ │ ├── earns-quiz.tsx │ │ ├── earns-section.tsx │ │ ├── earns-sections.stories.tsx │ │ ├── earns-utils.ts │ │ ├── index.ts │ │ ├── section-completed.stories.tsx │ │ ├── section-completed.tsx │ │ ├── sections.ts │ │ └── stars-01.svg │ ├── email-login-screen │ │ ├── email-login-flow.stories.tsx │ │ ├── email-login-initiate.tsx │ │ ├── email-login-validate.stories.tsx │ │ ├── email-login-validate.tsx │ │ └── index.ts │ ├── email-registration-screen │ │ ├── email-registration-initiate.stories.tsx │ │ ├── email-registration-initiate.tsx │ │ ├── email-registration-validate.stories.tsx │ │ ├── email-registration-validate.tsx │ │ └── index.ts │ ├── error-screen │ │ ├── error-screen.stories.tsx │ │ ├── error-screen.tsx │ │ ├── honey-badger-shovel-01.svg │ │ └── index.ts │ ├── full-onboarding-flow │ │ ├── full-onboarding-flow.stories.tsx │ │ ├── full-onboarding-flow.tsx │ │ └── index.ts │ ├── galoy-address-screen │ │ ├── address-component.tsx │ │ ├── address-explainer-modal.tsx │ │ ├── address-screen.stories.tsx │ │ ├── address-screen.tsx │ │ ├── index.ts │ │ ├── paycode-explainer-modal.tsx │ │ └── pos-explainer-modal.tsx │ ├── get-started-screen │ │ ├── device-account-fail-modal.stories.tsx │ │ ├── device-account-fail-modal.tsx │ │ ├── device-account-modal.tsx │ │ ├── get-started-screen.stories.tsx │ │ ├── get-started-screen.tsx │ │ ├── index.ts │ │ └── use-device-token.ts │ ├── home-screen │ │ ├── home-screen.stories.tsx │ │ ├── home-screen.tsx │ │ └── index.ts │ ├── map-screen │ │ ├── 16311-gps.json │ │ ├── functions.tsx │ │ └── map-screen.tsx │ ├── notification-history-screen │ │ ├── notification-history-screen.tsx │ │ ├── notification.tsx │ │ └── utils.ts │ ├── people-screen │ │ ├── circles │ │ │ ├── circles-card-people-home.tsx │ │ │ ├── circles-dashboard-screen.tsx │ │ │ ├── invite-friends-card.tsx │ │ │ ├── share-circles-card.tsx │ │ │ └── use-circles-card.tsx │ │ ├── contacts │ │ │ ├── all-contacts.tsx │ │ │ ├── contact-transactions.tsx │ │ │ ├── contacts-card.tsx │ │ │ ├── contacts-detail.stories.tsx │ │ │ └── contacts-detail.tsx │ │ ├── index.ts │ │ ├── people.stories.tsx │ │ ├── people.tsx │ │ └── tab-icon.tsx │ ├── phone-auth-screen │ │ ├── index.ts │ │ ├── phone-channel-buttons.tsx │ │ ├── phone-login-flow.stories.tsx │ │ ├── phone-login-input.tsx │ │ ├── phone-login-validation.stories.tsx │ │ ├── phone-login-validation.tsx │ │ ├── phone-registration-input.tsx │ │ ├── phone-registration-validation.tsx │ │ ├── request-phone-code-login.ts │ │ └── request-phone-code-registration.ts │ ├── price │ │ ├── index.ts │ │ └── price-history-screen.tsx │ ├── receive-bitcoin-screen │ │ ├── index.ts │ │ ├── my-ln-updates-sub.tsx │ │ ├── payment │ │ │ ├── helpers.ts │ │ │ ├── index.types.ts │ │ │ ├── payment-request-creation-data.ts │ │ │ └── payment-request.ts │ │ ├── qr-view.stories.tsx │ │ ├── qr-view.tsx │ │ ├── receive-screen.stories.tsx │ │ ├── receive-screen.tsx │ │ └── use-receive-bitcoin.ts │ ├── redeem-lnurl-withdrawal-screen │ │ ├── index.ts │ │ ├── redeem-bitcoin-detail-screen.stories.tsx │ │ ├── redeem-bitcoin-detail-screen.tsx │ │ ├── redeem-bitcoin-result-screen.stories.tsx │ │ └── redeem-bitcoin-result-screen.tsx │ ├── send-bitcoin-screen │ │ ├── confirm-destination-modal.stories.tsx │ │ ├── confirm-destination-modal.tsx │ │ ├── confirm-fees-modal.tsx │ │ ├── destination-information.tsx │ │ ├── index.ts │ │ ├── payment-destination │ │ │ ├── index.ts │ │ │ ├── index.types.ts │ │ │ ├── intraledger.ts │ │ │ ├── lightning.ts │ │ │ ├── lnurl.ts │ │ │ └── onchain.ts │ │ ├── payment-details │ │ │ ├── index.ts │ │ │ ├── index.types.ts │ │ │ ├── intraledger.ts │ │ │ ├── lightning.ts │ │ │ ├── onchain.ts │ │ │ └── utils.ts │ │ ├── payment-status-indicator.tsx │ │ ├── scanning-qrcode-screen.tsx │ │ ├── send-bitcoin-completed-screen.stories.tsx │ │ ├── send-bitcoin-completed-screen.tsx │ │ ├── send-bitcoin-confirmation-screen.stories.tsx │ │ ├── send-bitcoin-confirmation-screen.tsx │ │ ├── send-bitcoin-destination-screen.tsx │ │ ├── send-bitcoin-details-extra-info.stories.tsx │ │ ├── send-bitcoin-details-extra-info.tsx │ │ ├── send-bitcoin-details-screen.stories.tsx │ │ ├── send-bitcoin-details-screen.tsx │ │ ├── send-bitcoin-reducer.ts │ │ ├── suggestion-modal.stories.tsx │ │ ├── suggestion-modal.tsx │ │ ├── use-fee.ts │ │ ├── use-send-payment.ts │ │ └── validation.ts │ ├── settings-screen │ │ ├── account-screen.stories.tsx │ │ ├── account │ │ │ ├── account-delete-context.tsx │ │ │ ├── account-screen.tsx │ │ │ ├── banner.tsx │ │ │ ├── id.tsx │ │ │ ├── index.ts │ │ │ ├── login-methods-hook.ts │ │ │ ├── settings │ │ │ │ ├── danger-zone.tsx │ │ │ │ ├── delete.tsx │ │ │ │ ├── email.tsx │ │ │ │ ├── logout.tsx │ │ │ │ ├── phone.tsx │ │ │ │ ├── upgrade-trial-account.tsx │ │ │ │ └── upgrade.tsx │ │ │ └── show-warning-secure-account-hook.ts │ │ ├── button.tsx │ │ ├── default-wallet.stories.tsx │ │ ├── default-wallet.tsx │ │ ├── display-currency-screen.stories.tsx │ │ ├── display-currency-screen.tsx │ │ ├── group.tsx │ │ ├── index.tsx │ │ ├── language-screen.stories.tsx │ │ ├── language-screen.tsx │ │ ├── notifications-screen.tsx │ │ ├── row.tsx │ │ ├── security-screen.tsx │ │ ├── settings-screen.stories.tsx │ │ ├── settings-screen.tsx │ │ ├── settings.stories.tsx │ │ ├── settings │ │ │ ├── account-default-wallet.tsx │ │ │ ├── account-level.tsx │ │ │ ├── account-ln-address.tsx │ │ │ ├── account-pos.tsx │ │ │ ├── account-static-qr.tsx │ │ │ ├── account-tx-limits.tsx │ │ │ ├── advanced-api-access.tsx │ │ │ ├── advanced-export-csv.tsx │ │ │ ├── community-join.tsx │ │ │ ├── community-need-help.tsx │ │ │ ├── multi-account │ │ │ │ ├── index.ts │ │ │ │ ├── index.types.d.ts │ │ │ │ ├── profile.tsx │ │ │ │ ├── switch-account.stories.tsx │ │ │ │ ├── switch-account.tsx │ │ │ │ └── utils.ts │ │ │ ├── preferences-currency.tsx │ │ │ ├── preferences-language.tsx │ │ │ ├── preferences-theme.tsx │ │ │ ├── sp-notifications.tsx │ │ │ └── sp-security.tsx │ │ ├── theme-screen.stories.tsx │ │ ├── theme-screen.tsx │ │ ├── totp.tsx │ │ └── transaction-limits-screen.tsx │ ├── support-chat-screen │ │ ├── support-chat.stories.tsx │ │ └── support-chat.tsx │ ├── telegram-login-screen │ │ ├── index.ts │ │ ├── telegram-auth.ts │ │ ├── telegram-login-validate.stories.tsx │ │ └── telegram-login-validate.tsx │ ├── totp-screen │ │ ├── index.ts │ │ ├── totp-login-validate.tsx │ │ ├── totp-registration-initiate.tsx │ │ └── totp-registration-validate.tsx │ ├── transaction-detail-screen │ │ ├── format-time.ts │ │ ├── index.ts │ │ ├── transaction-detail-screen.stories.tsx │ │ └── transaction-detail-screen.tsx │ ├── transaction-history │ │ ├── index.ts │ │ ├── index.types.d.ts │ │ └── transaction-history-screen.tsx │ └── webview │ │ └── webview.tsx ├── store │ └── persistent-state │ │ ├── index.tsx │ │ └── state-migrations.ts ├── types │ ├── amounts.ts │ ├── declaration.d.ts │ └── wallets.ts └── utils │ ├── analytics.ts │ ├── biometricAuthentication.ts │ ├── date.ts │ ├── enum.ts │ ├── external.ts │ ├── format-public-key.ts │ ├── helper.ts │ ├── locale-detector.ts │ ├── logs.ts │ ├── notifications.ts │ ├── pay-links.ts │ ├── sleep.ts │ ├── storage │ ├── __storage.test.ts__ │ ├── index.ts │ ├── secureStorage.ts │ └── storage.ts │ ├── testProps.ts │ ├── timer.ts │ └── toast.ts ├── audit.sh ├── babel.config.js ├── bin └── get-testing-device.sh ├── ci ├── config │ ├── git-cliff-release.toml │ └── vendor │ │ └── git-cliff.toml ├── image │ └── Dockerfile ├── pipeline.yml ├── repipe ├── tasks │ ├── build.sh │ ├── bump-and-commit-build-number.sh │ ├── check-code.sh │ ├── choose-commit-prerelease.sh │ ├── e2e-test-android.sh │ ├── e2e-test-ios.sh │ ├── helpers.sh │ ├── install-deps.sh │ ├── prerelease.sh │ ├── test-unit.sh │ ├── upload-to-gcs.sh │ └── vendor │ │ └── prep-release-src.sh ├── values.yml ├── vendir.lock.yml ├── vendir.yml └── vendor │ ├── config │ └── git-cliff.toml │ ├── pipeline-fragments.lib.yml │ └── tasks │ ├── helpers.sh │ ├── nodejs-audit.sh │ ├── nodejs-cache-yarn-deps.sh │ ├── nodejs-check-code.sh │ ├── prep-release-src.sh │ └── test-on-docker-host.sh ├── codegen.yml ├── dev ├── Tiltfile ├── bin │ ├── dev-ln-setup.sh │ ├── dev-setup.sh │ └── one-block-every-5s.sh ├── vendir.lock.yml ├── vendir.yml └── vendor │ └── galoy-quickstart │ ├── .env.galoy │ ├── .gitignore │ ├── bin │ ├── bump-galoy-git-ref.sh │ ├── bump-galoy-image-digest.sh │ ├── bump-mongodb-migrate-image-digest.sh │ ├── helpers.sh │ ├── init-lightning.sh │ ├── init-onchain.sh │ ├── quickstart.sh │ └── re-render.sh │ ├── dev │ ├── BUCK │ ├── Tiltfile │ ├── config │ │ ├── apollo-federation │ │ │ ├── README.md │ │ │ ├── router.yaml │ │ │ ├── supergraph-config.yaml │ │ │ └── supergraph.graphql │ │ ├── bitcoind │ │ │ ├── bitcoin.conf │ │ │ └── bitcoind_signer_descriptors.json │ │ ├── bria.yml │ │ ├── fulcrum │ │ │ ├── fulcrum.conf │ │ │ ├── tls.cert │ │ │ └── tls.key │ │ ├── lnd │ │ │ ├── lnd.conf │ │ │ ├── regtest │ │ │ │ ├── lnd-outside-1.admin.macaroon │ │ │ │ ├── lnd-outside-1.admin.macaroon.base64 │ │ │ │ ├── lnd-outside-1.macaroons.db │ │ │ │ ├── lnd-outside-1.pubkey │ │ │ │ ├── lnd-outside-1.wallet.db │ │ │ │ ├── lnd-outside-2.admin.macaroon │ │ │ │ ├── lnd-outside-2.admin.macaroon.base64 │ │ │ │ ├── lnd-outside-2.macaroons.db │ │ │ │ ├── lnd-outside-2.pubkey │ │ │ │ ├── lnd-outside-2.wallet.db │ │ │ │ ├── lnd1.admin.macaroon │ │ │ │ ├── lnd1.admin.macaroon.base64 │ │ │ │ ├── lnd1.macaroons.db │ │ │ │ ├── lnd1.pubkey │ │ │ │ ├── lnd1.wallet.db │ │ │ │ ├── lnd2.admin.macaroon │ │ │ │ ├── lnd2.admin.macaroon.base64 │ │ │ │ ├── lnd2.macaroons.db │ │ │ │ ├── lnd2.pubkey │ │ │ │ └── lnd2.wallet.db │ │ │ ├── tls.cert │ │ │ └── tls.key │ │ ├── notifications │ │ │ ├── fake_service_account.json │ │ │ └── notifications.yml │ │ ├── ory │ │ │ ├── body.jsonnet │ │ │ ├── email_no_password_v0.identity.schema.json │ │ │ ├── hydra.yml │ │ │ ├── jwks.json │ │ │ ├── kratos.yml │ │ │ ├── oathkeeper.yml │ │ │ ├── oathkeeper_rules.yaml │ │ │ ├── phone_email_no_password_v0.identity.schema.json │ │ │ ├── phone_no_password_v0.identity.schema.json │ │ │ └── username_password_deviceid_v0.identity.schema.json │ │ ├── otel-agent-config.yaml │ │ ├── price.yml │ │ └── stablesats.yml │ ├── core-bundle │ │ ├── dummy-env.json │ │ ├── integration-env.json │ │ └── serve-env.json │ ├── docker-compose.deps.yml │ ├── healthcheck.py │ ├── helpers │ │ ├── auth.sh │ │ ├── cli.sh │ │ ├── gql.sh │ │ ├── gql │ │ │ ├── default-account.gql │ │ │ ├── on-chain-address-create.gql │ │ │ ├── transactions.gql │ │ │ ├── update-username.gql │ │ │ ├── user-email-registration-initiate.gql │ │ │ ├── user-email-registration-validate.gql │ │ │ └── wallets-for-account.gql │ │ └── onchain.sh │ └── tilt.bzl │ ├── docker-compose.yml │ └── graphql │ ├── gql │ ├── account-default-wallet.gql │ ├── account-delete.gql │ ├── account-details.gql │ ├── account-disable-notification-category.gql │ ├── account-disable-notification-channel.gql │ ├── account-enable-notification-category.gql │ ├── account-enable-notification-channel.gql │ ├── account-limits.gql │ ├── account-update-default-wallet-id.gql │ ├── api-key-create.gql │ ├── api-keys.gql │ ├── authorization.gql │ ├── business-map-markers.gql │ ├── callback-endpoint-add.gql │ ├── callback-endpoint-delete.gql │ ├── callback-endpoints-list.gql │ ├── contacts.gql │ ├── currency-conversion-estimation.gql │ ├── default-account.gql │ ├── globals.gql │ ├── identity.gql │ ├── intraledger-payment-send.gql │ ├── intraledger-usd-payment-send.gql │ ├── invoice-for-wallet-by-payment-hash.gql │ ├── invoices-by-wallet.gql │ ├── invoices.gql │ ├── ln-invoice-cancel.gql │ ├── ln-invoice-create-on-behalf-of-recipient.gql │ ├── ln-invoice-create.gql │ ├── ln-invoice-fee-probe.gql │ ├── ln-invoice-payment-send.gql │ ├── ln-invoice-payment-status-by-hash-sub.gql │ ├── ln-invoice-payment-status-by-hash.gql │ ├── ln-invoice-payment-status-by-payment-request-sub.gql │ ├── ln-invoice-payment-status-by-payment-request.gql │ ├── ln-no-amount-invoice-create-on-behalf-of-recipient.gql │ ├── ln-no-amount-invoice-create.gql │ ├── ln-no-amount-invoice-fee-probe.gql │ ├── ln-no-amount-invoice-payment-send.gql │ ├── ln-no-amount-usd-invoice-fee-probe.gql │ ├── ln-no-amount-usd-invoice-payment-send.gql │ ├── ln-usd-invoice-btc-denominated-create-on-behalf-of-recipient.gql │ ├── ln-usd-invoice-create-on-behalf-of-recipient.gql │ ├── ln-usd-invoice-create.gql │ ├── ln-usd-invoice-fee-probe.gql │ ├── lnurl-payment-send.gql │ ├── logout.gql │ ├── merchant-map-suggest.gql │ ├── my-updates-sub.gql │ ├── on-chain-address-create.gql │ ├── on-chain-address-current.gql │ ├── on-chain-payment-send-all.gql │ ├── on-chain-payment-send.gql │ ├── on-chain-tx-fee.gql │ ├── on-chain-usd-payment-send-as-btc-denominated.gql │ ├── on-chain-usd-payment-send.gql │ ├── on-chain-usd-tx-fee-as-btc-denominated.gql │ ├── on-chain-usd-tx-fee.gql │ ├── pending-incoming-transactions-by-address.gql │ ├── pending-incoming-transactions.gql │ ├── price-sub.gql │ ├── quiz-claim.gql │ ├── quiz-question.gql │ ├── quiz.gql │ ├── real-time-price-sub.gql │ ├── real-time-price.gql │ ├── revoke-api-key.gql │ ├── support-chat-message-add.gql │ ├── support-chat.gql │ ├── transaction-for-wallet-by-id.gql │ ├── transactions-by-address.gql │ ├── transactions-by-wallet.gql │ ├── transactions-for-wallet-by-payment-hash.gql │ ├── transactions-for-wallet-by-payment-request.gql │ ├── transactions.gql │ ├── update-display-currency.gql │ ├── user-details.gql │ ├── user-disable-notification-category.gql │ ├── user-disable-notification-channel.gql │ ├── user-email-delete.gql │ ├── user-email-registration-initiate.gql │ ├── user-email-registration-validate.gql │ ├── user-enable-notification-category.gql │ ├── user-enable-notification-channel.gql │ ├── user-login-upgrade.gql │ ├── user-login.gql │ ├── user-notification-settings.gql │ ├── user-phone-delete.gql │ ├── user-phone-registration-initiate.gql │ ├── user-phone-registration-validate.gql │ ├── user-totp-delete.gql │ ├── user-totp-registration-initiate.gql │ ├── user-totp-registration-validate.gql │ ├── user-update-language.gql │ ├── user-update-username.gql │ ├── username-available.gql │ └── wallets-for-account.gql │ └── schemas │ ├── admin │ └── schema.graphql │ └── public │ └── schema.graphql ├── docs ├── dev.md └── e2e-testing.md ├── e2e ├── 01-phone-flow-and-resets.e2e.spec.ts ├── 02-email-flow.e2e.spec.ts ├── 03-intraledger-flow.e2e.spec.ts ├── 04-payment-send-flow.e2e.spec.ts ├── 05-payments-receive-flow.e2e.spec.ts ├── 06-other-tests.e2e.spec.ts ├── config │ ├── browserstack.conf.js │ ├── single-test-runner.js │ ├── story-book.wdio.conf.js │ └── wdio.conf.js ├── detox │ ├── 01-auth.test.ts │ ├── 02-conversion.test.ts │ ├── 03-payment-send.test.ts │ ├── 04-payment-receive.test.ts │ ├── jest.config.js │ └── utils │ │ ├── commandline.ts │ │ ├── common-flows.ts │ │ ├── config.ts │ │ └── controls.ts ├── helpers.ts ├── story-book │ └── open-all-screens.e2e.spec.ts └── utils │ ├── config.ts │ ├── controls.ts │ ├── email.sh │ ├── email.ts │ ├── graphql.ts │ ├── index.ts │ └── use-cases.ts ├── flake.lock ├── flake.nix ├── index.js ├── ios ├── .xcode.env ├── GaloyApp-Bridging-Header.h ├── GaloyApp.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── GaloyApp.xcscheme ├── GaloyApp.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── GaloyApp │ ├── AppDelegate.h │ ├── AppDelegate.mm │ ├── BootSplash.storyboard │ ├── GaloyApp.entitlements │ ├── GaloyAppDebug.entitlements │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 50.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ ├── BootSplashLogo.imageset │ │ │ ├── Contents.json │ │ │ ├── bootsplash_logo-ldf3jg.png │ │ │ ├── bootsplash_logo-ldf3jg@2x.png │ │ │ └── bootsplash_logo-ldf3jg@3x.png │ │ └── Contents.json │ ├── Info.plist │ ├── LaunchScreen.storyboard │ ├── PrivacyInfo.xcprivacy │ └── main.m ├── Gemfile ├── Gemfile.lock ├── GoogleService-Info.plist ├── Podfile ├── Podfile.lock ├── PrivacyInfo.xcprivacy ├── fastlane │ ├── Appfile │ ├── Fastfile │ ├── Matchfile │ └── Pluginfile └── link-assets-manifest.json ├── jest.config.js ├── logs ├── metro.config.js ├── package.json ├── patches ├── @galoymoney+react-native-geetest-module+0.1.5.patch ├── react-native+0.73.7.patch ├── react-native+0.74.2.patch ├── react-native-fingerprint-scanner+6.0.0.patch └── react-native-vector-icons+10.0.3.patch ├── prettier.config.js ├── react-native.config.js ├── supergraph-config.yaml ├── supergraph.graphql ├── supergraph.sh ├── symbolicate-trace.sh ├── transifex.yml ├── tsconfig.jest.json ├── tsconfig.json ├── typos.toml ├── utils ├── .gitignore ├── countryInfo.json ├── create-gql.ts ├── export-language.mjs ├── find-unused-ll-keys.js ├── parseCSV.ts └── png-creation.js └── yarn.lock /.bundle/config: -------------------------------------------------------------------------------- 1 | BUNDLE_PATH: "vendor/bundle" 2 | BUNDLE_FORCE_RUBY_PLATFORM: 1 -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Windows files 2 | [*.bat] 3 | end_of_line = crlf 4 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | if [ -f ".env.local" ]; then 2 | dotenv .env.local 3 | fi 4 | 5 | use flake . 6 | 7 | # One time installs 8 | # xcodes install 15.2 9 | # xcodes runtimes install "iOS 17.0" 10 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | *.bat text eol=crlf -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 11 | 12 | **Describe the solution you'd like** 13 | A clear and concise description of what you want to happen. 14 | 15 | **Describe alternatives you've considered** 16 | A clear and concise description of any alternative solutions or features you've considered. 17 | 18 | **Additional context** 19 | Add any other context or screenshots about the feature request here. 20 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | # To get started with Dependabot version updates, you'll need to specify which 5 | # package ecosystems to update and where the package manifests are located. 6 | # Please see the documentation for all configuration options: 7 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 8 | 9 | version: 2 10 | updates: 11 | - package-ecosystem: "npm" # See documentation for possible values 12 | directory: "/" # Location of package manifests 13 | schedule: 14 | interval: "daily" 15 | -------------------------------------------------------------------------------- /.github/workflows/audit.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | name: Audit 5 | 6 | on: 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | audit: 12 | name: Audit 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 20 19 | cache: "yarn" 20 | - run: yarn install --frozen-lockfile 21 | - name: Run audit 22 | run: make audit 23 | -------------------------------------------------------------------------------- /.github/workflows/check-code.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | name: Check Code 5 | 6 | on: 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | check-code: 12 | name: Check Code 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 20 19 | cache: "yarn" 20 | - run: yarn install --frozen-lockfile 21 | - name: Run check code 22 | run: make check-code 23 | -------------------------------------------------------------------------------- /.github/workflows/conventional.yaml: -------------------------------------------------------------------------------- 1 | name: "Conventional commits" 2 | on: 3 | pull_request: 4 | branches: [main] 5 | jobs: 6 | conventional: 7 | name: "Conventional commits" 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Conventional PR 11 | uses: Namchee/conventional-pr@v0.12.1 12 | with: 13 | access_token: ${{ secrets.GITHUB_TOKEN }} 14 | message: this PR needs to be updated to follow conventional commits message 15 | body: false 16 | issue: false 17 | -------------------------------------------------------------------------------- /.github/workflows/spelling.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | name: Spelling 5 | 6 | on: 7 | pull_request: 8 | branches: [ main ] 9 | 10 | jobs: 11 | spelling: 12 | name: Spell Check with Typos 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout Actions Repository 16 | uses: actions/checkout@v3 17 | - name: Spell Check Repo 18 | uses: crate-ci/typos@master 19 | with: 20 | config: typos.toml 21 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: "Test" 2 | on: 3 | pull_request: 4 | branches: [main] 5 | jobs: 6 | check-code: 7 | name: Tests 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v3 11 | - uses: actions/setup-node@v3 12 | with: 13 | node-version: 20 14 | - run: yarn install 15 | - uses: nick-fields/retry@v3 16 | with: 17 | timeout_minutes: 10 18 | max_attempts: 3 19 | command: yarn test 20 | -------------------------------------------------------------------------------- /.github/workflows/vendor/nodejs-audit.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | name: Audit 5 | 6 | on: 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | audit: 12 | name: Audit 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 20 19 | cache: "yarn" 20 | - run: yarn install --frozen-lockfile 21 | - name: Run audit 22 | run: make audit 23 | -------------------------------------------------------------------------------- /.github/workflows/vendor/nodejs-check-code.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | name: Check Code 5 | 6 | on: 7 | pull_request: 8 | branches: [main] 9 | 10 | jobs: 11 | check-code: 12 | name: Check Code 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 20 19 | cache: "yarn" 20 | - run: yarn install --frozen-lockfile 21 | - name: Run check code 22 | run: make check-code 23 | -------------------------------------------------------------------------------- /.github/workflows/vendor/spelling.yml: -------------------------------------------------------------------------------- 1 | #! Auto synced from Shared CI Resources repository 2 | #! Don't change this file, instead change it in github.com/GaloyMoney/concourse-shared 3 | 4 | name: Spelling 5 | 6 | on: 7 | pull_request: 8 | branches: [ main ] 9 | 10 | jobs: 11 | spelling: 12 | name: Spell Check with Typos 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout Actions Repository 16 | uses: actions/checkout@v3 17 | - name: Spell Check Repo 18 | uses: crate-ci/typos@master 19 | with: 20 | config: typos.toml 21 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | ios 3 | android 4 | .vscode 5 | ignite/ignite.json 6 | package.json 7 | __generated__ 8 | app/components/price-graph/data-tst.ts 9 | .yalc 10 | app/i18n/**/* -------------------------------------------------------------------------------- /.readme/galoy-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/.readme/galoy-logo.png -------------------------------------------------------------------------------- /.readme/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/.readme/screenshot-1.png -------------------------------------------------------------------------------- /.readme/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/.readme/screenshot-2.png -------------------------------------------------------------------------------- /.readme/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/.readme/screenshot-3.png -------------------------------------------------------------------------------- /.readme/screenshot-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/.readme/screenshot-4.png -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 3.4.2 2 | -------------------------------------------------------------------------------- /.storybook/index.ts: -------------------------------------------------------------------------------- 1 | // this is the native storybook entry point 2 | // import { StorybookUI } from "./config" 3 | 4 | export * from "./storybook" 5 | -------------------------------------------------------------------------------- /.storybook/views/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./story-screen" 2 | export * from "./story" 3 | export * from "./use-case" 4 | -------------------------------------------------------------------------------- /.storybook/views/story.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { View, ViewStyle } from "react-native" 3 | import { ScrollView } from "react-native-gesture-handler" 4 | 5 | const ROOT: ViewStyle = { flex: 1 } 6 | 7 | export const Story: React.FC = (props) => ( 8 | 9 | {props.children} 10 | 11 | ) 12 | -------------------------------------------------------------------------------- /.storybook_server/main.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | stories: ['../app/**/*.stories.?(ts|tsx|js|jsx)'], 3 | logLevel: 'debug', 4 | env: () => ({}), 5 | addons: ['@storybook/addon-essentials'] 6 | } -------------------------------------------------------------------------------- /.svgrrc: -------------------------------------------------------------------------------- 1 | { 2 | "replaceAttrValues": { 3 | "black": "currentColor" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.typesafe-i18n.json: -------------------------------------------------------------------------------- 1 | { 2 | "adapter": "react", 3 | "$schema": "https://unpkg.com/typesafe-i18n@5.26.2/schema/typesafe-i18n.json", 4 | "outputPath": "./app/i18n" 5 | } -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /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 | # Cocoapods 1.15 introduced a bug which break the build. We will remove the upper 7 | # bound in the template on Cocoapods with next React Native release. 8 | gem 'cocoapods', '>= 1.13' 9 | gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' 10 | -------------------------------------------------------------------------------- /__mocks__/@react-native-async-storage/async-storage.js: -------------------------------------------------------------------------------- 1 | export { AsyncStorageMock as default } from "@react-native-async-storage/async-storage/jest/async-storage-mock" 2 | -------------------------------------------------------------------------------- /__mocks__/@react-native-clipboard/clipboard.js: -------------------------------------------------------------------------------- 1 | const mockedClipboard = { 2 | setString: jest.fn(), 3 | getString: jest.fn().mockResolvedValue(""), 4 | } 5 | 6 | export default mockedClipboard 7 | -------------------------------------------------------------------------------- /__mocks__/@react-native-firebase/analytics.js: -------------------------------------------------------------------------------- 1 | const logEvent = jest.fn() 2 | 3 | export default () => ({ 4 | logEvent, 5 | }) 6 | -------------------------------------------------------------------------------- /__mocks__/@react-native-firebase/crashlytics.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | export default () => ({ 4 | log: (message) => {}, 5 | recordError: (err) => {}, 6 | }) 7 | -------------------------------------------------------------------------------- /__mocks__/@react-native-firebase/messaging.js: -------------------------------------------------------------------------------- 1 | const messaging = { 2 | requestPermission: jest.fn(() => Promise.resolve()), 3 | getToken: jest.fn(() => Promise.resolve("mocked_token")), 4 | onMessage: jest.fn(() => () => {}), 5 | onNotificationOpenedApp: jest.fn(() => () => {}), 6 | setBackgroundMessageHandler: jest.fn(), 7 | } 8 | 9 | export default messaging 10 | -------------------------------------------------------------------------------- /__mocks__/react-native-device-info.js: -------------------------------------------------------------------------------- 1 | const getReadableVersion = jest.fn(() => "1.0.0") 2 | const getBuildNumber = jest.fn(() => "1234") 3 | 4 | export { getReadableVersion, getBuildNumber } 5 | 6 | export default { 7 | getReadableVersion, 8 | getBuildNumber, 9 | } 10 | -------------------------------------------------------------------------------- /__mocks__/react-native-keyboard-aware-scroll-view.js: -------------------------------------------------------------------------------- 1 | const KeyboardAwareScrollView = () => null 2 | 3 | export { KeyboardAwareScrollView } 4 | -------------------------------------------------------------------------------- /__mocks__/react-native-qrcode-svg.js: -------------------------------------------------------------------------------- 1 | export default function QRCode() { 2 | return null 3 | } 4 | -------------------------------------------------------------------------------- /__mocks__/react-native-rate.js: -------------------------------------------------------------------------------- 1 | export const AndroidMarket = { 2 | Google: "google", 3 | Amazon: "amazon", 4 | Other: "other", 5 | } 6 | 7 | export const IOSMarket = { 8 | AppStore: "appStore", 9 | Other: "other", 10 | } 11 | 12 | export const Package = { 13 | Types: { 14 | IOS: "ios", 15 | Android: "android", 16 | Both: "both", 17 | }, 18 | } 19 | 20 | export default { 21 | rate: jest.fn(), 22 | } 23 | -------------------------------------------------------------------------------- /__mocks__/react-native-share.js: -------------------------------------------------------------------------------- 1 | export default { 2 | open: jest.fn(), 3 | shareSingle: jest.fn(), 4 | isPackageInstalled: jest.fn(), 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/payment-destination/helpers.ts: -------------------------------------------------------------------------------- 1 | import { WalletCurrency } from "@app/graphql/generated" 2 | 3 | export const defaultPaymentDetailParams = { 4 | convertMoneyAmount: jest.fn(), 5 | sendingWalletDescriptor: { 6 | currency: WalletCurrency.Btc, 7 | id: "testid", 8 | }, 9 | } 10 | -------------------------------------------------------------------------------- /__tests__/screens/receive.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import ReceiveScreen from "@app/screens/receive-bitcoin-screen/receive-screen" 4 | import { act, render } from "@testing-library/react-native" 5 | 6 | import { ContextForScreen } from "./helper" 7 | 8 | jest.mock("react-native-nfc-manager", () => { 9 | return { 10 | NfcManager: { 11 | start: jest.fn(), 12 | stop: jest.fn(), 13 | }, 14 | isSupported: jest.fn(), 15 | } 16 | }) 17 | 18 | it("Receive", async () => { 19 | render( 20 | 21 | 22 | , 23 | ) 24 | await act(async () => {}) 25 | await act(async () => {}) 26 | }) 27 | -------------------------------------------------------------------------------- /__tests__/screens/send-destination.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import SendBitcoinDestinationScreen from "@app/screens/send-bitcoin-screen/send-bitcoin-destination-screen" 4 | import { act, render } from "@testing-library/react-native" 5 | 6 | import { ContextForScreen } from "./helper" 7 | 8 | const sendBitcoinDestination = { 9 | name: "sendBitcoinDestination", 10 | key: "sendBitcoinDestination", 11 | params: { 12 | payment: "", 13 | username: "", 14 | }, 15 | } as const 16 | 17 | it("SendScreen Destination", async () => { 18 | render( 19 | 20 | 21 | , 22 | ) 23 | await act(async () => {}) 24 | }) 25 | -------------------------------------------------------------------------------- /__tests__/utils/phone-number-parser.test.ts: -------------------------------------------------------------------------------- 1 | import { parsePhoneNumberFromString } from "libphonenumber-js/mobile" 2 | 3 | describe("parsePhoneNumber", () => { 4 | it("correctly handles extra 0", () => { 5 | const phoneWithLeadingZero = parsePhoneNumberFromString("07400123456", "GB") 6 | const phoneWithoutLeadingZero = parsePhoneNumberFromString("7400123456", "GB") 7 | expect(phoneWithLeadingZero?.isValid()).toBe(true) 8 | expect(phoneWithoutLeadingZero?.isValid()).toBe(true) 9 | expect(phoneWithLeadingZero?.number).toBe(phoneWithoutLeadingZero?.number) 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /android/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | 5 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 6 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 7 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/DMSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/DMSans-Bold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Black.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-BlackItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Bold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-BoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-ExtraBold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-ExtraLight.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Italic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Light.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-LightItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Medium.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-MediumItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-SemiBold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-Thin.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Montserrat-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/Montserrat-ThinItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SourceSansPro-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/SourceSansPro-Bold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SourceSansPro-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/SourceSansPro-BoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SourceSansPro-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/SourceSansPro-Italic.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SourceSansPro-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/SourceSansPro-SemiBold.ttf -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/SourceSansPro-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/assets/fonts/SourceSansPro-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/bootsplash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/drawable-hdpi/bootsplash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/bootsplash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/drawable-mdpi/bootsplash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/bitcoin_price_widget.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/drawable-v21/bitcoin_price_widget.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/bitcoin_price_widget_chart_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/drawable-xhdpi/bootsplash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/drawable-xxhdpi/bootsplash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/drawable-xxxhdpi/bootsplash_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #000000 3 | 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #000000 3 | #ffffff 4 | #FC5805 5 | 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #000000 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Blink 3 | Bitcoin Price 4 | Add bitcoin price widget 5 | USD/BTC price as reported by Blink Servers 6 | Bitcoin Price USD/BTC Chart 7 | BTC/USD 8 | Blink Logo 9 | Need internet connection to show BTC/USD price data 10 | Loading… 11 | 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/bitcoin_price_widget_info.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/network_security_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10.0.2.2 5 | localhost 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | json_key_file("galoyapp-2e25e160d4ba.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one 2 | package_name("com.galoyapp") # e.g. com.krausefx.app 3 | -------------------------------------------------------------------------------- /android/fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | # 3 | # Ensure this file is checked in to source control! 4 | 5 | gem 'fastlane-plugin-increment_version_code' 6 | gem 'fastlane-plugin-huawei_appgallery_connect' 7 | gem 'fastlane-plugin-browserstack' 8 | gem 'fastlane-plugin-versioning_android' 9 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'GaloyApp' 2 | include ':react-native-vector-icons' 3 | project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') 4 | include ':react-native-secure-key-store' 5 | project(':react-native-secure-key-store').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-secure-key-store/android') 6 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 7 | include ':app' 8 | includeBuild('../node_modules/@react-native/gradle-plugin') 9 | -------------------------------------------------------------------------------- /apollo.client.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | client: { 3 | includes: ["app/**/*.{ts,tsx,js,jsx,graphql}"], 4 | service: { 5 | name: `galoy`, 6 | url: `http://localhost:4000/graphql`, 7 | }, 8 | }, 9 | } 10 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GaloyApp", 3 | "displayName": "GaloyApp" 4 | } 5 | -------------------------------------------------------------------------------- /app/assets/fonts/DMSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/DMSans-Bold.ttf -------------------------------------------------------------------------------- /app/assets/fonts/SourceSansPro-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/SourceSansPro-Bold.ttf -------------------------------------------------------------------------------- /app/assets/fonts/SourceSansPro-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/SourceSansPro-BoldItalic.ttf -------------------------------------------------------------------------------- /app/assets/fonts/SourceSansPro-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/SourceSansPro-Italic.ttf -------------------------------------------------------------------------------- /app/assets/fonts/SourceSansPro-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/SourceSansPro-Regular.ttf -------------------------------------------------------------------------------- /app/assets/fonts/SourceSansPro-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/SourceSansPro-SemiBold.ttf -------------------------------------------------------------------------------- /app/assets/fonts/SourceSansPro-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/fonts/SourceSansPro-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /app/assets/icons-redesign/arrow-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/bell.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/caret-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/caret-left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/caret-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/caret-up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/check-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/close-cross-with-background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/copy-paste.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/eye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/globe.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/graph.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/lightning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/magnifying-glass.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/map.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/payment-error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/receive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/send.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/transfer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/video.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/warning-with-background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/assets/icons-redesign/warning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/assets/icons/cancel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/assets/icons/center-location-android.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons/chevron.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/assets/icons/downarrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/assets/icons/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/assets/icons/lightning-sats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/icons/lightning-sats.png -------------------------------------------------------------------------------- /app/assets/icons/lightning-usd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/icons/lightning-usd.png -------------------------------------------------------------------------------- /app/assets/icons/lightning.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/assets/icons/nfc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/assets/icons/onchain-btc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/icons/onchain-btc.png -------------------------------------------------------------------------------- /app/assets/icons/refresh.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/assets/icons/sat.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/assets/images/stable-sats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/images/stable-sats.png -------------------------------------------------------------------------------- /app/assets/logo/blink-logo-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/assets/logo/blink-logo-icon.png -------------------------------------------------------------------------------- /app/components/amount-input-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./amount-input-screen" 2 | -------------------------------------------------------------------------------- /app/components/amount-input/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./amount-input" 2 | export * from "./amount-input-modal" 3 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-button-field/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-button-field" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-currency-bubble/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-currency-bubble" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-error-box/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-error-box" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-icon-button/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-icon-button" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-icon/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-icon" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-info/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-info" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-input/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-input" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-primary-button/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-primary-button" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-secondary-button/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-secondary-button" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-slider-button/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-slider-button" 2 | -------------------------------------------------------------------------------- /app/components/atomic/galoy-tertiary-button/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-tertiary-button" 2 | -------------------------------------------------------------------------------- /app/components/balance-header/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./balance-header" 2 | -------------------------------------------------------------------------------- /app/components/button-group/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./button-group" 2 | -------------------------------------------------------------------------------- /app/components/circle/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./circle" 2 | -------------------------------------------------------------------------------- /app/components/close-cross/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./close-cross" 2 | -------------------------------------------------------------------------------- /app/components/code-input/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./code-input" 2 | -------------------------------------------------------------------------------- /app/components/contact-modal/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./contact-modal" 2 | -------------------------------------------------------------------------------- /app/components/currency-keyboard/currency-keyboard.stories.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { Story, UseCase } from "../../../.storybook/views" 4 | import { CurrencyKeyboard } from "./currency-keyboard" 5 | 6 | export default { 7 | title: "Currency Keyboard", 8 | component: CurrencyKeyboard, 9 | } 10 | 11 | export const Default = () => ( 12 | 13 | 14 | console.log(pressed)} /> 15 | 16 | 17 | ) 18 | -------------------------------------------------------------------------------- /app/components/currency-keyboard/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./currency-keyboard" 2 | -------------------------------------------------------------------------------- /app/components/currency-tag/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./currency-tag" 2 | -------------------------------------------------------------------------------- /app/components/custom-icon/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./custom-icon" 2 | -------------------------------------------------------------------------------- /app/components/custom-modal/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./custom-modal" 2 | -------------------------------------------------------------------------------- /app/components/galoy-toast/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-toast" 2 | -------------------------------------------------------------------------------- /app/components/icon-transactions/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./icon-transactions" 2 | -------------------------------------------------------------------------------- /app/components/input-payment/input-payment.types.d.ts: -------------------------------------------------------------------------------- 1 | type CurrencyType = "USD" | "BTC" | "display" 2 | -------------------------------------------------------------------------------- /app/components/introducing-circles-modal/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./introducing-circles-modal" 2 | -------------------------------------------------------------------------------- /app/components/invite-modal/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./invite-modal" 2 | -------------------------------------------------------------------------------- /app/components/june-challenge/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./modal" 2 | export * from "./card" 3 | -------------------------------------------------------------------------------- /app/components/may-challenge/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./modal" 2 | export * from "./card" 3 | -------------------------------------------------------------------------------- /app/components/menu-select/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./menu-select" 2 | export * from "./menu-select-item" 3 | -------------------------------------------------------------------------------- /app/components/menu-select/menu-select-item.tsx: -------------------------------------------------------------------------------- 1 | // This is a dummy item for better DX while writing the select component 2 | // See ./item.ts for the correct item 3 | import React from "react" 4 | 5 | import { ListItemProps } from "@rneui/base" 6 | 7 | export type MenuSelectItemProps = { 8 | children: React.ReactNode 9 | value: string 10 | testPropId?: string 11 | } & ListItemProps 12 | 13 | export const MenuSelectItem: React.FC = () => { 14 | return <> 15 | } 16 | -------------------------------------------------------------------------------- /app/components/modal-nfc/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./modal-nfc" 2 | -------------------------------------------------------------------------------- /app/components/mountain-header/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./mountain-header" 2 | -------------------------------------------------------------------------------- /app/components/note-input/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./note-input" 2 | -------------------------------------------------------------------------------- /app/components/pagination/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./pagination-item" 2 | -------------------------------------------------------------------------------- /app/components/payment-destination-display/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./payment-destination-display" 2 | -------------------------------------------------------------------------------- /app/components/pressable-card/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./pressable-card" 2 | -------------------------------------------------------------------------------- /app/components/price-history/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./price-history" 2 | -------------------------------------------------------------------------------- /app/components/push-notification/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./push-notification" 2 | -------------------------------------------------------------------------------- /app/components/screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./screen" 2 | -------------------------------------------------------------------------------- /app/components/set-default-account-modal/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./set-default-account-modal" 2 | -------------------------------------------------------------------------------- /app/components/set-lightning-address-modal/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./set-lightning-address-modal" 2 | -------------------------------------------------------------------------------- /app/components/stablesats-modal/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./stablesats-modal" 2 | -------------------------------------------------------------------------------- /app/components/success-action/field-with-copy.props.tsx: -------------------------------------------------------------------------------- 1 | export type FielWithCopyProps = { 2 | text: string 3 | copiedMessage: string 4 | accessibilityLabel: string 5 | } 6 | -------------------------------------------------------------------------------- /app/components/success-action/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./success-action" 2 | -------------------------------------------------------------------------------- /app/components/success-action/success-action.props.tsx: -------------------------------------------------------------------------------- 1 | import { LNURLPaySuccessAction } from "lnurl-pay/dist/types/types" 2 | 3 | export type SuccessActionComponentProps = { 4 | successAction?: LNURLPaySuccessAction 5 | preimage?: string 6 | } 7 | 8 | export enum SuccessActionTag { 9 | AES = "aes", 10 | MESSAGE = "message", 11 | URL = "url", 12 | } 13 | -------------------------------------------------------------------------------- /app/components/success-animation/config.ts: -------------------------------------------------------------------------------- 1 | export const ANIMATION_DURATION = 3000 // duration in ms 2 | export const ANIMATION_DELAY = 50 // delay in ms 3 | -------------------------------------------------------------------------------- /app/components/success-animation/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./success-icon-animation" 2 | export * from "./success-text-animation" 3 | -------------------------------------------------------------------------------- /app/components/success-animation/success-icon-animation.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import Animated, { PinwheelIn } from "react-native-reanimated" 3 | 4 | import { ANIMATION_DELAY, ANIMATION_DURATION } from "./config" 5 | 6 | export const SuccessIconAnimation = ({ children }: { children: React.ReactNode }) => { 7 | return ( 8 | 13 | {children} 14 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /app/components/success-animation/success-text-animation.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import Animated, { ZoomInEasyUp } from "react-native-reanimated" 3 | 4 | import { ANIMATION_DELAY, ANIMATION_DURATION } from "./config" 5 | 6 | export const CompletedTextAnimation = ({ children }: { children: React.ReactNode }) => { 7 | return ( 8 | 13 | {children} 14 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /app/components/telegram-login/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./telegram-button" 2 | -------------------------------------------------------------------------------- /app/components/totp-export/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./totp-qr" 2 | export * from "./totp-copy" 3 | -------------------------------------------------------------------------------- /app/components/totp-export/totp-copy.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import { MockedProvider } from "@apollo/client/testing" 4 | 5 | import { StoryScreen } from "../../../.storybook/views" 6 | import { CopySecretComponent } from "./totp-copy" 7 | 8 | export default { 9 | title: "Totp Clipboard", 10 | decorators: [ 11 | (Story) => ( 12 | 13 | {Story()} 14 | 15 | ), 16 | ], 17 | } 18 | 19 | export const Default = () => ( 20 | 21 | ) 22 | -------------------------------------------------------------------------------- /app/components/totp-export/totp-qr.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import { MockedProvider } from "@apollo/client/testing" 4 | 5 | import { StoryScreen } from "../../../.storybook/views" 6 | import { QrCodeComponent } from "./totp-qr" 7 | 8 | export default { 9 | title: "Totp QR", 10 | decorators: [ 11 | (Story) => ( 12 | 13 | {Story()} 14 | 15 | ), 16 | ], 17 | } 18 | 19 | export const Default = () => ( 20 | 21 | ) 22 | -------------------------------------------------------------------------------- /app/components/transaction-date/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./transaction-date" 2 | -------------------------------------------------------------------------------- /app/components/transaction-item/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./transaction-item" 2 | -------------------------------------------------------------------------------- /app/components/upgrade-account-modal/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./upgrade-account-modal" 2 | -------------------------------------------------------------------------------- /app/components/version/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./version" 2 | -------------------------------------------------------------------------------- /app/components/wallet-overview/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./wallet-overview" 2 | -------------------------------------------------------------------------------- /app/components/wallet-summary/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./wallet-summary" 2 | -------------------------------------------------------------------------------- /app/config/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./galoy-instances" 2 | export * from "./appinfo" 3 | 4 | export const SCHEMA_VERSION_KEY = "schema_version_key" 5 | -------------------------------------------------------------------------------- /app/graphql/error-code.ts: -------------------------------------------------------------------------------- 1 | export enum NetworkErrorCode { 2 | InvalidAuthentication = "INVALID_AUTHENTICATION", 3 | } 4 | -------------------------------------------------------------------------------- /app/graphql/hide-amount-component.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { PropsWithChildren, useState } from "react" 3 | 4 | import { useHideBalanceQuery } from "@app/graphql/generated" 5 | 6 | import { HideAmountContextProvider } from "./hide-amount-context" 7 | 8 | export const HideAmountContainer: React.FC = ({ children }) => { 9 | const { data: { hideBalance } = { hideBalance: false } } = useHideBalanceQuery() 10 | const [hideAmount, setHideAmount] = useState(hideBalance) 11 | 12 | const switchMemoryHideAmount = () => { 13 | setHideAmount(!hideAmount) 14 | } 15 | 16 | return ( 17 | 18 | {children} 19 | 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/graphql/hide-amount-context.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from "react" 2 | 3 | const HideAmountContext = createContext<{ 4 | hideAmount: boolean 5 | switchMemoryHideAmount: () => void 6 | }>({ 7 | hideAmount: false, 8 | switchMemoryHideAmount: () => {}, 9 | }) 10 | 11 | export const HideAmountContextProvider = HideAmountContext.Provider 12 | 13 | export const useHideAmount = () => useContext(HideAmountContext) 14 | -------------------------------------------------------------------------------- /app/graphql/is-authed-context.ts: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from "react" 2 | 3 | const IsAuthed = createContext(false) 4 | 5 | export const IsAuthedContextProvider = IsAuthed.Provider 6 | 7 | export const useIsAuthed = () => useContext(IsAuthed) 8 | -------------------------------------------------------------------------------- /app/graphql/ln-update-context.ts: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from "react" 2 | 3 | const LnUpdateHashPaid = createContext("") 4 | 5 | export const LnUpdateHashPaidProvider = LnUpdateHashPaid.Provider 6 | 7 | export const useLnUpdateHashPaid = () => useContext(LnUpdateHashPaid) 8 | -------------------------------------------------------------------------------- /app/graphql/messaging.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react" 2 | 3 | import { useApolloClient } from "@apollo/client" 4 | import messaging from "@react-native-firebase/messaging" 5 | 6 | import { HomeAuthedDocument } from "./generated" 7 | 8 | // refetch when we receive an OS notification 9 | export const MessagingContainer = () => { 10 | const client = useApolloClient() 11 | 12 | useEffect(() => { 13 | const unsubscribe = messaging().onMessage(async (_remoteMessage) => { 14 | client.refetchQueries({ include: [HomeAuthedDocument] }) 15 | }) 16 | 17 | return unsubscribe 18 | }, [client]) 19 | 20 | return null 21 | } 22 | -------------------------------------------------------------------------------- /app/graphql/network-error-context.ts: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from "react" 2 | 3 | import { NetworkError } from "@apollo/client/errors" 4 | 5 | type NetworkErrorState = { 6 | networkError: NetworkError | undefined 7 | clearNetworkError: () => void 8 | } 9 | 10 | const NetworkErrorContext = createContext({ 11 | networkError: undefined, 12 | clearNetworkError: () => {}, 13 | }) 14 | 15 | export const NetworkErrorContextProvider = NetworkErrorContext.Provider 16 | 17 | export const useNetworkError = () => useContext(NetworkErrorContext) 18 | -------------------------------------------------------------------------------- /app/graphql/utils.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLError } from "graphql" 2 | 3 | import { ApolloError } from "@apollo/client" 4 | 5 | import { GraphQlApplicationError } from "./generated" 6 | 7 | type ErrorInput = 8 | | readonly GraphQLError[] 9 | | readonly GraphQlApplicationError[] 10 | | ApolloError 11 | 12 | export const getErrorMessages = (error: ErrorInput): string => { 13 | if (Array.isArray(error)) { 14 | return error.map((err) => err.message).join(", ") 15 | } 16 | if (error instanceof ApolloError) { 17 | if (error.graphQLErrors && error.graphQLErrors.length > 0) { 18 | return error.graphQLErrors.map(({ message }) => message).join("\n ") 19 | } 20 | return error.message 21 | } 22 | return "Something went wrong" 23 | } 24 | -------------------------------------------------------------------------------- /app/hooks/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./use-geetest-captcha" 2 | export * from "./use-save-session-profile" 3 | export * from "./use-price-conversion" 4 | export * from "./use-app-config" 5 | -------------------------------------------------------------------------------- /app/i18n/af/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/af.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/ar/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from "../en" 3 | import rawTranslated from "../raw-i18n/translations/ar.json" 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/ca/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/ca.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/cs/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/cs.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/da/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/da.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/de/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/de.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/el/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/el.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/es/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/es.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/formatters.ts: -------------------------------------------------------------------------------- 1 | import type { FormattersInitializer } from "typesafe-i18n" 2 | import type { Locales, Formatters } from "./i18n-types" 3 | 4 | export const initFormatters: FormattersInitializer = ( 5 | _locale: Locales, 6 | ) => { 7 | const formatters: Formatters = { 8 | sats: (value: unknown): unknown => { 9 | if (!value) return "0 sats" 10 | 11 | const amount = Number(value) 12 | if (isNaN(amount)) return "0 sats" 13 | if (amount === 1) return "1 sat" 14 | 15 | return `${amount} sats` 16 | }, 17 | } 18 | return formatters 19 | } 20 | -------------------------------------------------------------------------------- /app/i18n/fr/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/fr.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/hr/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/hr.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/hu/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/hu.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/hy/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/hy.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/it/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/it.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/ja/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/ja.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/lg/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/lg.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/ms/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from "../en" 3 | import rawTranslated from "../raw-i18n/translations/ms.json" 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/nl/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from "../en" 3 | import rawTranslated from "../raw-i18n/translations/nl.json" 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/pt/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/pt.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/qu/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/qu.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/ro/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/ro.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated 9 | -------------------------------------------------------------------------------- /app/i18n/sk/index.ts: -------------------------------------------------------------------------------- 1 | import merge from "lodash.merge" 2 | 3 | import en from "../en" 4 | import { Translation } from "../i18n-types" 5 | import rawTranslated from "../raw-i18n/translations/sk.json" 6 | 7 | const translated: Translation = merge({}, en as Translation, rawTranslated) 8 | 9 | export default translated 10 | -------------------------------------------------------------------------------- /app/i18n/sr/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/sr.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/sw/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/sw.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/th/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/th.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/tr/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/tr.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/i18n/vi/index.ts: -------------------------------------------------------------------------------- 1 | import { Translation } from "../i18n-types" 2 | import en from '../en' 3 | import rawTranslated from '../raw-i18n/translations/vi.json' 4 | import merge from "lodash.merge" 5 | 6 | const translated: Translation = merge({}, en as Translation, rawTranslated) 7 | 8 | export default translated -------------------------------------------------------------------------------- /app/rne-theme/timing.ts: -------------------------------------------------------------------------------- 1 | export const timing = { 2 | /** 3 | * The duration (ms) for quick animations. 4 | */ 5 | quick: 300, 6 | } 7 | -------------------------------------------------------------------------------- /app/screens/accept-t-and-c/accept-t-and-c.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import { StoryScreen } from "../../../.storybook/views" 4 | import { AcceptTermsAndConditionsScreen } from "./accept-t-and-c" 5 | 6 | export default { 7 | title: "AcceptTAndC", 8 | component: AcceptTermsAndConditionsScreen, 9 | decorators: [(Story) => {Story()}], 10 | } 11 | 12 | export const Default = () => 13 | -------------------------------------------------------------------------------- /app/screens/accept-t-and-c/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./accept-t-and-c" 2 | -------------------------------------------------------------------------------- /app/screens/authentication-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./authentication-screen" 2 | export * from "./authentication-check-screen" 3 | -------------------------------------------------------------------------------- /app/screens/conversion-flow/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./conversion-details-screen" 2 | export * from "./conversion-confirmation-screen" 3 | export * from "./conversion-success-screen" 4 | -------------------------------------------------------------------------------- /app/screens/developer-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./developer-screen" 2 | -------------------------------------------------------------------------------- /app/screens/earns-map-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./earns-map-screen" 2 | -------------------------------------------------------------------------------- /app/screens/earns-map-screen/text-block-large.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/screens/earns-map-screen/text-block-medium.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/screens/earns-map-screen/text-block-small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 8 | 9 | -------------------------------------------------------------------------------- /app/screens/earns-screen/PopcornLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blinkbitcoin/blink-mobile/5d7e0e79e56175ca026f2b9b6aff6585ec923344/app/screens/earns-screen/PopcornLogo.png -------------------------------------------------------------------------------- /app/screens/earns-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./earns-quiz" 2 | export * from "./earns-section" 3 | export * from "./earns-utils" 4 | -------------------------------------------------------------------------------- /app/screens/email-login-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./email-login-initiate" 2 | export * from "./email-login-validate" 3 | -------------------------------------------------------------------------------- /app/screens/email-registration-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./email-registration-initiate" 2 | export * from "./email-registration-validate" 3 | -------------------------------------------------------------------------------- /app/screens/error-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./error-screen" 2 | -------------------------------------------------------------------------------- /app/screens/full-onboarding-flow/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./full-onboarding-flow" 2 | -------------------------------------------------------------------------------- /app/screens/galoy-address-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./address-screen" 2 | -------------------------------------------------------------------------------- /app/screens/get-started-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./get-started-screen" 2 | -------------------------------------------------------------------------------- /app/screens/home-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./home-screen" 2 | -------------------------------------------------------------------------------- /app/screens/notification-history-screen/utils.ts: -------------------------------------------------------------------------------- 1 | export const timeAgo = (pastDate: number): string => { 2 | const now = new Date() 3 | const past = new Date(pastDate * 1000) 4 | const diff = Number(now) - Number(past) 5 | 6 | const seconds = Math.floor(diff / 1000) 7 | const minutes = Math.floor(seconds / 60) 8 | const hours = Math.floor(minutes / 60) 9 | const days = Math.floor(hours / 24) 10 | 11 | if (seconds < 60) { 12 | return `a few seconds ago` 13 | } else if (minutes < 60) { 14 | return `${minutes} minute${minutes > 1 ? "s" : ""} ago` 15 | } else if (hours < 24) { 16 | return `${hours} hour${hours > 1 ? "s" : ""} ago` 17 | } 18 | return `${days} day${days > 1 ? "s" : ""} ago` 19 | } 20 | -------------------------------------------------------------------------------- /app/screens/people-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./people" 2 | export * from "./contacts/contacts-detail" 3 | -------------------------------------------------------------------------------- /app/screens/people-screen/people.stories.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { MockedProvider } from "@apollo/client/testing" 4 | import { Meta } from "@storybook/react-native" 5 | 6 | import { StoryScreen } from "../../../.storybook/views" 7 | import { createCache } from "../../graphql/cache" 8 | import mocks from "../../graphql/mocks" 9 | import { PeopleScreen } from "./people" 10 | 11 | export default { 12 | title: "People Screen", 13 | component: PeopleScreen, 14 | decorators: [(Story) => {Story()}], 15 | } as Meta 16 | 17 | export const Empty = () => ( 18 | 19 | 20 | 21 | ) 22 | -------------------------------------------------------------------------------- /app/screens/people-screen/people.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { makeStyles } from "@rneui/themed" 4 | 5 | import { Screen } from "../../components/screen" 6 | import { CirclesCardPeopleHome } from "./circles/circles-card-people-home" 7 | import { InviteFriendsCard } from "./circles/invite-friends-card" 8 | import { ContactsCard } from "./contacts/contacts-card" 9 | 10 | export const PeopleScreen: React.FC = () => { 11 | const styles = useStyles() 12 | 13 | return ( 14 | 15 | 16 | 17 | 18 | 19 | ) 20 | } 21 | 22 | const useStyles = makeStyles(() => ({ 23 | screen: { 24 | padding: 20, 25 | }, 26 | })) 27 | -------------------------------------------------------------------------------- /app/screens/phone-auth-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./phone-login-validation" 2 | export * from "./phone-login-input" 3 | -------------------------------------------------------------------------------- /app/screens/price/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./price-history-screen" 2 | -------------------------------------------------------------------------------- /app/screens/receive-bitcoin-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./receive-screen" 2 | -------------------------------------------------------------------------------- /app/screens/redeem-lnurl-withdrawal-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./redeem-bitcoin-detail-screen" 2 | export * from "./redeem-bitcoin-result-screen" 3 | -------------------------------------------------------------------------------- /app/screens/send-bitcoin-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./use-fee" 2 | export * from "./scanning-qrcode-screen" 3 | -------------------------------------------------------------------------------- /app/screens/send-bitcoin-screen/payment-details/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./onchain" 2 | export * from "./intraledger" 3 | export * from "./lightning" 4 | export * from "./index.types" 5 | export * from "./utils" 6 | -------------------------------------------------------------------------------- /app/screens/send-bitcoin-screen/validation.ts: -------------------------------------------------------------------------------- 1 | import { Network } from "@app/graphql/generated" 2 | 3 | export const isDestinationLightningPayment = (destination: string): boolean => { 4 | return ( 5 | destination.toLocaleLowerCase().startsWith("lnbc") || 6 | destination.toLocaleLowerCase().startsWith("lntb") 7 | ) 8 | } 9 | 10 | export const isDestinationNetworkValid = ( 11 | destination: string, 12 | network: Network, 13 | ): boolean => { 14 | return ( 15 | (network === "signet" && destination.toLowerCase().startsWith("lntb")) || 16 | (network === "mainnet" && destination.toLowerCase().startsWith("lnbc")) 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /app/screens/settings-screen/account/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./account-screen" 2 | -------------------------------------------------------------------------------- /app/screens/settings-screen/account/login-methods-hook.ts: -------------------------------------------------------------------------------- 1 | import { useSettingsScreenQuery } from "@app/graphql/generated" 2 | 3 | export const useLoginMethods = () => { 4 | const { data } = useSettingsScreenQuery({ fetchPolicy: "cache-and-network" }) 5 | 6 | const email = data?.me?.email?.address || undefined 7 | const emailVerified = Boolean(email && data?.me?.email?.verified) 8 | 9 | const phone = data?.me?.phone 10 | const phoneVerified = Boolean(phone) 11 | 12 | const bothEmailAndPhoneVerified = phoneVerified && emailVerified 13 | 14 | return { 15 | loading: !data, // Data would auto refresh after network call 16 | email, 17 | emailVerified, 18 | phone, 19 | phoneVerified, 20 | bothEmailAndPhoneVerified, 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/screens/settings-screen/index.tsx: -------------------------------------------------------------------------------- 1 | export * from "./settings-screen" 2 | -------------------------------------------------------------------------------- /app/screens/settings-screen/settings/account-tx-limits.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { useI18nContext } from "@app/i18n/i18n-react" 3 | import { RootStackParamList } from "@app/navigation/stack-param-lists" 4 | import { useNavigation } from "@react-navigation/native" 5 | import { StackNavigationProp } from "@react-navigation/stack" 6 | 7 | import { SettingsRow } from "../row" 8 | 9 | export const TxLimits: React.FC = () => { 10 | const { LL } = useI18nContext() 11 | const { navigate } = useNavigation>() 12 | 13 | return ( 14 | navigate("transactionLimitsScreen")} 18 | /> 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /app/screens/settings-screen/settings/multi-account/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./switch-account" 2 | -------------------------------------------------------------------------------- /app/screens/settings-screen/settings/multi-account/index.types.d.ts: -------------------------------------------------------------------------------- 1 | type ProfileProps = { 2 | userId?: string | null 3 | identifier: string 4 | token: string 5 | selected: boolean 6 | avatarUrl?: string 7 | phone?: string | null 8 | email?: string | null 9 | accountId?: string 10 | } 11 | 12 | type FetchUsername = LazyQueryExecFunction> 13 | 14 | type TryFetchUserProps = { 15 | token: string 16 | fetchUsername: FetchUsername 17 | } 18 | -------------------------------------------------------------------------------- /app/screens/settings-screen/settings/multi-account/switch-account.stories.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { MockedProvider } from "@apollo/client/testing" 3 | 4 | import { createCache } from "../../../../graphql/cache" 5 | import { IsAuthedContextProvider } from "../../../../graphql/is-authed-context" 6 | import { SwitchAccount } from "./switch-account" 7 | 8 | export const SwitchAccountComponent = () => ( 9 | 10 | 11 | 12 | 13 | 14 | ) 15 | -------------------------------------------------------------------------------- /app/screens/settings-screen/settings/multi-account/utils.ts: -------------------------------------------------------------------------------- 1 | import KeyStoreWrapper from "@app/utils/storage/secureStorage" 2 | 3 | export const fetchProfiles = async (currentToken: string): Promise => { 4 | const storedProfiles = await KeyStoreWrapper.getSessionProfiles() 5 | 6 | return storedProfiles.map((profile) => ({ 7 | ...profile, 8 | selected: profile.token === currentToken, 9 | })) 10 | } 11 | -------------------------------------------------------------------------------- /app/screens/settings-screen/theme-screen.stories.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { MockedProvider } from "@apollo/client/testing" 4 | import { Meta } from "@storybook/react" 5 | 6 | import { StoryScreen } from "../../../.storybook/views" 7 | import { createCache } from "../../graphql/cache" 8 | import { ThemeScreen } from "./theme-screen" 9 | 10 | export default { 11 | title: "Theme Screen", 12 | component: ThemeScreen, 13 | decorators: [(Story) => {Story()}], 14 | } as Meta 15 | 16 | export const Default = () => ( 17 | 18 | 19 | 20 | ) 21 | -------------------------------------------------------------------------------- /app/screens/telegram-login-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./telegram-login-validate" 2 | -------------------------------------------------------------------------------- /app/screens/telegram-login-screen/telegram-login-validate.stories.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { RouteProp } from "@react-navigation/native" 4 | import { MockedProvider } from "@apollo/client/testing" 5 | import { createCache } from "../../graphql/cache" 6 | import { TelegramLoginScreen } from "./telegram-login-validate" 7 | 8 | import { PhoneValidationStackParamList } from "../../navigation/stack-param-lists" 9 | 10 | export const TelegramLogin = ({ 11 | mockRoute, 12 | }: { 13 | mockRoute: RouteProp 14 | }) => ( 15 | 16 | 17 | 18 | ) 19 | -------------------------------------------------------------------------------- /app/screens/totp-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./totp-registration-initiate" 2 | export * from "./totp-registration-validate" 3 | export * from "./totp-login-validate" 4 | -------------------------------------------------------------------------------- /app/screens/transaction-detail-screen/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./transaction-detail-screen" 2 | -------------------------------------------------------------------------------- /app/screens/transaction-history/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./transaction-history-screen" 2 | -------------------------------------------------------------------------------- /app/screens/transaction-history/index.types.d.ts: -------------------------------------------------------------------------------- 1 | import { TransactionFragment } from "../../graphql/generated" 2 | 3 | export type SectionTransactions = { 4 | data: TransactionFragment[] 5 | title: string 6 | } 7 | -------------------------------------------------------------------------------- /app/types/declaration.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 "*.png" { 9 | import { ImageSourcePropType } from "react-native" 10 | const content: ImageSourcePropType 11 | export default content 12 | } 13 | 14 | declare module "*.json" { 15 | const content: string 16 | export default content 17 | } 18 | -------------------------------------------------------------------------------- /app/types/wallets.ts: -------------------------------------------------------------------------------- 1 | import { WalletCurrency } from "@app/graphql/generated" 2 | 3 | export type WalletDescriptor = { 4 | id: string 5 | currency: T 6 | } 7 | 8 | export type UsdWalletDescriptor = WalletDescriptor<"USD"> 9 | export type BtcWalletDescriptor = WalletDescriptor<"BTC"> 10 | -------------------------------------------------------------------------------- /app/utils/enum.ts: -------------------------------------------------------------------------------- 1 | export const AuthenticationScreenPurpose = { 2 | Authenticate: "Authenticate", 3 | TurnOnAuthentication: "TurnOnAuthentication", 4 | } as const 5 | 6 | export const PinScreenPurpose = { 7 | AuthenticatePin: "AuthenticatePin", 8 | SetPin: "SetPin", 9 | } as const 10 | 11 | export type AuthenticationScreenPurpose = 12 | (typeof AuthenticationScreenPurpose)[keyof typeof AuthenticationScreenPurpose] 13 | export type PinScreenPurpose = (typeof PinScreenPurpose)[keyof typeof PinScreenPurpose] 14 | -------------------------------------------------------------------------------- /app/utils/external.ts: -------------------------------------------------------------------------------- 1 | import { Linking } from "react-native" 2 | 3 | export const openWhatsApp: (number: string, message: string) => Promise = async ( 4 | number: string, 5 | message: string, 6 | ) => 7 | Linking.openURL( 8 | `whatsapp://send?phone=${encodeURIComponent(number)}&text=${encodeURIComponent( 9 | message, 10 | )}`, 11 | ) 12 | -------------------------------------------------------------------------------- /app/utils/format-public-key.ts: -------------------------------------------------------------------------------- 1 | export const formatPublicKey = (rawKey: string): string => { 2 | try { 3 | return JSON.parse(`"${rawKey}"`).trim() 4 | } catch { 5 | return rawKey.replace(/\\n/g, "\n").replace(/\r/g, "").trim() 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/utils/logs.ts: -------------------------------------------------------------------------------- 1 | import { LogBox } from "react-native" 2 | import Config from "react-native-config" 3 | 4 | // Interferes in tests 5 | 6 | if (Config.IGNORE_LOGS) LogBox.ignoreLogs(["[GraphQL error]:"]) 7 | -------------------------------------------------------------------------------- /app/utils/pay-links.ts: -------------------------------------------------------------------------------- 1 | export const getPosUrl = (posUrl: string, address: string): string => { 2 | return `${posUrl}/${address}` 3 | } 4 | 5 | export const getPrintableQrCodeUrl = (posUrl: string, address: string): string => { 6 | return `${posUrl}/${address}/print` 7 | } 8 | 9 | export const getLightningAddress = ( 10 | lnAddressHostname: string, 11 | address: string, 12 | ): string => { 13 | return `${address}@${lnAddressHostname}` 14 | } 15 | -------------------------------------------------------------------------------- /app/utils/sleep.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A "modern" sleep statement. 3 | * 4 | * @param ms The number of milliseconds to wait. 5 | */ 6 | export const sleep = (ms: number): Promise => 7 | new Promise((resolve) => { 8 | setTimeout(resolve, ms) 9 | }) 10 | -------------------------------------------------------------------------------- /app/utils/storage/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./storage" 2 | -------------------------------------------------------------------------------- /app/utils/testProps.ts: -------------------------------------------------------------------------------- 1 | // This is used for E2E tests to apply id's to a 2 | // Usage: 3 | //