├── .changelog ├── .markdownlint.yml ├── 2173.internal.md ├── 2174.internal.md ├── 2177.internal.md ├── 2178.internal.md ├── 2179.internal.md ├── 2181.bugfix.md ├── 2182.bugfix.md ├── 2183.internal.md ├── 2184.internal.md ├── 2185.internal.md ├── 2186.internal.md ├── 2187.bugfix.md ├── README.md └── template.md.j2 ├── .codecov.yml ├── .editorconfig ├── .env ├── .env.local ├── .env.production ├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github ├── dump_validators.sh └── workflows │ ├── ci-build.yml │ ├── ci-lint.yml │ ├── ci-renovate.yml │ ├── ci-test.yml │ ├── cloudflare-pages.yml │ ├── dump-validators.yml │ ├── release.yml │ └── update-screenshots.yml ├── .gitignore ├── .gitlint ├── .markdownlint.yml ├── .npmrc ├── .parcelrc ├── .prettierignore ├── .prettierrc ├── .proxyrc.js ├── .terserrc ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── android ├── .gitignore ├── app │ ├── .gitignore │ ├── build.gradle │ ├── capacitor.build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── getcapacitor │ │ │ └── myapp │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── org │ │ │ │ └── oasisprotocol │ │ │ │ └── wallet │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── drawable-land-hdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-ldpi │ │ │ └── splash.png │ │ │ ├── drawable-land-mdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-night-hdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-night-ldpi │ │ │ └── splash.png │ │ │ ├── drawable-land-night-mdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-night-xhdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-night-xxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-night-xxxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-xhdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-xxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-land-xxxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-night │ │ │ └── splash.png │ │ │ ├── drawable-port-hdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-ldpi │ │ │ └── splash.png │ │ │ ├── drawable-port-mdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-night-hdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-night-ldpi │ │ │ └── splash.png │ │ │ ├── drawable-port-night-mdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-night-xhdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-night-xxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-night-xxxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-xhdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-xxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-port-xxxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── ic_launcher_background.xml │ │ │ └── splash.png │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-ldpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_background.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── file_paths.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── getcapacitor │ │ └── myapp │ │ └── ExampleUnitTest.java ├── build.gradle ├── capacitor.settings.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── variables.gradle ├── assets ├── icon-background.png ├── icon-foreground.png ├── icon-only.png ├── mobile.md ├── splash-dark.png └── splash.png ├── capacitor.config.ts ├── docs ├── images │ └── architecture.svg ├── mobile.md └── release-process.md ├── extension └── src │ ├── ExtLedgerAccessPopup │ ├── ExtLedgerAccessPopup.tsx │ ├── __tests__ │ │ ├── __snapshots__ │ │ │ └── index.test.tsx.snap │ │ └── index.test.tsx │ ├── index.html │ └── index.tsx │ ├── popup.html │ └── popup │ ├── popup.tsx │ └── routes.tsx ├── internals ├── extractMessages │ └── i18next-scanner.config.js ├── getBuildData.js ├── getSecurityHeaders.js ├── jest │ ├── mocks │ │ ├── cssModule.js │ │ └── image.js │ └── setupTests.ts ├── scripts │ ├── build-ext.js │ ├── build-web.js │ ├── changelog.js │ ├── fix-grommet-icons-types.js │ ├── gitlint.js │ ├── normalize-translations.js │ ├── print-extension-dev-csp.js │ ├── release-tag.js │ └── validate-ext-manifest.js └── testing │ └── loadable.mock.tsx ├── ios ├── .gitignore └── App │ ├── App.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── App.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ ├── App │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── AppIcon-512@2x.png │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── Splash.imageset │ │ │ ├── Contents.json │ │ │ ├── Default@1x~universal~anyany-dark.png │ │ │ ├── Default@1x~universal~anyany.png │ │ │ ├── Default@2x~universal~anyany-dark.png │ │ │ ├── Default@2x~universal~anyany.png │ │ │ ├── Default@3x~universal~anyany-dark.png │ │ │ └── Default@3x~universal~anyany.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ └── Info.plist │ ├── Podfile │ └── Podfile.lock ├── jest.config.js ├── package.json ├── playwright ├── .gitignore ├── package.json ├── playwright.config.ts ├── screenshots │ ├── chrome-webstore-screenshots.spec.ts │ ├── extension-store-1.png │ ├── extension-store-2.png │ ├── extension-store-3.png │ ├── extension-store-4.png │ ├── extension-store-5.png │ ├── extension-store-6.png │ ├── extension-store-7.png │ └── extension-store-8.png ├── serve-prod.js ├── tests │ ├── csp-react-error-overlay.spec.ts │ ├── encryption-unit-tests.spec.ts │ ├── extension.spec.ts │ ├── fiat.spec.ts │ ├── generated-mnemonics.spec.ts │ ├── home.spec.ts │ ├── ledger.spec.ts │ ├── migrating-persisted-state.spec.ts │ ├── migrating-v0-ext-persisted-state.spec.ts │ ├── monitor-consensus-transfer-fee.spec.ts │ ├── monitor-paratime-withdraw-gas.spec.ts │ ├── monitor-paratime-withdraw-gas.spec.ts-snapshots │ │ ├── Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-mainnet-cipher-1-main-linux.txt │ │ ├── Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-mainnet-emerald-1-main-linux.txt │ │ ├── Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-mainnet-sapphire-1-main-linux.txt │ │ ├── Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-testnet-cipher-1-main-linux.txt │ │ ├── Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-testnet-emerald-1-main-linux.txt │ │ └── Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-testnet-sapphire-1-main-linux.txt │ ├── oasis-scan-v2.spec.ts │ ├── open-wallet.spec.ts │ ├── paraTimes.spec.ts │ ├── persist.spec.ts │ ├── preventSavingInputsToDisk │ │ ├── chromium.spec.ts │ │ └── firefox.spec.ts │ ├── refreshing-balance.spec.ts │ ├── syncTabs.spec.ts │ ├── toolbar.spec.ts │ ├── transfer.spec.ts │ ├── validators.spec.ts │ └── warnSlowApi.spec.ts ├── utils │ ├── expectNoErrorsInConsole.ts │ ├── expectNoFatal.ts │ ├── expectShell.ts │ ├── extensionTestExtend.ts │ ├── fillPrivateKey.ts │ ├── mockApi.ts │ ├── storage.ts │ ├── testWithUserDataDir.ts │ └── warnSlowApi.ts └── yarn.lock ├── public ├── Icon Blue 192.png ├── Icon Blue 512.png ├── Rose Wallet - OpenGraph Banner.png ├── Rose Wallet Blue.svg ├── Rose Wallet White.svg ├── _locales │ ├── en │ │ └── messages.json │ ├── index.json │ └── zh_CN │ │ └── messages.json ├── app.webmanifest ├── index.html ├── manifest.json ├── robots.txt └── service-worker.js ├── renovate.json ├── src ├── __mocks__ │ └── react-i18next.js ├── app │ ├── __tests__ │ │ ├── __snapshots__ │ │ │ └── index.test.tsx.snap │ │ └── index.test.tsx │ ├── components │ │ ├── AddEscrowForm │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── AddressBox │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── AddressFormatter │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── AlertBox │ │ │ └── index.tsx │ │ ├── AmountFormatter │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── AnchorLink │ │ │ └── index.tsx │ │ ├── BuildBanner │ │ │ ├── __tests__ │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── Button │ │ │ └── index.tsx │ │ ├── ButtonLink │ │ │ └── index.tsx │ │ ├── CountdownButton │ │ │ └── index.tsx │ │ ├── DateFormatter │ │ │ ├── __tests__ │ │ │ │ └── index.test.tsx │ │ │ ├── index.tsx │ │ │ └── intlDateTimeFormat.ts │ │ ├── DeleteInputForm │ │ │ └── index.tsx │ │ ├── ErrorBoundary │ │ │ └── index.tsx │ │ ├── ErrorFormatter │ │ │ └── index.tsx │ │ ├── FatalErrorHandler │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── Footer │ │ │ ├── PageFooter.tsx │ │ │ ├── __tests__ │ │ │ │ ├── PageFooter.test.tsx │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── Header │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── ImportAccountsStepFormatter │ │ │ └── index.tsx │ │ ├── Ionic │ │ │ ├── components │ │ │ │ ├── IonicNativePlatformProvider │ │ │ │ │ └── index.tsx │ │ │ │ └── UpdateGate │ │ │ │ │ └── index.tsx │ │ │ ├── hooks │ │ │ │ ├── useIonicAppStateChangeListener.ts │ │ │ │ ├── useIonicBackButtonListener.ts │ │ │ │ └── useIonicRequiresUpdate.ts │ │ │ ├── providers │ │ │ │ ├── IonicContext.ts │ │ │ │ └── IonicProvider.tsx │ │ │ └── utils │ │ │ │ └── capacitor-app-update.ts │ │ ├── JazzIcon │ │ │ └── index.tsx │ │ ├── LanguageSelect │ │ │ └── index.tsx │ │ ├── MnemonicField │ │ │ └── index.tsx │ │ ├── MnemonicGrid │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── MnemonicValidation │ │ │ └── index.tsx │ │ ├── MobileFooterNavigation │ │ │ ├── __tests__ │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── Modal │ │ │ ├── ModalContainer.tsx │ │ │ └── index.tsx │ │ ├── NoTranslate │ │ │ └── index.tsx │ │ ├── PasswordField │ │ │ ├── __tests__ │ │ │ │ ├── index.test.tsx │ │ │ │ └── type-only.test.tsx │ │ │ └── index.tsx │ │ ├── Persist │ │ │ ├── ChoosePasswordFields.tsx │ │ │ ├── ChoosePasswordInputFields.tsx │ │ │ ├── DeleteProfileButton.tsx │ │ │ ├── LoginModalLayout.tsx │ │ │ ├── MigrateV0StateForm.tsx │ │ │ ├── PersistLoadingGate.tsx │ │ │ ├── UnlockForm.tsx │ │ │ └── UnlockGate.tsx │ │ ├── PrettyAddress │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── PrivateKeyFormatter │ │ │ └── index.tsx │ │ ├── ReclaimEscrowForm │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── ResponsiveGridRow │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── ResponsiveLayer │ │ │ └── index.tsx │ │ ├── RevealOverlayButton │ │ │ └── index.tsx │ │ ├── SelectWithIcon │ │ │ └── index.tsx │ │ ├── ShortAddress │ │ │ ├── __tests__ │ │ │ │ └── index.test.tsx │ │ │ ├── index.tsx │ │ │ └── trimLongString.ts │ │ ├── Sidebar │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── ThemeSwitcher │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── TimeToEpoch │ │ │ ├── __tests__ │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── Toolbar │ │ │ ├── Features │ │ │ │ ├── Account │ │ │ │ │ ├── Account.tsx │ │ │ │ │ ├── DeleteAccount.tsx │ │ │ │ │ ├── DerivationFormatter.tsx │ │ │ │ │ ├── ImportableAccount.tsx │ │ │ │ │ ├── ManageableAccount.tsx │ │ │ │ │ ├── ManageableAccountDetails.tsx │ │ │ │ │ └── __tests__ │ │ │ │ │ │ ├── Account.test.tsx │ │ │ │ │ │ └── __snapshots__ │ │ │ │ │ │ └── Account.test.tsx.snap │ │ │ │ ├── AccountSelector │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Contacts │ │ │ │ │ ├── AddContact.tsx │ │ │ │ │ ├── ContactAccount.tsx │ │ │ │ │ ├── ContactAccountForm.tsx │ │ │ │ │ ├── DeleteContact.tsx │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── AddContact.test.tsx │ │ │ │ │ │ ├── ContactAccountForm.test.tsx │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ ├── AddContact.test.tsx.snap │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── LayerContainer │ │ │ │ │ └── index.tsx │ │ │ │ ├── NetworkSelector │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Profile │ │ │ │ │ ├── UpdatePassword.tsx │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── UpdatePassword.test.tsx │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ProfileModalButton │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ ├── addressToJazzIconSeed.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ScrollableContainer │ │ │ │ │ └── index.tsx │ │ │ │ ├── Settings │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── layer.ts │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── Transaction │ │ │ ├── InfoBox.tsx │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── TransactionModal │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── TransactionPreview │ │ │ └── index.tsx │ │ ├── TransactionStatus │ │ │ └── index.tsx │ │ └── TransactionTypeFormatter │ │ │ └── index.tsx │ ├── index.tsx │ ├── lib │ │ ├── __tests__ │ │ │ ├── helpers.test.ts │ │ │ ├── ledger.test.ts │ │ │ ├── privateToEthAddress.test.ts │ │ │ └── usePreventChangeOnNumberInputScroll.test.tsx │ │ ├── eth-helpers.ts │ │ ├── getAccountBalanceWithFallback.ts │ │ ├── helpers.ts │ │ ├── key.ts │ │ ├── ledger.ts │ │ ├── preventSavingInputsToUserData.ts │ │ ├── runtimeIs.ts │ │ ├── transaction.test.ts │ │ ├── transaction.ts │ │ └── usePreventChangeOnNumberInputScroll.ts │ ├── pages │ │ ├── AccountPage │ │ │ ├── Features │ │ │ │ ├── AccountDetails │ │ │ │ │ └── index.tsx │ │ │ │ ├── AccountSummary │ │ │ │ │ └── index.tsx │ │ │ │ ├── SendTransaction │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── StakeSubnavigation │ │ │ │ │ └── index.tsx │ │ │ │ └── TransactionHistory │ │ │ │ │ ├── __tests__ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ ├── index.tsx │ │ │ └── validateAccountPageRoute.ts │ │ ├── CreateWalletPage │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ ├── index.tsx │ │ │ └── slice │ │ │ │ ├── index.ts │ │ │ │ ├── selectors.ts │ │ │ │ └── types.ts │ │ ├── E2EPage │ │ │ ├── E2EWindow.d.ts │ │ │ └── index.tsx │ │ ├── FiatOnrampPage │ │ │ ├── index.tsx │ │ │ ├── isEnabled.ts │ │ │ └── slice │ │ │ │ ├── index.ts │ │ │ │ ├── selectors.ts │ │ │ │ └── types.ts │ │ ├── HomePage │ │ │ └── index.tsx │ │ ├── OpenWalletPage │ │ │ ├── Features │ │ │ │ ├── FromBleLedger │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FromLedger │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FromMnemonic │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FromPrivateKey │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── FromUsbLedger │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ImportAccountsSelectionModal │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ │ └── index.test.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── ListBleLedgerDevicesModal │ │ │ │ │ └── index.tsx │ │ │ ├── FromLedgerWebExtension.tsx │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ ├── ParaTimesPage │ │ │ ├── ParaTimeContent │ │ │ │ ├── __tests__ │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── ParaTimeFormFooter │ │ │ │ └── index.tsx │ │ │ ├── ParaTimeSelection │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── ParaTimeTransferType │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── ParaTimesPageInaccessible │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── TransactionAmount │ │ │ │ ├── FeesSection.tsx │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── TransactionConfirmation │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── TransactionError │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── TransactionRecipient │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── TransactionSummary │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ │ └── index.test.tsx │ │ │ │ └── index.tsx │ │ │ ├── __tests__ │ │ │ │ └── index.test.tsx │ │ │ ├── getParaTimeName.ts │ │ │ ├── index.tsx │ │ │ ├── useParaTimes.test.ts │ │ │ ├── useParaTimes.ts │ │ │ ├── useParaTimesNavigation.test.ts │ │ │ └── useParaTimesNavigation.ts │ │ └── StakingPage │ │ │ └── Features │ │ │ ├── CommissionBounds │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ │ ├── DelegationList │ │ │ ├── ActiveDelegationList.tsx │ │ │ ├── DebondingDelegationList.tsx │ │ │ ├── DelegationItem.tsx │ │ │ ├── __tests__ │ │ │ │ ├── ActiveDelegationList.test.tsx │ │ │ │ ├── DebondingDelegationList.test.tsx │ │ │ │ └── __snapshots__ │ │ │ │ │ ├── ActiveDelegationList.test.tsx.snap │ │ │ │ │ └── DebondingDelegationList.test.tsx.snap │ │ │ └── index.tsx │ │ │ ├── ValidatorList │ │ │ ├── ValidatorInformations.tsx │ │ │ ├── ValidatorItem.tsx │ │ │ ├── ValidatorStatus.tsx │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── index.test.tsx.snap │ │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ │ │ └── ValidatorMediaInfo │ │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ └── index.test.tsx.snap │ │ │ └── index.test.tsx │ │ │ └── index.tsx │ ├── state │ │ ├── account │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.test.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── contacts │ │ │ ├── index.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── evmAccounts │ │ │ ├── index.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── fatalerror │ │ │ ├── index.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── importaccounts │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── network │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── paratimes │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── persist │ │ │ ├── encryption.ts │ │ │ ├── index.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ ├── syncTabs.ts │ │ │ └── types.ts │ │ ├── selectIsAddressInWallet.ts │ │ ├── selectIsLockableOrCloseable.ts │ │ ├── selectUnlockedStatus.ts │ │ ├── staking │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ ├── takeLatestCancelable.test.ts │ │ ├── takeLatestCancelable.ts │ │ ├── transaction │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ │ └── wallet │ │ │ ├── index.ts │ │ │ ├── saga.test.ts │ │ │ ├── saga.ts │ │ │ ├── selectors.ts │ │ │ └── types.ts │ ├── useRouteRedirects.test.ts │ └── useRouteRedirects.tsx ├── commonRoutes.tsx ├── config.test.ts ├── config.ts ├── fonts │ ├── roboto-mono │ │ ├── LICENSE │ │ ├── roboto-mono-v13-latin-300.woff │ │ └── roboto-mono-v13-latin-300.woff2 │ └── rubik │ │ ├── LICENSE │ │ ├── rubik-v20-latin-ext_latin-300.woff │ │ └── rubik-v20-latin-ext_latin-300.woff2 ├── index.tsx ├── ionicConfig.ts ├── locales │ ├── __tests__ │ │ ├── i18n.test.ts │ │ └── strict-translation-keys.test.tsx │ ├── de │ │ └── translation.json │ ├── en │ │ └── translation.json │ ├── es │ │ └── translation.json │ ├── fr │ │ └── translation.json │ ├── i18n.ts │ ├── react-i18next.d.ts │ ├── sl │ │ └── translation.json │ ├── tr │ │ └── translation.json │ ├── vi │ │ └── translation.json │ └── zh_CN │ │ └── translation.json ├── routes.tsx ├── store │ ├── __tests__ │ │ └── reducer.test.ts │ ├── configureStore.ts │ ├── reducers.ts │ ├── sagas.ts │ └── slices.ts ├── styles │ ├── main.css │ └── theme │ │ ├── ThemeProvider.tsx │ │ ├── __tests__ │ │ ├── ThemeProvider.test.tsx │ │ └── utils.test.ts │ │ ├── dataTableTheme.ts │ │ ├── elementSizes.ts │ │ ├── icons │ │ ├── language │ │ │ ├── LICENSE │ │ │ ├── Language.test.tsx │ │ │ └── Language.tsx │ │ └── mui-icons │ │ │ ├── LICENSE │ │ │ ├── MuiBluetoothIcon.tsx │ │ │ ├── MuiLocalFireDepartmentIcon.tsx │ │ │ ├── MuiLockIcon.tsx │ │ │ ├── MuiMarginIcon.tsx │ │ │ ├── MuiUsbIcon.tsx │ │ │ ├── MuiVpnKeyIcon.tsx │ │ │ └── MuiWalletIcon.tsx │ │ ├── slice │ │ ├── index.ts │ │ ├── selectors.ts │ │ └── types.ts │ │ ├── styled.d.ts │ │ └── utils.ts ├── types │ ├── RootState.ts │ ├── StringifiedBigInt.ts │ ├── TypeSafeDataTable.tsx │ ├── __tests__ │ │ ├── TypeSafeDataTable.test.tsx │ │ └── styled-components.test.tsx │ ├── env.d.ts │ ├── errors.ts │ ├── fix-grommet-icons-types.d.ts │ ├── images.d.ts │ ├── index.ts │ ├── jazzicon.d.ts │ └── styled-components.d.ts ├── utils │ ├── @protobufjs │ │ └── inquire.js │ ├── @reduxjs │ │ ├── toolkit.test.tsx │ │ └── toolkit.tsx │ ├── __fixtures__ │ │ └── test-inputs.ts │ ├── __tests__ │ │ ├── __snapshots__ │ │ │ ├── loadable.test.tsx.snap │ │ │ └── walletExtensionV0.test.ts.snap │ │ ├── loadable.test.tsx │ │ └── walletExtensionV0.test.ts │ ├── eslint-test-noGoogleTranslateCrashingSyntax.tsx │ ├── loadable.tsx │ ├── walletExtensionV0.ts │ ├── warnImportMapViolation.ts │ └── webextension.ts └── vendors │ ├── __tests__ │ ├── __snapshots__ │ │ └── oasisscan-v2.test.ts.snap │ ├── oasisscan-v2.test.ts │ └── throwAPIErrors.test.ts │ ├── backend.ts │ ├── helpers.ts │ ├── nexus.ts │ ├── nexus │ ├── .openapi-generator-ignore │ ├── .openapi-generator │ │ ├── FILES │ │ └── VERSION │ ├── README.md │ ├── apis │ │ ├── DefaultApi.ts │ │ └── index.ts │ ├── dump_validators.json │ ├── index.ts │ ├── models │ │ ├── Account.ts │ │ ├── AccountList.ts │ │ ├── AccountListAllOf.ts │ │ ├── AccountStats.ts │ │ ├── ActiveAccounts.ts │ │ ├── ActiveAccountsList.ts │ │ ├── AddressDerivationContext.ts │ │ ├── AddressPreimage.ts │ │ ├── Allowance.ts │ │ ├── BareTokenHolder.ts │ │ ├── Block.ts │ │ ├── BlockList.ts │ │ ├── BlockListAllOf.ts │ │ ├── ConsensusEvent.ts │ │ ├── ConsensusEventList.ts │ │ ├── ConsensusEventListAllOf.ts │ │ ├── ConsensusEventType.ts │ │ ├── ConsensusTxMethod.ts │ │ ├── DebondingDelegation.ts │ │ ├── DebondingDelegationList.ts │ │ ├── DebondingDelegationListAllOf.ts │ │ ├── Delegation.ts │ │ ├── DelegationList.ts │ │ ├── DelegationListAllOf.ts │ │ ├── Entity.ts │ │ ├── EntityInfo.ts │ │ ├── EntityList.ts │ │ ├── EntityListAllOf.ts │ │ ├── Epoch.ts │ │ ├── EpochList.ts │ │ ├── EpochListAllOf.ts │ │ ├── Escrow.ts │ │ ├── EvmAbiParam.ts │ │ ├── EvmEventToken.ts │ │ ├── EvmNft.ts │ │ ├── EvmNftList.ts │ │ ├── EvmNftListAllOf.ts │ │ ├── EvmRefToken.ts │ │ ├── EvmToken.ts │ │ ├── EvmTokenList.ts │ │ ├── EvmTokenListAllOf.ts │ │ ├── EvmTokenSwap.ts │ │ ├── EvmTokenType.ts │ │ ├── InlineResponse400.ts │ │ ├── Layer.ts │ │ ├── List.ts │ │ ├── Node.ts │ │ ├── NodeList.ts │ │ ├── NodeListAllOf.ts │ │ ├── Proposal.ts │ │ ├── ProposalList.ts │ │ ├── ProposalListAllOf.ts │ │ ├── ProposalState.ts │ │ ├── ProposalTarget.ts │ │ ├── ProposalVote.ts │ │ ├── ProposalVotes.ts │ │ ├── ProposalVotesAllOf.ts │ │ ├── RoothashMessage.ts │ │ ├── RoothashMessageList.ts │ │ ├── RoothashMessageListAllOf.ts │ │ ├── RoothashMessageType.ts │ │ ├── Runtime.ts │ │ ├── RuntimeAccount.ts │ │ ├── RuntimeBlock.ts │ │ ├── RuntimeBlockList.ts │ │ ├── RuntimeBlockListAllOf.ts │ │ ├── RuntimeEvent.ts │ │ ├── RuntimeEventList.ts │ │ ├── RuntimeEventListAllOf.ts │ │ ├── RuntimeEventType.ts │ │ ├── RuntimeEvmBalance.ts │ │ ├── RuntimeEvmContract.ts │ │ ├── RuntimeEvmContractVerification.ts │ │ ├── RuntimeSdkBalance.ts │ │ ├── RuntimeStatus.ts │ │ ├── RuntimeTransaction.ts │ │ ├── RuntimeTransactionEncryptionEnvelope.ts │ │ ├── RuntimeTransactionList.ts │ │ ├── RuntimeTransactionListAllOf.ts │ │ ├── RuntimeTransactionSigner.ts │ │ ├── Status.ts │ │ ├── TokenHolderList.ts │ │ ├── TokenHolderListAllOf.ts │ │ ├── Transaction.ts │ │ ├── TransactionList.ts │ │ ├── TransactionListAllOf.ts │ │ ├── TxError.ts │ │ ├── TxVolume.ts │ │ ├── TxVolumeList.ts │ │ ├── Validator.ts │ │ ├── ValidatorAggStats.ts │ │ ├── ValidatorCommissionBound.ts │ │ ├── ValidatorHistory.ts │ │ ├── ValidatorHistoryAllOf.ts │ │ ├── ValidatorHistoryPoint.ts │ │ ├── ValidatorList.ts │ │ ├── ValidatorListAllOf.ts │ │ ├── ValidatorMedia.ts │ │ ├── ValidatorSignedBlock.ts │ │ ├── ValidatorsResponse.ts │ │ ├── VerificationLevel.ts │ │ └── index.ts │ ├── openapi.json │ ├── openapitools.json │ └── runtime.ts │ ├── oasisscan-v2.ts │ └── oasisscan-v2 │ ├── .openapi-generator-ignore │ ├── .openapi-generator │ ├── FILES │ └── VERSION │ ├── README.md │ ├── apis │ ├── AccountApi.ts │ ├── ChainApi.ts │ ├── CommonApi.ts │ ├── GovernanceApi.ts │ ├── MarketApi.ts │ ├── RuntimeApi.ts │ ├── ValidatorApi.ts │ └── index.ts │ ├── index.ts │ ├── models │ ├── AccountAllowance.ts │ ├── AccountDebondingInfo.ts │ ├── AccountDebondingRequest.ts │ ├── AccountDebondingResponse.ts │ ├── AccountDelegationsInfo.ts │ ├── AccountDelegationsRequest.ts │ ├── AccountDelegationsResponse.ts │ ├── AccountInfoResponse.ts │ ├── AccountRewardExportRequest.ts │ ├── AccountRewardInfo.ts │ ├── AccountRewardRequest.ts │ ├── AccountRewardResponse.ts │ ├── AccountRewardStatsInfo.ts │ ├── AccountRewardStatsItem.ts │ ├── AccountRewardStatsRequest.ts │ ├── AccountRewardStatsResponse.ts │ ├── AccountStakingEventsInfo.ts │ ├── AccountStakingEventsInfoRequest.ts │ ├── AccountStakingEventsInfoResponse.ts │ ├── AccountStakingEventsRequest.ts │ ├── AccountStakingEventsResponse.ts │ ├── Bound.ts │ ├── ChainBlockInfo.ts │ ├── ChainBlockInfoResponse.ts │ ├── ChainBlocksRequest.ts │ ├── ChainBlocksResponse.ts │ ├── ChainMethodsResponse.ts │ ├── ChainProposedBlocksRequest.ts │ ├── ChainProposedBlocksResponse.ts │ ├── ChainSearchRequest.ts │ ├── ChainSearchResponse.ts │ ├── ChainTransactionInfoResponse.ts │ ├── ChainTransactionListInfo.ts │ ├── ChainTransactionsRequest.ts │ ├── ChainTransactionsResponse.ts │ ├── Chart.ts │ ├── DelegatorsInfo.ts │ ├── DelegatorsRequest.ts │ ├── DelegatorsResponse.ts │ ├── EscrowStatus.ts │ ├── GovernanceProposalInfo.ts │ ├── GovernanceProposalListResponse.ts │ ├── GovernanceProposalWithVotesRequest.ts │ ├── GovernanceProposalWithVotesResponse.ts │ ├── GovernanceVotesRequest.ts │ ├── GovernanceVotesResponse.ts │ ├── MarketChartResponse.ts │ ├── MarketInfoResponse.ts │ ├── NetworkStatusResponse.ts │ ├── NetworkTrendResponse.ts │ ├── Page.ts │ ├── ProposalOption.ts │ ├── ProposalVote.ts │ ├── Rate.ts │ ├── RuntimeListInfo.ts │ ├── RuntimeListResponse.ts │ ├── RuntimeRoundInfo.ts │ ├── RuntimeRoundInfoRequest.ts │ ├── RuntimeRoundInfoResponse.ts │ ├── RuntimeRoundListRequest.ts │ ├── RuntimeRoundListResponse.ts │ ├── RuntimeStatsInfo.ts │ ├── RuntimeStatsItem.ts │ ├── RuntimeStatsRequest.ts │ ├── RuntimeStatsResponse.ts │ ├── RuntimeTransactionConsensusTx.ts │ ├── RuntimeTransactionEventError.ts │ ├── RuntimeTransactionEvmTx.ts │ ├── RuntimeTransactionInfoRequest.ts │ ├── RuntimeTransactionInfoResponse.ts │ ├── RuntimeTransactionListInfo.ts │ ├── RuntimeTransactionListRequest.ts │ ├── RuntimeTransactionListResponse.ts │ ├── ValidatorBlocksStatsInfo.ts │ ├── ValidatorBlocksStatsRequest.ts │ ├── ValidatorBlocksStatsResponse.ts │ ├── ValidatorEscrowEventRequest.ts │ ├── ValidatorEscrowEventResponse.ts │ ├── ValidatorEscrowStatsInfo.ts │ ├── ValidatorEscrowStatsRequest.ts │ ├── ValidatorEscrowStatsResponse.ts │ ├── ValidatorInfo.ts │ ├── ValidatorInfoRequest.ts │ ├── ValidatorInfoResponse.ts │ ├── ValidatorListRequest.ts │ ├── ValidatorListResponse.ts │ ├── ValidatorRuntime.ts │ ├── ValidatorSignStatsInfo.ts │ ├── ValidatorSignStatsRequest.ts │ ├── ValidatorSignStatsResponse.ts │ └── index.ts │ ├── openapitools.json │ ├── runtime.ts │ └── swagger.json ├── towncrier.toml ├── tsconfig.json └── yarn.lock /.changelog/.markdownlint.yml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json 2 | 3 | # markdownlint configuration for Change Log fragments. 4 | 5 | # For more information, see: 6 | # https://github.com/DavidAnson/markdownlint#optionsconfig. 7 | 8 | # Extend project's main configuration. 9 | extends: ../.markdownlint.yml 10 | 11 | line-length: 12 | # Line length checking is not strict by default. 13 | strict: true 14 | # Change Log fragments will be listed as bullets indented by 2 spaces so they 15 | # should be 2 characters shorter than ordinary lines. 16 | line_length: 78 17 | 18 | # Change Log fragments should not have a heading as the first line. 19 | first-line-heading: false 20 | 21 | ul-style: 22 | # Enforce a uniform symbol for unordered lists across all Change Log 23 | # fragments. 24 | style: dash 25 | -------------------------------------------------------------------------------- /.changelog/2173.internal.md: -------------------------------------------------------------------------------- 1 | Update dependencies 2 | -------------------------------------------------------------------------------- /.changelog/2174.internal.md: -------------------------------------------------------------------------------- 1 | Update dependencies 2 | -------------------------------------------------------------------------------- /.changelog/2177.internal.md: -------------------------------------------------------------------------------- 1 | Update extension release notes 2 | -------------------------------------------------------------------------------- /.changelog/2178.internal.md: -------------------------------------------------------------------------------- 1 | Remove Oasis Monitor leftovers 2 | -------------------------------------------------------------------------------- /.changelog/2179.internal.md: -------------------------------------------------------------------------------- 1 | Build APK only on master to speed up PR check 2 | -------------------------------------------------------------------------------- /.changelog/2181.bugfix.md: -------------------------------------------------------------------------------- 1 | Fix warnings and error overlays since parcel@2.14 2 | -------------------------------------------------------------------------------- /.changelog/2182.bugfix.md: -------------------------------------------------------------------------------- 1 | Fix importing images in parcel@2.14 2 | -------------------------------------------------------------------------------- /.changelog/2183.internal.md: -------------------------------------------------------------------------------- 1 | Update dependencies 2 | -------------------------------------------------------------------------------- /.changelog/2184.internal.md: -------------------------------------------------------------------------------- 1 | Fork @parcel/error-overlay to ignore console.error (for parcel@2.14) 2 | -------------------------------------------------------------------------------- /.changelog/2185.internal.md: -------------------------------------------------------------------------------- 1 | Migrate Cloudflare preview deploys to wrangler action 2 | -------------------------------------------------------------------------------- /.changelog/2186.internal.md: -------------------------------------------------------------------------------- 1 | Fix screenshots CI 2 | -------------------------------------------------------------------------------- /.changelog/2187.bugfix.md: -------------------------------------------------------------------------------- 1 | Don't throw on failed debonding transaction 2 | -------------------------------------------------------------------------------- /.changelog/README.md: -------------------------------------------------------------------------------- 1 | # Change Log Fragments 2 | 3 | This directory collects Change Log fragments: 4 | short files that each contain a snippet of Markdown formatted text that will 5 | be assembled using [towncrier] to form the [Change Log] section for the next 6 | release. 7 | 8 | This repository follows the same Change Log fragments style as the 9 | [Oasis Core] repository. 10 | Please, see [its Change Log fragments documentation] for more details. 11 | 12 | [Change Log]: ../CHANGELOG.md 13 | [towncrier]: https://github.com/oasisprotocol/towncrier 14 | [Oasis Core]: https://github.com/oasisprotocol/oasis-core 15 | [its Change Log fragments documentation]: 16 | https://github.com/oasisprotocol/oasis-core/blob/master/.changelog/README.md 17 | -------------------------------------------------------------------------------- /.changelog/template.md.j2: -------------------------------------------------------------------------------- 1 | {# This a Jinja2 template for preparing a new section of the Change Log with the towncrier utility.#} 2 | ## {{ versiondata.version }} ({{ versiondata.date }}) 3 | {% for section, _ in sections.items() %} 4 | 5 | {% if sections[section] %} 6 | {% for category, val in definitions.items() if category in sections[section] %} 7 | {% if definitions[category]['showcontent'] %} 8 | {{ "### " + definitions[category]['name'] }} 9 | 10 | {% for text, values in sections[section][category].items() %} 11 | {% set lines = text.splitlines() %} 12 | {% set referenced_issues = "(" + values | join(',\n ') + ")" %} 13 | {% if lines | length > 2 and lines[1] == "" %} 14 | - {{ lines[0] }} 15 | {{ referenced_issues }} 16 | 17 | {{ lines[2:] | join('\n') }} 18 | {% else %} 19 | - {{ text }} 20 | {{ referenced_issues }} 21 | {% endif %} 22 | {% if not loop.last %} 23 | 24 | {% endif %} 25 | {% endfor %} 26 | {% endif %} 27 | {% if sections[section][category]|length == 0 %} 28 | No significant changes. 29 | 30 | {% else %} 31 | {% endif %} 32 | 33 | {% endfor %} 34 | {% else %} 35 | No significant changes. 36 | 37 | 38 | {% endif %} 39 | {% endfor %} 40 | -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | --- 2 | comment: 3 | layout: "reach, diff, flags, files" 4 | behavior: default 5 | # Only post codecov comments when coverage changes 6 | require_changes: true 7 | require_base: true 8 | require_head: true 9 | branches: null 10 | 11 | coverage: 12 | status: 13 | project: 14 | default: 15 | # Allow the coverage to drop by 0.5% 16 | threshold: 0.5% 17 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain 2 | # consistent coding styles between different editors and IDEs. 3 | 4 | root = true 5 | 6 | [*] 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | indent_style = space 12 | indent_size = 2 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | REACT_APP_BUILD_DATETIME=0 2 | REACT_APP_BUILD_SHA=sha0000000000000000000000000000000000000 3 | REACT_APP_BUILD_VERSION=v1.0.0-dev.1 4 | 5 | REACT_APP_LOCALNET= 6 | REACT_APP_E2E_TEST=1 7 | 8 | REACT_APP_META_CSP= 9 | EXTENSION_CSP= 10 | REACT_APP_BACKEND=nexus 11 | REACT_APP_TRANSAK_URL=https://global-stg.transak.com 12 | # Our staging API key from transak dashboard 13 | REACT_APP_TRANSAK_PARTNER_ID=3566e9e3-d3b7-493c-a33e-91d33c5c32cb 14 | 15 | REACT_APP_PRODUCTION_URLS="https://wallet.oasis.io, https://wallet.prd.oasis.io" 16 | REACT_APP_STAGING_URLS=https://wallet.stg.oasis.io 17 | -------------------------------------------------------------------------------- /.env.local: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/.env.local -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | REACT_APP_BUILD_DATETIME= 2 | REACT_APP_BUILD_SHA= 3 | REACT_APP_BUILD_VERSION= 4 | 5 | REACT_APP_LOCALNET= 6 | REACT_APP_E2E_TEST= 7 | 8 | REACT_APP_TRANSAK_URL=https://global.transak.com 9 | REACT_APP_TRANSAK_PARTNER_ID=4b66a274-d663-42a8-a495-e1f0e88ce023 10 | 11 | REACT_APP_PRODUCTION_URLS="https://wallet.oasis.io, https://wallet.prd.oasis.io" 12 | REACT_APP_STAGING_URLS=https://wallet.stg.oasis.io 13 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .gitignore -------------------------------------------------------------------------------- /.github/dump_validators.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | curl -s https://nexus.oasis.io/v1/consensus/validators?limit=500 | 4 | jq '{ 5 | dump_timestamp: (now * 1000 | floor), 6 | dump_timestamp_iso: (now | strftime("%Y-%m-%dT%H:%M:%SZ")), 7 | list: .validators 8 | }' \ 9 | >|"$(dirname "$0")/../src/vendors/nexus/dump_validators.json" 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Don't check auto-generated stuff into git 2 | .parcel-cache/ 3 | coverage/ 4 | build/ 5 | build-ext/ 6 | build-dev/ 7 | node_modules/ 8 | stats.json 9 | .pnp 10 | .pnp.js 11 | .idea/ 12 | 13 | # misc 14 | .DS_Store 15 | npm-debug.log* 16 | yarn-debug.log* 17 | yarn-error.log* 18 | *~ 19 | \#* 20 | .\#* 21 | 22 | # Local debug 23 | debug*.c 24 | -------------------------------------------------------------------------------- /.gitlint: -------------------------------------------------------------------------------- 1 | # gitlint configuration. 2 | 3 | # For more information, see: 4 | # https://jorisroovers.com/gitlint/configuration/. 5 | 6 | [general] 7 | verbosity = 2 8 | ignore-merge-commits=true 9 | ignore-fixup-commits=false 10 | ignore-squash-commits=false 11 | ignore=body-is-missing 12 | contrib=contrib-disallow-cleanup-commits 13 | 14 | [title-max-length] 15 | line-length=72 16 | 17 | [body-max-line-length] 18 | line-length=80 19 | 20 | [body-min-length] 21 | min-length=20 22 | 23 | [title-must-not-contain-word] 24 | words=wip 25 | 26 | [ignore-by-author-name] 27 | # Ignore specific line length rules for Dependabot commits. 28 | regex=dependabot 29 | ignore=title-max-length,body-max-line-length 30 | -------------------------------------------------------------------------------- /.markdownlint.yml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://raw.githubusercontent.com/DavidAnson/markdownlint/main/schema/markdownlint-config-schema.json 2 | 3 | # markdownlint configuration. 4 | 5 | # For more information, see: 6 | # https://github.com/DavidAnson/markdownlint#optionsconfig. 7 | 8 | # Enable all rules. 9 | default: true 10 | 11 | line-length: 12 | # Line length checking is not strict by default. 13 | strict: true 14 | line_length: 80 15 | # Allow longer lines for code blocks. 16 | code_block_line_length: 100 17 | 18 | # Do not always require language specifiers with fenced code blocks since they 19 | # are not part of the Markdown spec. 20 | fenced-code-language: false 21 | 22 | # Allow
and
HTML elements 23 | no-inline-html: 24 | allowed_elements: ['details', 'summary'] 25 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | save-exact = true 2 | -------------------------------------------------------------------------------- /.parcelrc: -------------------------------------------------------------------------------- 1 | // Used for both: web and ext 2 | { 3 | "$schema": "https://raw.githubusercontent.com/lukaw3d/parcel-bundler-json-schemas/main/config_schema.json", 4 | "extends": "@parcel/config-webextension", 5 | "transformers": { 6 | "{index.html,manifest.json}": [ 7 | "parcel-transformer-env-variables-injection", 8 | "..." 9 | ], 10 | "*.svg": ["...", "@parcel/transformer-raw"], 11 | "*.png": ["...", "@parcel/transformer-raw"] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build/ 2 | node_modules/ 3 | coverage/ 4 | **/node/** 5 | package-lock.json 6 | yarn.lock 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 110, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": false, 6 | "singleQuote": true, 7 | "trailingComma": "all", 8 | "arrowParens": "avoid" 9 | } 10 | -------------------------------------------------------------------------------- /.proxyrc.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | /** 4 | * Add security headers to dev server 5 | * @param {import('connect').Server} app 6 | */ 7 | module.exports = (app) => { 8 | app.use((req, res, next) => { 9 | // Re-generate headers on every request so editing the file is reflected on reload. 10 | delete require.cache[require.resolve('./internals/getSecurityHeaders.js')]; 11 | const { getCsp, getPermissionsPolicy } = require('./internals/getSecurityHeaders.js') 12 | 13 | res.setHeader('Content-Security-Policy', getCsp({ isDev: true, isExtension: false })) 14 | res.setHeader('Permissions-Policy', getPermissionsPolicy()) 15 | next() 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /.terserrc: -------------------------------------------------------------------------------- 1 | { 2 | "mangle": { 3 | "keep_fnames": true 4 | }, 5 | "format": { 6 | "beautify": true 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "dbaeumer.vscode-eslint", 4 | "esbenp.prettier-vscode", 5 | "styled-components.vscode-styled-components", 6 | "editorconfig.editorconfig" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Chrome", 6 | "type": "chrome", 7 | "request": "launch", 8 | "url": "http://localhost:3000", 9 | "webRoot": "${workspaceFolder}/src", 10 | "sourceMapPathOverrides": { 11 | "webpack:///src/*": "${webRoot}/*" 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /android/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build/* 2 | !/build/.npmkeep 3 | -------------------------------------------------------------------------------- /android/app/capacitor.build.gradle: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN 2 | 3 | android { 4 | compileOptions { 5 | sourceCompatibility JavaVersion.VERSION_17 6 | targetCompatibility JavaVersion.VERSION_17 7 | } 8 | } 9 | 10 | apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" 11 | dependencies { 12 | implementation project(':capacitor-community-bluetooth-le') 13 | implementation project(':capacitor-app') 14 | implementation project(':capawesome-capacitor-app-update') 15 | 16 | } 17 | 18 | 19 | if (hasProperty('postBuildExtras')) { 20 | postBuildExtras() 21 | } 22 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.myapp; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import android.content.Context; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | import androidx.test.platform.app.InstrumentationRegistry; 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * @see Testing documentation 15 | */ 16 | @RunWith(AndroidJUnit4.class) 17 | public class ExampleInstrumentedTest { 18 | 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 23 | 24 | assertEquals("com.getcapacitor.app", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /android/app/src/main/java/org/oasisprotocol/wallet/MainActivity.java: -------------------------------------------------------------------------------- 1 | package org.oasisprotocol.wallet; 2 | 3 | import android.os.Bundle; 4 | import android.view.WindowManager; 5 | import com.getcapacitor.BridgeActivity; 6 | 7 | public class MainActivity extends BridgeActivity { 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | 12 | // Set secure flag to prevent app content from being captured in screenshots or recent apps view 13 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, 14 | WindowManager.LayoutParams.FLAG_SECURE); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-ldpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-ldpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-night-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-night-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-night-ldpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-night-ldpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-night-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-night-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-night-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-night-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-night-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-night-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-night-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-land-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-land-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-night/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-ldpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-ldpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-night-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-night-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-night-ldpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-night-ldpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-night-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-night-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-night-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-night-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-night-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-night-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-night-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-port-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable-port-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/drawable/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-ldpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-ldpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-ldpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-ldpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-ldpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ROSE Wallet 4 | ROSE Wallet 5 | org.oasisprotocol.wallet 6 | org.oasisprotocol.wallet 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 17 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /android/app/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.getcapacitor.myapp; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import org.junit.Test; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | 14 | @Test 15 | public void addition_isCorrect() throws Exception { 16 | assertEquals(4, 2 + 2); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | 5 | repositories { 6 | google() 7 | mavenCentral() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:8.2.1' 11 | classpath 'com.google.gms:google-services:4.4.0' 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | apply from: "variables.gradle" 19 | 20 | allprojects { 21 | repositories { 22 | google() 23 | mavenCentral() 24 | } 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /android/capacitor.settings.gradle: -------------------------------------------------------------------------------- 1 | // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN 2 | include ':capacitor-android' 3 | project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') 4 | 5 | include ':capacitor-community-bluetooth-le' 6 | project(':capacitor-community-bluetooth-le').projectDir = new File('../node_modules/@capacitor-community/bluetooth-le/android') 7 | 8 | include ':capacitor-app' 9 | project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') 10 | 11 | include ':capawesome-capacitor-app-update' 12 | project(':capawesome-capacitor-app-update').projectDir = new File('../node_modules/@capawesome/capacitor-app-update/android') 13 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | 19 | # AndroidX package structure to make it clearer which packages are bundled with the 20 | # Android operating system, and which are packaged with your app's APK 21 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 22 | android.useAndroidX=true 23 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/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.2.1-all.zip 4 | networkTimeout=10000 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | include ':capacitor-cordova-android-plugins' 3 | project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') 4 | 5 | apply from: 'capacitor.settings.gradle' -------------------------------------------------------------------------------- /android/variables.gradle: -------------------------------------------------------------------------------- 1 | ext { 2 | minSdkVersion = 30 3 | compileSdkVersion = 34 4 | targetSdkVersion = 34 5 | androidxActivityVersion = '1.8.0' 6 | androidxAppCompatVersion = '1.6.1' 7 | androidxCoordinatorLayoutVersion = '1.2.0' 8 | androidxCoreVersion = '1.12.0' 9 | androidxFragmentVersion = '1.6.2' 10 | coreSplashScreenVersion = '1.0.1' 11 | androidxWebkitVersion = '1.9.0' 12 | junitVersion = '4.13.2' 13 | androidxJunitVersion = '1.1.5' 14 | androidxEspressoCoreVersion = '3.5.1' 15 | cordovaAndroidVersion = '10.1.1' 16 | } 17 | -------------------------------------------------------------------------------- /assets/icon-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/assets/icon-background.png -------------------------------------------------------------------------------- /assets/icon-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/assets/icon-foreground.png -------------------------------------------------------------------------------- /assets/icon-only.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/assets/icon-only.png -------------------------------------------------------------------------------- /assets/mobile.md: -------------------------------------------------------------------------------- 1 | # Capacitor assets source files 2 | 3 | Files used as a source for Android and iOS icons and splash images. 4 | -------------------------------------------------------------------------------- /assets/splash-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/assets/splash-dark.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/assets/splash.png -------------------------------------------------------------------------------- /capacitor.config.ts: -------------------------------------------------------------------------------- 1 | import { CapacitorConfig } from '@capacitor/cli' 2 | 3 | const config: CapacitorConfig = { 4 | appId: 'org.oasisprotocol.wallet', 5 | appName: 'ROSE Wallet', 6 | webDir: 'build', 7 | server: { 8 | androidScheme: 'https', 9 | }, 10 | } 11 | 12 | export default config 13 | -------------------------------------------------------------------------------- /extension/src/ExtLedgerAccessPopup/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ROSE Wallet 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /extension/src/ExtLedgerAccessPopup/index.tsx: -------------------------------------------------------------------------------- 1 | import '../../../src/utils/warnImportMapViolation' 2 | import * as React from 'react' 3 | import { createRoot } from 'react-dom/client' 4 | 5 | // Use consistent styling 6 | import 'sanitize.css/sanitize.css' 7 | 8 | import { ThemeProviderWithoutRedux } from 'styles/theme/ThemeProvider' 9 | 10 | // Initialize languages 11 | import 'locales/i18n' 12 | 13 | // Fonts 14 | import 'styles/main.css' 15 | import { ExtLedgerAccessPopup } from './ExtLedgerAccessPopup' 16 | 17 | const container = document.getElementById('root') as HTMLElement 18 | const root = createRoot(container!) 19 | 20 | root.render( 21 | // Avoid redux: it's not necessary and has it has a little potential to cause 22 | // conflicts in stored state because it runs in parallel with wallet popup. 23 | 24 | 25 | 26 | 27 | , 28 | ) 29 | -------------------------------------------------------------------------------- /extension/src/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ROSE Wallet Extension 6 | 7 | 8 |
9 | 10 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /extension/src/popup/routes.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { RouteObject } from 'react-router-dom' 3 | import { App } from 'app' 4 | import { FromLedgerWebExtension } from 'app/pages/OpenWalletPage/FromLedgerWebExtension' 5 | import { commonRoutes } from '../../../src/commonRoutes' 6 | import { SelectOpenMethod } from '../../../src/app/pages/OpenWalletPage' 7 | 8 | export const routes: RouteObject[] = [ 9 | { 10 | path: '/*', 11 | element: , 12 | children: [ 13 | ...commonRoutes, 14 | { 15 | path: 'open-wallet', 16 | element: , 17 | }, 18 | { 19 | path: 'open-wallet/ledger', 20 | element: , 21 | }, 22 | ], 23 | }, 24 | ] 25 | -------------------------------------------------------------------------------- /internals/getBuildData.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const buildSha = require('child_process').execSync('git rev-parse HEAD').toString().trim() 3 | const buildVersion = require('child_process').execSync('git tag --points-at HEAD').toString().trim() 4 | const buildDatetime = Date.now().toString() 5 | 6 | module.exports = { buildSha, buildVersion, buildDatetime } 7 | -------------------------------------------------------------------------------- /internals/jest/mocks/cssModule.js: -------------------------------------------------------------------------------- 1 | module.exports = 'CSS_MODULE' 2 | -------------------------------------------------------------------------------- /internals/jest/mocks/image.js: -------------------------------------------------------------------------------- 1 | module.exports = 'IMAGE_MOCK' 2 | -------------------------------------------------------------------------------- /internals/jest/setupTests.ts: -------------------------------------------------------------------------------- 1 | import { waitFor } from '@testing-library/react' 2 | import 'dotenv/config' 3 | 4 | // react-testing-library renders your components to document.body, 5 | // this adds jest-dom's custom assertions 6 | import '@testing-library/jest-dom' 7 | import 'jest-styled-components' // Snapshot serializer 8 | 9 | // Init i18n for the tests needing it 10 | import 'locales/i18n' 11 | 12 | process.env.REACT_APP_LOCALNET = '1' 13 | 14 | global.TextEncoder = require('util').TextEncoder 15 | global.TextDecoder = require('util').TextDecoder 16 | window.TextDecoder = global.TextDecoder 17 | window.TextEncoder = global.TextEncoder 18 | 19 | global.window.scrollTo = () => {} 20 | 21 | afterEach(async () => { 22 | // @testing-library/react does not directly cleanup portals, but it does 23 | // trigger their internal cleanup. Wait for closing animation to finish. 24 | await waitFor(() => { 25 | expect(document.querySelector('[data-g-portal-id]')).not.toBeInTheDocument() 26 | }) 27 | }) 28 | -------------------------------------------------------------------------------- /internals/scripts/build-ext.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const execSync = require('child_process').execSync 3 | const { getCsp } = require('../getSecurityHeaders.js') 4 | const { buildDatetime, buildSha, buildVersion } = require('../getBuildData') 5 | 6 | process.env.REACT_APP_BUILD_DATETIME = buildDatetime 7 | process.env.REACT_APP_BUILD_SHA = buildSha 8 | process.env.REACT_APP_BUILD_VERSION = buildVersion 9 | process.env.EXTENSION_CSP = getCsp({ isDev: false, isExtension: true }) 10 | 11 | console.log(`Content-Security-Policy: ${process.env.EXTENSION_CSP}\n`) 12 | 13 | execSync('yarn clean:ext', { stdio: 'inherit' }) 14 | execSync('parcel build --target ext --dist-dir build-ext', { stdio: 'inherit' }) 15 | execSync('node ./internals/scripts/validate-ext-manifest.js', { stdio: 'inherit' }) 16 | -------------------------------------------------------------------------------- /internals/scripts/build-web.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const fs = require('fs') 3 | const execSync = require('child_process').execSync 4 | const { getCsp, getPermissionsPolicy } = require('../getSecurityHeaders.js') 5 | const { buildDatetime, buildSha, buildVersion } = require('../getBuildData') 6 | 7 | const csp = getCsp({ isDev: false, isExtension: false }) 8 | const permissionsPolicy = getPermissionsPolicy() 9 | console.log(`Content-Security-Policy: ${csp}\n`) 10 | console.log(`Permissions-Policy: ${permissionsPolicy}\n`) 11 | 12 | process.env.REACT_APP_BUILD_DATETIME = buildDatetime 13 | process.env.REACT_APP_BUILD_SHA = buildSha 14 | process.env.REACT_APP_BUILD_VERSION = buildVersion 15 | // Fix warning "'frame-ancestors' is ignored when delivered via " 16 | process.env.REACT_APP_META_CSP = csp.replace(/frame-ancestors .*?;/, '') 17 | 18 | execSync('yarn clean && parcel build --target web --dist-dir build', { stdio: 'inherit' }) 19 | execSync('cp public/robots.txt build/robots.txt', { encoding: 'utf8' }) 20 | fs.writeFileSync('build/Content-Security-Policy.txt', csp, 'utf8') 21 | fs.writeFileSync('build/Permissions-Policy.txt', permissionsPolicy, 'utf8') 22 | -------------------------------------------------------------------------------- /internals/scripts/fix-grommet-icons-types.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | 3 | const fileHeader = ` 4 | /* eslint-disable no-restricted-imports */ 5 | // Auto-generated by "yarn fix-grommet-icons-types" 6 | // This is needed because grommet-icons does not define types for each individual icon file 7 | `.trim() 8 | 9 | const generatedFileName = 'src/types/fix-grommet-icons-types.d.ts' 10 | 11 | const iconNames = fs 12 | .readFileSync('node_modules/grommet-icons/es6/icons/index.d.ts', 'utf8') 13 | .split('\n') 14 | .map(line => line.match(/^export declare const (\w+): Icon;$/)?.[1]) 15 | .filter(iconName => iconName) 16 | 17 | const moduleDeclarations = iconNames.map( 18 | iconName => ` 19 | declare module 'grommet-icons/es6/icons/${iconName}' { 20 | import { Icon } from 'grommet-icons/es6/icons' 21 | export declare const ${iconName}: Icon 22 | }`, 23 | ) 24 | 25 | fs.writeFileSync(generatedFileName, [fileHeader, ...moduleDeclarations, ''].join('\n'), 'utf8') 26 | -------------------------------------------------------------------------------- /internals/scripts/gitlint.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // https://github.com/oasisprotocol/oasis-core/blob/50d972df71fed2bcaa88e6ce5430d919ec08087d/common.mk#L171-L180 3 | const execSync = require('child_process').execSync 4 | 5 | const GIT_ORIGIN_REMOTE = 'origin' 6 | const RELEASE_BRANCH = 'master' 7 | const BRANCH = `${GIT_ORIGIN_REMOTE}/${RELEASE_BRANCH}` 8 | const COMMIT_SHA = require('child_process').execSync(`git rev-parse ${BRANCH}`).toString().trim() 9 | 10 | console.log(`*** Running gitlint for commits from ${BRANCH} (${COMMIT_SHA})`) 11 | 12 | try { 13 | execSync(`gitlint --commits ${BRANCH}..HEAD`, { stdio: 'inherit' }) 14 | } catch (error) { 15 | process.exit(1) 16 | } 17 | -------------------------------------------------------------------------------- /internals/scripts/normalize-translations.js: -------------------------------------------------------------------------------- 1 | /** 2 | * "Download for use" from Transifex includes English strings for untranslated. 3 | * "Download file to translate" includes empty strings instead. This removes 4 | * empty strings and then empty groups. react-i18next will automatically 5 | * use the English version of the string, if the translation does not exist. 6 | * 7 | * Usage: `node ./normalize-translations.js ./path/*.json` 8 | */ 9 | 10 | const paths = process.argv.slice(2) 11 | paths.forEach(path => { 12 | const translationStr = require('fs').readFileSync(path, 'utf-8') 13 | 14 | const cleanedUpTranslation = JSON.stringify( 15 | JSON.parse(translationStr, (k, v) => { 16 | if (v === '') return // Remove untranslated "" fields 17 | if (Object.getPrototypeOf(v) === Object.prototype && Object.keys(v).length === 0) return // Remove empty groups {} 18 | return v 19 | }), 20 | null, 21 | 2, 22 | ) 23 | 24 | require('fs').writeFileSync(path, `${cleanedUpTranslation}\n`, 'utf-8') 25 | }) 26 | -------------------------------------------------------------------------------- /internals/scripts/print-extension-dev-csp.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const { getCsp } = require('../getSecurityHeaders.js') 3 | console.log(getCsp({ isDev: true, isExtension: true })) 4 | -------------------------------------------------------------------------------- /internals/scripts/validate-ext-manifest.js: -------------------------------------------------------------------------------- 1 | const manifest = require('../../build-ext/manifest.json') 2 | 3 | if (manifest.content_security_policy.extension_pages.includes('EXTENSION_CSP')) { 4 | console.error('CSP rules were not injected by parcel-transformer-env-variables-injection!') 5 | process.exit(1) 6 | } 7 | -------------------------------------------------------------------------------- /internals/testing/loadable.mock.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | 3 | export function ExportedFunc() { 4 | return
My lazy-loaded component
5 | } 6 | export default ExportedFunc 7 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | App/build 2 | App/Pods 3 | App/output 4 | App/App/public 5 | DerivedData 6 | xcuserdata 7 | 8 | # Cordova plugins for Capacitor 9 | capacitor-cordova-ios-plugins 10 | 11 | # Generated Config files 12 | App/App/capacitor.config.json 13 | App/App/config.xml 14 | -------------------------------------------------------------------------------- /ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/App/App.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "size": "1024x1024", 6 | "filename": "AppIcon-512@2x.png", 7 | "platform": "ios" 8 | } 9 | ], 10 | "info": { 11 | "author": "xcode", 12 | "version": 1 13 | } 14 | } -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany-dark.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/Splash.imageset/Default@1x~universal~anyany.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany-dark.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/Splash.imageset/Default@2x~universal~anyany.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany-dark.png -------------------------------------------------------------------------------- /ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/ios/App/App/Assets.xcassets/Splash.imageset/Default@3x~universal~anyany.png -------------------------------------------------------------------------------- /ios/App/App/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /ios/App/Podfile: -------------------------------------------------------------------------------- 1 | require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' 2 | 3 | platform :ios, '13.0' 4 | use_frameworks! 5 | 6 | # workaround to avoid Xcode caching of Pods that requires 7 | # Product -> Clean Build Folder after new Cordova plugins installed 8 | # Requires CocoaPods 1.6 or newer 9 | install! 'cocoapods', :disable_input_output_paths => true 10 | 11 | def capacitor_pods 12 | pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' 13 | pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' 14 | pod 'CapacitorCommunityBluetoothLe', :path => '../../node_modules/@capacitor-community/bluetooth-le' 15 | pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' 16 | pod 'CapawesomeCapacitorAppUpdate', :path => '../../node_modules/@capawesome/capacitor-app-update' 17 | end 18 | 19 | target 'App' do 20 | capacitor_pods 21 | # Add your Pods here 22 | end 23 | 24 | post_install do |installer| 25 | assertDeploymentTarget(installer) 26 | end 27 | -------------------------------------------------------------------------------- /ios/App/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Capacitor (5.0.4): 3 | - CapacitorCordova 4 | - CapacitorCommunityBluetoothLe (3.0.0): 5 | - Capacitor 6 | - CapacitorCordova (5.0.4) 7 | 8 | DEPENDENCIES: 9 | - "Capacitor (from `../../node_modules/@capacitor/ios`)" 10 | - "CapacitorCommunityBluetoothLe (from `../../node_modules/@capacitor-community/bluetooth-le`)" 11 | - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)" 12 | 13 | EXTERNAL SOURCES: 14 | Capacitor: 15 | :path: "../../node_modules/@capacitor/ios" 16 | CapacitorCommunityBluetoothLe: 17 | :path: "../../node_modules/@capacitor-community/bluetooth-le" 18 | CapacitorCordova: 19 | :path: "../../node_modules/@capacitor/ios" 20 | 21 | SPEC CHECKSUMS: 22 | Capacitor: d3d4463573438b9fa65326d1f3549da6f4c21634 23 | CapacitorCommunityBluetoothLe: f2cab9f83b1ac5568c6450f39ad6c8553c64ef16 24 | CapacitorCordova: b1fe6bf1f36974a8e4a9044b342d22d49c0996d6 25 | 26 | PODFILE CHECKSUM: 47998e176d73fb1dcd46c2cd81d1fab8a9f392d8 27 | 28 | COCOAPODS: 1.12.1 29 | -------------------------------------------------------------------------------- /playwright/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | /test-results/ 3 | /playwright-report/ 4 | /playwright/.cache/ 5 | -------------------------------------------------------------------------------- /playwright/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@oasisprotocol/rose-wallet-playwright-test", 3 | "version": "0.0.0-development", 4 | "private": true, 5 | "scripts": { 6 | "test": "playwright test --project main", 7 | "test:prod": "BASE_URL=http://localhost:5000 EXTENSION_PATH=../build-ext/ playwright test --project main", 8 | "test:screenshots": "playwright test --project screenshots" 9 | }, 10 | "devDependencies": { 11 | "@playwright/test": "1.46.1", 12 | "serve-handler": "6.1.6" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-1.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-2.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-3.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-4.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-5.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-6.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-7.png -------------------------------------------------------------------------------- /playwright/screenshots/extension-store-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/playwright/screenshots/extension-store-8.png -------------------------------------------------------------------------------- /playwright/serve-prod.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const path = require('path') 3 | const http = require('http') 4 | const serveHandler = require('serve-handler') 5 | const { getCsp, getPermissionsPolicy } = require('../internals/getSecurityHeaders.js') 6 | const csp = getCsp({ isDev: false, isExtension: false }) 7 | const permissionsPolicy = getPermissionsPolicy() 8 | console.log(`Content-Security-Policy: ${csp}\n`) 9 | console.log(`Permissions-Policy: ${permissionsPolicy}\n`) 10 | 11 | const root = path.resolve(__dirname, '..') 12 | 13 | const server = http.createServer((request, response) => { 14 | return serveHandler(request, response, { 15 | public: path.join(root, 'build'), 16 | rewrites: [ 17 | { 18 | source: '**', 19 | destination: '/index.html', 20 | }, 21 | ], 22 | // Disable etag so we don't need to clear cache if we only change CSP. 23 | etag: false, 24 | headers: [ 25 | { 26 | source: '**', 27 | headers: [ 28 | { 29 | key: 'Content-Security-Policy', 30 | value: csp, 31 | }, 32 | { 33 | key: 'Permissions-Policy', 34 | value: permissionsPolicy, 35 | }, 36 | ], 37 | }, 38 | ], 39 | }) 40 | }) 41 | 42 | server.listen(5000, () => { 43 | console.log('Running at http://localhost:5000') 44 | }) 45 | -------------------------------------------------------------------------------- /playwright/tests/csp-react-error-overlay.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test' 2 | import { expectNoErrorsInConsole } from '../utils/expectNoErrorsInConsole' 3 | 4 | test('Dev Content-Security-Policy should allow @parcel/error-overlay', async ({ page, baseURL }) => { 5 | if (baseURL !== 'http://localhost:3000') test.skip() 6 | expect((await page.request.head('/')).headers()).toHaveProperty('content-security-policy') 7 | await page.goto('/e2e') 8 | await page.getByRole('button', { name: 'Trigger uncaught error' }).click() 9 | await expectNoErrorsInConsole(page) 10 | await expect(page.getByText('ReferenceError')).toBeVisible({ timeout: 30_000 }) 11 | }) 12 | -------------------------------------------------------------------------------- /playwright/tests/generated-mnemonics.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test' 2 | import { E2EWindow } from '../../src/app/pages/E2EPage/E2EWindow' 3 | 4 | // Prevent https://blog.ledger.com/Funds-of-every-wallet-created-with-the-Trust-Wallet-browser-extension-could-have-been-stolen/ 5 | // or https://milksad.info/disclosure.html 6 | test('Generated mnemonics should have more than 32 bits of entropy (thus no collisions in 250_000 rounds)', async ({ 7 | page, 8 | }) => { 9 | await page.goto('/e2e') 10 | 11 | const numberOfMnemonics = await page.evaluate(async () => { 12 | const { oasis } = window as E2EWindow 13 | const generatedMnemonics = new Set( 14 | [...new Array(250_000)].map(() => oasis.hdkey.HDKey.generateMnemonic(256)), 15 | ) 16 | return generatedMnemonics.size 17 | }) 18 | expect(numberOfMnemonics).toBe(250_000) 19 | }) 20 | -------------------------------------------------------------------------------- /playwright/tests/home.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test' 2 | import { warnSlowApi } from '../utils/warnSlowApi' 3 | import { mockApi } from '../utils/mockApi' 4 | 5 | test.beforeEach(async ({ context }) => { 6 | await warnSlowApi(context) 7 | await mockApi(context, '0') 8 | }) 9 | 10 | test.describe('The homepage should load', () => { 11 | test('should have options to open the wallet', async ({ page }) => { 12 | await page.goto('/') 13 | await expect(page.getByRole('link', { name: /Open wallet/i })).toBeVisible() 14 | await expect(page.getByRole('link', { name: /Create wallet/i })).toBeVisible() 15 | }) 16 | }) 17 | -------------------------------------------------------------------------------- /playwright/tests/ledger.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test' 2 | import { expectNoErrorsInConsole } from '../utils/expectNoErrorsInConsole' 3 | 4 | test.describe('Ledger', () => { 5 | test('Permissions-Policy should allow USB', async ({ page }) => { 6 | expect((await page.request.head('/')).headers()).toHaveProperty('permissions-policy') 7 | await expectNoErrorsInConsole(page) 8 | 9 | await page.goto('/open-wallet/ledger/usb') 10 | await page.getByRole('button', { name: 'Select accounts to open' }).click() 11 | await expect(page.getByText('error').or(page.getByText('fail'))).toBeHidden() 12 | }) 13 | }) 14 | -------------------------------------------------------------------------------- /playwright/tests/monitor-paratime-withdraw-gas.spec.ts-snapshots/Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-mainnet-cipher-1-main-linux.txt: -------------------------------------------------------------------------------- 1 | 4106320 -------------------------------------------------------------------------------- /playwright/tests/monitor-paratime-withdraw-gas.spec.ts-snapshots/Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-mainnet-emerald-1-main-linux.txt: -------------------------------------------------------------------------------- 1 | 61316 -------------------------------------------------------------------------------- /playwright/tests/monitor-paratime-withdraw-gas.spec.ts-snapshots/Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-mainnet-sapphire-1-main-linux.txt: -------------------------------------------------------------------------------- 1 | 61316 -------------------------------------------------------------------------------- /playwright/tests/monitor-paratime-withdraw-gas.spec.ts-snapshots/Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-testnet-cipher-1-main-linux.txt: -------------------------------------------------------------------------------- 1 | 4106320 -------------------------------------------------------------------------------- /playwright/tests/monitor-paratime-withdraw-gas.spec.ts-snapshots/Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-testnet-emerald-1-main-linux.txt: -------------------------------------------------------------------------------- 1 | 61316 -------------------------------------------------------------------------------- /playwright/tests/monitor-paratime-withdraw-gas.spec.ts-snapshots/Check-if-hardcoded-Paratime-withdraw-gas-limit-needs-to-be-updated-testnet-sapphire-1-main-linux.txt: -------------------------------------------------------------------------------- 1 | 61316 -------------------------------------------------------------------------------- /playwright/tests/oasis-scan-v2.spec.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test' 2 | 3 | test('validate if API is missing historical data', async ({ request }) => { 4 | const expectedResponse = { 5 | code: 0, 6 | message: 'OK', 7 | data: null, 8 | } 9 | 10 | const response = await request.get('https://www.oasisscan.com/v2/mainnet/chain/block/16817955') 11 | if (response.status() === 200) { 12 | const jsonResponse = await response.json() 13 | expect(jsonResponse).toEqual(expectedResponse) 14 | } else { 15 | console.warn(`Skipping V2 test due to API issues: ${response.status()}`) 16 | } 17 | }) 18 | -------------------------------------------------------------------------------- /playwright/tests/warnSlowApi.spec.ts: -------------------------------------------------------------------------------- 1 | import { test } from '@playwright/test' 2 | import { warnSlowApi } from '../utils/warnSlowApi' 3 | 4 | test.beforeEach(async ({ page }) => { 5 | await warnSlowApi(page) 6 | }) 7 | 8 | test('warnSlowApi should not throw if test ends before it measures response time', async ({ page }) => { 9 | await page.goto('/open-wallet/private-key', { waitUntil: 'domcontentloaded' }) 10 | }) 11 | -------------------------------------------------------------------------------- /playwright/utils/expectNoFatal.ts: -------------------------------------------------------------------------------- 1 | import { BrowserContext, TestInfo, expect } from '@playwright/test' 2 | 3 | export async function expectNoFatal(context: BrowserContext, testInfo: TestInfo) { 4 | for (const page of context.pages()) { 5 | const fatalError = (await page.getByTestId('fatalerror-stacktrace').elementHandles())[0] 6 | if (fatalError && testInfo.expectedStatus !== 'failed') { 7 | console.error('fatalerror-stacktrace', await fatalError.textContent()) 8 | } 9 | expect(fatalError).toBeUndefined() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /playwright/utils/expectShell.ts: -------------------------------------------------------------------------------- 1 | import { execSync } from 'child_process' 2 | import { expect } from '@playwright/test' 3 | 4 | export function expectShell(cmd: string) { 5 | let output: string 6 | try { 7 | output = execSync(cmd, { encoding: 'utf-8' }) 8 | } catch (e: any) { 9 | output = `exit code ${e.status}: ${e.message}` 10 | } 11 | return expect(output) 12 | } 13 | -------------------------------------------------------------------------------- /playwright/utils/warnSlowApi.ts: -------------------------------------------------------------------------------- 1 | import { BrowserContext, Page } from '@playwright/test' 2 | 3 | export async function warnSlowApi(context: BrowserContext | Page) { 4 | await context.route('**', async route => { 5 | await route.continue() 6 | try { 7 | await (await route.request().response())?.finished() 8 | const url = route.request().url() 9 | const responseTime = route.request().timing().responseEnd 10 | if (responseTime > 500) console.warn('Slow API', `${responseTime}ms`, url) 11 | } catch (e) { 12 | // Ignore error that some requests haven't finished before browser closed. 13 | if (e.message.endsWith('Target page, context or browser has been closed')) return // @playwright/test@<=1.39 14 | if (e.message.endsWith('Test ended.')) return // @playwright/test@>=1.40 15 | throw e 16 | } 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /public/Icon Blue 192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/public/Icon Blue 192.png -------------------------------------------------------------------------------- /public/Icon Blue 512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/public/Icon Blue 512.png -------------------------------------------------------------------------------- /public/Rose Wallet - OpenGraph Banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oasisprotocol/wallet/fff6408cb87c979ee1e338a7b3bd09a34ddea6b0/public/Rose Wallet - OpenGraph Banner.png -------------------------------------------------------------------------------- /public/_locales/en/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "appName": { 3 | "message": "ROSE Wallet", 4 | "description": "The name of the application" 5 | }, 6 | "appDescription": { 7 | "message": "The official non-custodial browser extension wallet for the Oasis Network.", 8 | "description": "The description of the application" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /public/_locales/index.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "code": "en", "name": "English" }, 3 | { "code": "zh_CN", "name": "中文(简体)" } 4 | ] 5 | -------------------------------------------------------------------------------- /public/_locales/zh_CN/messages.json: -------------------------------------------------------------------------------- 1 | { 2 | "appName": { 3 | "message": "Oasis钱包", 4 | "description": "The name of the application" 5 | }, 6 | "appDescription": { 7 | "message": "Oasis官方非托管浏览器插件钱包", 8 | "description": "The description of the application" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /public/app.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/web-manifest-combined.json", 3 | "short_name": "ROSE Wallet", 4 | "name": "The official non-custodial web wallet for the Oasis Network.", 5 | "icons": [ 6 | { 7 | "src": "https://assets.oasis.io/logotypes/favicon.svg", 8 | "sizes": "any", 9 | "type": "image/x-icon" 10 | }, 11 | { 12 | "src": "./Icon Blue 192.png", 13 | "type": "image/png", 14 | "sizes": "192x192" 15 | }, 16 | { 17 | "src": "./Icon Blue 512.png", 18 | "type": "image/png", 19 | "sizes": "512x512" 20 | } 21 | ], 22 | "start_url": ".", 23 | "display": "standalone", 24 | "theme_color": "#000000", 25 | "background_color": "#ffffff" 26 | } 27 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ROSE Wallet 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/service-worker.js: -------------------------------------------------------------------------------- 1 | // Only needed for E2E tests to detect extension ID. 2 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base", ":disableDependencyDashboard"], 4 | "packageRules": [ 5 | { 6 | "groupName": "lint dependencies", 7 | "matchPackagePatterns": ["eslint", "prettier"] 8 | }, 9 | { 10 | "groupName": "test dependencies", 11 | "matchPackagePatterns": ["jest", "testing-library"] 12 | }, 13 | { 14 | "groupName": "react dependencies", 15 | "matchPackagePatterns": ["react"] 16 | }, 17 | { 18 | "groupName": "redux dependencies", 19 | "matchPackagePatterns": ["redux"] 20 | }, 21 | { 22 | "groupName": "i18n dependencies", 23 | "matchPackagePatterns": ["i18n"] 24 | }, 25 | { 26 | "groupName": "TypeScript type definitions", 27 | "matchPackagePatterns": ["@types/"] 28 | }, 29 | { 30 | "groupName": "CI github-actions", 31 | "matchManagers": ["github-actions"] 32 | }, 33 | { 34 | "description": "Packages needed for migration from V0 extension should stay at the pinned version (https://github.com/oasisprotocol/oasis-wallet-ext/blob/master/package.json#L14)", 35 | "matchPackageNames": ["@metamask/browser-passworder"], 36 | "enabled": false 37 | } 38 | ], 39 | "rangeStrategy": "bump" 40 | } 41 | -------------------------------------------------------------------------------- /src/app/__tests__/index.test.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | import { createRenderer } from 'react-test-renderer/shallow' 3 | 4 | import { App } from '../index' 5 | import { useRouteRedirects } from '../useRouteRedirects' 6 | 7 | const renderer = createRenderer() 8 | 9 | jest.mock('../useRouteRedirects') 10 | 11 | describe('', () => { 12 | it('should render and match the snapshot', () => { 13 | renderer.render() 14 | 15 | const renderedOutput = renderer.getRenderOutput() 16 | expect(useRouteRedirects).toHaveBeenCalled() 17 | expect(renderedOutput).toMatchSnapshot() 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /src/app/components/AnchorLink/index.tsx: -------------------------------------------------------------------------------- 1 | import { Anchor, AnchorExtendedProps } from 'grommet/es6/components/Anchor' 2 | import { Link, LinkProps } from 'react-router-dom' 3 | import React from 'react' 4 | 5 | type AnchorLinkProps = LinkProps & AnchorExtendedProps 6 | 7 | /** 8 | * Behaves like {@link Link} and styled like {@link Anchor}. Needed because: 9 | * - Link isn't styled but routes correctly 10 | * - Anchor is styled but does a full reload 11 | */ 12 | export const AnchorLink = (props: AnchorLinkProps) => { 13 | return 14 | } 15 | -------------------------------------------------------------------------------- /src/app/components/BuildBanner/__tests__/index.test.tsx: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react' 2 | import { BuildBanner } from '..' 3 | 4 | function mockLocation(href: string) { 5 | // @ts-expect-error Location isn't optional so typescript complains 6 | delete window.location 7 | // @ts-expect-error Type approximately matches 8 | window.location = new URL(href) 9 | } 10 | 11 | describe('', () => { 12 | const originalLocation = window.location 13 | 14 | beforeEach(() => { 15 | mockLocation('http://localhost/') 16 | }) 17 | afterEach(() => { 18 | window.location = originalLocation 19 | }) 20 | 21 | it('should render warning banner when not on official deploy', () => { 22 | mockLocation('https://lw-new-domain.oasis-wallet.pages.dev/') 23 | render() 24 | 25 | expect(screen.getByText('banner.buildPreview')).toBeInTheDocument() 26 | }) 27 | 28 | it('should not render warning banner on official deploy', () => { 29 | mockLocation('https://wallet.oasis.io/') 30 | render() 31 | 32 | expect(screen.queryByText('banner.buildPreview')).not.toBeInTheDocument() 33 | }) 34 | }) 35 | -------------------------------------------------------------------------------- /src/app/components/Button/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Used for time being until Wallet redesign is done 3 | */ 4 | import styled from 'styled-components' 5 | import { Button, ButtonExtendedProps } from 'grommet/es6/components/Button' 6 | 7 | const StyledButton = styled(Button)` 8 | font-size: 14px; 9 | border-radius: 8px; 10 | border-width: 1px; 11 | border-style: solid; 12 | ` 13 | 14 | interface BrandButtonProps extends ButtonExtendedProps { 15 | brandVariant?: 'brand-blue' | 'brand-gray-medium' 16 | } 17 | 18 | export function BrandButton(props: BrandButtonProps) { 19 | const { brandVariant = 'brand-blue', size = 'large', ...rest } = props 20 | return 21 | } 22 | -------------------------------------------------------------------------------- /src/app/components/ButtonLink/index.tsx: -------------------------------------------------------------------------------- 1 | import { Button, ButtonExtendedProps } from 'grommet/es6/components/Button' 2 | import { Link, To } from 'react-router-dom' 3 | import React from 'react' 4 | 5 | type ButtonLinkProps = Omit & { label: string; to: To } 6 | 7 | /** 8 | * Behaves like {@link Link} and styled like {@link Button}. Needed because: 9 | * - Link isn't styled but routes correctly 10 | * - Button is styled but can't navigate 11 | * - Wrapping Link around Button adds two focusable elements 12 | */ 13 | export const ButtonLink = (props: ButtonLinkProps) => { 14 | const { label, to, ...buttonProps } = props 15 | return ( 16 | 17 |