├── .dockerignore ├── .editorconfig ├── .env ├── .env.development ├── .env.docker ├── .eslintrc.js ├── .github └── workflows │ ├── _validate-npm.yml │ ├── integration.yml │ ├── pull-request-cleanup.yml │ ├── pull-request.yml │ ├── release-please.yml │ └── release.yml ├── .gitignore ├── .postcssrc.js ├── .prettierignore ├── .prettierrc ├── Dockerfile ├── LICENSE ├── README.md ├── babel.config.js ├── backend ├── Dockerfile ├── package-lock.json ├── package.json └── src │ ├── main.js │ ├── send-push-notification.js │ ├── server.js │ └── server.tests.js ├── config.xml ├── config ├── jest │ ├── EmptySvg.vue │ └── globals.js └── webpack │ └── vue-svg-loader.js ├── cypress.config.js ├── designs └── 00-aepp-baseapp.sketch ├── docker-compose.yml ├── docker-compose ├── aeternity.yaml └── init-state.mjs ├── docker ├── nginx.conf └── override-env.sh ├── jest.config.js ├── package-lock.json ├── package.json ├── public ├── .well-known │ ├── apple-app-site-association │ └── assetlinks.json ├── apple-touch-icon.png ├── favicon.ico ├── icon-192x192.png ├── icon-512x512.png ├── icon-grid.png ├── icon-mask-safari.svg ├── icon-maskable-512x512.png ├── icon-receive.png ├── icon.svg └── index.html ├── resources ├── android │ ├── icon-foreground.png │ ├── icon │ │ ├── drawable-hdpi-icon.png │ │ ├── drawable-ldpi-icon.png │ │ ├── drawable-mdpi-icon.png │ │ ├── drawable-xhdpi-icon.png │ │ ├── drawable-xxhdpi-icon.png │ │ ├── drawable-xxxhdpi-icon.png │ │ ├── hdpi-foreground.png │ │ ├── ldpi-foreground.png │ │ ├── mdpi-foreground.png │ │ ├── xhdpi-foreground.png │ │ ├── xxhdpi-foreground.png │ │ └── xxxhdpi-foreground.png │ └── splash │ │ └── icon.png ├── icon.png ├── ios │ ├── icon │ │ ├── icon-1024.png │ │ ├── icon-108@2x.png │ │ ├── icon-20.png │ │ ├── icon-20@2x.png │ │ ├── icon-20@3x.png │ │ ├── icon-24@2x.png │ │ ├── icon-27.5@2x.png │ │ ├── icon-29.png │ │ ├── icon-29@2x.png │ │ ├── icon-29@3x.png │ │ ├── icon-40.png │ │ ├── icon-40@2x.png │ │ ├── icon-40@3x.png │ │ ├── icon-44@2x.png │ │ ├── icon-50.png │ │ ├── icon-50@2x.png │ │ ├── icon-60.png │ │ ├── icon-60@2x.png │ │ ├── icon-60@3x.png │ │ ├── icon-72.png │ │ ├── icon-72@2x.png │ │ ├── icon-76.png │ │ ├── icon-76@2x.png │ │ ├── icon-83.5@2x.png │ │ ├── icon-86@2x.png │ │ ├── icon-98@2x.png │ │ ├── icon.png │ │ └── icon@2x.png │ └── splash │ │ ├── Default-1792h~iphone.png │ │ ├── Default-2436h.png │ │ ├── Default-2688h~iphone.png │ │ ├── Default-568h@2x~iphone.png │ │ ├── Default-667h.png │ │ ├── Default-736h.png │ │ ├── Default-Landscape-1792h~iphone.png │ │ ├── Default-Landscape-2436h.png │ │ ├── Default-Landscape-2688h~iphone.png │ │ ├── Default-Landscape-736h.png │ │ ├── Default-Landscape@2x~ipad.png │ │ ├── Default-Landscape@~ipadpro.png │ │ ├── Default-Landscape~ipad.png │ │ ├── Default-Portrait@2x~ipad.png │ │ ├── Default-Portrait@~ipadpro.png │ │ ├── Default-Portrait~ipad.png │ │ ├── Default@2x~iphone.png │ │ ├── Default@2x~universal~anyany.png │ │ └── Default~iphone.png ├── splash.png └── values │ ├── colors.xml │ └── styles.xml ├── src ├── App.vue ├── AppDesktop.vue ├── assets │ ├── account-card.svg │ ├── base-aepp-confirm.svg │ ├── icons │ │ ├── aepp-default.svg │ │ ├── base.svg │ │ ├── inline │ │ │ ├── active.svg │ │ │ ├── add-contact.svg │ │ │ ├── arrow-chart.svg │ │ │ ├── arrow-double.svg │ │ │ ├── back.svg │ │ │ ├── bold.svg │ │ │ ├── bookmark-full.svg │ │ │ ├── bookmark.svg │ │ │ ├── burger.svg │ │ │ ├── camera.svg │ │ │ ├── card.svg │ │ │ ├── chat.svg │ │ │ ├── check.svg │ │ │ ├── clock.svg │ │ │ ├── close-circle.svg │ │ │ ├── close.svg │ │ │ ├── contacts.svg │ │ │ ├── copy.svg │ │ │ ├── currency.svg │ │ │ ├── delete.svg │ │ │ ├── device.svg │ │ │ ├── diagram.svg │ │ │ ├── edit.svg │ │ │ ├── eye.svg │ │ │ ├── filter.svg │ │ │ ├── flip.svg │ │ │ ├── github.svg │ │ │ ├── globe.svg │ │ │ ├── grid.svg │ │ │ ├── headline.svg │ │ │ ├── home.svg │ │ │ ├── info-circle.svg │ │ │ ├── info.svg │ │ │ ├── italic.svg │ │ │ ├── key.svg │ │ │ ├── left-more.svg │ │ │ ├── link-alternative.svg │ │ │ ├── link.svg │ │ │ ├── list.svg │ │ │ ├── lock-open.svg │ │ │ ├── more.svg │ │ │ ├── network.svg │ │ │ ├── paste.svg │ │ │ ├── plus.svg │ │ │ ├── question-circle.svg │ │ │ ├── receive.svg │ │ │ ├── reload.svg │ │ │ ├── save.svg │ │ │ ├── search.svg │ │ │ ├── settings.svg │ │ │ ├── share.svg │ │ │ ├── shield-fill.svg │ │ │ ├── shield.svg │ │ │ ├── sign-out.svg │ │ │ ├── square.svg │ │ │ ├── transfer.svg │ │ │ ├── underline.svg │ │ │ ├── vote.svg │ │ │ └── x-square.svg │ │ ├── rabbit.svg │ │ └── turtle.svg │ ├── intro.svg │ ├── ledger-logo.svg │ ├── ledger-nano-s.svg │ ├── onboarding │ │ ├── aepps.svg │ │ ├── phones.svg │ │ ├── send.svg │ │ └── subaccounts.svg │ ├── security-courses │ │ ├── bank.svg │ │ ├── eye.svg │ │ ├── layers.svg │ │ └── warning.svg │ └── switch-to-chrome.svg ├── components │ ├── AccountInline.vue │ ├── AeAccount.vue │ ├── AeAddress.vue │ ├── AeButton.vue │ ├── AeButtonGroup.vue │ ├── AeCard.vue │ ├── AeFraction.vue │ ├── AeIdenticon.vue │ ├── AeInput.vue │ ├── AeInputAccount.vue │ ├── AeInputAmount.vue │ ├── AeInputAmountCurrency.vue │ ├── AeInputMnemonic.vue │ ├── AeInputName.js │ ├── AeInputPassword.vue │ ├── AeInputPlain.vue │ ├── AeInputRange.vue │ ├── AeInputWrapper.vue │ ├── AeLink.vue │ ├── AeMenu.vue │ ├── AeMenuItem.vue │ ├── AeModal.vue │ ├── AePopover.vue │ ├── AeQrCode.vue │ ├── AeRadio.vue │ ├── AeSpinner.vue │ ├── AeTextarea.vue │ ├── AeToolbar.vue │ ├── AeToolbarButton.vue │ ├── AlertModal.vue │ ├── AppShortcut.vue │ ├── Balance.vue │ ├── ButtonAddFixed.vue │ ├── ButtonPlain.vue │ ├── ConfirmAccountAccess.vue │ ├── ConnectionStatus.vue │ ├── CurrencySwitcher.vue │ ├── Guide.vue │ ├── IconGroup.vue │ ├── LanguageSwitcher.vue │ ├── ListItem.vue │ ├── ListItemAccount.vue │ ├── ListItemButton.vue │ ├── ListItemChoose.vue │ ├── ListItemCircle.vue │ ├── ListItemSettingsLanguage.vue │ ├── ListItemSettingsReset.vue │ ├── ListItemTransaction.vue │ ├── ModalPlain.vue │ ├── NetworkAdd.vue │ ├── NetworkSwitcher.vue │ ├── Note.vue │ ├── Notification.vue │ ├── NotificationSpendSuccess.vue │ ├── NotificationUpdateAvailable.vue │ ├── Overlay.vue │ ├── Page.vue │ ├── PageHeader.vue │ ├── Progress.vue │ ├── ProgressFake.vue │ ├── QrCodeReader.vue │ ├── SettingsVersion.vue │ ├── __tests__ │ │ ├── AeInputAccount.js │ │ └── AeLink.js │ ├── async.js │ ├── copied.scss │ ├── desktop │ │ ├── AccountSwitcher.vue │ │ ├── AccountTypeMixin.js │ │ ├── AeAddressPanel.vue │ │ ├── CancelSignModal.vue │ │ ├── ConnectGuide.vue │ │ ├── CreateOrRecover.vue │ │ ├── Header.vue │ │ ├── LedgerAccountNotFoundModal.vue │ │ ├── LedgerAddressConfirmModal.vue │ │ ├── LedgerAddressNotConfirmedModal.vue │ │ ├── LedgerModal.vue │ │ ├── LedgerModalNanoS.vue │ │ ├── LedgerModalNote.vue │ │ ├── LedgerRequestModal.vue │ │ ├── LedgerRequestRetryModal.vue │ │ ├── LedgerSignTransactionModal.vue │ │ ├── LedgerTransactionFeeModal.vue │ │ ├── Modal.vue │ │ ├── ModalHeader.vue │ │ ├── ModalSpendSuccess.vue │ │ ├── Sidebar.vue │ │ ├── SidebarModal.vue │ │ └── Step.vue │ ├── icon.scss │ ├── icons.js │ └── mobile │ │ ├── AccountSwitcherModal.vue │ │ ├── AeAccountReverse.vue │ │ ├── ButtonFlat.vue │ │ ├── ButtonGroup.vue │ │ ├── ButtonMnemonicWord.vue │ │ ├── ConfirmAccountAccessModal.vue │ │ ├── ConfirmSignModal.vue │ │ ├── ConfirmTransactionSignModal.vue │ │ ├── DetailsAccountAccessPermission.vue │ │ ├── DetailsAddress.vue │ │ ├── DetailsAmount.vue │ │ ├── DetailsAmountAndFee.vue │ │ ├── DetailsAmountCurrency.vue │ │ ├── DetailsFeeInput.vue │ │ ├── DetailsField.vue │ │ ├── DetailsItem.vue │ │ ├── DetailsList.vue │ │ ├── DetailsNamePointers.vue │ │ ├── DetailsPermission.vue │ │ ├── DetailsRawData.vue │ │ ├── DetailsRow.vue │ │ ├── ListItemAuction.vue │ │ ├── ListItemBid.vue │ │ ├── MnemonicBackupWarning.vue │ │ ├── Modal.vue │ │ ├── NameListHeader.vue │ │ ├── NotificationMnemonicBackup.vue │ │ ├── PasswordModal.vue │ │ ├── PasswordPurpose.vue │ │ ├── SecurityCourseModal.vue │ │ ├── TabBar.vue │ │ ├── Tooltip.vue │ │ ├── TooltipsModal.vue │ │ ├── UrlForm.vue │ │ ├── VaultSignModal.vue │ │ ├── __tests__ │ │ └── UrlForm.js │ │ └── details-fields.js ├── directives │ ├── copyOnClick.js │ └── removeSpacesOnCopy.js ├── filters │ ├── __tests__ │ │ ├── formatAddress.js │ │ └── prefixedAmount.js │ ├── blocksToRelativeTime.js │ ├── currencyAmount.js │ ├── formatAddress.js │ └── prefixedAmount.js ├── lib │ ├── __mocks__ │ │ └── sdkWallet.js │ ├── __tests__ │ │ ├── aes.js │ │ └── rpc.js │ ├── aes.js │ ├── airGap.js │ ├── appsRegistry.json │ ├── constants.js │ ├── localStorageCall.js │ ├── methods.js │ ├── networksRegistry.js │ ├── renderQrCodeSvg.js │ ├── rpc.js │ ├── sdkWallet.js │ ├── setGlobalPolyfills.js │ ├── spendTxFees.js │ ├── storeErrorHandler.js │ ├── utils.js │ ├── vuexRouterSync.js │ └── withFormatting.js ├── locales │ ├── cn.json │ ├── en.json │ ├── es.json │ └── ru.json ├── main.js ├── pages │ ├── FullscreenPrompt.vue │ ├── NotFound.vue │ ├── RecoverMixin.js │ ├── SendAmountMixin.js │ ├── StoreLoadError.vue │ ├── aens │ │ ├── AuctionBid.vue │ │ ├── AuctionDetails.vue │ │ ├── AuctionList.vue │ │ ├── NameDetails.vue │ │ ├── NameList.vue │ │ ├── NameNew.vue │ │ └── NameTransfer.vue │ ├── desktop │ │ ├── Apps.vue │ │ ├── Receive.vue │ │ ├── Send.vue │ │ └── Settings.vue │ └── mobile │ │ ├── AddToHomeScreenPrompt.vue │ │ ├── AppBrowser.vue │ │ ├── AppDetails.vue │ │ ├── AppList.vue │ │ ├── Intro.vue │ │ ├── Login.vue │ │ ├── Onboarding.vue │ │ ├── OnboardingAepps.vue │ │ ├── OnboardingPage.scss │ │ ├── OnboardingSend.vue │ │ ├── OnboardingSubaccounts.vue │ │ ├── OnboardingWelcome.vue │ │ ├── Receive.vue │ │ ├── Recover.vue │ │ ├── RedeemBalance.vue │ │ ├── Send.vue │ │ ├── SendAmount.vue │ │ ├── SendConfirm.vue │ │ ├── Settings.vue │ │ ├── SettingsAccountRemove.vue │ │ ├── SettingsAppDetails.vue │ │ ├── SettingsAppList.vue │ │ ├── SettingsCurrency.vue │ │ ├── SettingsInfo.vue │ │ ├── SettingsLanguage.vue │ │ ├── SettingsMnemonic.vue │ │ ├── SettingsMnemonicConfirm.vue │ │ ├── SettingsMnemonicConfirmed.vue │ │ ├── SettingsMnemonicDeleted.vue │ │ ├── SettingsMnemonicShow.vue │ │ ├── SettingsNetwork.vue │ │ ├── SettingsNetworkNew.vue │ │ ├── SettingsPassword.vue │ │ ├── SettingsPasswordSet.vue │ │ ├── SettingsRemoteConnection.vue │ │ ├── SettingsRemoteConnectionNew.vue │ │ ├── SettingsSecurityCourseBank.vue │ │ ├── SettingsSecurityCourseIntro.vue │ │ ├── SettingsSecurityCourseLayers.vue │ │ ├── SettingsSecurityCourseList.vue │ │ ├── SettingsSecurityCoursePrivacy.vue │ │ ├── SettingsSecurityCourseWrapper.vue │ │ ├── TransactionDetails.vue │ │ ├── TransactionList.vue │ │ ├── Transfer.vue │ │ ├── VaultSetup.scss │ │ ├── VaultSetupAnotherDevice.vue │ │ ├── VaultSetupAnotherDeviceGuide.vue │ │ ├── VaultSetupCompleted.vue │ │ ├── VaultSetupMethod.vue │ │ ├── VaultSetupSameDevice.vue │ │ ├── VaultSetupSameDeviceSync.vue │ │ ├── __tests__ │ │ └── AppBrowser.js │ │ └── settingsSecurityCourseList.js ├── popup.js ├── router │ ├── index.js │ ├── modals │ │ ├── desktop.js │ │ ├── index.js │ │ ├── mobile.js │ │ └── utils.js │ ├── routes │ │ ├── common.js │ │ ├── desktop.js │ │ └── mobile.js │ └── utils.js ├── service-worker.js ├── store │ ├── index.js │ ├── migrations │ │ ├── 00-removed.js │ │ ├── __tests__ │ │ │ └── runner.js │ │ ├── index.js │ │ └── runner.js │ ├── modules │ │ ├── accounts │ │ │ ├── airGap.js │ │ │ ├── hdWallet.js │ │ │ ├── hdWalletRemote.js │ │ │ ├── index.js │ │ │ ├── ledger.js │ │ │ └── utils.js │ │ ├── desktop.js │ │ ├── mobile.js │ │ └── root.js │ ├── plugins │ │ ├── persistState.js │ │ ├── registerServiceWorker.js │ │ ├── remoteConnection.js │ │ ├── reverseIframe.js │ │ ├── sdk.js │ │ ├── syncLedgerAccounts.js │ │ ├── ui │ │ │ ├── __tests__ │ │ │ │ ├── appsMetadata.js │ │ │ │ ├── assets │ │ │ │ │ ├── manifestMozillaDocs.json │ │ │ │ │ └── manifestTwitter.json │ │ │ │ ├── notificationOnRemoteConnection.js │ │ │ │ └── observables.js │ │ │ ├── appsMetadata.js │ │ │ ├── connectionStatusTracker.js │ │ │ ├── currencies.js │ │ │ ├── desktopGuide.js │ │ │ ├── index.js │ │ │ ├── languages.js │ │ │ ├── ledgerConnection.js │ │ │ ├── modals.js │ │ │ ├── names.js │ │ │ ├── notFoundPage.js │ │ │ ├── notificationOnRemoteConnection.js │ │ │ ├── observables.js │ │ │ ├── pathTracker.js │ │ │ ├── urlRequestHandler.js │ │ │ └── veeValidate.js │ │ └── unlockWalletIfNotEncrypted.js │ └── utils.js ├── styles │ ├── functions.scss │ ├── mixins.scss │ ├── typography.scss │ └── variables.scss ├── ui-common.js └── ui.js ├── tests ├── e2e │ ├── .eslintrc.js │ ├── fixtures │ │ ├── qr-code-videos │ │ │ ├── address.png │ │ │ ├── address.y4m │ │ │ ├── aepp-base-invite.png │ │ │ ├── aepp-base-invite.y4m │ │ │ ├── default.png │ │ │ ├── default.y4m │ │ │ └── generate.sh │ │ ├── state-created-mnemonic-not-backup.json │ │ ├── state-created-mnemonic.json │ │ ├── state-created.json │ │ ├── state-encrypted-test.json │ │ ├── state-encrypted.json │ │ └── state-recovered.json │ ├── specs │ │ ├── __image_snapshots__ │ │ │ ├── Browser shows aepp in browser and bookmarks #0.png │ │ │ ├── Browser shows app details #0.png │ │ │ ├── Browser shows app list #0.png │ │ │ ├── Browser shows app list on desktop #0.png │ │ │ ├── Create or recover account creates new account, goes to security courses #0.png │ │ │ ├── Create or recover account creates new account, goes to security courses #1.png │ │ │ ├── Create or recover account creates new account, goes to security courses #2.png │ │ │ ├── Create or recover account creates new account, goes to security courses #3.png │ │ │ ├── Create or recover account creates new account, goes to security courses #4.png │ │ │ ├── Create or recover account recovers an account, goes to transfer #0.png │ │ │ ├── Create or recover account recovers an account, goes to transfer #1.png │ │ │ ├── Create or recover account recovers an account, goes to transfer #2.png │ │ │ ├── Deep links Get address returns #0.png │ │ │ ├── Deep links Sign raw data signs #0.png │ │ │ ├── Load error fails to load state desktop #0.png │ │ │ ├── Load error fails to load state mobile #0.png │ │ │ ├── Load error load error desktop #0.png │ │ │ ├── Load error load error mobile #0.png │ │ │ ├── Onboarding walks through #0.png │ │ │ ├── Onboarding walks through #1.png │ │ │ ├── Onboarding walks through #2.png │ │ │ └── Onboarding walks through #3.png │ │ ├── browser.cy.js │ │ ├── deep-links.cy.js │ │ ├── intro.cy.js │ │ ├── load-error.cy.js │ │ ├── names │ │ │ ├── __image_snapshots__ │ │ │ │ ├── Auctions bids on auction #0.png │ │ │ │ ├── Auctions starts an auction #0.png │ │ │ │ ├── Long names extends #0.png │ │ │ │ ├── Long names register name #0.png │ │ │ │ ├── Long names set pointer #0.png │ │ │ │ ├── Long names transfer #0.png │ │ │ │ ├── Names shows auctionengine.chain #0.png │ │ │ │ ├── Names shows bidengine.chain #0.png │ │ │ │ ├── Names shows bidengine.chainamount #0.png │ │ │ │ ├── Names shows character-length3 #0.png │ │ │ │ ├── Names shows character-length6 #0.png │ │ │ │ ├── Names shows ending-soonest #0.png │ │ │ │ ├── Names shows initial screen #0.png │ │ │ │ ├── Names shows max-bid #0.png │ │ │ │ ├── Names shows new #0.png │ │ │ │ ├── Names shows personal name details #0.png │ │ │ │ ├── Names shows personalentertainment.chainpoint #0.png │ │ │ │ └── Names shows personalentertainment.chaintransfer #0.png │ │ │ ├── auctions.cy.js │ │ │ ├── index.cy.js │ │ │ └── long-names.cy.js │ │ ├── settings │ │ │ ├── __image_snapshots__ │ │ │ │ ├── Security courses walks through #0.png │ │ │ │ ├── Security courses walks through #1.png │ │ │ │ ├── Security courses walks through #2.png │ │ │ │ ├── Security courses walks through #3.png │ │ │ │ ├── Security courses walks through #4.png │ │ │ │ ├── Security courses walks through #5.png │ │ │ │ ├── Settings mnemonic goes to confirmed #0.png │ │ │ │ ├── Settings mnemonic goes to confirmed #1.png │ │ │ │ ├── Settings mnemonic goes to mnemonic confirm #0.png │ │ │ │ ├── Settings mnemonic goes to mnemonic confirm #1.png │ │ │ │ ├── Settings mnemonic goes to mnemonic confirm #2.png │ │ │ │ ├── Settings mnemonic goes to mnemonic confirm #3.png │ │ │ │ ├── Settings mnemonic removes mnemonic phrase #0.png │ │ │ │ ├── Settings mnemonic shows mnemonic deleted #0.png │ │ │ │ ├── Settings opens #0.png │ │ │ │ ├── Settings opens apps #0.png │ │ │ │ ├── Settings opens currency #0.png │ │ │ │ ├── Settings opens info #0.png │ │ │ │ ├── Settings opens language #0.png │ │ │ │ ├── Settings opens remote-connection #0.png │ │ │ │ ├── Settings password can log out #0.png │ │ │ │ ├── Settings password changes password #0.png │ │ │ │ ├── Settings password logins and removes password #0.png │ │ │ │ ├── Settings password logins and removes password #1.png │ │ │ │ ├── Settings password logins and removes password #2.png │ │ │ │ ├── Settings password sets password #0.png │ │ │ │ ├── Settings password sets password #1.png │ │ │ │ ├── Settings password sets password #2.png │ │ │ │ ├── Settings password sets password #3.png │ │ │ │ └── Settings password shows login at intro screen #0.png │ │ │ ├── index.cy.js │ │ │ ├── mnemonic.cy.js │ │ │ ├── network.cy.js │ │ │ ├── password.cy.js │ │ │ └── security-courses.cy.js │ │ └── transfer │ │ │ ├── __image_snapshots__ │ │ │ ├── Sign transaction shows ContractCallTx details #0.png │ │ │ ├── Sign transaction shows ContractCreateTx details #0.png │ │ │ ├── Sign transaction shows NameClaimTx details #0.png │ │ │ ├── Sign transaction shows NamePreclaimTx details #0.png │ │ │ ├── Sign transaction shows NameRevokeTx details #0.png │ │ │ ├── Sign transaction shows NameTransferTx details #0.png │ │ │ ├── Sign transaction shows NameUpdateTx details #0.png │ │ │ ├── Sign transaction shows OracleExtendTx details #0.png │ │ │ ├── Sign transaction shows OracleQueryTx details #0.png │ │ │ ├── Sign transaction shows OracleRegisterTx details #0.png │ │ │ ├── Sign transaction shows OracleResponseTx details #0.png │ │ │ ├── Sign transaction shows SpendTx details #0.png │ │ │ ├── Sign transaction signs transaction #0.png │ │ │ ├── Transfer Send coins sends coins #0.png │ │ │ ├── Transfer Send coins sends coins #1.png │ │ │ ├── Transfer Send coins sends coins #2.png │ │ │ ├── Transfer Transaction history shows list of transactions #0.png │ │ │ ├── Transfer Transaction history shows transaction details #0.png │ │ │ ├── Transfer opens initial page, check tooltips #0.png │ │ │ ├── Transfer opens initial page, check tooltips #1.png │ │ │ ├── Transfer opens initial page, check tooltips #2.png │ │ │ ├── Transfer opens initial page, check tooltips #3.png │ │ │ ├── Transfer opens initial page, check tooltips #4.png │ │ │ ├── Transfer opens initial page, check tooltips #5.png │ │ │ ├── Transfer opens receive #0.png │ │ │ └── Transfer redeem opens #0.png │ │ │ ├── index.cy.js │ │ │ ├── send-coins.cy.js │ │ │ ├── sign-transaction.cy.js │ │ │ └── transaction-history.cy.js │ ├── support │ │ ├── commands.js │ │ └── index.js │ └── utils.js └── examples │ └── cordova-android-bridge-access │ └── index.html └── vue.config.js /.dockerignore: -------------------------------------------------------------------------------- 1 | * 2 | 3 | !package* 4 | !config 5 | !public 6 | !src 7 | !.env 8 | !.postcssrc.js 9 | !babel.config.js 10 | !vue.config.js 11 | !docker 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [/config.xml] 12 | indent_size = 4 13 | 14 | [*.webmanifest] 15 | indent_size = 4 16 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | VUE_APP_BACKEND_URL=https://base-backend.prd.aepps.com 2 | VUE_APP_VAPID_PUBLIC_KEY=BHkQhNWW2TKfKfxo7vAgXkZGcVOXGrjhIZJlN1hKp6abIjWJgO8FYPswXJ35XEuKw46O9yZ-8KmsZ4-TXNBePcw 3 | -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | VUE_APP_BACKEND_URL=https://base-backend.stg.aepps.com 2 | -------------------------------------------------------------------------------- /.env.docker: -------------------------------------------------------------------------------- 1 | VUE_APP_NETWORK_NAME=Local network 2 | VUE_APP_NODE_URL=http://localhost:3013 3 | VUE_APP_MIDDLEWARE_URL=http://localhost:4000 4 | VUE_APP_EXPLORER_URL=http://localhost:3070 5 | VUE_APP_BACKEND_URL=http://localhost:3079 6 | -------------------------------------------------------------------------------- /.github/workflows/_validate-npm.yml: -------------------------------------------------------------------------------- 1 | on: 2 | workflow_call: 3 | 4 | jobs: 5 | build_test: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v4 9 | with: 10 | ref: ${{ github.head_ref }} 11 | - uses: actions/setup-node@v4 12 | with: 13 | node-version: 20.x 14 | cache: npm 15 | - run: npm ci 16 | working-directory: backend 17 | - run: npm test 18 | working-directory: backend 19 | - run: npm ci --legacy-peer-deps # TODO: remove --legacy-peer-deps after updating dependencies 20 | - run: docker compose up middleware -d --wait --quiet-pull 21 | - run: ./docker-compose/init-state.mjs 22 | - run: npm test 23 | - uses: stefanzweifel/git-auto-commit-action@v5 24 | if: failure() 25 | with: 26 | commit_message: 'fixme: update e2e screenshots' 27 | file_pattern: tests/e2e/*.png 28 | - run: docker compose logs 29 | if: always() 30 | -------------------------------------------------------------------------------- /.github/workflows/integration.yml: -------------------------------------------------------------------------------- 1 | name: integration 2 | 3 | on: 4 | push: 5 | branches: [develop] 6 | 7 | jobs: 8 | validate: 9 | uses: ./.github/workflows/_validate-npm.yml 10 | publish: 11 | uses: aeternity/github-actions/.github/workflows/_publish-ecr.yml@v2.3.1 12 | needs: [validate] 13 | secrets: inherit 14 | with: 15 | BUILD_ARGS: REVISION=${{ github.sha }} 16 | deploy: 17 | uses: aeternity/github-actions/.github/workflows/_deploy-gitops.yml@v2.3.1 18 | needs: [publish] 19 | secrets: inherit 20 | with: 21 | DEPLOY_ENV: stg 22 | DEPLOY_APP: '${{ github.event.repository.name }}' 23 | DEPLOY_VERSION: develop 24 | DEPLOY_SUBDOMAIN: 'base' 25 | -------------------------------------------------------------------------------- /.github/workflows/pull-request-cleanup.yml: -------------------------------------------------------------------------------- 1 | name: pull-request-cleanup 2 | 3 | on: 4 | pull_request: 5 | branches: [master, develop] 6 | types: [closed] 7 | 8 | jobs: 9 | rollback: 10 | uses: aeternity/github-actions/.github/workflows/_rollback-gitops.yml@v2.3.1 11 | secrets: inherit 12 | with: 13 | DEPLOY_ENV: stg 14 | DEPLOY_APP: ${{ github.event.repository.name }} 15 | DEPLOY_VERSION: pr-${{ github.event.number }} 16 | DEPLOY_SUBDOMAIN: pr-${{ github.event.number }}-base 17 | delete-tag: 18 | uses: aeternity/github-actions/.github/workflows/_delete-tag-ecr.yml@v2.3.1 19 | secrets: inherit 20 | with: 21 | TAG: pr-${{ github.event.number }} 22 | cleanup: 23 | uses: aeternity/github-actions/.github/workflows/_cleanup-ecr.yml@v2.3.1 24 | needs: [delete-tag] 25 | secrets: inherit 26 | -------------------------------------------------------------------------------- /.github/workflows/pull-request.yml: -------------------------------------------------------------------------------- 1 | name: pull-request 2 | 3 | on: 4 | pull_request: 5 | branches: [master, develop] 6 | 7 | jobs: 8 | validate: 9 | uses: ./.github/workflows/_validate-npm.yml 10 | publish: 11 | uses: aeternity/github-actions/.github/workflows/_publish-ecr.yml@v2.3.1 12 | needs: [validate] 13 | secrets: inherit 14 | with: 15 | BUILD_ARGS: REVISION=${{ github.sha }} 16 | deploy: 17 | uses: aeternity/github-actions/.github/workflows/_deploy-gitops.yml@v2.3.1 18 | needs: [publish] 19 | secrets: inherit 20 | with: 21 | DEPLOY_ENV: stg 22 | DEPLOY_APP: ${{ github.event.repository.name }} 23 | DEPLOY_VERSION: pr-${{ github.event.number }} 24 | DEPLOY_SUBDOMAIN: pr-${{ github.event.number }}-base 25 | -------------------------------------------------------------------------------- /.github/workflows/release-please.yml: -------------------------------------------------------------------------------- 1 | name: release-please 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | 7 | jobs: 8 | release-please: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: GoogleCloudPlatform/release-please-action@v2 12 | id: release 13 | with: 14 | token: ${{ secrets.GITHUB_TOKEN }} 15 | release-type: node 16 | package-name: '' 17 | changelog-types: '[{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"ci","section":"CI / CD","hidden":false},{"type":"test","section":"Testing","hidden":false},{"type":"refactor","section":"Refactorings","hidden":false},{"type":"chore","section":"Miscellaneous","hidden":false}]' 18 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | push: 5 | tags: [v*] 6 | 7 | jobs: 8 | publish: 9 | uses: aeternity/github-actions/.github/workflows/_publish-ecr.yml@v2.3.1 10 | secrets: inherit 11 | with: 12 | BUILD_ARGS: REVISION=${{ github.sha }} 13 | deploy: 14 | uses: aeternity/github-actions/.github/workflows/_deploy-gitops.yml@v2.3.1 15 | needs: [publish] 16 | secrets: inherit 17 | with: 18 | DEPLOY_ENV: prd 19 | DEPLOY_APP: ${{ github.event.repository.name }} 20 | DEPLOY_TAG: ${{ github.ref_name }} 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | __image_snapshots_local__ 5 | tests/e2e/fixtures/qr-code-videos/video.y4m 6 | 7 | # Cordova files 8 | /www 9 | /platforms 10 | /plugins 11 | 12 | # local env files 13 | .env.local 14 | .env.*.local 15 | 16 | # Log files 17 | npm-debug.log* 18 | yarn-debug.log* 19 | yarn-error.log* 20 | 21 | # Editor directories and files 22 | .idea 23 | .vscode 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw* 29 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | www 2 | platforms 3 | plugins 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine as aepp-aepp-base-build 2 | WORKDIR /app 3 | RUN apk add make g++ python3 git 4 | 5 | ADD package*.json ./ 6 | # TODO: remove --legacy-peer-deps after updating dependencies 7 | RUN npm ci --legacy-peer-deps 8 | 9 | COPY . . 10 | 11 | ARG REVISION 12 | ENV VUE_APP_REVISION $REVISION 13 | 14 | # TODO: remove legacy openssl after updating @vue/cli 15 | RUN NODE_OPTIONS=--openssl-legacy-provider npm run build -- --report 16 | 17 | FROM nginx:1.24-alpine 18 | COPY docker/nginx.conf /etc/nginx/nginx.conf 19 | COPY docker/override-env.sh /docker-entrypoint.d 20 | COPY --from=aepp-aepp-base-build /app/dist /usr/share/nginx/html 21 | RUN cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.template.html 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2024, aeternity developers 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 10 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 12 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 | OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 | PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'], 3 | plugins: ['@babel/plugin-syntax-import-attributes', '@babel/plugin-transform-private-methods'], 4 | }; 5 | -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine 2 | WORKDIR /app 3 | 4 | COPY package*.json ./ 5 | RUN npm ci 6 | 7 | COPY src src 8 | EXPOSE 80 9 | ENV PORT=80 10 | 11 | ARG REVISION 12 | ENV REVISION $REVISION 13 | 14 | CMD [ "node", "src/main.js" ] 15 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aepp-base-backend", 3 | "version": "1.3.0", 4 | "scripts": { 5 | "test": "mocha 'src/*.tests.js'", 6 | "start": "node src/main.js" 7 | }, 8 | "type": "module", 9 | "author": "Denis Davidyuk ", 10 | "private": true, 11 | "license": "ISC", 12 | "dependencies": { 13 | "socket.io": "^4.8.1", 14 | "web-push": "^3.6.7" 15 | }, 16 | "devDependencies": { 17 | "chai": "^5.2.0", 18 | "mocha": "^11.1.0", 19 | "socket.io-client": "^4.8.1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/src/main.js: -------------------------------------------------------------------------------- 1 | import createServer from './server.js'; 2 | 3 | // eslint-disable-next-line no-console 4 | const io = createServer(process.env.PORT ?? 8079, console.log); 5 | 6 | process.on('SIGINT', () => io.close()); 7 | process.on('SIGTERM', () => io.close()); 8 | -------------------------------------------------------------------------------- /backend/src/send-push-notification.js: -------------------------------------------------------------------------------- 1 | import webPush from 'web-push'; 2 | 3 | export default async (pushApiSubscription) => { 4 | if (['not-available', 'errored', 'not-allowed'].includes(pushApiSubscription)) { 5 | throw new Error(`subscription not available, ${pushApiSubscription}`); 6 | } 7 | webPush.setVapidDetails( 8 | 'https://github.com/aeternity/aepp-base/issues', 9 | process.env.VAPID_PUBLIC_KEY ?? 10 | 'BHkQhNWW2TKfKfxo7vAgXkZGcVOXGrjhIZJlN1hKp6abIjWJgO8FYPswXJ35XEuKw46O9yZ-8KmsZ4-TXNBePcw', 11 | process.env.VAPID_PRIVATE_KEY ?? 'mwSZbWF_yU_h1gXlqlBy9cOfkOF-Pa0jhHxbTFXdhFE', 12 | ); 13 | const subscription = JSON.parse(pushApiSubscription); 14 | await webPush.sendNotification(subscription); 15 | }; 16 | -------------------------------------------------------------------------------- /config/jest/EmptySvg.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /config/jest/globals.js: -------------------------------------------------------------------------------- 1 | global.matchMedia = () => ({ matches: true }); 2 | global.ENV_MOBILE_DEVICE = true; 3 | -------------------------------------------------------------------------------- /config/webpack/vue-svg-loader.js: -------------------------------------------------------------------------------- 1 | module.exports = (svgContent) => { 2 | const svgEvents = svgContent.replace( 3 | '${svgEvents}`; 7 | }; 8 | -------------------------------------------------------------------------------- /designs/00-aepp-baseapp.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/designs/00-aepp-baseapp.sketch -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | services: 2 | middleware: 3 | # TODO: use upstream after merging https://github.com/aeternity/ae_mdw/issues/1758 4 | image: davidyuk/temp:mdw-dev-mode-1.97.1-oas-fix 5 | ports: [4000:4000, 4001:4001, 3013:3013, 3313:3313] 6 | volumes: 7 | - ./docker-compose/aeternity.yaml:/home/aeternity/aeternity.yaml 8 | stop_grace_period: 0s 9 | 10 | explorer: 11 | image: aeternity/aescan:0.20.0 12 | ports: [3070:8080] 13 | environment: 14 | - NUXT_PUBLIC_NETWORK_NAME=Local network 15 | - NUXT_PUBLIC_NODE_URL=http://host.docker.internal:3013 16 | - NUXT_PUBLIC_MIDDLEWARE_URL=http://host.docker.internal:4000 17 | - NUXT_PUBLIC_WEBSOCKET_URL=ws://host.docker.internal:4001/v2/websocket 18 | 19 | frontend: 20 | build: . 21 | ports: [3080:80] 22 | environment: 23 | - VUE_APP_NETWORK_NAME=Local network 24 | - VUE_APP_NODE_URL=http://localhost:3013 25 | - VUE_APP_MIDDLEWARE_URL=http://localhost:4000 26 | - VUE_APP_EXPLORER_URL=http://localhost:3070 27 | - VUE_APP_BACKEND_URL=http://localhost:3079 28 | 29 | backend: 30 | build: backend 31 | ports: [3079:80] 32 | -------------------------------------------------------------------------------- /docker-compose/aeternity.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://github.com/aeternity/aeternity/raw/master/apps/aeutils/priv/aeternity_config_schema.json 2 | 3 | system: 4 | dev_mode: true 5 | plugins: 6 | - name: aeplugin_dev_mode 7 | 8 | dev_mode: 9 | auto_emit_microblocks: true 10 | 11 | chain: 12 | persist: false 13 | hard_forks: 14 | '1': 0 15 | '6': 1 16 | genesis_accounts: 17 | ak_21A27UVVt3hDkBE5J7rhhqnH5YNb4Y1dqo4PnSybrH85pnWo7E: 1000000000000000000000000 18 | 19 | # TODO: remove after solving https://github.com/aeternity/ae_mdw/issues/1760 20 | fork_management: 21 | network_id: ae_dev 22 | 23 | # TODO remove after solving https://github.com/aeternity/ae_mdw/issues/1760#issuecomment-2102872638 24 | mining: 25 | beneficiary: ak_21A27UVVt3hDkBE5J7rhhqnH5YNb4Y1dqo4PnSybrH85pnWo7E 26 | -------------------------------------------------------------------------------- /docker/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 1; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | include /etc/nginx/mime.types; 13 | types { 14 | application/json map; 15 | } 16 | default_type application/octet-stream; 17 | 18 | sendfile on; 19 | keepalive_timeout 60; 20 | gzip on; 21 | gzip_types application/javascript text/css image/svg+xml; 22 | 23 | server { 24 | root /usr/share/nginx/html; 25 | 26 | location ~ /(css|img|js) { 27 | expires max; 28 | etag off; 29 | } 30 | 31 | location /robots.txt { 32 | } 33 | 34 | location / { 35 | try_files $uri $uri/ /index.html; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /docker/override-env.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | envsubst < /usr/share/nginx/html/index.template.html > /usr/share/nginx/html/index.html 5 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | const packagesToTranspile = [ 2 | 'lodash-es', 3 | 'emoji-datasource-apple', 4 | '@aeternity/hd-wallet', 5 | 'register-service-worker', 6 | ]; 7 | 8 | module.exports = { 9 | testEnvironment: 'jsdom', 10 | setupFiles: ['jest-canvas-mock', '/config/jest/globals.js'], 11 | moduleFileExtensions: ['js', 'mjs', 'jsx', 'json', 'vue'], 12 | transform: { 13 | '^.+\\.vue$': '@vue/vue2-jest', 14 | '.+\\.(css|styl|less|sass|scss|png|jpg|svg|ttf|woff|woff2)$': 'jest-transform-stub', 15 | '^.+\\.m?jsx?$': 'babel-jest', 16 | }, 17 | transformIgnorePatterns: [`node_modules/(?!(${packagesToTranspile.join('|')})/)`], 18 | moduleNameMapper: { 19 | '^.*\\.svg\\?icon-component$': '/config/jest/EmptySvg.vue', 20 | }, 21 | snapshotSerializers: ['jest-serializer-vue'], 22 | testMatch: ['**/tests/unit/**/*.spec.(js|jsx|ts|tsx)', '**/__tests__/*.(js|jsx|ts|tsx)'], 23 | testURL: 'http://localhost/', 24 | }; 25 | -------------------------------------------------------------------------------- /public/.well-known/apple-app-site-association: -------------------------------------------------------------------------------- 1 | { 2 | "applinks": { 3 | "apps": [], 4 | "details": [ 5 | { 6 | "appID": "8H7FGC266S.com.aeternity.base", 7 | "paths": [ 8 | "*", 9 | "/" 10 | ] 11 | } 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/.well-known/assetlinks.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "relation": ["delegate_permission/common.handle_all_urls"], 4 | "target": { 5 | "namespace": "android_app", 6 | "package_name": "com.aeternity.base", 7 | "sha256_cert_fingerprints": [ 8 | "9C:3D:17:92:24:A9:33:12:0E:0C:EE:34:D2:D5:19:54:81:BD:F6:3F:2F:79:6F:9F:CE:24:38:DE:F6:B4:5B:C4" 9 | ] 10 | } 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/favicon.ico -------------------------------------------------------------------------------- /public/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/icon-192x192.png -------------------------------------------------------------------------------- /public/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/icon-512x512.png -------------------------------------------------------------------------------- /public/icon-grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/icon-grid.png -------------------------------------------------------------------------------- /public/icon-maskable-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/icon-maskable-512x512.png -------------------------------------------------------------------------------- /public/icon-receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/public/icon-receive.png -------------------------------------------------------------------------------- /resources/android/icon-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon-foreground.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-hdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/drawable-hdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-ldpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/drawable-ldpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-mdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/drawable-mdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/drawable-xhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/drawable-xxhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/drawable-xxxhdpi-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/drawable-xxxhdpi-icon.png -------------------------------------------------------------------------------- /resources/android/icon/hdpi-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/hdpi-foreground.png -------------------------------------------------------------------------------- /resources/android/icon/ldpi-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/ldpi-foreground.png -------------------------------------------------------------------------------- /resources/android/icon/mdpi-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/mdpi-foreground.png -------------------------------------------------------------------------------- /resources/android/icon/xhdpi-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/xhdpi-foreground.png -------------------------------------------------------------------------------- /resources/android/icon/xxhdpi-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/xxhdpi-foreground.png -------------------------------------------------------------------------------- /resources/android/icon/xxxhdpi-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/icon/xxxhdpi-foreground.png -------------------------------------------------------------------------------- /resources/android/splash/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/android/splash/icon.png -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/icon.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-1024.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-108@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-108@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-20.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-20@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-20@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-24@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-24@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-27.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-27.5@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-29.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-29@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-29@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-40.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-40@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-40@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-44@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-44@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-50.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-50@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-60.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-60@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-60@3x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-72.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-72@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-76.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-76@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-83.5@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-86@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-86@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon-98@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon-98@2x.png -------------------------------------------------------------------------------- /resources/ios/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon.png -------------------------------------------------------------------------------- /resources/ios/icon/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/icon/icon@2x.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-1792h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-1792h~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-2436h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-2436h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-2688h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-2688h~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-568h@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-568h@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-667h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-667h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-1792h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape-1792h~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-2436h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape-2436h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-2688h~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape-2688h~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape-736h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape-736h.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Landscape~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Landscape~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Portrait@2x~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait@~ipadpro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Portrait@~ipadpro.png -------------------------------------------------------------------------------- /resources/ios/splash/Default-Portrait~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default-Portrait~ipad.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default@2x~iphone.png -------------------------------------------------------------------------------- /resources/ios/splash/Default@2x~universal~anyany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default@2x~universal~anyany.png -------------------------------------------------------------------------------- /resources/ios/splash/Default~iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/ios/splash/Default~iphone.png -------------------------------------------------------------------------------- /resources/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aeternity/aepp-base/756a705f06209e3cb844703541217ff7a3dbcbec/resources/splash.png -------------------------------------------------------------------------------- /resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF0D6A 4 | #FF0D6A 5 | 6 | -------------------------------------------------------------------------------- /resources/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/icons/base.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/add-contact.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/arrow-chart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | arrow 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/inline/arrow-double.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | >> 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/inline/back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/bold.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/bookmark-full.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/burger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/camera.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/card.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/chat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | clock 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/inline/close-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/icons/inline/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/contacts.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/currency.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/device.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/diagram.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/eye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/flip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/globe.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/grid.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/headline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/info-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/icons/inline/italic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/key.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/left-more.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/link-alternative.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/lock-open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/more.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/icons/inline/network.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/inline/paste.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/receive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/reload.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/save.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/shield-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/shield.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/sign-out.svg: -------------------------------------------------------------------------------- 1 | 2 | atoms/icons/ui/sign-out 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/icons/inline/square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/transfer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/underline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/vote.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/inline/x-square.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/rabbit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/turtle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/components/AeButtonGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 39 | -------------------------------------------------------------------------------- /src/components/AeFraction.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 22 | 23 | 30 | -------------------------------------------------------------------------------- /src/components/AeIdenticon.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 26 | 27 | 34 | -------------------------------------------------------------------------------- /src/components/AeInputMnemonic.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 35 | -------------------------------------------------------------------------------- /src/components/AeInputName.js: -------------------------------------------------------------------------------- 1 | import { isNameValid } from '@aeternity/aepp-sdk'; 2 | import withFormatting from '../lib/withFormatting'; 3 | import { AENS_DOMAIN } from '../lib/constants'; 4 | import AeInput from './AeInput.vue'; 5 | 6 | const notNameCharsRegExp = /[^\p{General_Category=Letter}0-9-]/gu; 7 | 8 | export const formatDisplayValueAndCursor = ({ value, cursor }, previousValue) => { 9 | if (!value || value === AENS_DOMAIN) return { value: '', cursor: 0 }; 10 | if (isNameValid(value)) return { value, cursor }; 11 | if (!previousValue) { 12 | const cleared = value 13 | .replace(new RegExp(`\\${AENS_DOMAIN}$`), '') 14 | .replace(notNameCharsRegExp, ''); 15 | return { 16 | value: cleared && cleared + AENS_DOMAIN, 17 | cursor, 18 | }; 19 | } 20 | if (isNameValid(value + AENS_DOMAIN) && !value.endsWith(AENS_DOMAIN.slice(1))) { 21 | return { value: value + AENS_DOMAIN, cursor }; 22 | } 23 | return { 24 | value: previousValue, 25 | cursor: Math.min(cursor, previousValue.length - AENS_DOMAIN.length), 26 | }; 27 | }; 28 | 29 | export default withFormatting(AeInput, { formatDisplayValueAndCursor }); 30 | -------------------------------------------------------------------------------- /src/components/AeLink.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 41 | -------------------------------------------------------------------------------- /src/components/AeMenu.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 26 | -------------------------------------------------------------------------------- /src/components/AeMenuItem.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | 15 | 42 | -------------------------------------------------------------------------------- /src/components/AeModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/AeQrCode.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 34 | 35 | 46 | -------------------------------------------------------------------------------- /src/components/AeSpinner.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 43 | -------------------------------------------------------------------------------- /src/components/AeToolbar.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | 57 | -------------------------------------------------------------------------------- /src/components/AeToolbarButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 39 | -------------------------------------------------------------------------------- /src/components/ButtonAddFixed.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 24 | 25 | 46 | -------------------------------------------------------------------------------- /src/components/ButtonPlain.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 24 | 25 | 46 | -------------------------------------------------------------------------------- /src/components/CurrencySwitcher.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 25 | -------------------------------------------------------------------------------- /src/components/IconGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 20 | -------------------------------------------------------------------------------- /src/components/LanguageSwitcher.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 25 | -------------------------------------------------------------------------------- /src/components/ListItemButton.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | 17 | 44 | -------------------------------------------------------------------------------- /src/components/ListItemCircle.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | 20 | 43 | -------------------------------------------------------------------------------- /src/components/ListItemSettingsLanguage.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 21 | -------------------------------------------------------------------------------- /src/components/ListItemSettingsReset.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 31 | -------------------------------------------------------------------------------- /src/components/ModalPlain.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 28 | -------------------------------------------------------------------------------- /src/components/Note.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /src/components/NotificationUpdateAvailable.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 27 | -------------------------------------------------------------------------------- /src/components/Overlay.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | 36 | -------------------------------------------------------------------------------- /src/components/Progress.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | -------------------------------------------------------------------------------- /src/components/ProgressFake.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 41 | -------------------------------------------------------------------------------- /src/components/async.js: -------------------------------------------------------------------------------- 1 | export const AeQrCode = () => import(/* webpackChunkName: "qr-codes" */ './AeQrCode.vue'); 2 | export const QrCodeReader = () => import(/* webpackChunkName: "qr-codes" */ './QrCodeReader.vue'); 3 | -------------------------------------------------------------------------------- /src/components/copied.scss: -------------------------------------------------------------------------------- 1 | @use '../styles/variables'; 2 | 3 | %copied { 4 | position: relative; 5 | 6 | &:before { 7 | content: attr(data-copied-text); 8 | display: flex; 9 | justify-content: center; 10 | align-items: center; 11 | text-align: center; 12 | color: variables.$color-neutral-negative-3; 13 | background: rgba(variables.$color-neutral-positive-1, 0.9); 14 | position: absolute; 15 | top: 0; 16 | right: 0; 17 | left: 0; 18 | bottom: 0; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/components/desktop/AccountTypeMixin.js: -------------------------------------------------------------------------------- 1 | export default { 2 | props: { 3 | accountType: { 4 | type: String, 5 | validator: (value) => ['hd-wallet-desktop', 'hd-wallet', 'ledger'].includes(value), 6 | default: 'local', 7 | }, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerAccountNotFoundModal.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 33 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerAddressNotConfirmedModal.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 36 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerModalNanoS.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerModalNote.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | 39 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerRequestModal.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 37 | -------------------------------------------------------------------------------- /src/components/desktop/LedgerSignTransactionModal.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | 29 | 37 | -------------------------------------------------------------------------------- /src/components/desktop/ModalHeader.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /src/components/desktop/SidebarModal.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 56 | -------------------------------------------------------------------------------- /src/components/desktop/Step.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 48 | -------------------------------------------------------------------------------- /src/components/icon.scss: -------------------------------------------------------------------------------- 1 | @use '../styles/functions'; 2 | 3 | svg.icon { 4 | height: functions.rem(20px); 5 | vertical-align: middle; 6 | fill: currentColor; 7 | } 8 | -------------------------------------------------------------------------------- /src/components/mobile/ButtonGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /src/components/mobile/ConfirmAccountAccessModal.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 22 | 23 | 41 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsAccountAccessPermission.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 23 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsAddress.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | 19 | 26 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsAmount.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 29 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsAmountCurrency.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 25 | 26 | 37 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsItem.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsList.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsNamePointers.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 36 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsPermission.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 25 | 26 | 43 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsRawData.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 25 | 26 | 36 | -------------------------------------------------------------------------------- /src/components/mobile/DetailsRow.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /src/components/mobile/MnemonicBackupWarning.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 18 | 19 | 36 | -------------------------------------------------------------------------------- /src/components/mobile/Modal.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | 20 | 27 | -------------------------------------------------------------------------------- /src/components/mobile/PasswordPurpose.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/components/mobile/__tests__/UrlForm.js: -------------------------------------------------------------------------------- 1 | import { shallowMount } from '@vue/test-utils'; 2 | import UrlForm from '../UrlForm.vue'; 3 | 4 | describe('UrlForm', () => { 5 | [ 6 | { 7 | typedAddress: 'example.com', 8 | routerPath: '/browser/example.com', 9 | }, 10 | { 11 | typedAddress: 'https://example.com/test', 12 | routerPath: '/browser/https://example.com/test', 13 | }, 14 | ].forEach(({ typedAddress, routerPath }) => 15 | it(`passes address "${typedAddress}" to router properly`, () => { 16 | const push = jest.fn(); 17 | const wrapper = shallowMount(UrlForm, { 18 | mocks: { 19 | $router: { push }, 20 | $t: () => 'locale-specific-text', 21 | }, 22 | }); 23 | wrapper.vm.newUrl = typedAddress; 24 | wrapper.vm.submitHandler(); 25 | expect(push).toHaveBeenCalledWith(routerPath); 26 | }), 27 | ); 28 | }); 29 | -------------------------------------------------------------------------------- /src/directives/copyOnClick.js: -------------------------------------------------------------------------------- 1 | import copyToClipboard from 'copy-to-clipboard'; 2 | import { i18n } from '../store/plugins/ui/languages'; 3 | 4 | export default (el, binding) => { 5 | if (!('copyOnClick' in el.dataset)) { 6 | el.addEventListener('click', async () => { 7 | const value = el.dataset.copyOnClick; 8 | 9 | if (!value) return; 10 | 11 | if (!copyToClipboard(value)) return; 12 | el.dataset.copiedText = i18n.t('copied'); // eslint-disable-line no-param-reassign 13 | el.classList.add('v-copied'); 14 | setTimeout(() => el.classList.remove('v-copied'), 500); 15 | }); 16 | } 17 | 18 | el.dataset.copyOnClick = binding.value; // eslint-disable-line no-param-reassign 19 | }; 20 | -------------------------------------------------------------------------------- /src/directives/removeSpacesOnCopy.js: -------------------------------------------------------------------------------- 1 | export default { 2 | inserted: (el) => 3 | el.addEventListener('copy', (event) => { 4 | event.clipboardData.setData('text/plain', getSelection().toString().replace(/\s/g, '')); 5 | event.preventDefault(); 6 | }), 7 | }; 8 | -------------------------------------------------------------------------------- /src/filters/__tests__/formatAddress.js: -------------------------------------------------------------------------------- 1 | import formatAddress from '../formatAddress'; 2 | 3 | describe('formatAddress', () => { 4 | const testAddress = 'ak_123456789123456789123456789123456789123456789123'; 5 | const testAddressFormatted = 6 | 'ak_ 123 456 789 123 456 789 123 456 789 123 456 789 123 456 789 123'; 7 | 8 | [ 9 | { 10 | address: testAddress, 11 | formatted: testAddressFormatted, 12 | }, 13 | { 14 | address: `${testAddress}4`, 15 | formatted: `${testAddressFormatted} 4`, 16 | }, 17 | { 18 | address: `${testAddress}45`, 19 | formatted: `${testAddressFormatted} 45`, 20 | }, 21 | ].forEach(({ address, formatted }) => 22 | it(`formats address with length ${address.length}`, () => 23 | expect(formatAddress(address)).toEqual(formatted)), 24 | ); 25 | 26 | it('formats address in short mode', () => 27 | expect(formatAddress(testAddress, 'short')).toEqual('ak_ 123···123')); 28 | }); 29 | -------------------------------------------------------------------------------- /src/filters/blocksToRelativeTime.js: -------------------------------------------------------------------------------- 1 | import { i18n } from '../store/plugins/ui/languages'; 2 | 3 | export default (blocks) => { 4 | const minutes = blocks * 3; 5 | const minutesPerHour = 60; 6 | const minutesPerDay = minutesPerHour * 24; 7 | 8 | if (minutes < minutesPerHour) { 9 | return `~${i18n.tc('minutes', Math.round(minutes))}`; 10 | } 11 | if (minutes < minutesPerDay) { 12 | return `~${i18n.tc('hours', Math.round(minutes / minutesPerHour))}`; 13 | } 14 | return `~${i18n.tc('days', Math.round(minutes / minutesPerDay))}`; 15 | }; 16 | -------------------------------------------------------------------------------- /src/filters/currencyAmount.js: -------------------------------------------------------------------------------- 1 | const toFiatFixedValue = (v) => (v.e < -2 ? '0.01' : v.toFixed(2)); 2 | 3 | export default (value, { symbol, isCrypto = true }) => { 4 | let v; 5 | if (typeof value === 'string') v = value; 6 | else v = isCrypto ? value.toFixed(8) : toFiatFixedValue(value); 7 | return `${!isCrypto ? symbol : ''}${v}${isCrypto ? ` ${symbol}` : ''}`; 8 | }; 9 | -------------------------------------------------------------------------------- /src/filters/formatAddress.js: -------------------------------------------------------------------------------- 1 | export default (address, mode = 'full') => { 2 | const chunks = address.match(/.{1,3}/g); 3 | switch (mode) { 4 | case 'full': 5 | return chunks.join(' '); 6 | case 'short': 7 | return `${chunks.slice(0, 2).join(' ')}···${address.slice(-3)}`; 8 | default: 9 | throw new Error(`Invalid mode: ${mode}`); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /src/filters/prefixedAmount.js: -------------------------------------------------------------------------------- 1 | import { MAGNITUDE_EXA, MAGNITUDE_GIGA, MAGNITUDE_PICO } from '../lib/constants'; 2 | 3 | const prefixes = [ 4 | { name: 'Exa', magnitude: MAGNITUDE_EXA }, 5 | { name: 'Giga', magnitude: MAGNITUDE_GIGA }, 6 | { name: '', magnitude: 0 }, 7 | { name: 'Pico', magnitude: MAGNITUDE_PICO }, 8 | ]; 9 | 10 | const getNearestPrefix = (exponent) => 11 | prefixes.reduce((p, n) => 12 | Math.abs(n.magnitude - exponent) < Math.abs(p.magnitude - exponent) ? n : p, 13 | ); 14 | 15 | const getLowerBoundPrefix = (exponent) => 16 | prefixes.find((p) => p.magnitude <= exponent) || prefixes[prefixes.length - 1]; 17 | 18 | export default (value) => { 19 | const { name, magnitude } = (value.e < 0 ? getNearestPrefix : getLowerBoundPrefix)(value.e); 20 | const v = value 21 | .shiftedBy(-magnitude) 22 | .precision(9 + Math.min(value.e - magnitude, 0)) 23 | .toFixed(); 24 | return `${v}${name ? ' ' : ''}${name}`; 25 | }; 26 | -------------------------------------------------------------------------------- /src/lib/__mocks__/sdkWallet.js: -------------------------------------------------------------------------------- 1 | export default () => {}; 2 | -------------------------------------------------------------------------------- /src/lib/aes.js: -------------------------------------------------------------------------------- 1 | export default class AES { 2 | BLOCK_SIZE = 16; 3 | 4 | constructor(key) { 5 | this.algorithm = { 6 | name: 'AES-CTR', 7 | counter: Buffer.alloc(16), 8 | length: 128, 9 | }; 10 | this.key = key; 11 | } 12 | 13 | incrementCounter(dataByteLength) { 14 | this.algorithm.counter.writeUIntBE( 15 | this.algorithm.counter.readUIntBE(10, 6) + Math.ceil(dataByteLength / this.BLOCK_SIZE), 16 | 10, 17 | 6, 18 | ); 19 | } 20 | 21 | async encrypt(data) { 22 | const dataEncrypted = await window.crypto.subtle.encrypt(this.algorithm, this.key, data); 23 | this.incrementCounter(dataEncrypted.byteLength); 24 | return dataEncrypted; 25 | } 26 | 27 | async decrypt(dataEncrypted) { 28 | const data = await window.crypto.subtle.decrypt(this.algorithm, this.key, dataEncrypted); 29 | this.incrementCounter(data.byteLength); 30 | return data; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/lib/appsRegistry.json: -------------------------------------------------------------------------------- 1 | ["superhero.com", "governance.aeternity.com", "graffiti.aeternity.com", "faucet.aepps.com"] 2 | -------------------------------------------------------------------------------- /src/lib/constants.js: -------------------------------------------------------------------------------- 1 | export const MAGNITUDE = 18; 2 | export const MAGNITUDE_EXA = 18; 3 | export const MAGNITUDE_GIGA = 9; 4 | export const MAGNITUDE_MICRO = -6; 5 | export const MAGNITUDE_PICO = -12; 6 | 7 | export const AENS_DOMAIN = '.chain'; 8 | 9 | export const NAME_LIST_ROUTE_NAMES = ['name-list', 'auction-list', 'auction-list-character-length']; 10 | 11 | export const PROTOCOLS_ALLOWED = [ 12 | 'https:', 13 | ...(window.location.protocol === 'https:' ? [] : ['http:']), 14 | ]; 15 | export const PROTOCOL_DEFAULT = 16 | window.location.protocol === 'https:' || process.env.NODE_ENV === 'production' 17 | ? 'https:' 18 | : 'http:'; 19 | 20 | export const ROUTE_MOBILE_LOGGED_IN = { name: 'transfer' }; 21 | 22 | // https://developers.google.com/web/fundamentals/app-install-banners/#detect-mode 23 | export const IS_PWA = 24 | matchMedia('(display-mode: standalone)').matches || navigator.standalone === true; 25 | 26 | // https://stackoverflow.com/a/9039885 27 | export const IS_IOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; 28 | 29 | export const RUNNING_IN_FRAME = window.parent !== window; 30 | 31 | export const RUNNING_IN_POPUP = !!window.opener && window.name === 'popup'; 32 | -------------------------------------------------------------------------------- /src/lib/localStorageCall.js: -------------------------------------------------------------------------------- 1 | const KEY = 'local-storage-call'; 2 | 3 | export const send = (data) => localStorage.setItem(KEY, data); 4 | 5 | export const receive = () => 6 | new Promise((resolve) => { 7 | const storageHandler = ({ key }) => { 8 | if (key !== KEY) return; 9 | window.removeEventListener('storage', storageHandler); 10 | resolve(localStorage.getItem(KEY)); 11 | localStorage.removeItem(KEY); 12 | }; 13 | window.addEventListener('storage', storageHandler); 14 | }); 15 | -------------------------------------------------------------------------------- /src/lib/methods.js: -------------------------------------------------------------------------------- 1 | export async function resetConfirm() { 2 | await this.$store.dispatch('modals/open', { 3 | name: 'confirm', 4 | text: ENV_MOBILE_DEVICE 5 | ? this.$t('settings.reset.confirm') 6 | : this.$t('settings.reset.confirm-desktop'), 7 | primaryButtonText: this.$t('settings.reset.button'), 8 | }); 9 | await this.$store.dispatch('reset'); 10 | } 11 | 12 | export async function fetchAuctions(handler) { 13 | const { middleware } = this.$store.getters; 14 | let page = await middleware.getNamesAuctions({ limit: 100 }); 15 | handler(page.data); 16 | while (page.nextPath) { 17 | page = await page.next(); 18 | handler(page.data); 19 | } 20 | handler(); 21 | } 22 | -------------------------------------------------------------------------------- /src/lib/networksRegistry.js: -------------------------------------------------------------------------------- 1 | const mainNetwork = { 2 | name: 'Ceres-net', 3 | url: 'https://mainnet.aeternity.io', 4 | middlewareUrl: 'https://mainnet.aeternity.io/mdw', 5 | explorerUrl: 'https://aescan.io', 6 | }; 7 | 8 | const testNetwork = { 9 | name: 'Testnet', 10 | url: 'https://testnet.aeternity.io', 11 | middlewareUrl: 'https://testnet.aeternity.io/mdw', 12 | explorerUrl: 'https://testnet.aescan.io', 13 | }; 14 | 15 | const envNetwork = { 16 | name: process.env.VUE_APP_NETWORK_NAME, 17 | url: process.env.VUE_APP_NODE_URL, 18 | middlewareUrl: process.env.VUE_APP_MIDDLEWARE_URL, 19 | explorerUrl: process.env.VUE_APP_EXPLORER_URL, 20 | }; 21 | 22 | const networks = (() => { 23 | if (!['', '$VUE_APP_NETWORK_NAME'].includes(window.overrideNetwork.name)) { 24 | return [window.overrideNetwork]; 25 | } 26 | if (envNetwork.name) return [envNetwork]; 27 | return process.env.NODE_ENV === 'production' 28 | ? [mainNetwork, testNetwork] 29 | : [testNetwork, mainNetwork]; 30 | })(); 31 | 32 | export default Object.freeze(networks.map(Object.freeze)); 33 | -------------------------------------------------------------------------------- /src/lib/setGlobalPolyfills.js: -------------------------------------------------------------------------------- 1 | Object.assign(window, { 2 | Int32Array, 3 | Uint8ClampedArray, 4 | }); 5 | -------------------------------------------------------------------------------- /src/lib/spendTxFees.js: -------------------------------------------------------------------------------- 1 | import BigNumber from 'bignumber.js'; 2 | import { buildTx, unpackTx, Tag } from '@aeternity/aepp-sdk'; 3 | import { MAGNITUDE, MAGNITUDE_MICRO } from './constants'; 4 | 5 | const STUB_ADDRESS = 'ak_enAPooFqpTQKkhJmU47J16QZu9HbPQQPwWBVeGnzDbDnv9dxp'; 6 | 7 | export const calculateMinSpendTxFee = (options) => 8 | unpackTx( 9 | buildTx({ 10 | ...options, 11 | tag: Tag.SpendTx, 12 | senderId: STUB_ADDRESS, 13 | recipientId: STUB_ADDRESS, 14 | }), 15 | Tag.SpendTx, 16 | ).fee; 17 | 18 | const MAX_UINT256 = BigNumber(2).exponentiatedBy(256).minus(1); 19 | const MIN_SPEND_TX_FEE_STRING = calculateMinSpendTxFee({ 20 | amount: MAX_UINT256, 21 | ttl: MAX_UINT256, 22 | nonce: MAX_UINT256, 23 | }); 24 | 25 | export const MIN_SPEND_TX_FEE = BigNumber(MIN_SPEND_TX_FEE_STRING).shiftedBy(-MAGNITUDE); 26 | export const MAX_REASONABLE_FEE = MIN_SPEND_TX_FEE.multipliedBy(10); 27 | 28 | const toMicro = (value) => value.shiftedBy(-MAGNITUDE_MICRO).toFixed(); 29 | 30 | export const MIN_SPEND_TX_FEE_MICRO = toMicro(MIN_SPEND_TX_FEE); 31 | export const MAX_REASONABLE_FEE_MICRO = toMicro(MAX_REASONABLE_FEE); 32 | -------------------------------------------------------------------------------- /src/lib/storeErrorHandler.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | window.onerror = async function errorHandler(...args) { 4 | if (document.getElementById('app').innerHTML) { 5 | window.onerror = null; 6 | return; 7 | } 8 | 9 | const StoreLoadError = (await import('../pages/StoreLoadError.vue')).default; 10 | new Vue({ 11 | render: (h) => h(StoreLoadError), 12 | }).$mount('#app'); 13 | 14 | // eslint-disable-next-line no-console 15 | console.error('Unknown error', ...args); 16 | }; 17 | -------------------------------------------------------------------------------- /src/lib/vuexRouterSync.js: -------------------------------------------------------------------------------- 1 | import { sync } from 'vuex-router-sync'; 2 | 3 | export default (store, router) => { 4 | store.registerModule('router', { 5 | namespaced: true, 6 | actions: { 7 | push: (context, payload) => router.push(payload), 8 | replace: (context, payload) => router.replace(payload), 9 | go: (context, payload) => router.go(payload), 10 | back: (context, payload) => router.back(payload), 11 | forward: (context, payload) => router.forward(payload), 12 | addRoute: (context, payload) => router.addRoute(payload), 13 | }, 14 | }); 15 | 16 | sync(store, router); 17 | }; 18 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import 'normalize.css'; 2 | import Vue from 'vue'; 3 | import './lib/setGlobalPolyfills'; 4 | import store from './store'; 5 | import { RUNNING_IN_POPUP, RUNNING_IN_FRAME } from './lib/constants'; 6 | 7 | Vue.config.productionTip = false; 8 | 9 | if (process.env.NODE_ENV === 'development') { 10 | window.store = store; 11 | } 12 | 13 | /* eslint-disable no-unused-expressions */ 14 | if (RUNNING_IN_POPUP) import(/* webpackChunkName: "popup" */ './popup'); 15 | else if (!RUNNING_IN_FRAME) import(/* webpackChunkName: "ui" */ './ui'); 16 | /* eslint-enable no-unused-expressions */ 17 | -------------------------------------------------------------------------------- /src/pages/NotFound.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /src/pages/RecoverMixin.js: -------------------------------------------------------------------------------- 1 | import dizzySymbolEmoji from 'emoji-datasource-apple/img/apple/64/1f4ab.png'; 2 | 3 | export default { 4 | data() { 5 | return { 6 | dizzySymbolEmoji, 7 | mnemonic: '', 8 | error: false, 9 | }; 10 | }, 11 | methods: { 12 | async setMnemonic() { 13 | if (!(await this.$validator.validateAll())) return; 14 | 15 | await this.$store.dispatch('accounts/hdWallet/createWallet', this.mnemonic); 16 | }, 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /src/pages/StoreLoadError.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 23 | 24 | 37 | -------------------------------------------------------------------------------- /src/pages/desktop/Apps.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 31 | 32 | 45 | -------------------------------------------------------------------------------- /src/pages/mobile/OnboardingAepps.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | 21 | 27 | -------------------------------------------------------------------------------- /src/pages/mobile/OnboardingPage.scss: -------------------------------------------------------------------------------- 1 | @use '../../styles/variables'; 2 | @use '../../styles/functions'; 3 | @use '../../styles/typography'; 4 | 5 | .onboarding-page { 6 | margin: auto 0; 7 | text-align: center; 8 | 9 | &.v-enter-active, 10 | &.v-leave-active { 11 | transition-duration: 0.25s; 12 | 13 | img { 14 | transition: opacity 0.25s ease-out; 15 | } 16 | } 17 | 18 | &.v-leave-active img { 19 | transition-timing-function: ease-in; 20 | } 21 | 22 | &.v-enter, 23 | &.v-leave-to { 24 | img { 25 | opacity: 0; 26 | } 27 | } 28 | 29 | .guide { 30 | display: block; 31 | min-height: functions.rem(133px); 32 | margin-bottom: 0; 33 | margin-left: functions.rem(20px); 34 | margin-right: functions.rem(20px); 35 | 36 | .note { 37 | margin-top: functions.rem(5px); 38 | @extend %face-sans-base; 39 | font-weight: 500; 40 | color: variables.$color-neutral-negative-2; 41 | } 42 | } 43 | 44 | img { 45 | margin-bottom: functions.rem(30px); 46 | height: 300px; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/pages/mobile/OnboardingSend.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | 20 | 26 | -------------------------------------------------------------------------------- /src/pages/mobile/OnboardingSubaccounts.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | 20 |