├── app ├── public │ ├── chosen.min.css │ ├── mac_close_fix │ │ └── fix.js │ ├── font-awesome │ │ └── fonts │ │ │ └── fontawesome-webfont.woff │ └── tooltipster │ │ └── css │ │ └── themes │ │ ├── tooltipster-noir.css │ │ ├── tooltipster-light.css │ │ ├── tooltipster-punk.css │ │ └── tooltipster-shadow.css ├── assets │ ├── css │ │ ├── spec │ │ │ ├── result.less │ │ │ ├── index.less │ │ │ └── spec.less │ │ ├── wallet │ │ │ ├── accounts │ │ │ │ ├── operations.less │ │ │ │ ├── alloperations.less │ │ │ │ ├── index.less │ │ │ │ └── show.less │ │ │ ├── bitid │ │ │ │ ├── index.less │ │ │ │ ├── form.less │ │ │ │ └── authenticating.less │ │ │ ├── p2sh │ │ │ │ ├── index.less │ │ │ │ └── signing.less │ │ │ ├── api │ │ │ │ ├── accounts.less │ │ │ │ ├── addresses.less │ │ │ │ └── operations.less │ │ │ ├── xpubkey │ │ │ │ ├── index.less │ │ │ │ └── processing.less │ │ │ ├── settings │ │ │ │ ├── apps.less │ │ │ │ ├── display.less │ │ │ │ ├── bitcoin.less │ │ │ │ ├── tools.less │ │ │ │ ├── hardware.less │ │ │ │ └── index.less │ │ │ ├── dialogs │ │ │ │ ├── operationdetail.less │ │ │ │ ├── accountsettings.less │ │ │ │ ├── addaccount.less │ │ │ │ ├── xpub.less │ │ │ │ └── apifailures.less │ │ │ ├── send │ │ │ │ ├── mobile.less │ │ │ │ ├── cpfp.less │ │ │ │ ├── preparing.less │ │ │ │ ├── method.less │ │ │ │ ├── processing.less │ │ │ │ └── validating.less │ │ │ ├── message │ │ │ │ ├── result.less │ │ │ │ └── index.less │ │ │ ├── receive │ │ │ │ ├── index.less │ │ │ │ └── enforce │ │ │ │ │ └── alert.less │ │ │ └── pairing │ │ │ │ ├── progress.less │ │ │ │ ├── finalizing.less │ │ │ │ └── index.less │ │ ├── apps │ │ │ └── coinkite │ │ │ │ ├── cosign │ │ │ │ ├── show.less │ │ │ │ ├── index.less │ │ │ │ ├── signing.less │ │ │ │ └── fetching.less │ │ │ │ ├── keygen │ │ │ │ ├── index.less │ │ │ │ ├── show.less │ │ │ │ └── processing.less │ │ │ │ ├── settings │ │ │ │ └── index.less │ │ │ │ ├── dashboard │ │ │ │ ├── index.less │ │ │ │ └── compatibility.less │ │ │ │ └── coinkite.less │ │ ├── onboarding │ │ │ ├── device │ │ │ │ ├── unplug.less │ │ │ │ ├── plug.less │ │ │ │ ├── pin.less │ │ │ │ ├── connecting.less │ │ │ │ ├── error.less │ │ │ │ ├── opening.less │ │ │ │ ├── failed.less │ │ │ │ ├── unsupported.less │ │ │ │ ├── update.less │ │ │ │ ├── firmware.less │ │ │ │ ├── chains │ │ │ │ │ ├── recover.less │ │ │ │ │ └── message.less │ │ │ │ ├── switchfirmware.less │ │ │ │ ├── swappedbip39provisioning.less │ │ │ │ └── chains.less │ │ │ ├── management │ │ │ │ ├── summary.less │ │ │ │ ├── pinconfirmation.less │ │ │ │ ├── welcome.less │ │ │ │ ├── provisioning.less │ │ │ │ ├── security.less │ │ │ │ └── done.less │ │ │ └── device.less │ │ ├── widgets.less │ │ ├── update │ │ │ ├── done.less │ │ │ ├── index.less │ │ │ ├── plug.less │ │ │ ├── unplug.less │ │ │ ├── welcome.less │ │ │ ├── erasing.less │ │ │ ├── error.less │ │ │ ├── updating.less │ │ │ ├── unlocking.less │ │ │ ├── linux.less │ │ │ └── loading.less │ │ ├── application.less │ │ ├── mixins.less │ │ ├── widgets │ │ │ ├── circle_progress_bar.less │ │ │ ├── accessories.less │ │ │ └── panels.less │ │ ├── progressbars.less │ │ ├── common │ │ │ └── dialogs │ │ │ │ ├── qrcode.less │ │ │ │ ├── ticket.less │ │ │ │ ├── message.less │ │ │ │ └── confirmation.less │ │ └── qrcodes.less │ ├── images │ │ ├── icon-16.png │ │ ├── icon-32.png │ │ ├── icon-48.png │ │ ├── icon-64.png │ │ ├── icon-128.png │ │ ├── update │ │ │ ├── flash.png │ │ │ ├── gears.png │ │ │ ├── towers.png │ │ │ ├── skyrocket.png │ │ │ ├── plug_wallet.png │ │ │ └── unplug_wallet.png │ │ ├── common │ │ │ ├── large_fail.png │ │ │ ├── large_check.png │ │ │ ├── large_error.png │ │ │ ├── plug_wallet.png │ │ │ ├── large_question.png │ │ │ ├── large_settings.png │ │ │ ├── large_success.png │ │ │ └── qrcode_borders.png │ │ ├── wallet │ │ │ ├── help_icon.png │ │ │ ├── send_icon.png │ │ │ ├── chains_icon.png │ │ │ ├── cursor_arrow.png │ │ │ ├── ledger_icon.png │ │ │ ├── pairing_icon.png │ │ │ ├── receive_icon.png │ │ │ ├── reload_icon.png │ │ │ ├── signout_icon.png │ │ │ ├── accounts_icon.png │ │ │ ├── dashboard_icon.png │ │ │ ├── dropdown_icon.png │ │ │ ├── settings_icon.png │ │ │ └── send │ │ │ │ └── ic_exchange.png │ │ ├── apps │ │ │ └── coinkite │ │ │ │ ├── key_icon.png │ │ │ │ ├── help_icon.png │ │ │ │ ├── coinkite_icon.png │ │ │ │ ├── cosign_icon.png │ │ │ │ ├── settings_icon.png │ │ │ │ └── wallet_icon.png │ │ └── onboarding │ │ │ ├── large_logo.png │ │ │ ├── live │ │ │ ├── nanos.png │ │ │ └── screenshot.png │ │ │ ├── pin_value.png │ │ │ ├── device │ │ │ ├── plug_wallet.png │ │ │ └── unplug_wallet.png │ │ │ ├── large_right_arrow.png │ │ │ └── management │ │ │ ├── restore_icon.png │ │ │ ├── wallet_icon.png │ │ │ ├── ledger_wallet.png │ │ │ ├── numeric_field.png │ │ │ ├── scrambled_field.png │ │ │ ├── convert_from_new.png │ │ │ ├── convert_from_old.png │ │ │ ├── new_ledger_wallet.png │ │ │ └── existing_ledger_wallet.png │ └── fonts │ │ ├── OpenSans-Bold.woff │ │ ├── OpenSans-Light.woff │ │ ├── OpenSans-Regular.woff │ │ ├── OpenSans-Semibold.woff │ │ └── OpenSans-ExtraBold.woff ├── src │ ├── configuration.release.coffee │ ├── controllers │ │ ├── wallet │ │ │ ├── dialogs │ │ │ │ ├── wallet_dialogs_ │ │ │ │ ├── wallet_dialogs_apifailures_dialog_view_controller.coffee │ │ │ │ └── wallet_dialogs_xpub_dialog_view_controller.coffee │ │ │ ├── settings │ │ │ │ ├── wallet_settings_apps_section_dialog_view_controller.coffee │ │ │ │ ├── base │ │ │ │ │ └── wallet_settings_setting_view_controller.coffee │ │ │ │ ├── wallet_settings_tools_section_dialog_view_controller.coffee │ │ │ │ ├── wallet_settings_display_section_dialog_view_controller.coffee │ │ │ │ ├── wallet_settings_bitcoin_section_dialog_view_controller.coffee │ │ │ │ ├── apps │ │ │ │ │ └── wallet_settings_apps_list_setting_view_controller.coffee │ │ │ │ ├── wallet_settings_hardware_section_dialog_view_controller.coffee │ │ │ │ └── bitcoin │ │ │ │ │ ├── wallet_settings_bitcoin_blockchain_setting_view_controller.coffee │ │ │ │ │ └── wallet_settings_bitcoin_fees_setting_view_controller.coffee │ │ │ ├── api │ │ │ │ ├── wallet_api_accounts_dialog_view_controller.coffee │ │ │ │ ├── wallet_api_operations_dialog_view_controller.coffee │ │ │ │ └── wallet_api_addresses_dialog_view_controller.coffee │ │ │ ├── message │ │ │ │ └── wallet_message_result_dialog_view_controller.coffee │ │ │ ├── xpubkey │ │ │ │ └── wallet_xpubkey_index_dialog_view_controller.coffee │ │ │ ├── p2sh │ │ │ │ └── wallet_p2sh_index_dialog_view_controller.coffee │ │ │ └── bitid │ │ │ │ └── wallet_bitid_form_dialog_view_controller.coffee │ │ ├── onboarding │ │ │ ├── onboarding_navigation_controller.coffee │ │ │ ├── device │ │ │ │ ├── onboarding_device_error_view_controller.coffee │ │ │ │ ├── onboarding_device_unplug_view_controller.coffee │ │ │ │ ├── onboarding_device_failed_view_controller.coffee │ │ │ │ ├── onboarding_device_unsupported_view_controller.coffee │ │ │ │ ├── onboarding_device_firmware_view_controller.coffee │ │ │ │ ├── chains │ │ │ │ │ ├── onboarding_device_chains_recover_dialog_view_controller.coffee │ │ │ │ │ └── onboarding_device_chains_message_dialog_view_controller.coffee │ │ │ │ └── onboarding_device_update_view_controller.coffee │ │ │ └── management │ │ │ │ ├── onboarding_management_done_view_controller.coffee │ │ │ │ ├── onboarding_management_convert_view_controller.coffee │ │ │ │ ├── onboarding_management_recoverydevice_view_controller.coffee │ │ │ │ ├── onboarding_management_recoverymode_view_controller.coffee │ │ │ │ ├── onboarding_management_security_view_controller.coffee │ │ │ │ ├── onboarding_management_summary_view_controller.coffee │ │ │ │ └── onboarding_management_provisioning_view_controller.coffee │ │ ├── update │ │ │ ├── update_error_view_controller.coffee │ │ │ ├── update_plug_view_controller.coffee │ │ │ ├── update_unplug_view_controller.coffee │ │ │ ├── update_linux_view_controller.coffee │ │ │ ├── update_index_view_controller.coffee │ │ │ ├── update_welcome_view_controller.coffee │ │ │ ├── update_done_view_controller.coffee │ │ │ ├── update_erasing_view_controller.coffee │ │ │ ├── update_loading_view_controller.coffee │ │ │ ├── update_unlocking_view_controller.coffee │ │ │ └── update_updating_view_controller.coffee │ │ ├── apps │ │ │ └── coinkite │ │ │ │ ├── dashboard │ │ │ │ ├── apps_coinkite_dashboard_index_view_controller.coffee │ │ │ │ └── apps_coinkite_dashboard_compatibility_view_controller.coffee │ │ │ │ ├── keygen │ │ │ │ ├── apps_coinkite_keygen_show_dialog_view_controller.coffee │ │ │ │ └── apps_coinkite_keygen_index_dialog_view_controller.coffee │ │ │ │ ├── settings │ │ │ │ └── apps_coinkite_settings_index_dialog_view_controller.coffee │ │ │ │ └── cosign │ │ │ │ └── apps_coinkite_cosign_index_dialog_view_controller.coffee │ │ └── common │ │ │ └── dialogs │ │ │ ├── common_dialogs_help_dialog_view_controller.coffee │ │ │ └── common_dialogs_message_dialog_view_controller.coffee │ ├── configuration.all.coffee │ ├── utils │ │ ├── lru.coffee │ │ ├── synchronization │ │ │ └── synchronized_object.coffee │ │ ├── array.coffee │ │ ├── json.coffee │ │ ├── math.coffee │ │ ├── promise_map.coffee │ │ ├── easing.coffee │ │ ├── render.coffee │ │ ├── promise │ │ │ ├── debounce.coffee │ │ │ └── throttle.coffee │ │ ├── validers.coffee │ │ ├── logger │ │ │ ├── secure_log_writer.coffee │ │ │ └── secure_log_reader.coffee │ │ ├── require.coffee │ │ ├── function_lock.coffee │ │ ├── progressbars.coffee │ │ ├── spinners.coffee │ │ └── apdu_logger.coffee │ ├── fup │ │ ├── operation_firmware_update_request.coffee │ │ ├── setup_firmware_update_request.coffee │ │ ├── utils.coffee │ │ └── versatile_firmware_update_request.coffee │ ├── crypto │ │ ├── sha256.coffee │ │ ├── base58.coffee │ │ └── aes.coffee │ ├── api │ │ ├── fees_restclient.coffee │ │ ├── warning_restclient.coffee │ │ ├── m2fa_restclient.coffee │ │ ├── block_restclient.coffee │ │ └── currencies_restclient.coffee │ ├── configuration.debug.coffee │ ├── managers │ │ ├── application_manager.coffee │ │ └── schemes_manager.coffee │ ├── models │ │ ├── configuration.coffee │ │ ├── block.coffee │ │ └── transaction.coffee │ ├── dongle │ │ └── utils.coffee │ ├── preferences │ │ └── fees.coffee │ ├── storage │ │ └── memory_store.coffee │ ├── widgets │ │ ├── switch.coffee │ │ └── circle_progress_bar.coffee │ └── tasks │ │ └── operations_consumption_task.coffee ├── locales │ └── en │ │ ├── messages.beta.properties │ │ ├── messages.debug.bitcoin.properties │ │ ├── messages.release.testnet.properties │ │ └── messages.debug.testnet.properties ├── spec │ ├── spec_view_controller.coffee │ ├── support │ │ └── jasmine.json │ ├── api │ │ └── synced_rest_client_spec.coffee │ ├── tasks │ │ └── wallet_open_task_spec.coffee │ ├── utils │ │ └── storage │ │ │ └── chrome_store_spec.coffee │ └── dongle │ │ └── derivation_spec.coffee ├── views │ ├── onboarding │ │ ├── onboarding.eco │ │ ├── management │ │ │ ├── provisioning.eco │ │ │ └── done.eco │ │ ├── device │ │ │ ├── unplug.eco │ │ │ ├── opening.eco │ │ │ ├── pin.eco │ │ │ ├── connecting.eco │ │ │ ├── chains │ │ │ │ ├── recover.eco │ │ │ │ ├── choice.eco │ │ │ │ └── message.eco │ │ │ ├── swappedbip39provisioning.eco │ │ │ ├── plug.eco │ │ │ ├── error.eco │ │ │ ├── failed.eco │ │ │ ├── unsupported.eco │ │ │ ├── firmware.eco │ │ │ └── update.eco │ │ └── live │ │ │ ├── go_hw1.eco │ │ │ └── go.eco │ ├── common │ │ └── dialogs │ │ │ ├── dialog.eco │ │ │ ├── qrcode.eco │ │ │ └── message.eco │ ├── update │ │ ├── unlocking.eco │ │ ├── welcome.eco │ │ ├── plug.eco │ │ ├── unplug.eco │ │ ├── index.eco │ │ ├── linux.eco │ │ ├── done.eco │ │ ├── loading.eco │ │ ├── error.eco │ │ ├── erasing.eco │ │ ├── updating.eco │ │ ├── update.eco │ │ ├── seed.eco │ │ └── setupswappedbip39.eco │ ├── wallet │ │ ├── accounts │ │ │ ├── alloperations.eco │ │ │ ├── operations.eco │ │ │ └── index.eco │ │ ├── bitid │ │ │ ├── authenticating.eco │ │ │ └── form.eco │ │ ├── settings │ │ │ ├── bitcoin │ │ │ │ ├── confirmations.eco │ │ │ │ ├── fees.eco │ │ │ │ └── blockchain.eco │ │ │ ├── display │ │ │ │ ├── units.eco │ │ │ │ ├── currency.eco │ │ │ │ └── language.eco │ │ │ ├── apps.eco │ │ │ ├── tools.eco │ │ │ ├── hardware.eco │ │ │ ├── display.eco │ │ │ ├── bitcoin.eco │ │ │ ├── hardware │ │ │ │ └── firmware.eco │ │ │ ├── apps │ │ │ │ └── list.eco │ │ │ └── tools │ │ │ │ ├── logs.eco │ │ │ │ └── utilities.eco │ │ ├── p2sh │ │ │ ├── signing.eco │ │ │ └── index.eco │ │ ├── xpubkey │ │ │ ├── processing.eco │ │ │ └── index.eco │ │ ├── message │ │ │ ├── result.eco │ │ │ ├── processing.eco │ │ │ └── index.eco │ │ ├── pairing │ │ │ ├── progress.eco │ │ │ └── finalizing.eco │ │ ├── send │ │ │ ├── preparing.eco │ │ │ ├── mobile.eco │ │ │ ├── processing.eco │ │ │ ├── validating.eco │ │ │ ├── method.eco │ │ │ └── card.eco │ │ ├── api │ │ │ ├── accounts.eco │ │ │ └── operations.eco │ │ ├── dialogs │ │ │ ├── xpub.eco │ │ │ └── apifailures.eco │ │ └── receive │ │ │ └── enforce │ │ │ └── alert.eco │ ├── spec │ │ ├── _suite_node.eco │ │ └── index.eco │ └── apps │ │ └── coinkite │ │ ├── cosign │ │ ├── signing.eco │ │ └── fetching.eco │ │ ├── keygen │ │ ├── processing.eco │ │ └── index.eco │ │ └── dashboard │ │ └── compatibility.eco ├── firmwares │ ├── btchipfirmware-init-1103.js │ ├── btchipfirmware-init-1104.js │ ├── btchipfirmware-init-01410.js │ ├── btchipfirmware-init-01411.js │ ├── btchipfirmware-init-01412.js │ ├── btchipfirmware-init-01413.js │ ├── btchipfirmware-init-01414.js │ ├── btchipfirmware-init-1102.js │ ├── btchipfirmware-init-1101.js │ └── btchipfirmware-init-1100.js └── libs │ └── btchip │ └── btchip-js-api │ └── GlobalConstants.js ├── gulpfile.js ├── .gitignore └── compilation ├── script-doc.coffee ├── script-git-finalize.coffee ├── build.coffee.template ├── script-zip.coffee ├── utils.coffee ├── gulp-build-file.coffee └── script-git-setup.coffee /app/public/chosen.min.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/assets/css/spec/result.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/configuration.release.coffee: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/assets/css/wallet/accounts/operations.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/assets/css/wallet/accounts/alloperations.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/dialogs/wallet_dialogs_: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/locales/en/messages.beta.properties: -------------------------------------------------------------------------------- 1 | application.name = Ledger Wallet Bitcoin (Beta 3) -------------------------------------------------------------------------------- /app/src/configuration.all.coffee: -------------------------------------------------------------------------------- 1 | # Btchip logging 2 | @DEBUG = ledger.config.btcshipDebug -------------------------------------------------------------------------------- /app/public/mac_close_fix/fix.js: -------------------------------------------------------------------------------- 1 | setTimeout(function () { 2 | window.close(); 3 | }, 0); -------------------------------------------------------------------------------- /app/locales/en/messages.debug.bitcoin.properties: -------------------------------------------------------------------------------- 1 | application.name = Ledger Wallet Bitcoin (debug) -------------------------------------------------------------------------------- /app/locales/en/messages.release.testnet.properties: -------------------------------------------------------------------------------- 1 | application.name = Ledger Wallet Bitcoin for Testnet -------------------------------------------------------------------------------- /app/locales/en/messages.debug.testnet.properties: -------------------------------------------------------------------------------- 1 | application.name = Ledger Wallet Bitcoin for Testnet (debug) -------------------------------------------------------------------------------- /app/spec/spec_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class ledger.specs.ViewController extends ledger.common.ViewController 2 | 3 | -------------------------------------------------------------------------------- /app/assets/images/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/icon-16.png -------------------------------------------------------------------------------- /app/assets/images/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/icon-32.png -------------------------------------------------------------------------------- /app/assets/images/icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/icon-48.png -------------------------------------------------------------------------------- /app/assets/images/icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/icon-64.png -------------------------------------------------------------------------------- /app/views/onboarding/onboarding.eco: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /app/assets/images/icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/icon-128.png -------------------------------------------------------------------------------- /app/assets/images/update/flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/update/flash.png -------------------------------------------------------------------------------- /app/assets/images/update/gears.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/update/gears.png -------------------------------------------------------------------------------- /app/assets/fonts/OpenSans-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/fonts/OpenSans-Bold.woff -------------------------------------------------------------------------------- /app/assets/fonts/OpenSans-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/fonts/OpenSans-Light.woff -------------------------------------------------------------------------------- /app/assets/images/update/towers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/update/towers.png -------------------------------------------------------------------------------- /app/assets/fonts/OpenSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/fonts/OpenSans-Regular.woff -------------------------------------------------------------------------------- /app/assets/fonts/OpenSans-Semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/fonts/OpenSans-Semibold.woff -------------------------------------------------------------------------------- /app/assets/images/common/large_fail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/large_fail.png -------------------------------------------------------------------------------- /app/assets/images/update/skyrocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/update/skyrocket.png -------------------------------------------------------------------------------- /app/assets/images/wallet/help_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/help_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/send_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/send_icon.png -------------------------------------------------------------------------------- /app/assets/fonts/OpenSans-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/fonts/OpenSans-ExtraBold.woff -------------------------------------------------------------------------------- /app/assets/images/common/large_check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/large_check.png -------------------------------------------------------------------------------- /app/assets/images/common/large_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/large_error.png -------------------------------------------------------------------------------- /app/assets/images/common/plug_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/plug_wallet.png -------------------------------------------------------------------------------- /app/assets/images/update/plug_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/update/plug_wallet.png -------------------------------------------------------------------------------- /app/assets/images/wallet/chains_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/chains_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/cursor_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/cursor_arrow.png -------------------------------------------------------------------------------- /app/assets/images/wallet/ledger_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/ledger_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/pairing_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/pairing_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/receive_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/receive_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/reload_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/reload_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/signout_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/signout_icon.png -------------------------------------------------------------------------------- /app/spec/support/jasmine.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "spec", 3 | "spec_files": [], 4 | "helpers": [ 5 | "helpers/**/*.js" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /app/assets/images/apps/coinkite/key_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/apps/coinkite/key_icon.png -------------------------------------------------------------------------------- /app/assets/images/common/large_question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/large_question.png -------------------------------------------------------------------------------- /app/assets/images/common/large_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/large_settings.png -------------------------------------------------------------------------------- /app/assets/images/common/large_success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/large_success.png -------------------------------------------------------------------------------- /app/assets/images/common/qrcode_borders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/common/qrcode_borders.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/large_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/large_logo.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/live/nanos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/live/nanos.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/pin_value.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/pin_value.png -------------------------------------------------------------------------------- /app/assets/images/update/unplug_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/update/unplug_wallet.png -------------------------------------------------------------------------------- /app/assets/images/wallet/accounts_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/accounts_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/dashboard_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/dashboard_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/dropdown_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/dropdown_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/settings_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/settings_icon.png -------------------------------------------------------------------------------- /app/assets/images/apps/coinkite/help_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/apps/coinkite/help_icon.png -------------------------------------------------------------------------------- /app/assets/images/wallet/send/ic_exchange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/wallet/send/ic_exchange.png -------------------------------------------------------------------------------- /app/src/controllers/onboarding/onboarding_navigation_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingNavigationController extends ledger.common.NavigationController 2 | -------------------------------------------------------------------------------- /app/assets/images/apps/coinkite/coinkite_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/apps/coinkite/coinkite_icon.png -------------------------------------------------------------------------------- /app/assets/images/apps/coinkite/cosign_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/apps/coinkite/cosign_icon.png -------------------------------------------------------------------------------- /app/assets/images/apps/coinkite/settings_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/apps/coinkite/settings_icon.png -------------------------------------------------------------------------------- /app/assets/images/apps/coinkite/wallet_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/apps/coinkite/wallet_icon.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/live/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/live/screenshot.png -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/onboarding_device_error_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceErrorViewController extends ledger.common.ViewController -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/onboarding_device_unplug_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceUnplugViewController extends @OnboardingViewController -------------------------------------------------------------------------------- /app/assets/images/onboarding/device/plug_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/device/plug_wallet.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/large_right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/large_right_arrow.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/device/unplug_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/device/unplug_wallet.png -------------------------------------------------------------------------------- /app/public/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/public/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/restore_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/restore_icon.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/wallet_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/wallet_icon.png -------------------------------------------------------------------------------- /app/assets/css/wallet/bitid/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#bitid_index_dialog { 5 | width: 500px; 6 | } -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/ledger_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/ledger_wallet.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/numeric_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/numeric_field.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/scrambled_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/scrambled_field.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/convert_from_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/convert_from_new.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/convert_from_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/convert_from_old.png -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/new_ledger_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/new_ledger_wallet.png -------------------------------------------------------------------------------- /app/spec/api/synced_rest_client_spec.coffee: -------------------------------------------------------------------------------- 1 | describe "SyncedRestClient", -> 2 | client = null 3 | 4 | beforeEach -> 5 | client = new ledger.storage.SyncedRestClient.instance 6 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by pollas_p on 16/10/2014. 3 | */ 4 | /** This file should not be edited **/ 5 | 6 | require('coffee-script/register'); 7 | require('./Gulpfile.coffee'); -------------------------------------------------------------------------------- /app/assets/css/wallet/p2sh/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#wallet_p2sh_index_dialog { 5 | width: 300px; 6 | } 7 | -------------------------------------------------------------------------------- /app/src/controllers/update/update_error_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateErrorViewController extends @UpdateViewController 2 | 3 | localizablePageSubtitle: "update.error.update_failed" -------------------------------------------------------------------------------- /app/src/controllers/update/update_plug_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdatePlugViewController extends @UpdateViewController 2 | 3 | localizablePageSubtitle: "update.plug.plug_your_wallet" -------------------------------------------------------------------------------- /app/src/utils/lru.coffee: -------------------------------------------------------------------------------- 1 | 2 | LRUCache.fromJson = (jsonArray, limit = 200000) -> 3 | cache = new LRUCache(limit) 4 | for item in jsonArray 5 | cache.put(item.key, item.value) 6 | cache -------------------------------------------------------------------------------- /app/src/utils/synchronization/synchronized_object.coffee: -------------------------------------------------------------------------------- 1 | ledger.synchronization ?= {} 2 | 3 | class ledger.synchronization.SynchronizedObject 4 | 5 | get: () -> 6 | 7 | synchronize: () -> -------------------------------------------------------------------------------- /app/assets/css/wallet/api/accounts.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#wallet_api_accounts_dialog { 5 | width: 300px; 6 | } 7 | -------------------------------------------------------------------------------- /app/assets/css/wallet/api/addresses.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#wallet_api_addresses_dialog { 5 | width: 300px; 6 | } 7 | -------------------------------------------------------------------------------- /app/assets/css/wallet/api/operations.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#wallet_api_operations_dialog { 5 | width: 300px; 6 | } 7 | -------------------------------------------------------------------------------- /app/assets/images/onboarding/management/existing_ledger_wallet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LedgerHQ/ledger-wallet-chrome/HEAD/app/assets/images/onboarding/management/existing_ledger_wallet.png -------------------------------------------------------------------------------- /app/src/controllers/update/update_unplug_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateUnplugViewController extends @UpdateViewController 2 | 3 | localizablePageSubtitle: "update.unplug.unplug_your_wallet" -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/cosign/show.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../mixins"; 2 | @import (reference) "../../../constants"; 3 | 4 | section#coinkite_cosign_show_dialog { 5 | width: 300px; 6 | } 7 | -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/unplug.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | div { 7 | margin-top: @metrics-small-padding; 8 | } 9 | } -------------------------------------------------------------------------------- /app/views/common/dialogs/dialog.eco: -------------------------------------------------------------------------------- 1 |
2 | 5 |
-------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | build/ 3 | node_modules/ 4 | release/ 5 | .DS_Store 6 | doc/ 7 | *.html 8 | *~ 9 | dist/ 10 | *.log 11 | signature/ 12 | .compilation_preferences.json 13 | crowdin.yaml 14 | package-lock.json 15 | MuseoSans*.woff 16 | -------------------------------------------------------------------------------- /app/src/fup/operation_firmware_update_request.coffee: -------------------------------------------------------------------------------- 1 | ### 2 | 3 | ### 4 | class ledger.fup.OperationFirmwareUpdateRequest extends ledger.fup.FirmwareUpdateRequest 5 | 6 | constructor: (firmwareUpdate) -> 7 | super firmwareUpdate, 'OS_LOADER' -------------------------------------------------------------------------------- /app/src/fup/setup_firmware_update_request.coffee: -------------------------------------------------------------------------------- 1 | ### 2 | 3 | ### 4 | class ledger.fup.SetupFirmwareUpdateRequest extends ledger.fup.FirmwareUpdateRequest 5 | 6 | constructor: (firmwareUpdater) -> 7 | super firmwareUpdater, 'OS_LOADER' 8 | -------------------------------------------------------------------------------- /app/assets/css/spec/index.less: -------------------------------------------------------------------------------- 1 | 2 | @import (reference) "../mixins"; 3 | @import (reference) "../constants"; 4 | 5 | #suites_tree { 6 | padding-top: @metrics-very-small-padding; 7 | } 8 | 9 | .right-action-panel { 10 | float: right; 11 | } -------------------------------------------------------------------------------- /app/spec/tasks/wallet_open_task_spec.coffee: -------------------------------------------------------------------------------- 1 | xdescribe "WalletOpenTask", -> 2 | 3 | beforeEach -> 4 | ledger.tasks.WalletOpenTask.instance.start() 5 | 6 | afterEach -> 7 | ledger.tasks.Task.resetAllSingletonTasks() 8 | 9 | it "should", -> -------------------------------------------------------------------------------- /app/src/controllers/apps/coinkite/dashboard/apps_coinkite_dashboard_index_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @AppsCoinkiteDashboardIndexViewController extends ledger.common.ViewController 2 | 3 | openCoinkite: -> 4 | window.open 'https://coinkite.com/' -------------------------------------------------------------------------------- /app/src/crypto/sha256.coffee: -------------------------------------------------------------------------------- 1 | @ledger.crypto ?= {} 2 | 3 | # Wrapper class around Stanford AES Library for hashing data with SHA-256 4 | class @ledger.crypto.SHA256 5 | 6 | @hashString: (string) -> sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(string)) -------------------------------------------------------------------------------- /app/assets/css/widgets.less: -------------------------------------------------------------------------------- 1 | @import "widgets/buttons"; 2 | @import "widgets/panels"; 3 | @import "widgets/switch"; 4 | @import "widgets/select"; 5 | @import "widgets/segmented_control"; 6 | @import "widgets/accessories"; 7 | @import "widgets/circle_progress_bar"; -------------------------------------------------------------------------------- /app/assets/css/onboarding/management/summary.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .page-content-container { 5 | .black-indication:first-of-type { 6 | margin-top: @metrics-very-large-padding; 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/xpubkey/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#wallet_xpubkey_index_dialog { 5 | width: 300px; 6 | } 7 | 8 | #derivation_path { 9 | font-family: monospace; 10 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_done_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementDoneViewController extends @OnboardingViewController 2 | 3 | bumpsStepCount: false 4 | 5 | openSupport: -> 6 | window.open t 'application.support_url' -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/keygen/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../mixins"; 2 | @import (reference) "../../../constants"; 3 | 4 | section#apps_coinkite_keygen_index_dialog { 5 | width: 300px; 6 | } 7 | 8 | #derivation_path { 9 | font-family: monospace; 10 | } -------------------------------------------------------------------------------- /app/src/api/fees_restclient.coffee: -------------------------------------------------------------------------------- 1 | 2 | class ledger.api.FeesRestClient extends ledger.api.RestClient 3 | 4 | getEstimatedFees: (callback) -> 5 | ledger.defer(callback).resolve( 6 | @http().get(url: "blockchain/v2/#{ledger.config.network.ticker}/fees") 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/configuration.debug.coffee: -------------------------------------------------------------------------------- 1 | _.extend @ledger.config, 2 | defaultLoggingLevel: 3 | Connected: 4 | Enabled: 'ALL' 5 | Disabled: 'ALL' 6 | Disconnected: 7 | Enabled: 'ALL' 8 | Disabled: 'ALL' 9 | 10 | Q.longStackSupport = true 11 | -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-1103.js: -------------------------------------------------------------------------------- 1 | var INIT_LW_1103 = [ 2 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 3 | "D02200002B000000020000000120B1E991573CD246E6586376D6C607F337FC23958E78B8B86FCB9060C8BA3714D8009D" 4 | ]; 5 | 6 | -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-1104.js: -------------------------------------------------------------------------------- 1 | var INIT_LW_1104 = [ 2 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 3 | "D02200002B000000020000000120A024A06166C2F43E34D39BC6937F255329198530AA9AF08F2D86CE80F02264FC009D" 4 | ]; 5 | 6 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/dialogs/wallet_dialogs_apifailures_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletDialogsApifailuresDialogViewController extends ledger.common.DialogViewController 2 | 3 | openHelpCenter: -> 4 | window.open t 'application.support_url' 5 | @dismiss() 6 | -------------------------------------------------------------------------------- /app/assets/css/update/done.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/bitid/form.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#wallet_bitid_form_dialog { 5 | .text-input { 6 | width: 450px; 7 | font-family: monospace; 8 | color: @color-dark-grey; 9 | } 10 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/onboarding_device_failed_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceFailedViewController extends @OnboardingViewController 2 | 3 | updateNow: -> 4 | ledger.app.setExecutionMode(ledger.app.Modes.FirmwareUpdate) 5 | ledger.app.router.go '/' -------------------------------------------------------------------------------- /app/src/utils/array.coffee: -------------------------------------------------------------------------------- 1 | 2 | _.mixin 3 | eachBatch: (array, batchSize, iteratee) -> 4 | batch = [] 5 | for item in array 6 | batch.push item 7 | if batch.length >= batchSize 8 | iteratee(array, yes) 9 | batch = [] 10 | iteratee(batch, no) -------------------------------------------------------------------------------- /app/assets/css/update/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .regular-grey-text-small { 9 | margin-top: @metrics-small-padding; 10 | } 11 | } -------------------------------------------------------------------------------- /app/assets/css/update/plug.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/settings/apps.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#settings_apps_dialog { 4 | width: @dialog-width-settings; 5 | 6 | #list_table_container { 7 | > .large-table { 8 | margin-top: @metrics-medium-padding; 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /app/assets/css/update/unplug.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | } -------------------------------------------------------------------------------- /app/assets/css/update/welcome.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/onboarding_device_unsupported_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceUnsupportedViewController extends @OnboardingViewController 2 | 3 | updateNow: -> 4 | ledger.app.setExecutionMode(ledger.app.Modes.FirmwareUpdate) 5 | ledger.app.router.go '/' -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/wallet_settings_apps_section_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsAppsSectionDialogViewController extends WalletSettingsSectionDialogViewController 2 | 3 | settingViewControllersClasses: [ 4 | WalletSettingsAppsListSettingViewController, 5 | ] -------------------------------------------------------------------------------- /app/assets/css/application.less: -------------------------------------------------------------------------------- 1 | @import "constants"; 2 | @import "mixins"; 3 | @import "fonts"; 4 | @import "reset"; 5 | @import "dialogs"; 6 | @import "dropdown"; 7 | @import "common"; 8 | @import "pincodes"; 9 | @import "tables"; 10 | @import "progressbars"; 11 | @import "qrcodes"; 12 | @import "widgets"; -------------------------------------------------------------------------------- /app/views/update/unlocking.eco: -------------------------------------------------------------------------------- 1 |
2 | <%= t 'update.unlocking.enter_pin_code' %> 3 |
4 |
<%= t 'update.unlocking.if_you_forgot' %>
5 |
-------------------------------------------------------------------------------- /app/views/update/welcome.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- t 'update.welcome.you_are_about' %>
4 |
<%= t 'update.welcome.assistant' %>
5 |
-------------------------------------------------------------------------------- /app/assets/css/mixins.less: -------------------------------------------------------------------------------- 1 | .fullsize { 2 | width: 100%; 3 | height: 100%; 4 | } 5 | 6 | .selectable { 7 | -webkit-user-select: text; 8 | } 9 | 10 | .inverted { 11 | direction: rtl; 12 | } 13 | 14 | @media print 15 | { 16 | .no-print, .no-print * 17 | { 18 | display: none !important; 19 | } 20 | } -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-01410.js: -------------------------------------------------------------------------------- 1 | var INIT_01410 = [ 2 | "E00000000E010401020A0BB41F865524002CCF", 3 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 4 | "D02200002B000000010000000120C0298847F863B98E33245A616F1A923A5F4E80A190482222E709729B5BDCCEA11461" 5 | ]; 6 | 7 | -------------------------------------------------------------------------------- /app/src/controllers/update/update_linux_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateLinuxViewController extends @UpdateViewController 2 | 3 | navigation: 4 | nextRoute: "/update/loading" 5 | localizablePageSubtitle: "update.linux.linux_users" 6 | 7 | navigateNext: -> 8 | @getRequest().approveCurrentState() 9 | super -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/base/wallet_settings_setting_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsSettingViewController extends ledger.common.ViewController 2 | 3 | renderSelector: null 4 | 5 | identifier: () -> 6 | @className().replace 'SettingViewController', '' 7 | 8 | stylesheetIdentifier: -> null -------------------------------------------------------------------------------- /app/src/utils/json.coffee: -------------------------------------------------------------------------------- 1 | _.mixin 2 | 3 | toJson: (data) -> 4 | if _(data).isObject() and !_(data).isArray() 5 | data = _(data).chain().pairs().sort().object().value() 6 | '{' + (JSON.stringify(key) + ':' + _(value).toJson() for key, value of data).join(',') + '}' 7 | else 8 | JSON.stringify(data) -------------------------------------------------------------------------------- /app/assets/css/wallet/dialogs/operationdetail.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#operation_detail_dialog { 4 | #operation_inputs, #operation_outputs { 5 | line-height: 25px; 6 | .selectable; 7 | padding: 6px 0px; 8 | } 9 | #operation_identifier { 10 | .selectable; 11 | } 12 | } -------------------------------------------------------------------------------- /app/views/update/plug.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- t 'update.plug.insert_your_wallet' %>
4 |
<%- t 'update.common.need_to_repeat_several_times' %>
5 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/device/plug.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | > img { 7 | margin-bottom: @metrics-small-padding; 8 | } 9 | 10 | > .medium-indication { 11 | margin-top: @metrics-small-padding; 12 | display: block; 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_convert_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementConvertViewController extends @OnboardingViewController 2 | 3 | # accepts @params.message_mode = "new" or "old" 4 | 5 | navigation: 6 | continueUrl: '/onboarding/management/pin' 7 | bumpsStepCount: false 8 | -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/pin.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | .pincode { 7 | margin-top: @metrics-medium-padding; 8 | justify-content: center; 9 | align-items: center; 10 | } 11 | 12 | > a { 13 | display: block; 14 | } 15 | } -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-01411.js: -------------------------------------------------------------------------------- 1 | var INIT_01411 = [ 2 | "E00000000E010401020A0BB41F865524002CCF", 3 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 4 | "D02200002B0000000200000001209BB0CB7921EE6965273AA55CD10B64DADEE198F5BE4231B48C45EAF0A309D649009D", 5 | "E02A020000" 6 | ]; 7 | 8 | -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-01412.js: -------------------------------------------------------------------------------- 1 | var INIT_01412 = [ 2 | "E00000000E010401020A0BB41F865524002CCF", 3 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 4 | "D02200002B000000020000000120356CFE4A90D6BA0E52C1E90DB993778901A2016E56CFDB87FBA478EA85A161A4009D", 5 | "E02A020000" 6 | ]; 7 | 8 | -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-01413.js: -------------------------------------------------------------------------------- 1 | var INIT_01413 = [ 2 | "E00000000E010401020A0BB41F865524002CCF", 3 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 4 | "D02200002B00000002000000012055CA0E902444FBB4632D10A5EBF9C6DF95B47190357ADE87ECE46BC3EC15BF7F009D", 5 | "E02A020000" 6 | ]; 7 | 8 | -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-01414.js: -------------------------------------------------------------------------------- 1 | var INIT_01414 = [ 2 | "E00000000E010401020A0BB41F865524002CCF", 3 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 4 | "D02200002B00000002000000012044A95E95E274CD260C427E802748075F5CC3D06ED3BA49D04ADA15FBED3DDD8C009D", 5 | "E02A020000" 6 | ]; 7 | 8 | -------------------------------------------------------------------------------- /app/views/update/unplug.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- t 'update.unplug.remove_your_wallet' %>
4 |
<%- t 'update.common.need_to_repeat_several_times' %>
5 |
-------------------------------------------------------------------------------- /app/views/wallet/accounts/alloperations.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.accounts.alloperations.all_operations' %>

4 |
5 |
<%= t 'wallet.defaults.operations.no_operations' %>
6 |
7 |
-------------------------------------------------------------------------------- /app/public/tooltipster/css/themes/tooltipster-noir.css: -------------------------------------------------------------------------------- 1 | .tooltipster-noir { 2 | border-radius: 0px; 3 | border: 3px solid #2c2c2c; 4 | background: #fff; 5 | color: #2c2c2c; 6 | } 7 | .tooltipster-noir .tooltipster-content { 8 | font-family: 'Georgia', serif; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/management/pinconfirmation.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .page-content-container { 5 | > .pincode { 6 | margin-top: @metrics-small-padding; 7 | } 8 | 9 | > .invalid-indication { 10 | margin-top: @metrics-medium-padding; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/management/welcome.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .title-container { 5 | .page-indication { 6 | margin-top: @metrics-almost-small-padding; 7 | } 8 | 9 | .page-strong-indication { 10 | margin-top: @metrics-large-padding; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /app/public/tooltipster/css/themes/tooltipster-light.css: -------------------------------------------------------------------------------- 1 | .tooltipster-light { 2 | border-radius: 5px; 3 | border: 1px solid #cccccc; 4 | background: #ededed; 5 | color: #666666; 6 | } 7 | .tooltipster-light .tooltipster-content { 8 | font-family: Arial, sans-serif; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/connecting.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | .spinner { 7 | margin-top: 20px; 8 | margin-bottom: 60px; 9 | } 10 | 11 | > .medium-indication { 12 | margin-top: @metrics-small-padding; 13 | display: block; 14 | } 15 | } -------------------------------------------------------------------------------- /app/public/tooltipster/css/themes/tooltipster-punk.css: -------------------------------------------------------------------------------- 1 | .tooltipster-punk { 2 | border-radius: 5px; 3 | border-bottom: 3px solid #f71169; 4 | background: #2a2a2a; 5 | color: #fff; 6 | } 7 | .tooltipster-punk .tooltipster-content { 8 | font-family: 'Courier', monospace; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/wallet_settings_tools_section_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsToolsSectionDialogViewController extends WalletSettingsSectionDialogViewController 2 | 3 | settingViewControllersClasses: [ 4 | WalletSettingsToolsLogsSettingViewController, 5 | WalletSettingsToolsUtilitiesSettingViewController 6 | ] -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/keygen/show.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../mixins"; 2 | @import (reference) "../../../constants"; 3 | 4 | section#coinkite_keygen_show_dialog { 5 | width: 500px; 6 | .textarea-input { 7 | font-family: monospace; 8 | color: @color-dark-grey; 9 | } 10 | } 11 | 12 | #path { 13 | font-family: monospace; 14 | } -------------------------------------------------------------------------------- /app/assets/css/widgets/circle_progress_bar.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | .circle-progress-bar-container { 4 | width: 100px; 5 | height: 100px; 6 | 7 | & > svg { 8 | width: 100%; 9 | display: block; 10 | } 11 | 12 | .progress-text { 13 | font-size: 14px; 14 | font-weight: @font-weight-light; 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/cosign/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../mixins"; 2 | @import (reference) "../../../constants"; 3 | 4 | section#coinkite_cosign_index_dialog { 5 | width: 300px; 6 | #request_input { 7 | width: 200px; 8 | } 9 | .text-input { 10 | font-family: monospace; 11 | color: @color-dark-grey; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/public/tooltipster/css/themes/tooltipster-shadow.css: -------------------------------------------------------------------------------- 1 | .tooltipster-shadow { 2 | border-radius: 5px; 3 | background: #fff; 4 | box-shadow: 0px 0px 14px rgba(0,0,0,0.3); 5 | color: #2c2c2c; 6 | } 7 | .tooltipster-shadow .tooltipster-content { 8 | font-family: 'Arial', sans-serif; 9 | font-size: 14px; 10 | line-height: 16px; 11 | padding: 8px 10px; 12 | } -------------------------------------------------------------------------------- /app/src/controllers/common/dialogs/common_dialogs_help_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @CommonDialogsHelpDialogViewController extends ledger.common.DialogViewController 2 | 3 | browseKnowledge: -> 4 | window.open t 'application.support_url' 5 | @dismiss() 6 | 7 | contactSupport: -> 8 | @getDialog().push new CommonDialogsTicketDialogViewController() -------------------------------------------------------------------------------- /app/views/spec/_suite_node.eco: -------------------------------------------------------------------------------- 1 |
style="margin-top: 5px"<% end%>> 2 | 3 | checked<% end %> data-href="#toggleSpec(id=<%= @id %>)" /> 4 | <%= @name %> 5 |
-------------------------------------------------------------------------------- /app/views/update/index.eco: -------------------------------------------------------------------------------- 1 |
2 |
<%- _.str.sprintf(t('update.index.update_process'), ledger.config.network.plural) %>
3 |
<%- t 'update.index.clicking_continue' %>
4 |
<%= t 'update.index.please_note' %>
5 |
-------------------------------------------------------------------------------- /app/views/update/linux.eco: -------------------------------------------------------------------------------- 1 |
2 |
<%- t 'update.linux.follow_instructions' %>
3 |
<%= t 'update.linux.first' %>
4 |
<%= t 'update.linux.fc' %>
5 |
<%= t 'update.linux.second' %>
6 |
-------------------------------------------------------------------------------- /app/views/wallet/accounts/operations.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |

5 |
6 |
<%= t 'wallet.defaults.operations.no_operations' %>
7 |
8 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/device/error.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .greyed-container { 5 | text-align: center; 6 | 7 | > .black-indication { 8 | margin-top: @metrics-small-padding; 9 | } 10 | 11 | > .medium-indication { 12 | margin-top: @metrics-small-padding; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /app/assets/css/progressbars.less: -------------------------------------------------------------------------------- 1 | @import (reference) "common"; 2 | 3 | .progressbar { 4 | @height: 2px; 5 | height: @height; 6 | width: 100px; 7 | display: flex; 8 | flex-direction: row; 9 | background-color: @color-light-grey; 10 | 11 | > .left { 12 | width: 0%; 13 | background-color: @color-soft-grey; 14 | height: 100%; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/api/warning_restclient.coffee: -------------------------------------------------------------------------------- 1 | 2 | class ledger.api.WarningRestClient extends ledger.api.RestClient 3 | 4 | getWarning: (callback) -> 5 | ledger.defer(callback).resolve( 6 | @http().get(url: "http://api.ledgerwallet.com/bitcoin/fork/warning") 7 | ).promise 8 | 9 | ledger.api.WarningRestClient.instance = new ledger.api.WarningRestClient() 10 | -------------------------------------------------------------------------------- /compilation/script-doc.coffee: -------------------------------------------------------------------------------- 1 | {exec} = require 'child_process' 2 | Q = require 'Q' 3 | 4 | module.exports = () -> 5 | defer = Q.defer() 6 | child = exec './node_modules/.bin/codo -v app/src/', {}, () -> 7 | child.stdin.pipe process.stdin 8 | child.stdout.pipe process.stdout 9 | child.stderr.pipe process.stderr 10 | defer.resolve() 11 | defer.promise -------------------------------------------------------------------------------- /app/assets/css/update/erasing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | 12 | > .regular-grey-text-small { 13 | margin-top: @metrics-small-padding; 14 | } 15 | } -------------------------------------------------------------------------------- /app/assets/css/update/error.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | 12 | > .regular-grey-text-small { 13 | margin-top: @metrics-almost-small-padding; 14 | } 15 | } -------------------------------------------------------------------------------- /app/assets/css/update/updating.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-large-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .page-indication { 9 | margin-top: @metrics-very-small-padding; 10 | } 11 | 12 | > .regular-grey-text-small { 13 | margin-top: @metrics-small-padding; 14 | } 15 | } -------------------------------------------------------------------------------- /app/src/controllers/wallet/api/wallet_api_accounts_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletApiAccountsDialogViewController extends ledger.common.DialogViewController 2 | 3 | cancellable: no 4 | 5 | cancel: -> 6 | Api.callback_cancel 'get_accounts', t('wallet.api.errors.cancelled') 7 | @dismiss() 8 | 9 | confirm: -> 10 | Api.exportAccounts() 11 | @dismiss() -------------------------------------------------------------------------------- /app/src/managers/application_manager.coffee: -------------------------------------------------------------------------------- 1 | ledger.managers ?= {} 2 | 3 | class ledger.managers.Application extends EventEmitter 4 | 5 | stringVersion: -> 6 | return chrome.runtime.getManifest().version 7 | 8 | fullStringVersion: -> 9 | return t('application.name') + ' Chrome ' + @stringVersion() 10 | 11 | ledger.managers.application = new ledger.managers.Application() -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/opening.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | .spinner { 7 | margin-top: @metrics-small-padding; 8 | margin-bottom: @metrics-extra-large-padding; 9 | } 10 | 11 | > .medium-indication { 12 | margin-top: @metrics-small-padding; 13 | display: block; 14 | } 15 | } -------------------------------------------------------------------------------- /app/views/wallet/bitid/authenticating.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.bitid.auth.authenticating' %>

4 |
5 |
6 |
<%= t 'wallet.bitid.auth.login' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
-------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/settings/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../mixins"; 2 | @import (reference) "../../../constants"; 3 | 4 | section#coinkite_settings_dialog { 5 | #api_key_input { 6 | width: 300px; 7 | } 8 | #api_secret_input { 9 | width: 300px; 10 | } 11 | .text-input { 12 | font-family: monospace; 13 | color: @color-dark-grey; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/api/m2fa_restclient.coffee: -------------------------------------------------------------------------------- 1 | 2 | class ledger.api.M2faRestClient extends ledger.api.RestClient 3 | 4 | @instance: new @ 5 | 6 | wakeUpSecureScreens: (pairingIds, callback = _.noop) -> 7 | @http().authenticated().post 8 | url: '2fa/pairings/wake_up' 9 | data: {pairing_ids: pairingIds} 10 | onSuccess: callback 11 | onError: @networkErrorCallback(callback) -------------------------------------------------------------------------------- /app/src/utils/math.coffee: -------------------------------------------------------------------------------- 1 | 2 | ledger.math ||= {} 3 | 4 | fibonacciCache = [0, 1] 5 | 6 | _.extend ledger.math, 7 | 8 | fibonacci: (n) -> 9 | return 0 if n < 0 10 | return fibonacciCache[n] if n < fibonacciCache.length 11 | for pos in [fibonacciCache.length - 1...n] 12 | fibonacciCache.push fibonacciCache[pos - 1] + fibonacciCache[pos] 13 | fibonacciCache[n] 14 | 15 | -------------------------------------------------------------------------------- /app/assets/css/update/unlocking.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-indication { 5 | margin-top: @metrics-very-small-padding; 6 | } 7 | 8 | > #pin_container { 9 | margin-top: @metrics-small-padding; 10 | margin-bottom: @metrics-small-padding; 11 | 12 | > .pincode { 13 | justify-content: center; 14 | } 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_recoverydevice_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementRecoverydeviceViewController extends @OnboardingViewController 2 | 3 | bumpsStepCount: false 4 | 5 | navigateConvert: -> 6 | @navigateContinue('/onboarding/management/convert', message_mode: 'new') 7 | 8 | navigatePin: -> 9 | @navigateContinue('/onboarding/management/pin') -------------------------------------------------------------------------------- /app/views/update/done.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- t 'update.done.successfully_updated' %>
4 |
<%- _.str.sprintf(t(if @params.provisioned then 'update.done.enjoy' else 'update.done.use_24_words'), ledger.config.network.plural)%>
5 |
-------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/dashboard/index.less: -------------------------------------------------------------------------------- 1 | @import "../../../constants"; 2 | 3 | #coinkite { 4 | width: 500px; 5 | p { 6 | margin-top: 20px; 7 | } 8 | ul { 9 | list-style-type: disc; 10 | margin-top: 20px; 11 | } 12 | li { 13 | margin-left: 30px; 14 | } 15 | } 16 | 17 | #test { 18 | width: 300px; 19 | margin-left: 50px; 20 | p { 21 | margin-top: 20px; 22 | } 23 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/failed.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | > .black-indication { 7 | margin-top: @metrics-small-padding; 8 | } 9 | 10 | > .medium-indication { 11 | margin-top: @metrics-almost-small-padding; 12 | } 13 | 14 | > .actions-container { 15 | margin-top: @metrics-medium-padding; 16 | } 17 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/dialogs/accountsettings.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#dialogs_accountsettings_dialog { 4 | width: @dialog-width-accounts; 5 | 6 | #account_name_input { 7 | width: 200px; 8 | } 9 | 10 | > .large-table { 11 | margin-top: @metrics-small-padding; 12 | 13 | &:first-of-type { 14 | margin-top: @metrics-medium-padding; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/controllers/apps/coinkite/keygen/apps_coinkite_keygen_show_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @AppsCoinkiteKeygenShowDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | xpubInput: '#xpub_input' 5 | signatureInput: '#signature_input' 6 | 7 | onAfterRender: -> 8 | super 9 | @view.xpubInput.val @params.xpub 10 | @view.signatureInput.val @params.signature -------------------------------------------------------------------------------- /app/views/update/loading.eco: -------------------------------------------------------------------------------- 1 |
2 |
<%- _.str.sprintf(t('update.loading.loading'), @targetVersion) %>
3 |
4 |
5 |
0%
6 |
7 |
<%- t 'update.loading.do_not_unplug' %>
8 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/device/unsupported.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | > .black-indication { 7 | margin-top: @metrics-small-padding; 8 | } 9 | 10 | > .medium-indication { 11 | margin-top: @metrics-almost-small-padding; 12 | } 13 | 14 | > .actions-container { 15 | margin-top: @metrics-medium-padding; 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/wallet_settings_display_section_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsDisplaySectionDialogViewController extends WalletSettingsSectionDialogViewController 2 | 3 | settingViewControllersClasses: [ 4 | WalletSettingsDisplayUnitsSettingViewController, 5 | WalletSettingsDisplayCurrencySettingViewController, 6 | WalletSettingsDisplayLanguageSettingViewController 7 | ] -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_recoverymode_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementRecoverymodeViewController extends @OnboardingViewController 2 | 3 | bumpsStepCount: false 4 | 5 | navigateConvert: -> 6 | @navigateContinue('/onboarding/management/convert', message_mode: 'old') 7 | 8 | navigateRecoveryDevice: -> 9 | @navigateContinue('/onboarding/management/recovery_device') -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/wallet_settings_bitcoin_section_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsBitcoinSectionDialogViewController extends WalletSettingsSectionDialogViewController 2 | 3 | settingViewControllersClasses: [ 4 | WalletSettingsBitcoinConfirmationsSettingViewController, 5 | WalletSettingsBitcoinFeesSettingViewController, 6 | WalletSettingsBitcoinBlockchainSettingViewController 7 | ] -------------------------------------------------------------------------------- /app/assets/css/onboarding/management/provisioning.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .greyed-container { 5 | text-align: center; 6 | 7 | > .spinner { 8 | margin-top: @metrics-small-padding; 9 | margin-bottom: @metrics-extra-large-padding; 10 | } 11 | 12 | > .medium-indication { 13 | margin-top: @metrics-small-padding; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/views/update/error.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- _.str.sprintf(t('update.error.error_updated'), @params.errorCode) %>
4 |
<%- t 'update.error.plug_back' %>
5 |
<%- t 'update.error.problem_persists' %>
6 |
-------------------------------------------------------------------------------- /compilation/script-git-finalize.coffee: -------------------------------------------------------------------------------- 1 | 2 | module.exports = (configuration) -> 3 | Q = require 'q' 4 | return Q() unless configuration.tag? 5 | git = require 'gulp-git' 6 | defer = Q.defer() 7 | 8 | git.checkout configuration.currentBranch, quiet: yes, -> 9 | if configuration.isStashed 10 | git.exec args: 'stash pop', -> defer.resolve() 11 | else 12 | defer.resolve() 13 | 14 | defer.promise 15 | -------------------------------------------------------------------------------- /app/src/models/configuration.coffee: -------------------------------------------------------------------------------- 1 | class @Configuration extends ledger.database.Model 2 | do @init 3 | 4 | @_instance: undefined 5 | 6 | @getInstance: (context) -> 7 | unless @_instance? 8 | @_instance = @findOrCreate({id: 1}, context) 9 | @_instance 10 | 11 | setCurrentApplicationVersion: (version) -> @set('__app_version', version).save() 12 | 13 | getCurrentApplicationVersion: () -> @get('__app_version') -------------------------------------------------------------------------------- /app/src/utils/promise_map.coffee: -------------------------------------------------------------------------------- 1 | 2 | @ledger ||= {} 3 | @ledger.utils ||= {} 4 | 5 | class ledger.utils.PromiseMap 6 | 7 | constructor: -> 8 | @_map = {} 9 | 10 | set: (key, value) -> 11 | (@_map[key] ||= ledger.defer()).resolve(value) 12 | 13 | get: (key) -> @_map[key] ||= ledger.defer().promise 14 | 15 | remove: (key) -> 16 | @_map[key]?.reject(new Error("removed")) 17 | @_map = _.without(@_map, key) 18 | -------------------------------------------------------------------------------- /app/assets/css/common/dialogs/qrcode.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../application"; 2 | 3 | section#dialogs_qrcode_dialog { 4 | text-align: center; 5 | 6 | > #video_capture_container { 7 | @width: 320px; 8 | @height: 240px; 9 | margin-top: @metrics-medium-padding; 10 | width: @width; 11 | height: @height; 12 | } 13 | 14 | > div.regular-grey-text-small { 15 | margin-top: @metrics-small-padding; 16 | } 17 | } -------------------------------------------------------------------------------- /app/views/wallet/settings/bitcoin/confirmations.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.bitcoin.confirmations_to_spend' %>
4 |
5 |
6 |
<%= t 'wallet.settings.bitcoin.required_confirmations' %>
7 |
8 |
9 |
-------------------------------------------------------------------------------- /app/views/update/erasing.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- t 'update.erasing.ready_to_start_process' %>
4 |
<%- _.str.sprintf(t('update.erasing.clicking_continue'), ledger.config.network.plural) %>
5 |
<%= t 'update.erasing.please_note' %>
6 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/management/security.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .greyed-container { 5 | &.detailed { 6 | > .index { 7 | letter-spacing: -10px; 8 | } 9 | } 10 | } 11 | 12 | > .page-content-container { 13 | padding-right: @metrics-ultra-large-padding * 2; 14 | > .paragraph { 15 | margin-top: @metrics-very-small-padding + 5px; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /app/assets/css/update/linux.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .page-indication { 5 | margin-top: @metrics-almost-small-padding; 6 | } 7 | 8 | > .shell-command { 9 | .selectable; 10 | font-family: "Courier New", "Courier"; 11 | font-size: 13px; 12 | margin-top: @metrics-very-small-padding; 13 | margin-bottom: @metrics-extra-small-padding; 14 | letter-spacing: -0.3px; 15 | } 16 | } -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/coinkite.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../application"; 3 | @import "top-menu"; 4 | 5 | .main-container { 6 | #navigation_controller_content { 7 | padding: @metrics-large-padding @metrics-medium-padding; 8 | overflow: auto; 9 | } 10 | } 11 | 12 | section { 13 | > .empty-container { 14 | .regular-grey-text; 15 | text-align: center; 16 | padding: 130px 0; 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/onboarding_device_firmware_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceFirmwareViewController extends @OnboardingViewController 2 | 3 | view: 4 | notNowButton: "#not_now_button" 5 | 6 | updateNow: -> 7 | window.open("https://chrome.google.com/webstore/detail/ledger-manager/beimhnaefocolcplfimocfiaiefpkgbf") 8 | window.close() 9 | 10 | 11 | notNow: -> 12 | ledger.app.router.go '/onboarding/device/continue' -------------------------------------------------------------------------------- /app/src/utils/easing.coffee: -------------------------------------------------------------------------------- 1 | 2 | # t: current time, b: begInnIng value, c: change In value, d: duration 3 | 4 | 5 | jQuery.easing['jswing'] = jQuery.easing['swing'] 6 | 7 | $.extend $.easing, 8 | 9 | default: 'smooth' 10 | 11 | swing: (t, b, c, d) -> $.easing[$.easing.default](t, b, c, d) 12 | 13 | accelerate_deccelerate: (t, b, c, d) -> (Math.cos((t + 1) * Math.PI) / 2.0) + 0.5 14 | 15 | smooth: (t, b, c, d) -> Math.pow(t - 1, 5) + 1 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/views/common/dialogs/qrcode.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'common.qrcode.scan_qrcode' %>

4 |
5 |
6 |
<%= t 'common.qrcode.present' %>
7 |
8 |
9 |
10 | <%= t 'common.cancel' %> 11 |
-------------------------------------------------------------------------------- /app/views/onboarding/management/provisioning.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
<%= t 'onboarding.management.provisioning.provisioning' %>
7 |
<%= t 'onboarding.management.provisioning.dont_unplug' %>
8 |
9 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/bitcoin/fees.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.bitcoin.transaction_fees' %>
4 |
5 |
6 |
<%= t 'wallet.settings.bitcoin.default_value' %>
7 |
8 | 9 |
10 |
11 |
-------------------------------------------------------------------------------- /compilation/build.coffee.template: -------------------------------------------------------------------------------- 1 | ### 2 | Generated file. Do not edit this file manually. Launch `gulp fup:manifest` in order to generate this again. 3 | ### 4 | 5 | @ledger ?= {} 6 | ledger.build = {} 7 | ledger.build.Mode = '<%- @mode %>' 8 | ledger.build.Network = '<%- @network %>' 9 | ledger.build.Flavors = <%- JSON.stringify(@flavors) %> 10 | ledger.build.Time = <%- @time %> 11 | ledger.build.Commit = '<%- @commit %>' 12 | ledger.build.Version = '<%- @version %>' -------------------------------------------------------------------------------- /app/assets/css/widgets/accessories.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../constants"; 2 | 3 | ._marker { 4 | &:last-child { 5 | margin-left: @metrics-very-small-padding; 6 | } 7 | 8 | &:first-child { 9 | margin-right: @metrics-very-small-padding; 10 | } 11 | } 12 | 13 | .small-dot { 14 | ._marker; 15 | font-size: 8px; 16 | vertical-align: inherit; 17 | } 18 | 19 | .medium-square { 20 | ._marker; 21 | font-size: 10px; 22 | vertical-align: inherit; 23 | } 24 | -------------------------------------------------------------------------------- /app/views/wallet/settings/display/units.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.display.units' %>
4 |
5 |
6 |
<%= _.str.sprintf(t('wallet.settings.display.bitcoin_unit'), _.str.capitalize(ledger.config.network.display_name)) %>
7 |
8 |
9 |
-------------------------------------------------------------------------------- /compilation/script-zip.coffee: -------------------------------------------------------------------------------- 1 | 2 | archiver = require 'archiver' 3 | zip = archiver 'zip' 4 | fs = require 'fs' 5 | {ensureDistDir} = require './utils' 6 | 7 | module.exports = (configuration) -> 8 | ensureDistDir() 9 | manifest = require "../#{configuration.buildDir}/manifest.json" 10 | output = fs.createWriteStream "dist/SNAPSHOT-#{manifest.version}.zip" 11 | zip.pipe output 12 | zip.bulk [expand: true, cwd: configuration.buildDir, src: ['**']] 13 | zip.finalize() -------------------------------------------------------------------------------- /compilation/utils.coffee: -------------------------------------------------------------------------------- 1 | 2 | fs = require 'fs' 3 | path = require 'path' 4 | join = path.join 5 | 6 | ensureDirectoryExists = (dirname) -> 7 | unless fs.existsSync(join(dirname)) 8 | fs.mkdirSync join(dirname), 0o766 9 | 10 | ensureDistDir = () -> ensureDirectoryExists 'dist' 11 | 12 | ensureSignatureDir = () -> ensureDirectoryExists('signature') 13 | 14 | module.exports = { 15 | ensureDirectoryExists 16 | ensureDistDir 17 | ensureSignatureDir 18 | } 19 | 20 | -------------------------------------------------------------------------------- /app/spec/utils/storage/chrome_store_spec.coffee: -------------------------------------------------------------------------------- 1 | describe "ChromeStore", -> 2 | store = null 3 | obj = 4 | cb: -> 5 | 6 | beforeEach -> 7 | store = new ledger.storage.ChromeStore("chrome_test") 8 | 9 | it "_raw_keys return keys from items", -> 10 | spyOn(chrome.storage.local, 'get').and.callFake (raw_keys, cb) -> cb(key1: 1, key2: 2) 11 | spyOn(obj, 'cb') 12 | 13 | store._raw_keys(obj.cb) 14 | expect(obj.cb).toHaveBeenCalledWith(["key1", "key2"]) 15 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/apps/wallet_settings_apps_list_setting_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsAppsListSettingViewController extends WalletSettingsSettingViewController 2 | 3 | renderSelector: "#list_table_container" 4 | 5 | openCoinkite: -> 6 | ledger.app.router.go("/apps/coinkite/dashboard/index") 7 | @parentViewController.dismiss() 8 | 9 | openBitID: -> 10 | ledger.app.router.go("/wallet/bitid/form") 11 | @parentViewController.dismiss() -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/chains/onboarding_device_chains_recover_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceChainsRecoverDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | recover: ".recover" 5 | 6 | show: -> 7 | super 8 | 9 | onAfterRender: -> 10 | super 11 | @view.recover.on "click", @recover 12 | 13 | onDismiss: -> 14 | super 15 | 16 | recover: (e) -> 17 | @emit 'click:recover' 18 | @dismiss() -------------------------------------------------------------------------------- /app/src/crypto/base58.coffee: -------------------------------------------------------------------------------- 1 | @ledger.crypto ?= {} 2 | 3 | class @ledger.crypto.Base58 4 | 5 | @Alphabet: 6 | Uppercase: "ABCDEFGHJKLMNPQRSTUVWXYZ" 7 | Lowercase: "abcdefghijkmnopqrstuvwxyz" 8 | Digits: "0123456789" 9 | fullString: "ABCDEFGHJKLMNPQRSTUVWXYZ" 10 | 11 | @encode: (buffer) -> bs58.encode(buffer) 12 | 13 | @decode: (string) -> bs58.decode(string) 14 | 15 | @concatAlphabet: -> 16 | @Alphabet.Uppercase + @Alphabet.Lowercase + @Alphabet.Digits 17 | 18 | -------------------------------------------------------------------------------- /app/views/spec/index.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | Run selected | Run All | Run last 6 |
7 |
8 |
9 | 10 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/apps.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.settings.common.apps' %>

4 |
5 |
6 |
7 |
8 | <%= t 'wallet.settings.common.other_settings' %> 9 |
10 | <%= t 'common.close' %> 11 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/bitcoin/blockchain.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.bitcoin.blockchain_explorer' %>
4 |
5 |
6 |
<%= t 'wallet.settings.bitcoin.default_explorer' %>
7 |
8 | 9 |
10 |
11 |
-------------------------------------------------------------------------------- /app/src/controllers/update/update_index_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateIndexViewController extends @UpdateViewController 2 | 3 | navigation: 4 | nextRoute: "" 5 | previousRoute: "/onboarding/device/plug" 6 | previousParams: {animateIntro: no} 7 | localizablePageSubtitle: "update.index.important_notice" 8 | 9 | navigatePrevious: -> 10 | ledger.app.setExecutionMode(ledger.app.Modes.Wallet) 11 | super 12 | 13 | navigateNext: -> 14 | @getRequest().startUpdate() -------------------------------------------------------------------------------- /app/src/controllers/update/update_welcome_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateWelcomeViewController extends UpdateViewController 2 | 3 | localizablePageSubtitle: "update.welcome.ledger_wallet" 4 | navigation: 5 | nextRoute: "" 6 | previousRoute: "/onboarding/device/plug" 7 | previousParams: {animateIntro: no} 8 | 9 | navigatePrevious: -> 10 | ledger.app.setExecutionMode(ledger.app.Modes.Wallet) 11 | super 12 | 13 | navigateNext: -> 14 | @getRequest().startUpdate() -------------------------------------------------------------------------------- /app/src/dongle/utils.coffee: -------------------------------------------------------------------------------- 1 | 2 | _.extend ledger.dongle, 3 | # @return Return true if dongle is plugged and unblocked. 4 | isPluggedAndUnlocked: () -> 5 | ledger.app.dongle? && ledger.app.dongle.state == ledger.dongle.States.UNLOCKED 6 | 7 | # @return Return current unblocked dongle or throw error if dongle is not plugged or not unblocked. 8 | unlocked: () -> 9 | ledger.errors.throw(ledger.errors.DongleLocked) unless @isPluggedAndUnlocked() 10 | return ledger.app.dongle 11 | -------------------------------------------------------------------------------- /app/src/controllers/common/dialogs/common_dialogs_message_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @CommonDialogsMessageDialogViewController extends ledger.common.DialogViewController 2 | 3 | ### 4 | @param kind [String] The message kind [error|success] 5 | @param title [String] The message title 6 | @param subtitle [String] The message subtitle 7 | ### 8 | constructor: ({kind, title, subtitle}) -> 9 | kind ?= "success" 10 | title ?= "" 11 | subtitle ?= "" 12 | super 13 | -------------------------------------------------------------------------------- /app/assets/css/wallet/send/mobile.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#send_mobile_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-medium-padding; 10 | 11 | > .regular-text { 12 | margin-top: @metrics-small-padding; 13 | } 14 | 15 | > .regular-grey-text-small { 16 | margin-top: @metrics-almost-small-padding; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/update.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | > .black-indication { 7 | margin-top: @metrics-small-padding; 8 | } 9 | 10 | > .medium-indication { 11 | margin-top: @metrics-small-padding; 12 | } 13 | 14 | > .actions-container { 15 | margin-top: @metrics-medium-padding; 16 | 17 | > .action-rounded-button { 18 | margin-left: @metrics-very-small-padding; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/utils/render.coffee: -------------------------------------------------------------------------------- 1 | helpers = 2 | url: (url, params) -> 3 | ledger.url.createUrlWithParams(url, params) 4 | 5 | @render = (template, params, callback) => 6 | template = template.substr(1) if _.string.startsWith(template, '/') 7 | if window.JST?[template]? 8 | context = _.extend(params, helpers) 9 | _.defer => callback?(JST[template](context)) 10 | else 11 | require('../views/' + template, => 12 | context = _.extend(params, helpers) 13 | callback(JST[template](context)) 14 | ) -------------------------------------------------------------------------------- /app/views/wallet/accounts/index.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.accounts.index.quicklook' %>

4 |
5 |
6 |
7 |
8 |
9 |

<%= t 'wallet.accounts.index.last_operations' %>

10 |
11 |
<%= t 'wallet.defaults.operations.no_operations' %>
12 |
13 |
-------------------------------------------------------------------------------- /app/views/common/dialogs/message.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
<%= @params.title %>
6 |
<%- @params.subtitle %>
7 | <%= t "common.close" %> 8 |
9 |
10 |
-------------------------------------------------------------------------------- /app/views/onboarding/device/unplug.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
8 | <%= t 'onboarding.device.unplug.you_can_unplug' %> 9 |
10 |
11 |
12 |
13 |
-------------------------------------------------------------------------------- /app/spec/dongle/derivation_spec.coffee: -------------------------------------------------------------------------------- 1 | jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000000 2 | describe 'Hardware and Software derivations', -> 3 | 4 | PinCode = '0000' 5 | 6 | it 'compute the same address', (done) -> 7 | ledger.app.dongle.lock() 8 | ledger.app.dongle.unlockWithPinCode(PinCode) 9 | .then -> 10 | ledger.app.dongle.getPublicAddress("44'/0'/0'/1/84") 11 | .then (address) -> 12 | expect(address.bitcoinAddress.toString(ASCII)).toBe('1PCbsXooZxknnX8p9kpUZeedYRbTGUTsSL') 13 | done() 14 | .done() -------------------------------------------------------------------------------- /app/views/update/updating.eco: -------------------------------------------------------------------------------- 1 |
2 | 3 |
<%- t 'update.updating.wallet_is_ready' %>
4 |
<%= _.str.sprintf(t('update.updating.clicking_continue'), @dongleVersion, @targetVersion) %>
5 |
<%= t 'update.updating.change_security_card' %>
6 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/send/cpfp.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../mixins"; 2 | @import (reference) "../../constants"; 3 | 4 | section#send_cpfp_dialog { 5 | #receiver_input { 6 | width: 300px; 7 | } 8 | 9 | #message { 10 | line-height: 20px; 11 | } 12 | 13 | max-width: 500px; 14 | 15 | h1 { 16 | margin-bottom: 20px; 17 | } 18 | .red { 19 | color: @color-invalid-red; 20 | } 21 | 22 | #check { 23 | margin-top: 20px; 24 | margin-bottom: 0px; 25 | line-height: 20px; 26 | } 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/views/wallet/p2sh/signing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.p2sh.signing.title' %>

4 |
5 |
6 |
<%= t 'wallet.p2sh.signing.info' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/tools.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.settings.common.tools' %>

4 |
5 |
6 |
7 |
8 | 9 |
10 | <%= t 'wallet.settings.common.other_settings' %> 11 |
12 | <%= t 'common.close' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/settings/display.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#settings_display_dialog { 4 | width: @dialog-width-settings; 5 | 6 | #units_table_container { 7 | > .large-table { 8 | margin-top: @metrics-medium-padding; 9 | } 10 | } 11 | 12 | #currency_table_container { 13 | > .large-table { 14 | margin-top: @metrics-small-padding; 15 | } 16 | } 17 | 18 | #language_table_container { 19 | > .large-table { 20 | margin-top: @metrics-small-padding; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/api/block_restclient.coffee: -------------------------------------------------------------------------------- 1 | 2 | class ledger.api.BlockRestClient extends ledger.api.RestClient 3 | 4 | @instance: new @ 5 | 6 | refreshLastBlock: (callback) -> 7 | @http().get 8 | url: "blockchain/v2/#{ledger.config.network.ticker}/blocks/current" 9 | onSuccess: (response) -> 10 | response['time'] = new Date(response['time'] * 1000) 11 | block = Block.fromJson(response).save() 12 | ledger.app.emit 'wallet:operations:update' 13 | callback?(block) 14 | onError: @networkErrorCallback(callback) -------------------------------------------------------------------------------- /app/src/controllers/wallet/message/wallet_message_result_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletMessageResultDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | result: '#result' 5 | 6 | onAfterRender: -> 7 | super 8 | @view.result.val( 9 | "-----BEGIN BITCOIN SIGNED MESSAGE-----\n" + 10 | "#{@params.message}\n" + 11 | "-----BEGIN SIGNATURE-----\n" + 12 | "#{@params.address}\n" + 13 | "#{@params.signature}\n" + 14 | "-----END BITCOIN SIGNED MESSAGE-----\n" 15 | ) 16 | -------------------------------------------------------------------------------- /app/views/wallet/settings/display/currency.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.display.show_currency' %>
4 |
5 |
6 |
7 |
<%= t 'wallet.settings.display.exchange_rate' %>
8 |
9 | 10 |
11 |
12 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/dialogs/addaccount.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#dialogs_addaccount_dialog { 4 | width: @dialog-width-accounts; 5 | 6 | #account_name_input { 7 | width: 200px; 8 | } 9 | 10 | > .large-table { 11 | margin-top: @metrics-small-padding; 12 | 13 | &:first-of-type { 14 | margin-top: @metrics-medium-padding; 15 | } 16 | } 17 | 18 | > #hidden_accounts_table { 19 | .row > a.small-action-rounded-button { 20 | margin-left: @metrics-very-small-padding; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/settings/bitcoin.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#settings_bitcoin_dialog { 4 | width: @dialog-width-settings; 5 | 6 | #confirmations_table_container { 7 | > .large-table { 8 | margin-top: @metrics-medium-padding; 9 | } 10 | } 11 | 12 | #fees_table_container { 13 | > .large-table { 14 | margin-top: @metrics-small-padding; 15 | } 16 | } 17 | 18 | #blockchain_table_container { 19 | > .large-table { 20 | margin-top: @metrics-small-padding; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/views/onboarding/device/opening.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 | <%= t 'common.wait' %> 8 |
9 |
10 | <%= t 'onboading.common.help' %> 11 |
12 |
-------------------------------------------------------------------------------- /app/views/onboarding/device/pin.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | <%= t 'onboarding.device.pin.enter_your_pin_code' %> 7 |
8 |
9 |
10 | <%= t 'onboading.common.help' %> 11 |
12 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/hardware.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.settings.common.hardware' %>

4 |
5 |
6 |
7 |
8 |
9 | <%= t 'wallet.settings.common.other_settings' %> 10 |
11 | <%= t 'common.close' %> 12 |
-------------------------------------------------------------------------------- /app/src/controllers/update/update_done_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateDoneViewController extends @UpdateViewController 2 | 3 | localizablePageSubtitle: "update.done.update_succeeded" 4 | localizableNextButton: "common.restore" 5 | navigation: 6 | nextRoute: "/onboarding/device/connecting" 7 | 8 | initialize: -> 9 | super 10 | if @params.provisioned 11 | @localizableNextButton = "common.continue" 12 | 13 | navigateNext: -> 14 | @getRequest().cancel() 15 | ledger.app.reconnectDongleAndEnterWalletMode().then => 16 | super -------------------------------------------------------------------------------- /app/views/onboarding/device/connecting.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 | <%= t 'common.wait' %> 8 |
9 |
10 | <%= t 'onboading.common.help' %> 11 |
12 |
-------------------------------------------------------------------------------- /app/src/models/block.coffee: -------------------------------------------------------------------------------- 1 | class @Block extends ledger.database.Model 2 | do @init 3 | 4 | @index 'hash' 5 | @has many: 'transactions', onDelete: 'destroy' 6 | 7 | @fromJson: (json, context = ledger.database.contexts.main) -> 8 | return null if !json? 9 | @findOrCreate(hash: json['hash'], json, context) 10 | 11 | @lastBlock: (context = ledger.database.contexts.main) -> 12 | @find({}, context).simpleSort('height', yes).data()[0] 13 | 14 | get: (key) -> 15 | switch key 16 | when 'time' then new Date(super key) 17 | else super key -------------------------------------------------------------------------------- /app/src/preferences/fees.coffee: -------------------------------------------------------------------------------- 1 | ledger.preferences ||= {} 2 | ledger.preferences.fees ||= {} 3 | 4 | _.extend ledger.preferences.fees, 5 | 6 | Levels: 7 | Fast: 8 | id: '20000' 9 | numberOfBlock: 1 10 | defaultValue: 20000 11 | 12 | Normal: 13 | id: '10000' 14 | numberOfBlock: 3 15 | defaultValue: 10000 16 | 17 | Slow: 18 | id: '1000' 19 | numberOfBlock: 6 20 | defaultValue: 1000 21 | 22 | MaxValue: 50000 23 | 24 | 25 | getLevelFromId: (id) -> _(ledger.preferences.fees.Levels).find (l) -> l.id is id -------------------------------------------------------------------------------- /app/views/wallet/xpubkey/processing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.xpubkey.processing.title' %>

4 |
5 |
6 |
<%= t 'wallet.xpubkey.processing.info' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/widgets/panels.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../constants"; 2 | 3 | .panel { 4 | padding: @metrics-small-padding; 5 | border-radius: @border-radius-default-value; 6 | background-color: @color-extra-light-grey; 7 | border: 1px solid @color-very-light-grey; 8 | display: block; 9 | 10 | a& { 11 | text-decoration: none; 12 | color: inherit; 13 | } 14 | 15 | a&:hover { 16 | background-color: darken(@color-extra-light-grey, 1%); 17 | color: inherit; 18 | } 19 | 20 | &.freeform { 21 | padding: 0 @metrics-small-padding; 22 | } 23 | } -------------------------------------------------------------------------------- /app/views/apps/coinkite/cosign/signing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'apps.coinkite.cosign.signing.title' %>

4 |
5 |
6 |
<%= t 'apps.coinkite.cosign.signing.info' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/common/dialogs/ticket.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../application"; 2 | 3 | section#dialogs_ticket_dialog { 4 | > table input { 5 | width: 100%; 6 | } 7 | 8 | > .rounded-text-area { 9 | margin-top: @metrics-almost-small-padding; 10 | width: 100%; 11 | height: 140px; 12 | } 13 | } 14 | 15 | .dialog-actions-bar { 16 | > #logs_container { 17 | display: flex; 18 | flex-direction: row; 19 | align-items: center; 20 | 21 | 22 | > #logs_switch_container { 23 | margin-left: @metrics-very-small-padding; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /app/views/apps/coinkite/cosign/fetching.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'apps.coinkite.cosign.fetching.title' %>

4 |
5 |
6 |
<%= t 'apps.coinkite.cosign.fetching.info' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/settings/tools.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#settings_tools_dialog { 4 | width: @dialog-width-settings; 5 | 6 | #logs_table_container { 7 | > .large-table { 8 | margin-top: @metrics-medium-padding; 9 | } 10 | 11 | > .regular-soft-grey-text-small { 12 | margin-top: @metrics-small-padding; 13 | text-align: center; 14 | line-height: 20px; 15 | } 16 | } 17 | 18 | #protocols_table_container { 19 | > .large-table { 20 | margin-top: @metrics-medium-padding; 21 | } 22 | } 23 | 24 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_security_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementSecurityViewController extends @OnboardingViewController 2 | 3 | navigation: 4 | continueUrl: '/onboarding/management/pin' 5 | 6 | onAfterRender: -> 7 | super 8 | firmware = ledger.app.dongle.getFirmwareInformation() 9 | if firmware.hasSubFirmwareSupport() and not firmware.hasSetupFirmwareSupport() 10 | ledger.app.router.go '/onboarding/device/switch_firmware', _.extend(_.clone(@params), mode: 'setup', on_done: '/onboarding/management/security') -------------------------------------------------------------------------------- /app/src/utils/promise/debounce.coffee: -------------------------------------------------------------------------------- 1 | ledger.utils ?= {} 2 | ledger.utils.promise = {} unless ledger.utils.promise? 3 | 4 | _.extend ledger.utils.promise, 5 | 6 | debounce: (func, wait) -> 7 | deferred = null 8 | timeout = null 9 | args = undefined 10 | onTimeoutExpired = -> deferred.resolve(func(args...)) 11 | (a...) -> 12 | args = a 13 | if deferred? and !deferred.promise.isFulfilled() 14 | clearTimeout(timeout) 15 | else 16 | deferred = ledger.defer() 17 | timeout = setTimeout(onTimeoutExpired, wait) 18 | deferred.promise -------------------------------------------------------------------------------- /app/assets/css/update/loading.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../common"; 2 | 3 | #view_controller_content { 4 | > .progress-container { 5 | display: flex; 6 | flex-direction: row; 7 | align-items: center; 8 | justify-content: center; 9 | 10 | > #bar_container { 11 | margin: @metrics-almost-medium-padding 0; 12 | 13 | > .progressbar { 14 | width: 420px; 15 | } 16 | } 17 | 18 | > .percent { 19 | text-align: right; 20 | width: 30px; 21 | margin-left: @metrics-small-padding; 22 | flex-shrink: 1; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/wallet_settings_hardware_section_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsHardwareSectionDialogViewController extends WalletSettingsSectionDialogViewController 2 | 3 | settingViewControllersClasses: [ 4 | WalletSettingsHardwareFirmwareSettingViewController, 5 | WalletSettingsHardwareSmartphonesSettingViewController 6 | ] 7 | 8 | onAfterRender: -> 9 | super 10 | if ledger.app.dongle.getFirmwareInformation().hasScreenAndButton() 11 | $('a[href$="#flashFirmware"]').hide() 12 | $('#smartphones_table_container').hide() -------------------------------------------------------------------------------- /app/views/apps/coinkite/keygen/processing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'apps.coinkite.keygen.processing.title' %>

4 |
5 |
6 |
<%= t 'apps.coinkite.keygen.processing.info' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/dialogs/xpub.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#dialogs_xpub_dialog { 4 | 5 | > #code_container { 6 | text-align: center; 7 | margin-top: @metrics-medium-padding; 8 | word-wrap: break-word; 9 | width: @dialog-width-settings; 10 | } 11 | 12 | > #qrcode_container { 13 | margin-top: @metrics-medium-padding; 14 | display: flex; 15 | flex-direction: column; 16 | align-items: center; 17 | } 18 | 19 | > div.regular-grey-text-small { 20 | text-align: center; 21 | margin-top: @metrics-small-padding; 22 | } 23 | } -------------------------------------------------------------------------------- /app/views/wallet/message/result.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.message.result.title' %>

4 |
5 | 6 | 7 | 8 | 9 |
10 | 11 |
12 |
13 |
14 |
15 | <%= t 'common.close' %> 16 |
17 | 18 | -------------------------------------------------------------------------------- /app/views/wallet/settings/display.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.settings.common.display' %>

4 |
5 |
6 |
7 |
8 |
9 |
10 | <%= t 'wallet.settings.common.other_settings' %> 11 |
12 | <%= t 'common.close' %> 13 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/bitcoin.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.settings.common.coin' %>

4 |
5 |
6 |
7 |
8 |
9 |
10 | <%= t 'wallet.settings.common.other_settings' %> 11 |
12 | <%= t 'common.close' %> 13 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/hardware/firmware.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.hardware.firmware' %>
4 | <%= t 'wallet.settings.hardware.flash_firmware' %> 5 |
6 |
7 |
<%= t 'common.checking' %>
8 |
9 |
10 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/management/done.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | #content-container { 4 | > .greyed-container { 5 | text-align: center; 6 | 7 | > .spinner { 8 | margin-top: @metrics-small-padding; 9 | margin-bottom: @metrics-extra-large-padding; 10 | } 11 | 12 | > .black-indication { 13 | margin-top: @metrics-small-padding; 14 | } 15 | 16 | > .medium-indication { 17 | margin-top: @metrics-small-padding; 18 | } 19 | 20 | > .action-rounded-button { 21 | margin-top: @metrics-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/message/result.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../application"; 2 | 3 | section#wallet_message_index_dialog { 4 | width: 380px; 5 | 6 | > table input { 7 | width: 100%; 8 | } 9 | 10 | > .rounded-text-area { 11 | width: 100%; 12 | height: 140px; 13 | margin-top: @metrics-medium-padding; 14 | } 15 | } 16 | 17 | .dialog-actions-bar { 18 | > #logs_container { 19 | display: flex; 20 | flex-direction: row; 21 | align-items: center; 22 | 23 | 24 | > #logs_switch_container { 25 | margin-left: @metrics-very-small-padding; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /app/views/wallet/pairing/progress.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.pairing.common.pair_a_new_mobile' %>

4 |
5 |
6 |
<%= t 'wallet.pairing.progress.pairing_with_mobile_device' %>
7 |
<%= t 'wallet.pairing.progress.follow_instructions' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/message/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../application"; 2 | 3 | section#wallet_message_index_dialog { 4 | width: 380px; 5 | 6 | > table input { 7 | width: 100%; 8 | } 9 | 10 | > .rounded-text-area { 11 | margin-top: @metrics-almost-small-padding; 12 | width: 100%; 13 | height: 140px; 14 | } 15 | } 16 | 17 | .dialog-actions-bar { 18 | > #logs_container { 19 | display: flex; 20 | flex-direction: row; 21 | align-items: center; 22 | 23 | 24 | > #logs_switch_container { 25 | margin-left: @metrics-very-small-padding; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /app/views/wallet/settings/apps/list.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
BETA APPS
4 |
5 | 6 |
BitID
7 |
8 |
9 | 10 | 11 | 12 | 13 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/device/firmware.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | text-align: center; 5 | 6 | > .black-indication { 7 | margin-top: @metrics-small-padding; 8 | line-height: 30px; 9 | } 10 | 11 | > .medium-indication { 12 | margin-top: @metrics-small-padding; 13 | } 14 | 15 | > .actions-container { 16 | margin-top: @metrics-medium-padding; 17 | 18 | > .action-rounded-button { 19 | margin-left: @metrics-very-small-padding; 20 | } 21 | } 22 | } 23 | #content-container > .actions-container { 24 | padding-top: 50px; 25 | } -------------------------------------------------------------------------------- /app/views/apps/coinkite/dashboard/compatibility.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'apps.coinkite.dashboard.compatibility.title' %>

4 |
5 |
6 |
<%= t 'apps.coinkite.dashboard.compatibility.info' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/views/wallet/send/preparing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= _.str.sprintf(t('wallet.send.common.send_bitcoins'), ledger.config.network.plural) %>

4 |
5 |
6 |
<%= t 'wallet.send.preparing.preparing_transaction' %>
7 |
<%= t 'common.may_take_a_while' %>
8 |
9 |
10 |
11 |
12 | <%= t 'common.cancel' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/receive/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../mixins"; 3 | 4 | section#receive_index_dialog { 5 | #receiver_address { 6 | .selectable; 7 | } 8 | 9 | #qrcode_container { 10 | display: flex; 11 | flex-direction: column; 12 | align-items: center; 13 | margin-top: @metrics-medium-padding; 14 | 15 | > div { 16 | padding: 8px; 17 | background-color: @color-white; 18 | } 19 | 20 | > p { 21 | margin-top: @metrics-small-padding - 9px; 22 | text-align: center; 23 | line-height: 20px; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /app/views/onboarding/device/chains/recover.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'onboarding.device.chains.recover_title' %>
4 |
<%= t 'onboarding.device.chains.recover_message' %>
5 | 10 |
11 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/pairing/progress.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#pairing_progress_dialog { 4 | width: @dialog-width-pairing; 5 | 6 | > #content_container { 7 | text-align: center; 8 | margin-top: @metrics-almost-medium-padding; 9 | padding-top: @metrics-almost-medium-padding; 10 | 11 | > .spinner { 12 | padding-bottom: @metrics-almost-small-padding; 13 | } 14 | 15 | > .regular-text { 16 | margin-top: @metrics-almost-medium-padding; 17 | } 18 | 19 | > .regular-grey-text-small { 20 | margin-top: @metrics-almost-small-padding; 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /app/src/utils/promise/throttle.coffee: -------------------------------------------------------------------------------- 1 | ledger.utils ?= {} 2 | ledger.utils.promise = {} unless ledger.utils.promise? 3 | 4 | _.extend ledger.utils.promise, 5 | 6 | throttle: (func, wait, {immediate} = {}) -> 7 | deferred = null 8 | args = undefined 9 | immediate ?= no 10 | (a...) -> 11 | args = a 12 | return deferred.promise if deferred? and !deferred.promise.isFulfilled() 13 | deferred = ledger.defer() 14 | deferred.resolve(func(args...)) if immediate 15 | setTimeout -> 16 | deferred.resolve(func(args...)) unless immediate 17 | deferred = null 18 | , wait 19 | deferred.promise -------------------------------------------------------------------------------- /app/src/controllers/apps/coinkite/keygen/apps_coinkite_keygen_index_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @AppsCoinkiteKeygenIndexDialogViewController extends ledger.common.DialogViewController 2 | 3 | cancellable: no 4 | 5 | view: 6 | derivationPath: '#derivation_path' 7 | 8 | onAfterRender: -> 9 | super 10 | chrome.app.window.current().show() 11 | 12 | cancel: -> 13 | Api.callback_cancel 'coinkite_get_xpubkey', t("apps.coinkite.keygen.errors.cancelled") 14 | @dismiss() 15 | 16 | confirm: -> 17 | dialog = new AppsCoinkiteKeygenProcessingDialogViewController index: @params.index, api: true 18 | @getDialog().push dialog -------------------------------------------------------------------------------- /app/src/controllers/update/update_erasing_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateErasingViewController extends UpdateViewController 2 | 3 | localizableNextButton: "common.reset" 4 | localizablePageSubtitle: "update.erasing.erasure_confirmation" 5 | navigation: 6 | nextRoute: "" 7 | previousRoute: "/update/seed" 8 | previousParams: {animateIntro: no} 9 | 10 | render: -> 11 | super 12 | if @getRequest().getDongleFirmware().hasSubFirmwareSupport() 13 | @navigation.previousRoute = "/update/unlocking" 14 | 15 | 16 | 17 | navigateNext: -> 18 | @getRequest().forceDongleErasure() 19 | @getRequest().approveDongleErasure() -------------------------------------------------------------------------------- /app/src/utils/validers.coffee: -------------------------------------------------------------------------------- 1 | ledger.validers ?= {} 2 | 3 | ### 4 | This class is a namespace and cannot be instantiated 5 | ### 6 | class ledger.validers 7 | 8 | ### 9 | This constructor prevent the class to be instantiated 10 | 11 | @throw [Object] error Throw an error when user try to instantiates the class 12 | ### 13 | constructor: -> 14 | throw new Error('This class cannot be instantiated') 15 | 16 | ### 17 | This method check if a given string a valid email address 18 | ### 19 | @isValidEmailAddress: (str) -> 20 | filter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/ 21 | return filter.test str -------------------------------------------------------------------------------- /app/views/onboarding/device/swappedbip39provisioning.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |
7 |
8 |

<%= t 'onboarding.device.swappedbip39provisioning.in_progress' %>

9 |

<%= t 'common.may_take_a_while' %>

10 |
11 |
12 |
13 | 15 |
16 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/tools/logs.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.tools.logs' %>
4 |
5 |
6 |
7 |
<%= t 'wallet.settings.tools.stored_logs' %>
8 | <%= t 'common.export' %> 9 |
10 |
11 |
12 | <%= t 'wallet.settings.tools.disclamer' %> 13 |
-------------------------------------------------------------------------------- /app/assets/css/common/dialogs/message.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#dialogs_message_dialog { 4 | display:flex; 5 | max-width: @dialog-width-default; 6 | 7 | > .content-container { 8 | text-align: center; 9 | 10 | > .uppercase-section-title { 11 | margin-top: @metrics-small-padding; 12 | } 13 | 14 | > .regular-text-small { 15 | margin-top: @metrics-very-small-padding; 16 | line-height: 20px; 17 | } 18 | 19 | > .cancel-rounded-button { 20 | margin-top: @metrics-almost-medium-padding; 21 | } 22 | } 23 | 24 | > .spacer { 25 | width: @metrics-medium-padding; 26 | } 27 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/dialogs/apifailures.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#dialogs_apifaulures_dialog { 4 | display:flex; 5 | flex-direction: column; 6 | max-width: 400px; 7 | 8 | > .content-container { 9 | 10 | > .uppercase-section-title { 11 | margin-bottom: @metrics-almost-small-padding; 12 | } 13 | 14 | > .regular-text-small { 15 | margin-top: @metrics-very-small-padding; 16 | line-height: 20px; 17 | } 18 | 19 | > .cancel-rounded-button { 20 | margin-top: @metrics-almost-medium-padding; 21 | } 22 | } 23 | 24 | > .spacer { 25 | width: @metrics-medium-padding; 26 | } 27 | } -------------------------------------------------------------------------------- /app/src/utils/logger/secure_log_writer.coffee: -------------------------------------------------------------------------------- 1 | 2 | @ledger ?= {} 3 | @ledger.utils ?= {} 4 | 5 | class @ledger.utils.SecureLogWriter extends @ledger.utils.LogWriter 6 | 7 | constructor: (key, bitIdAddress, daysMax = 2, fsmode = PERSISTENT) -> 8 | @_bitIdAddress = bitIdAddress 9 | @_key = key 10 | @_aes = new ledger.crypto.AES(@_key) 11 | super @_daysMax, fsmode 12 | 13 | 14 | write: (msg) -> 15 | msg = @_aes.encrypt(msg) 16 | super msg 17 | 18 | 19 | 20 | ### 21 | Set file name with bitIdAdress and date of the day 22 | ### 23 | _getFileName: -> 24 | "secure_#{@_bitIdAddress}_#{ moment().format('YYYY_MM_DD') }.log" 25 | -------------------------------------------------------------------------------- /app/assets/css/common/dialogs/confirmation.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#dialogs_confirmation_dialog { 4 | display:flex; 5 | max-width: @dialog-width-default; 6 | 7 | > .content-container { 8 | text-align: center; 9 | 10 | > .uppercase-section-title { 11 | margin-top: @metrics-small-padding; 12 | } 13 | 14 | > .regular-text-small { 15 | margin-top: @metrics-very-small-padding; 16 | line-height: 20px; 17 | } 18 | 19 | > .dialog-actions-bar { 20 | margin-top: @metrics-almost-medium-padding; 21 | } 22 | } 23 | 24 | > .spacer { 25 | width: @metrics-medium-padding; 26 | } 27 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/device.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../constants"; 2 | 3 | // device styles 4 | > .logo-container { 5 | margin: 0 auto; 6 | padding-bottom: @metrics-ultra-large-padding; 7 | padding-top: @metrics-giga-large-padding; 8 | } 9 | 10 | > .actions-container { 11 | padding-bottom: @metrics-very-large-padding; 12 | padding-top: @metrics-ultra-large-padding; 13 | text-align: center; 14 | 15 | .greyed-action { 16 | font-size: @font-size-very-small; 17 | color: @color-soft-grey; 18 | text-decoration: none; 19 | } 20 | 21 | a.greyed-action:hover { 22 | color: darken(@color-soft-grey, @color-strong-darken-value); 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/send/preparing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#send_preparing_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/p2sh/signing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#wallet_p2sh_signing_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/pairing/finalizing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#pairing_finalizing_dialog { 4 | width: @dialog-width-pairing; 5 | 6 | > #content_container { 7 | text-align: center; 8 | 9 | > img { 10 | margin-top: @metrics-medium-padding; 11 | } 12 | 13 | > #phone_name_input { 14 | width: 100%; 15 | text-align: center; 16 | margin-top: @metrics-very-small-padding; 17 | } 18 | 19 | > .regular-grey-text-small { 20 | margin-top: @metrics-almost-small-padding; 21 | } 22 | 23 | > .bold-invalid-text { 24 | margin-top: @metrics-almost-small-padding; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/chains/recover.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../common"; 2 | @import (reference) "../../../mixins"; 3 | @import (reference) "../../../constants"; 4 | 5 | section#dialogs_message_dialog { 6 | display:flex; 7 | max-width: 450px; 8 | 9 | > .content-container { 10 | margin-top: 0px; 11 | 12 | > .uppercase-section-title { 13 | margin-top: 0px; 14 | } 15 | 16 | > .regular-text-small { 17 | margin-top: 20px; 18 | line-height: 20px; 19 | } 20 | 21 | > .cancel-rounded-button { 22 | margin-top: @metrics-almost-medium-padding; 23 | } 24 | } 25 | > .spacer { 26 | width: 10 px; 27 | } 28 | } -------------------------------------------------------------------------------- /app/views/wallet/p2sh/index.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.p2sh.index.title' %>

4 |
5 | 6 | 7 | 8 | 11 | 12 | 13 |
9 | <%= t 'wallet.p2sh.index.info' %> 10 |
14 |
15 |
16 |
17 |
18 | <%= t 'common.cancel' %> 19 | <%= t 'common.confirm' %> 20 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/bitid/authenticating.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#bitid_authenticating_dialog { 5 | width: @dialog-width-bitid; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/settings/hardware.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#settings_hardware_dialog { 4 | width: @dialog-width-settings; 5 | 6 | #firmware_table_container { 7 | > .large-table { 8 | margin-top: @metrics-medium-padding; 9 | } 10 | } 11 | 12 | #smartphones_table_container { 13 | > .large-table { 14 | margin-top: @metrics-almost-medium-padding; 15 | } 16 | 17 | .row { 18 | > .light-grey-icon-large { 19 | margin-right: @metrics-very-small-padding; 20 | } 21 | 22 | > .regular-grey-text-small { 23 | margin-right: @metrics-very-small-padding; 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /app/views/update/update.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'update.common.firmware_update' %>
4 |
5 |
6 |
7 |
8 | 9 |
10 | 11 |
12 | 13 |
14 |
15 |
16 |
-------------------------------------------------------------------------------- /app/views/wallet/api/accounts.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.api.accounts.title' %>

4 |
5 | 6 | 7 | 8 | 11 | 12 | 13 |
9 | <%= t 'wallet.api.accounts.info' %> 10 |
14 |
15 |
16 |
17 |
18 | <%= t 'common.cancel' %> 19 | <%= t 'common.confirm' %> 20 |
-------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/cosign/signing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../constants"; 2 | @import (reference) "../../../common"; 3 | 4 | section#coinkite_cosign_signing_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/views/update/seed.eco: -------------------------------------------------------------------------------- 1 |
2 |
<%- t 'update.seed.enter_characters' %>
3 |
<%- t 'update.seed.on_the_left' %>
4 |
5 |
6 | 7 |
8 |
9 | 10 |
11 | 12 |
13 |
14 |
-------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/cosign/fetching.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../constants"; 2 | @import (reference) "../../../common"; 3 | 4 | section#coinkite_cosign_fetching_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/keygen/processing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../constants"; 2 | @import (reference) "../../../common"; 3 | 4 | section#coinkite_keygen_processing_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/views/update/setupswappedbip39.eco: -------------------------------------------------------------------------------- 1 |
2 |
<%- t 'update.seed.enter_characters' %>
3 |
<%- t 'update.seed.on_the_left' %>
4 |
5 |
6 | 7 |
8 |
9 | 10 |
11 | 12 |
13 |
14 |
-------------------------------------------------------------------------------- /app/src/controllers/wallet/xpubkey/wallet_xpubkey_index_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletXpubkeyIndexDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | derivationPath: '#derivation_path' 5 | confirmButton: '#confirm_button' 6 | 7 | onAfterRender: -> 8 | super 9 | chrome.app.window.current().show() 10 | @path = Api.cleanPath(@params.path) 11 | @view.derivationPath.text("m/" + @path) 12 | 13 | cancel: -> 14 | Api.callback_cancel 'get_xpubkey', t('wallet.xpubkey.errors.cancelled') 15 | @dismiss() 16 | 17 | confirm: -> 18 | dialog = new WalletXpubkeyProcessingDialogViewController path: @path 19 | @getDialog().push dialog -------------------------------------------------------------------------------- /app/assets/css/apps/coinkite/dashboard/compatibility.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../constants"; 2 | @import (reference) "../../../common"; 3 | 4 | section#coinkite_dashboard_compatibility_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_summary_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementSummaryViewController extends @OnboardingViewController 2 | 3 | navigation: 4 | continueUrl: '/onboarding/management/provisioning' 5 | 6 | 7 | initialize: -> 8 | super 9 | if @params.swapped_bip39 10 | @navigation.continueUrl = '/onboarding/device/swapped_bip39_provisioning' 11 | else if ledger.app.dongle.getFirmwareInformation().hasSubFirmwareSupport() 12 | @navigation.continueUrl = '/onboarding/device/switch_firmware' 13 | 14 | navigationContinueParams: -> 15 | pin: @params.pin 16 | mnemonicPhrase: @params.mnemonicPhrase 17 | mode: 'operation' -------------------------------------------------------------------------------- /app/views/apps/coinkite/keygen/index.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'apps.coinkite.keygen.index.title' %>

4 |
5 | 6 | 7 | 8 | 11 | 12 | 13 |
9 | <%= t 'apps.coinkite.keygen.index.info' %> 10 |
14 |
15 |
16 |
17 |
18 | <%= t 'common.cancel' %> 19 | <%= t 'common.confirm' %> 20 |
-------------------------------------------------------------------------------- /app/views/wallet/dialogs/xpub.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.dialogs.xpub.extended_public_key' %>

4 |
5 |
coucou
6 |
7 |
<%= t 'wallet.dialogs.xpub.qrcode' %>
8 |
9 |
10 | <%= t 'common.send_by_email' %> 11 | <%= t 'common.print' %> 12 |
13 | <%= t 'common.close' %> 14 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/send/method.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#send_method_dialog { 5 | width: @dialog-width-send; 6 | 7 | > div.regular-text { 8 | line-height: 20px; 9 | margin-top: @metrics-small-padding; 10 | } 11 | 12 | #mobile_table { 13 | margin-top: @metrics-almost-medium-padding; 14 | 15 | .row { 16 | > .regular-text-small { 17 | margin-left: @metrics-very-small-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-right: @metrics-very-small-padding; 22 | } 23 | } 24 | } 25 | 26 | > #card_table { 27 | margin-top: @metrics-small-padding; 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/xpubkey/processing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#wallet_xpubkey_processing_dialog, section#wallet_message_processing_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | margin-top: @metrics-almost-medium-padding; 10 | padding-top: @metrics-almost-medium-padding; 11 | 12 | > .spinner { 13 | padding-bottom: @metrics-almost-small-padding; 14 | } 15 | 16 | > .regular-text { 17 | margin-top: @metrics-almost-medium-padding; 18 | } 19 | 20 | > .regular-grey-text-small { 21 | margin-top: @metrics-almost-small-padding; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /app/assets/css/spec/spec.less: -------------------------------------------------------------------------------- 1 | @import "../wallet/wallet"; 2 | @import (reference) "../constants"; 3 | @import (reference) "../mixins"; 4 | 5 | .spec-large-text-input { 6 | .large-text-input; 7 | text-align: left; 8 | margin-left: @metrics-very-small-padding; 9 | } 10 | 11 | .action-link { 12 | .text(@color-action-purple); 13 | text-decoration: none; 14 | 15 | &:hover { 16 | color: darken(@color-action-purple, 20); 17 | } 18 | } 19 | 20 | .header-action-link { 21 | .text(@color-action-purple); 22 | font-size: @font-size-large; 23 | 24 | &:hover { 25 | color: darken(@color-action-purple, 20); 26 | } 27 | } 28 | 29 | #navigation_controller_content { 30 | overflow: scroll; 31 | width: 100%; 32 | } -------------------------------------------------------------------------------- /app/src/api/currencies_restclient.coffee: -------------------------------------------------------------------------------- 1 | class ledger.api.CurrenciesRestClient extends ledger.api.RestClient 2 | 3 | ### 4 | Get infos for all currencies 5 | 6 | @param [Function] cb Callback 7 | ### 8 | getAllCurrencies: (cb) -> 9 | r = new ledger.api.RestClient() 10 | r.http().get 11 | url: "currencies/all/exchange_rates" 12 | onSuccess: (data) -> 13 | cb?(data, null) 14 | onError: @networkErrorCallback(cb) 15 | 16 | 17 | getCurrency: (currency, cb) -> 18 | r = new ledger.api.RestClient() 19 | r.http().get 20 | url: "currencies/" + currency + "/exchange_rate" 21 | onSuccess: (data) -> 22 | cb?(data, null) 23 | onError: @networkErrorCallback(cb) -------------------------------------------------------------------------------- /app/views/wallet/settings/display/language.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.display.language_and_region' %>
4 |
5 |
6 |
<%= t 'wallet.settings.display.interface_language' %>
7 |
8 | 9 |
10 |
11 |
12 |
<%= t 'wallet.settings.display.region' %>
13 |
14 | 15 |
16 |
17 |
-------------------------------------------------------------------------------- /app/views/onboarding/device/plug.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
<%= t 'onboarding.device.plug.welcome_instruction' %>
8 | <%= t 'onboarding.device.plug.welcome_bolos_instruction' %> 9 |
10 |
11 | <%= t 'onboading.common.help' %> 12 |
13 |
14 | -------------------------------------------------------------------------------- /compilation/gulp-build-file.coffee: -------------------------------------------------------------------------------- 1 | 2 | _ = require 'underscore' 3 | gutil = require 'gulp-util' 4 | File = gutil.File 5 | through = require 'through2' 6 | Eco = require 'eco' 7 | fs = require 'fs' 8 | 9 | transformStream = (configuraton, file, encoding, done) -> 10 | @push file 11 | do done 12 | 13 | flushStream = (configuration, done) -> 14 | template = fs.readFileSync 'compilation/build.coffee.template', "utf-8" 15 | buildFileContent = Eco.render(template, configuration) 16 | @push new File(cwd: '', base: '', path: "src/build.coffee", contents: new Buffer(buildFileContent)) 17 | do done 18 | 19 | module.exports = (configuration) -> through.obj(_.partial(transformStream, configuration), _.partial(flushStream, configuration)) -------------------------------------------------------------------------------- /app/src/fup/utils.coffee: -------------------------------------------------------------------------------- 1 | 2 | ledger.fup ?= {} 3 | ledger.fup.utils ?= {} 4 | 5 | _.extend ledger.fup.utils, 6 | 7 | compareVersions: (v1, v2) -> 8 | new ledger.utils.ComparisonResult v1, v2, (v1, v2) -> 9 | if v1[0] == v2[0] and v1[1] == v2[1] 10 | 0 11 | else if v1[0] < v2[0] or (v1[0] == v2[0] and v1[1] < v2[1]) 12 | -1 13 | else if v1[0] > v2[0] or (v1[0] == v2[0] and v1[1] > v2[1]) 14 | 1 15 | 16 | versionToString: (v) -> 17 | return null unless v? 18 | return v.toString() if _.isKindOf(v, ledger.fup.Card.Version) 19 | version = v[1] 20 | info = if v[0] is 0 then "HW1" else "Ledger OS" 21 | "#{info} #{(version >> 16) & 0xff}.#{(version >> 8) & 0xff}.#{version & 0xff}" 22 | -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/onboarding_device_update_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceUpdateViewController extends @OnboardingViewController 2 | 3 | view: 4 | notNowButton: "#not_now_button" 5 | 6 | updateNow: -> 7 | ledger.app.setExecutionMode(ledger.app.Modes.FirmwareUpdate) 8 | ledger.app.router.go '/' 9 | 10 | notNow: -> 11 | ledger.app.dongle.getState (state) => 12 | if state == ledger.dongle.States.LOCKED 13 | ledger.app.router.go '/onboarding/device/pin' 14 | else 15 | ledger.app.router.go '/onboarding/management/welcome' 16 | 17 | onAfterRender: -> 18 | super 19 | if ledger.app.dongle.getStringFirmwareVersion() is "1.0.0" 20 | @view.notNowButton.hide() -------------------------------------------------------------------------------- /app/views/wallet/receive/enforce/alert.eco: -------------------------------------------------------------------------------- 1 |
style="max-width: none"<% end %>> 2 |
3 |
4 | 5 |
<%- t 'wallet.receive.enforce.alert' %>
6 | 11 |
12 |
13 |
-------------------------------------------------------------------------------- /app/views/wallet/dialogs/apifailures.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%- t('common.errors.synchronization_error') %>
4 |
<%- _.str.sprintf(t('common.errors.error_during_synchronization_1'), ledger.config.network.display_name) %>
5 |
<%- t('common.errors.error_during_synchronization_2') %>
6 |
7 |
8 | <%= t 'common.visit_help_center' %> 9 |
10 | <%= t 'common.close' %> 11 |
12 |
-------------------------------------------------------------------------------- /app/src/utils/logger/secure_log_reader.coffee: -------------------------------------------------------------------------------- 1 | 2 | @ledger ?= {} 3 | @ledger.utils ?= {} 4 | 5 | class @ledger.utils.SecureLogReader extends @ledger.utils.LogReader 6 | 7 | constructor: (key, bitIdAddress, daysMax=2, fsmode=PERSISTENT) -> 8 | @_bitIdAddress = bitIdAddress 9 | @_key = key 10 | @_aes = new ledger.crypto.AES(@_key) 11 | super @_daysMax, fsmode 12 | 13 | 14 | read: (callback) -> 15 | deciphLines = [] 16 | super (lines) => 17 | for line in lines 18 | try 19 | deciphLines.push @_aes.decrypt line 20 | catch e 21 | l e 22 | callback? deciphLines 23 | 24 | 25 | _isFileOfMine: (name) -> 26 | regex = "secure_#{@_bitIdAddress}_[\\d]{4}_[\\d]{2}_[\\d]{2}\\.log" 27 | name.match new RegExp(regex) -------------------------------------------------------------------------------- /app/assets/css/qrcodes.less: -------------------------------------------------------------------------------- 1 | @import (reference) "common"; 2 | 3 | .qrcode { 4 | overflow: hidden; 5 | .fullsize; 6 | 7 | > .video { 8 | .fullsize; 9 | background-color: @color-extra-light-grey; 10 | } 11 | 12 | > .overlay { 13 | .fullsize; 14 | display: flex; 15 | justify-content: center; 16 | align-items: center; 17 | background-image: url("@{images-url}/common/qrcode_borders.png"); 18 | background-position: center center; 19 | background-size: 170px 170px; 20 | background-repeat: no-repeat; 21 | opacity: 0.5; 22 | color: @color-soft-grey; 23 | position: relative; 24 | top: -100%; 25 | .regular-grey-text-small; 26 | 27 | &.errored { 28 | background-image: none; 29 | opacity: 1; 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/controllers/update/update_loading_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateLoadingViewController extends UpdateViewController 2 | 3 | localizablePageSubtitle: "update.loading.updating_wallet" 4 | view: 5 | progressLabel: "#progress" 6 | progressBarContainer: "#bar_container" 7 | 8 | onBeforeRender: -> 9 | super 10 | @targetVersion = @getRequest().getTargetVersion() 11 | 12 | onAfterRender: -> 13 | super 14 | @view.progressBar = new ledger.progressbars.ProgressBar(@view.progressBarContainer) 15 | @view.progressBar.setAnimated(false) 16 | 17 | onProgress: (state, current, total) -> 18 | super 19 | progress = current / total 20 | @view.progressLabel.text("#{Math.ceil(progress * 100)}%") 21 | @view.progressBar.setProgress progress 22 | -------------------------------------------------------------------------------- /app/views/wallet/pairing/finalizing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.pairing.common.pair_a_new_mobile' %>

4 |
5 |
6 | 7 | 8 |
<%= t 'wallet.pairing.finalizing.assign_a_name' %>
9 |
10 |
11 |
12 |
13 |
14 | <%= t 'common.finish' %> 15 |
-------------------------------------------------------------------------------- /app/views/wallet/bitid/form.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.bitid.form.title' %>

4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 |
<%= t 'wallet.bitid.form.uri' %>
12 | 13 |
17 |
18 |
19 |
20 | <%= t 'common.close' %> 21 | <%= t 'common.next' %> 22 |
-------------------------------------------------------------------------------- /app/views/wallet/send/mobile.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= _.str.sprintf(t('wallet.send.common.send_bitcoins'), ledger.config.network.plural) %>

4 |
5 |
6 | 7 |
8 |
<%= t 'wallet.send.mobile.open_mobile_app' %>
9 |
10 |
11 |
12 | <%= t 'wallet.send.common.other_validation_methods' %> 13 |
14 | <%= t 'common.cancel' %> 15 |
-------------------------------------------------------------------------------- /app/src/managers/schemes_manager.coffee: -------------------------------------------------------------------------------- 1 | ledger.managers ?= {} 2 | ledger.managers.schemes ?= {} 3 | 4 | class ledger.managers.schemes.Base extends EventEmitter 5 | 6 | parseURI: (uri) -> 7 | undefined 8 | 9 | class ledger.managers.schemes.Bitcoin extends ledger.managers.schemes.Base 10 | 11 | parseURI: (uri) -> 12 | return undefined unless uri? 13 | uri = ledger.url.parseAsUrl uri 14 | return undefined unless (uri? and uri.protocol == ledger.config.network.scheme and uri.pathname? and uri.pathname.length > 0) 15 | hash = {} 16 | params = uri.params() 17 | hash.address = uri.pathname 18 | hash.amount = params.amount if params.amount? and params.amount.length > 0 19 | return hash 20 | 21 | ledger.managers.schemes.bitcoin = new ledger.managers.schemes.Bitcoin() -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/switchfirmware.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | div.greyed-container { 4 | display: flex; 5 | flex-direction: column; 6 | justify-content: center; 7 | align-items: center; 8 | 9 | .progress-container { 10 | display: flex; 11 | align-items: center; 12 | margin-top: @metrics-almost-small-padding; 13 | 14 | #bar_container { 15 | margin: 0 0; 16 | 17 | > .progressbar { 18 | width: 400px; 19 | } 20 | } 21 | 22 | #progress { 23 | margin-left: @metrics-small-padding; 24 | } 25 | 26 | } 27 | 28 | > img { 29 | margin-bottom: @metrics-small-padding; 30 | } 31 | 32 | > .medium-indication { 33 | margin-top: @metrics-small-padding; 34 | display: block; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/views/wallet/send/processing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= _.str.sprintf(t('wallet.send.common.send_bitcoins'), ledger.config.network.plural) %>

4 |
5 |
6 |
<%= t 'wallet.send.processing.finalizing_transaction' %>
7 |
8 |
9 |
0%
10 |
11 |
<%= t 'common.may_take_a_while' %>
12 |
13 |
14 |
15 |
16 | <%= t 'common.cancel' %> 17 |
-------------------------------------------------------------------------------- /app/views/wallet/send/validating.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= _.str.sprintf(t('wallet.send.common.send_bitcoins'), ledger.config.network.plural) %>

4 |
5 |
6 |
<%= t 'wallet.send.validating.validating_transaction' %>
7 |
8 |
9 |
0%
10 |
11 |
<%= t 'common.may_take_a_while' %>
12 |
13 |
14 |
15 |
16 | <%= t 'common.cancel' %> 17 |
-------------------------------------------------------------------------------- /app/views/onboarding/device/chains/choice.eco: -------------------------------------------------------------------------------- 1 |
2 | <% if true || (console.log('test')): %> 3 | <% end %> 4 |
5 |
<%= @title %>
6 |
<%- @text %>
7 | 13 | <% if @optionChoice : %> 14 | <%= @optionChoice %> 15 | <% end %> 16 |
17 |
18 | -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/swappedbip39provisioning.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../../../../ledger-wallet-chrome/app/assets/css/common"; 2 | 3 | div.greyed-container { 4 | display: flex; 5 | justify-content: center; 6 | 7 | .text-container { 8 | margin-left: @metrics-large-padding; 9 | display: flex; 10 | flex-direction: column; 11 | justify-content: center; 12 | } 13 | 14 | .almost-small-top-margin { 15 | margin-top: @metrics-almost-small-padding; 16 | } 17 | 18 | } 19 | 20 | div.actions-container { 21 | display: flex; 22 | justify-content: center; 23 | } 24 | 25 | 26 | .carousel { 27 | 28 | width: 500px; 29 | 30 | .carousel-item { 31 | .regular-soft-grey-text-small(); 32 | width: 100%; 33 | text-align: center; 34 | line-height: 25px; 35 | } 36 | 37 | } -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-1102.js: -------------------------------------------------------------------------------- 1 | /* 2 | BIP 70 root test 3 | 4 | -----BEGIN CERTIFICATE----- 5 | MIIBLTCB1KADAgECAgkAhxJgxODsMhIwCgYIKoZIzj0EAwIwHjEcMBoGA1UEAxMT 6 | TGVkZ2VyIEJJUDcwIFRlc3QgMTAeFw0xNTAxMDUwMDM2MDVaFw0yNTAxMDIwMDM2 7 | MDVaMB4xHDAaBgNVBAMTE0xlZGdlciBCSVA3MCBUZXN0IDEwVjAQBgcqhkjOPQIB 8 | BgUrgQQACgNCAAQTzvR+t44bLpYj97mjTIojnqZz9W/Mv/Fy367HV09jw/Ay828G 9 | 0UttnI3x0HmVuTyXl0/j1Ba0Zd4veCIhz4tLMAoGCCqGSM49BAMCA0gAMEUCIQDg 10 | fPcjgjLObeGXY/MlvPITbnFbFS9nlJSvowkvtTi7xAIgIHtmdop8WuCuK3kWHP+h 11 | ojPSHj9fUn/KOqJbfQQiW2M= 12 | -----END CERTIFICATE----- 13 | 14 | */ 15 | 16 | var INIT_LW_1102 = [ 17 | "D020000028000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C3", 18 | "D02200002B000000020000000120FE403238018C3991A8ED0E4E3B91CB4328F602D2D7A9BCEEBBFC08E26DA2F3E3009D" 19 | ]; -------------------------------------------------------------------------------- /app/views/onboarding/device/error.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 | <% if @params.message?: %> 8 |
<%= @params.message %>
9 | <% end %> 10 | <% if @params.indication?: %> 11 |
<%= @params.indication %>
12 | <% end %> 13 |
14 |
15 | <%= t 'onboading.common.help' %> 16 |
17 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/receive/enforce/alert.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../constants"; 2 | @import (reference) "../../../mixins"; 3 | @import (reference) "../../../common"; 4 | 5 | section#dialogs_confirmation_dialog { 6 | display:flex; 7 | max-width: 320px; 8 | 9 | > .content-container { 10 | text-align: center; 11 | 12 | > i { 13 | color: #cccccc; 14 | font-size: 40px; 15 | } 16 | 17 | > .uppercase-section-title { 18 | margin-top: @metrics-small-padding; 19 | } 20 | 21 | > .regular-text-small { 22 | margin-top: @metrics-very-small-padding; 23 | line-height: 20px; 24 | } 25 | 26 | > .dialog-actions-bar { 27 | margin-top: @metrics-almost-medium-padding; 28 | } 29 | } 30 | 31 | > .spacer { 32 | width: @metrics-medium-padding; 33 | } 34 | } -------------------------------------------------------------------------------- /app/views/wallet/send/method.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= _.str.sprintf(t('wallet.send.common.send_bitcoins'), ledger.config.network.plural) %>

4 |
5 |
<%- t 'wallet.send.method.select_method' %>
6 |
7 |
8 | 9 |
<%= t 'wallet.send.method.security_card' %>
10 |
11 |
12 |
13 |
14 |
15 |
16 | <%= t 'common.cancel' %> 17 |
-------------------------------------------------------------------------------- /app/views/onboarding/device/failed.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
<%= t 'onboarding.device.failed.unexpected_error' %>
8 |
<%= t 'onboarding.device.failed.unplug' %>
9 | 12 |
13 |
14 | <%= t 'onboading.common.help' %> 15 |
16 |
-------------------------------------------------------------------------------- /app/src/utils/require.coffee: -------------------------------------------------------------------------------- 1 | require_script = (url, callback) -> 2 | script = document.createElement('script') 3 | script.type = 'text/javascript' 4 | script.src = '../src/' + url + '.js' + '?' + (new Date().getTime()) 5 | if callback? 6 | script.onreadystatechange = callback; 7 | script.onload = script.onreadystatechange; 8 | document.getElementsByTagName('head')[0].appendChild(script) 9 | script 10 | 11 | @require = (urls, callback) -> 12 | self = this 13 | scripts = [] 14 | if (urls instanceof Array) 15 | index = -1 16 | require_array = -> 17 | if (index + 1 < urls.length) 18 | scripts.push require_script(urls[++index], require_array) 19 | else 20 | callback.bind(self)(scripts) 21 | do require_array 22 | else 23 | scripts.push require_script(urls, => callback?(scripts)) -------------------------------------------------------------------------------- /app/src/utils/function_lock.coffee: -------------------------------------------------------------------------------- 1 | 2 | _.mixin 3 | 4 | lock: (thisArg, functionNames) -> 5 | calls = [] 6 | functions = {} 7 | lock = on 8 | unlock = -> 9 | return unless lock 10 | lock = off 11 | for call in calls 12 | call.deferred.resolve(functions[call.functionName].apply(thisArg, call.arguments)) 13 | return 14 | for functionName in functionNames 15 | func = thisArg[functionName] 16 | functions[functionName] = func 17 | do (func, functionName) -> 18 | thisArg[functionName] = -> 19 | if lock 20 | deferred = ledger.defer() 21 | calls.push functionName: functionName, arguments: arguments, deferred: deferred 22 | deferred.promise 23 | else 24 | functions[functionName].apply(thisArg, arguments) 25 | unlock -------------------------------------------------------------------------------- /app/views/onboarding/device/unsupported.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
<%= t 'onboarding.device.unsupported.not_linked' %>
8 |
<%= t 'onboarding.device.unsupported.please_update' %>
9 | 12 |
13 |
14 | <%= t 'onboading.common.help' %> 15 |
16 |
-------------------------------------------------------------------------------- /app/src/controllers/update/update_unlocking_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateUnlockingViewController extends UpdateViewController 2 | 3 | localizablePageSubtitle: "update.unlocking.pin_code" 4 | navigation: 5 | previousRoute: "/onboarding/device/plug" 6 | previousParams: {animateIntro: no} 7 | 8 | navigatePrevious: -> 9 | ledger.app.setExecutionMode(ledger.app.Modes.Wallet) 10 | super 11 | 12 | onAfterRender: -> 13 | super 14 | do @_insertPinCode 15 | 16 | _insertPinCode: -> 17 | @view.pinCode = new ledger.pin_codes.PinCode() 18 | @view.pinCode.insertIn(@select('div#pin_container')[0]) 19 | @view.pinCode.setStealsFocus(yes) 20 | @view.pinCode.once 'complete', (event, value) => 21 | @getRequest().unlockWithPinCode(value) 22 | 23 | resetWallet: -> 24 | ledger.app.router.go '/update/erasing' 25 | -------------------------------------------------------------------------------- /app/src/controllers/onboarding/management/onboarding_management_provisioning_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingManagementProvisioningViewController extends @OnboardingViewController 2 | 3 | bumpsStepCount: false 4 | 5 | onAfterRender: -> 6 | super 7 | @view.spinner = ledger.spinners.createLargeSpinner(@select('div.greyed-container')[0]) 8 | @_performSetup() 9 | 10 | _performSetup: -> 11 | seed = ledger.bitcoin.bip39.mnemonicPhraseToSeed(@params.mnemonicPhrase) 12 | ledger.app.dongle.setup @params.pin, seed 13 | .then => 14 | ledger.wallet.checkSetup ledger.app.dongle, seed, @params.pin 15 | .then => 16 | ledger.app.router.go '/onboarding/management/done', {wallet_mode: @params.wallet_mode} 17 | .fail => 18 | ledger.app.router.go '/onboarding/management/done', {wallet_mode: @params.wallet_mode, error: 1} 19 | -------------------------------------------------------------------------------- /app/libs/btchip/btchip-js-api/GlobalConstants.js: -------------------------------------------------------------------------------- 1 | /* 2 | ************************************************************************ 3 | Copyright (c) 2012-2014 UBINITY SAS 4 | 5 | Licensed under the Apache License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | See the License for the specific language governing permissions and 15 | limitations under the License. 16 | ************************************************************************* 17 | */ 18 | 19 | var ASCII = 1; 20 | var HEX = 5; 21 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/p2sh/wallet_p2sh_index_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletP2shIndexDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | confirmButton: '#confirm_button' 5 | 6 | onAfterRender: -> 7 | super 8 | chrome.app.window.current().show() 9 | @inputs = JSON.parse @params.inputs 10 | @scripts = JSON.parse @params.scripts 11 | @outputs_number = @params.outputs_number 12 | @outputs_script = @params.outputs_script 13 | @paths = JSON.parse @params.paths 14 | 15 | cancel: -> 16 | Api.callback_cancel 'p2sh', t('wallet.p2sh.errors.cancelled') 17 | @dismiss() 18 | 19 | confirm: -> 20 | dialog = new WalletP2shSigningDialogViewController inputs: @inputs, scripts: @scripts, outputs_number: @outputs_number, outputs_script: @outputs_script, paths: @paths 21 | @getDialog().push dialog -------------------------------------------------------------------------------- /app/views/onboarding/device/chains/message.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'onboarding.device.chains.choose_chain' %>
4 |
<%= t 'onboarding.device.chains.bitcoin_cash_warning' %>
5 | 11 | <%= t 'onboarding.device.chains.recover' %> 12 |
13 |
14 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/bitid/wallet_bitid_form_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletBitidFormDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | bitidUri: '#bitid_uri' 5 | errorContainer: '#error_container' 6 | 7 | onShow: -> 8 | super 9 | @view.bitidUri.focus() 10 | 11 | next: -> 12 | nextError = @_nextFormError() 13 | if nextError? 14 | @view.errorContainer.show() 15 | @view.errorContainer.text nextError 16 | else 17 | @view.errorContainer.hide() 18 | dialog = new WalletBitidIndexDialogViewController uri: @_uri(), silent: true 19 | @getDialog().push dialog 20 | 21 | _uri: -> 22 | _.str.trim(@view.bitidUri.val()) 23 | 24 | _nextFormError: -> 25 | if !ledger.bitcoin.bitid.isValidUri(@_uri()) 26 | return t 'wallet.bitid.form.invalid_uri' 27 | undefined 28 | -------------------------------------------------------------------------------- /app/src/controllers/onboarding/device/chains/onboarding_device_chains_message_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @OnboardingDeviceChainsMessageDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | split: ".split" 5 | un_split: ".un_split" 6 | 7 | show: -> 8 | super 9 | 10 | onAfterRender: -> 11 | super 12 | @view.split.on "click", @split 13 | @view.un_split.on "click", @un_split 14 | 15 | onDismiss: -> 16 | super 17 | l "On dismiss" 18 | 19 | split: (e) -> 20 | @emit 'click:split' 21 | @dismiss() 22 | 23 | un_split: (e) -> 24 | @emit 'click:un_split' 25 | @dismiss() 26 | 27 | recoverTool: (e) -> 28 | dialog = new OnboardingDeviceChainsRecoverDialogViewController() 29 | dialog.once 'click:recover', => 30 | @chainChoosen(ledger.bitcoin.Networks.bitcoin_recover) 31 | dialog.show() 32 | -------------------------------------------------------------------------------- /app/src/utils/progressbars.coffee: -------------------------------------------------------------------------------- 1 | @ledger.progressbars ?= {} 2 | 3 | class ledger.progressbars.ProgressBar 4 | 5 | _el: null 6 | _leftEl: null 7 | _progress: null 8 | 9 | constructor: (node) -> 10 | @_el = $('
') 11 | @_leftEl = $('
') 12 | @_el.append [@_leftEl] 13 | @setProgress(0) 14 | @setAnimated(true) 15 | node.append @_el 16 | 17 | setAnimated: (animated) -> 18 | if animated 19 | @_leftEl.css 'transition', 'width 0.25s ease-in-out' 20 | else 21 | @_leftEl.css 'transition', 'none' 22 | 23 | setProgress: (progress) -> 24 | return if (@_progress is progress) or progress < 0.0 or progress > 1.0 25 | @_progress = progress 26 | computedProgress = Math.ceil(progress * 100) 27 | @_leftEl.css 'width', computedProgress + '%' 28 | 29 | getProgress: -> return @_progress -------------------------------------------------------------------------------- /app/src/utils/spinners.coffee: -------------------------------------------------------------------------------- 1 | @ledger.spinners ?= {} 2 | @ledger.spinners.createLargeSpinner = (target) -> 3 | opts = 4 | lines: 9 5 | length: 0 6 | width: 3 7 | radius: 16 8 | corners: 0 9 | rotate: 0 10 | direction: 1 11 | color: '#000' 12 | speed: 0.6 13 | trail: 20 14 | shadow: false 15 | hwaccel: true 16 | className: 'spinner' 17 | zIndex: 0 18 | position: 'relative' 19 | return new Spinner(opts).spin(target) 20 | 21 | @ledger.spinners.createTinySpinner = (target) -> 22 | opts = 23 | lines: 7 24 | length: 0 25 | width: 2 26 | radius: 5 27 | corners: 0 28 | rotate: 0 29 | direction: 1 30 | color: '#000' 31 | speed: 0.8 32 | trail: 50 33 | shadow: false 34 | hwaccel: true 35 | className: 'tinySpinner' 36 | position: 'relative' 37 | return new Spinner(opts).spin(target) -------------------------------------------------------------------------------- /app/src/fup/versatile_firmware_update_request.coffee: -------------------------------------------------------------------------------- 1 | ### 2 | 3 | ### 4 | class ledger.fup.VersatileFirmwareUpdateRequest extends ledger.fup.FirmwareUpdateRequest 5 | 6 | constructor: (firmwareUpdate) -> 7 | super firmwareUpdate, 'VERSATILE' 8 | @_osLoader = 'OS_LOADER' 9 | 10 | _getOsLoader: -> ledger.fup.updates[@_osLoader] 11 | 12 | _processInitStageOs: -> 13 | @_getVersion().then (version) => 14 | firmware = version.getFirmwareInformation() 15 | if firmware.hasSubFirmwareSupport() and firmware.hasOperationFirmwareSupport() 16 | @_osLoader = 'OS_LOADER' 17 | else 18 | @_osLoader = 'OS_LOADER' 19 | super 20 | 21 | _setCurrentState: (state) -> 22 | if state is ledger.fup.FirmwareUpdateRequest.States.LoadingBootloader or ledger.fup.FirmwareUpdateRequest.States.LoadingBootloaderReloader 23 | @_osLoader ||= 'OS_LOADER' 24 | super -------------------------------------------------------------------------------- /app/src/controllers/apps/coinkite/settings/apps_coinkite_settings_index_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @AppsCoinkiteSettingsIndexDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | apiKeyInput: '#api_key_input' 5 | apiSecretInput: '#api_secret_input' 6 | saveButton: '#save_button' 7 | 8 | onAfterRender: () -> 9 | super 10 | ledger.storage.sync.get "__apps_coinkite_api_key", (r) => 11 | @view.apiKeyInput.val(r.__apps_coinkite_api_key) 12 | ledger.storage.sync.get "__apps_coinkite_api_secret", (r) => 13 | @view.apiSecretInput.val(r.__apps_coinkite_api_secret) 14 | 15 | onShow: -> 16 | super 17 | @view.apiKeyInput.focus() 18 | 19 | save: -> 20 | ledger.storage.sync.set 21 | "__apps_coinkite_api_key": @view.apiKeyInput.val() 22 | "__apps_coinkite_api_secret": @view.apiSecretInput.val() 23 | @dismiss() 24 | -------------------------------------------------------------------------------- /app/views/wallet/message/processing.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.message.index.title' %>

4 |
5 |
6 | 7 |
<%= t 'wallet.message.processing.info' %>
8 |
<%- t 'wallet.message.processing.confirm_check_1' %>
9 |
<%- t 'wallet.message.processing.confirm_check_2' %>
10 |
11 |
12 |
13 |
<%= t 'wallet.message.processing.hash' %>:
14 |
15 |
16 | <%= t 'common.cancel' %> 17 |
18 | -------------------------------------------------------------------------------- /app/views/wallet/xpubkey/index.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.xpubkey.index.title' %>

4 |
5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | 21 |
9 | <%= t 'wallet.xpubkey.index.info' %> 10 |
<%= t 'wallet.xpubkey.index.path' %>
17 | 18 |
22 |
23 |
24 |
25 |
26 | <%= t 'common.cancel' %> 27 | <%= t 'common.confirm' %> 28 |
-------------------------------------------------------------------------------- /app/src/controllers/wallet/dialogs/wallet_dialogs_xpub_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletDialogsXpubDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | codeContainer: '#code_container' 5 | 6 | _xpub: null 7 | 8 | show: -> 9 | @_getAccount().getExtendedPublicKey (xpub) => 10 | @_xpub = xpub 11 | super 12 | 13 | onAfterRender: -> 14 | super 15 | # configure view 16 | @view.codeContainer.text @_xpub 17 | @view.qrcode = new QRCode "qrcode_container", 18 | text: @_xpub 19 | width: 196 20 | height: 196 21 | colorDark : "#000000" 22 | colorLight : "#ffffff" 23 | correctLevel : QRCode.CorrectLevel.H 24 | 25 | email: -> window.open 'mailto:?body=' + @_xpub 26 | 27 | print: -> window.print() 28 | 29 | _getAccount: () -> 30 | @_account ?= Account.find(index: @params.account_id).first() 31 | @_account -------------------------------------------------------------------------------- /app/views/wallet/send/card.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= _.str.sprintf(t('wallet.send.common.send_bitcoins'), ledger.config.network.plural) %>

4 |
5 |
<%- t 'wallet.send.card.grab_your_card' %>
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | <%= t 'wallet.send.common.other_validation_methods' %> 17 |
18 | <%= t 'common.cancel' %> 19 |
-------------------------------------------------------------------------------- /app/src/storage/memory_store.coffee: -------------------------------------------------------------------------------- 1 | class ledger.storage.MemoryStore extends ledger.storage.Store 2 | 3 | constructor: -> 4 | super 5 | @_data = {} 6 | 7 | # @see ledger.storage.Store#_raw_get 8 | _raw_get: (keys, cb) -> _.defer => cb?(_(@_data).pick(keys)) 9 | 10 | # @see ledger.storage.Store#_raw_set 11 | _raw_set: (items, cb=->) -> 12 | _.defer => 13 | _.extend(@_data, items) 14 | @emit 'set', items 15 | cb?() 16 | 17 | # @see ledger.storage.Store#_raw_keys 18 | _raw_keys: (cb) -> _.defer => cb?(_(@_data).keys()) 19 | 20 | # @see ledger.storage.Store#_raw_remove 21 | _raw_remove: (keys, cb=->) -> 22 | _.defer => 23 | deletedKeys = _(@_data).chain().keys().intersection(keys).value() 24 | @_data = _(@_data).omit(keys) 25 | @emit 'remove', deletedKeys if deletedKeys.length > 0 26 | cb?() 27 | 28 | extend: (data) -> 29 | _.extend(@_data, data) -------------------------------------------------------------------------------- /app/src/utils/apdu_logger.coffee: -------------------------------------------------------------------------------- 1 | @ledger ?= {} 2 | @ledger.utils ?= {} 3 | 4 | apduFilter = [ 5 | {test: 'e0220000', length: 0} 6 | {test: 'd02600001104', length: 0} 7 | {test: 'e020', length: 4} 8 | ] 9 | 10 | class ledger.utils.ApduLogger extends ledger.utils.Logger 11 | 12 | constructor: -> 13 | super 14 | 15 | _storeLog: (msg, msgType) -> 16 | if msg.match(/(=>)/)? 17 | apdu = msg.substr(if msg.match(/(=> [0-9a-f]{14})/)? then 17 else 3) 18 | result = _.find(apduFilter, ((item) -> apdu.startsWith(item.test))) 19 | 20 | if result?.test? 21 | msg = _.str.rpad(msg.substr(0, msg.indexOf(result.test) + result.test.length), msg.length, 'x') 22 | @_obfuscatedApdu = result.length 23 | else if msg.startsWith('=>') and @_obfuscatedApdu? and @_obfuscatedApdu > 0 24 | msg = _.str.rpad("=> ", msg.length, 'x') 25 | @_obfuscatedApdu -= 1 26 | super msg, msgType -------------------------------------------------------------------------------- /app/assets/css/onboarding/device/chains.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../mixins"; 3 | 4 | div.greyed-container { 5 | text-align: center; 6 | 7 | .black-indication { 8 | margin-bottom: 20px; 9 | } 10 | 11 | .medium-indication { 12 | line-height: 20px; 13 | } 14 | 15 | 16 | .chain-selector { 17 | margin-top: 20px; 18 | } 19 | 20 | #advanced { 21 | margin-top: 20px; 22 | } 23 | 24 | .choice { 25 | margin-right: @metrics-very-small-padding; 26 | width: 160px; 27 | } 28 | 29 | 30 | #remember { 31 | margin-top: 20px; 32 | } 33 | 34 | b { 35 | line-height: 30px; 36 | font-weight: @font-weight-semibold; 37 | } 38 | } 39 | 40 | #content-container { 41 | >.logo-container { 42 | padding-top: 60px; 43 | padding-bottom: 40px; 44 | } 45 | 46 | >.actions-container { 47 | padding-top: 40px; 48 | } 49 | } 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/api/wallet_api_operations_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletApiOperationsDialogViewController extends ledger.common.DialogViewController 2 | 3 | cancellable: no 4 | 5 | view: 6 | accountName: '#account_name' 7 | confirmButton: '#confirmButton' 8 | 9 | onAfterRender: -> 10 | super 11 | @account_id = parseInt(@params.account_id) || 0 12 | @account = Account.findById(@account_id) 13 | if @account 14 | @view.accountName.text @account.get('name') 15 | else 16 | @view.accountName.text t('wallet.api.errors.account_not_found') 17 | @view.confirmButton.addClass "disabled" 18 | Api.callback_cancel 'get_operations', t('wallet.api.errors.account_not_found') 19 | 20 | cancel: -> 21 | Api.callback_cancel 'get_operations', t('wallet.api.errors.cancelled') 22 | @dismiss() 23 | 24 | confirm: -> 25 | Api.exportOperations(@account_id) 26 | @dismiss() -------------------------------------------------------------------------------- /app/views/wallet/api/operations.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.api.operations.title' %>

4 |
5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 19 | 20 | 21 |
9 | <%= t 'wallet.api.operations.info' %> 10 |
<%= t 'wallet.api.operations.account_name' %>
17 | 18 |
22 |
23 |
24 |
25 |
26 | <%= t 'common.cancel' %> 27 | <%= t 'common.confirm' %> 28 |
-------------------------------------------------------------------------------- /app/views/wallet/settings/tools/utilities.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
<%= t 'wallet.settings.tools.utilities' %>
4 |
5 | 6 |
<%= t 'wallet.settings.tools.reset_data' %>
7 |
8 |
9 | 10 |
<%= t 'wallet.settings.tools.register' %>
11 |
12 |
13 | 14 |
<%= t 'wallet.settings.tools.sign_message' %>
15 |
16 |
17 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/accounts/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | section#quicklook { 4 | > .accounts-list { 5 | display: flex; 6 | margin-top: @metrics-medium-padding; 7 | flex-wrap: wrap; 8 | justify-content: space-between; 9 | margin-bottom: @metrics-almost-small-padding; 10 | 11 | > .panel { 12 | display: flex; 13 | width: 48.8%; 14 | height: 40px; 15 | align-items: center; 16 | margin-top: @metrics-very-small-padding; 17 | 18 | &:nth-child(-n+2) { 19 | margin-top: 0; 20 | } 21 | 22 | > .name { 23 | flex-grow: 1; 24 | } 25 | 26 | > .countervalue, .arrow { 27 | margin-left: @metrics-small-padding; 28 | } 29 | 30 | > .countervalue { 31 | white-space: nowrap; 32 | } 33 | 34 | > .balance { 35 | display: flex; 36 | flex-direction: row; 37 | } 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/controllers/update/update_updating_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @UpdateUpdatingViewController extends UpdateViewController 2 | 3 | navigation: 4 | nextRoute: "" 5 | view: 6 | keycardErasureSection: '#keycard-erasure-section' 7 | localizablePageSubtitle: "update.updating.update_confirmation" 8 | localizableNextButton: "common.update" 9 | 10 | navigateNext: -> 11 | if ledger.managers.system.isLinux() or ledger.managers.system.isUnknown() 12 | @navigation.nextRoute = "/update/linux" 13 | else 14 | @getRequest().approveCurrentState() 15 | @navigation.nextRoute = "/update/loading" 16 | super 17 | 18 | onBeforeRender: -> 19 | super 20 | @dongleVersion = @getRequest().getDongleVersion() 21 | @targetVersion = @getRequest().getTargetVersion() 22 | 23 | onAfterRender: -> 24 | super 25 | if @params?.no_erase_keycard_seed is true 26 | @view.keycardErasureSection.remove() 27 | 28 | -------------------------------------------------------------------------------- /app/views/onboarding/management/done.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
<%= if @params.error? then t 'onboarding.management.done.configuration_failed_' + @params.wallet_mode else t 'onboarding.management.done.configuration_is_complete_' + @params.wallet_mode %>
8 | <% if not @params.error?: %> 9 |
<%= _.str.sprintf(t('onboarding.management.done.unplug_plug'), ledger.config.network.plural) %>
10 | <% else: %> 11 | <%= t 'onboarding.management.done.contact_support' %> 12 | <% end %> 13 |
14 |
-------------------------------------------------------------------------------- /app/assets/css/wallet/settings/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#settings_index_dialog { 4 | width: @dialog-width-settings-table; 5 | 6 | .sections-container { 7 | display: flex; 8 | flex-direction: row; 9 | flex-wrap: wrap; 10 | margin-top: @metrics-small-padding; 11 | justify-content: space-between; 12 | 13 | .panel { 14 | width: 90px; 15 | height: 85px; 16 | padding: 0; 17 | display: flex; 18 | flex-direction: column; 19 | align-items: center; 20 | justify-content: center; 21 | margin-top: @metrics-very-small-padding; 22 | margin-left: @metrics-very-small-padding; 23 | 24 | > .fa { 25 | font-size: @font-size-very-very-very-large; 26 | color: @color-dark-grey; 27 | margin-bottom: @metrics-very-small-padding; 28 | } 29 | 30 | &:last-child { 31 | margin-right: auto; 32 | } 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/send/processing.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#send_processing_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | padding: @metrics-very-small-padding 0; 10 | 11 | > .regular-text { 12 | margin-top: @metrics-medium-padding; 13 | } 14 | 15 | > .progress_container { 16 | display: flex; 17 | flex-direction: row; 18 | align-items: center; 19 | justify-content: center; 20 | margin-top: @metrics-small-padding; 21 | 22 | > #progressbar_container { 23 | > .progressbar { 24 | width: 320px; 25 | } 26 | } 27 | 28 | > .regular-grey-text-small { 29 | margin-left: @metrics-small-padding; 30 | } 31 | } 32 | 33 | > .regular-grey-text-small { 34 | margin-top: @metrics-almost-small-padding; 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /app/assets/css/wallet/send/validating.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | @import (reference) "../../common"; 3 | 4 | section#send_validating_dialog { 5 | width: @dialog-width-send; 6 | 7 | > #content_container { 8 | text-align: center; 9 | padding: @metrics-very-small-padding 0; 10 | 11 | > .regular-text { 12 | margin-top: @metrics-medium-padding; 13 | } 14 | 15 | > .progress_container { 16 | display: flex; 17 | flex-direction: row; 18 | align-items: center; 19 | justify-content: center; 20 | margin-top: @metrics-small-padding; 21 | 22 | > #progressbar_container { 23 | > .progressbar { 24 | width: 320px; 25 | } 26 | } 27 | 28 | > .regular-grey-text-small { 29 | margin-left: @metrics-small-padding; 30 | } 31 | } 32 | 33 | > .regular-grey-text-small { 34 | margin-top: @metrics-almost-small-padding; 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/controllers/apps/coinkite/cosign/apps_coinkite_cosign_index_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @AppsCoinkiteCosignIndexDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | requestInput: '#request_input' 5 | nextButton: '#next_button' 6 | errorContainer: '#error_container' 7 | 8 | onShow: -> 9 | super 10 | @view.requestInput.focus() 11 | 12 | next: -> 13 | nextError = @_nextFormError() 14 | if nextError? 15 | @view.errorContainer.show() 16 | @view.errorContainer.text nextError 17 | else 18 | @view.errorContainer.hide() 19 | dialog = new AppsCoinkiteCosignFetchingDialogViewController request: @_request() 20 | @getDialog().push dialog 21 | 22 | _request: -> 23 | _.str.trim(@view.requestInput.val()) 24 | 25 | _nextFormError: -> 26 | if @_request().length != 17 27 | return t 'apps.coinkite.cosign.errors.invalid_request_ref' 28 | undefined -------------------------------------------------------------------------------- /app/views/onboarding/live/go_hw1.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

NOW AVAILABLE

5 |

6 | Ledger Live 7 |

8 |

9 | Ledger is discontinuing Chrome apps 10 |

11 |

12 | Please download Ledger live, the all-in-one companion app for your Ledger device from https://www.ledger.com/ledger-live
13 | We invite you to shift to Ledger Live as all of our Chrome application will stop working by September 2020. 14 |

15 | 16 | Contact Ledger support 17 | 18 | 19 |
20 | 21 |
22 |
23 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/bitcoin/wallet_settings_bitcoin_blockchain_setting_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsBitcoinBlockchainSettingViewController extends WalletSettingsSettingViewController 2 | 3 | renderSelector: "#blockchain_table_container" 4 | view: 5 | blockchainSelect: "#blockchain_select" 6 | 7 | onAfterRender: -> 8 | super 9 | @_updateExplorer() 10 | @_listenEvents() 11 | 12 | _updateExplorer: -> 13 | @view.blockchainSelect.empty() 14 | for id in _.keys(ledger.preferences.defaults.Coin.explorers) 15 | node = $("").text(ledger.preferences.defaults.Coin.explorers[id].name).attr('value', id) 16 | if id == ledger.preferences.instance.getBlockchainExplorer() 17 | node.attr 'selected', true 18 | @view.blockchainSelect.append node 19 | 20 | _listenEvents: -> 21 | @view.blockchainSelect.on 'change', => 22 | ledger.preferences.instance.setBlockchainExplorer(@view.blockchainSelect.val()) -------------------------------------------------------------------------------- /app/views/wallet/message/index.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |

<%= t 'wallet.message.index.title' %>

4 |
5 | 6 | 7 | 8 | 9 | 13 | 14 | 15 |
<%= t 'wallet.bitid.index.address' %> 10 | 11 | 12 |
16 | 17 |
18 |
19 |
20 |
21 | <%= t 'common.cancel' %> 22 | <%= t 'wallet.message.index.sign' %> 23 |
24 | 25 | -------------------------------------------------------------------------------- /app/views/onboarding/live/go.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

NOW AVAILABLE

5 |

6 | Ledger Live 7 |

8 |

9 | Ledger is discontinuing Chrome apps 10 |

11 |

12 | Please download Ledger live, the all-in-one companion app for your Ledger device from https://www.ledger.com/ledger-live
13 | We invite you to shift to Ledger Live as all of our Chrome application will stop working by September 2020. 14 |

15 | 16 | Get Ledger Live now! 17 | 18 | 19 | Contact support 20 |
21 | 22 |
23 |
24 | -------------------------------------------------------------------------------- /app/src/widgets/switch.coffee: -------------------------------------------------------------------------------- 1 | ledger.widgets ?= {} 2 | 3 | ### 4 | Switch 5 | ### 6 | class ledger.widgets.Switch extends EventEmitter 7 | 8 | # @param The node on which the switch will be appended to 9 | constructor: (node) -> 10 | @_switchEl = $('
') 11 | @_switchEl.appendTo(node) 12 | @_switchEl.click => 13 | @setOn(!@isOn(), true) 14 | @emit (if @isOn() then "isOn" else "isOff") 15 | 16 | ### 17 | Set switch state 18 | @param [Boolean] state The state of the switch 19 | @param [Boolean] isAnimated If the switch must be animated 20 | ### 21 | setOn: (state, isAnimated = false) -> 22 | if isAnimated 23 | @_switchEl.addClass('animated') 24 | else 25 | @_switchEl.removeClass('animated') 26 | 27 | if state is on 28 | @_switchEl.addClass('on') 29 | else 30 | @_switchEl.removeClass('on') 31 | state 32 | 33 | # Get switch state 34 | isOn: -> @_switchEl.hasClass('on') -------------------------------------------------------------------------------- /compilation/script-git-setup.coffee: -------------------------------------------------------------------------------- 1 | 2 | module.exports = (configuration) -> 3 | Q = require 'q' 4 | return Q() unless configuration.tag? 5 | git = require 'gulp-git' 6 | defer = Q.defer() 7 | git.exec args: 'branch', (err, stdout) -> 8 | return defer.reject("Unable to retrieve current branch") unless stdout? 9 | [__, configuration.currentBranch] = stdout.match /\*\s*(.+)\s/ 10 | return defer.reject("Unable to retrieve current branch") unless configuration.currentBranch? 11 | git.exec args: 'stash', (err, stdout) -> 12 | return defer.reject(err) if err 13 | configuration.isStashed = stdout.match(/HEAD/)? 14 | git.checkout configuration.tag, quiet: yes, (err) -> 15 | if err? 16 | git.exec args: 'fetch', (err, stdout) -> 17 | git.checkout configuration.tag, quiet: yes, (err) -> 18 | defer.reject("Unable to checkout on tag #{configuration.tag}") if err? 19 | else 20 | defer.resolve() 21 | defer.promise 22 | -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-1101.js: -------------------------------------------------------------------------------- 1 | /* 2 | BIP 70 root test 3 | 4 | -----BEGIN CERTIFICATE----- 5 | MIIBLTCB1KADAgECAgkAhxJgxODsMhIwCgYIKoZIzj0EAwIwHjEcMBoGA1UEAxMT 6 | TGVkZ2VyIEJJUDcwIFRlc3QgMTAeFw0xNTAxMDUwMDM2MDVaFw0yNTAxMDIwMDM2 7 | MDVaMB4xHDAaBgNVBAMTE0xlZGdlciBCSVA3MCBUZXN0IDEwVjAQBgcqhkjOPQIB 8 | BgUrgQQACgNCAAQTzvR+t44bLpYj97mjTIojnqZz9W/Mv/Fy367HV09jw/Ay828G 9 | 0UttnI3x0HmVuTyXl0/j1Ba0Zd4veCIhz4tLMAoGCCqGSM49BAMCA0gAMEUCIQDg 10 | fPcjgjLObeGXY/MlvPITbnFbFS9nlJSvowkvtTi7xAIgIHtmdop8WuCuK3kWHP+h 11 | ojPSHj9fUn/KOqJbfQQiW2M= 12 | -----END CERTIFICATE----- 13 | 14 | */ 15 | 16 | var INIT_LW_1101 = [ 17 | "D020000038000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C397680EB805BC0E95E2B65D9E49B1B045", 18 | "D02800003B35096BE33B2E8D85B4991E89E80FFBE513E991FD3C1C648804BFB91D5B3A62D91621AE1EE50DA24698F9170AA570959B9A06D6EDB6435B2CC6D6DC", // BIP 70 root test 19 | "D02200002B0000000200000001205111286A731F16CB18D70A0C14E12FF969B794F407241DE75E65642C0727FDF5009D" 20 | ]; -------------------------------------------------------------------------------- /app/src/models/transaction.coffee: -------------------------------------------------------------------------------- 1 | class @Transaction extends ledger.database.Model 2 | do @init 3 | 4 | @index 'hash' 5 | @has many: 'operations', onDelete: 'destroy' 6 | @has many: 'outputs', onDelete: 'destroy' 7 | 8 | ### 9 | { 10 | "hash": "da21f9616fb92a7fbe5e72d1537fe30e9b33603d456af72747baf5e5d28f54e3", 11 | "received_at": "2015-07-06T15:48:58Z", 12 | "lock_time": 0, 13 | "fees": 10000 14 | } 15 | ### 16 | @fromJson: (tx, context = ledger.database.contexts.main) -> 17 | base = 18 | hash: tx['hash'] 19 | received_at: tx['received_at'] 20 | lock_time: tx['lock_time'] 21 | fees: tx['fees'] 22 | @findOrCreate({hash: base['hash']}, base, context) 23 | 24 | get: (key) -> 25 | block = => 26 | block._block if block._block? 27 | block._block = @get('block') 28 | switch key 29 | when 'confirmations' then (if block()? then Block.lastBlock()?.get('height') - block().get('height') + 1 else 0) 30 | else super key -------------------------------------------------------------------------------- /app/firmwares/btchipfirmware-init-1100.js: -------------------------------------------------------------------------------- 1 | /* 2 | BIP 70 root test 3 | 4 | -----BEGIN CERTIFICATE----- 5 | MIIBLTCB1KADAgECAgkAhxJgxODsMhIwCgYIKoZIzj0EAwIwHjEcMBoGA1UEAxMT 6 | TGVkZ2VyIEJJUDcwIFRlc3QgMTAeFw0xNTAxMDUwMDM2MDVaFw0yNTAxMDIwMDM2 7 | MDVaMB4xHDAaBgNVBAMTE0xlZGdlciBCSVA3MCBUZXN0IDEwVjAQBgcqhkjOPQIB 8 | BgUrgQQACgNCAAQTzvR+t44bLpYj97mjTIojnqZz9W/Mv/Fy367HV09jw/Ay828G 9 | 0UttnI3x0HmVuTyXl0/j1Ba0Zd4veCIhz4tLMAoGCCqGSM49BAMCA0gAMEUCIQDg 10 | fPcjgjLObeGXY/MlvPITbnFbFS9nlJSvowkvtTi7xAIgIHtmdop8WuCuK3kWHP+h 11 | ojPSHj9fUn/KOqJbfQQiW2M= 12 | -----END CERTIFICATE----- 13 | 14 | */ 15 | 16 | var INIT_LW_1100 = [ 17 | "D020000038000000000000000118F43F95A217EFEDE0A8D98DAC357E3B2501E79C3958B9D7E15238D43A6807C397680EB805BC0E95E2B65D9E49B1B045", 18 | "D02800003B35CA005783E55DAA440A81ABF79643FAE8B796999C979C2016B98615EA23598AD52AC63E2CA5AFFA62CE917A0FE664F64F83EEC080156ECF85D6DC", // BIP 70 root test 19 | "D02200002B000000020000000120AE5697D1BCE461E9EB8BE367A54512F0EF4AEA4F786B4227971C6FBD4BFCD4EE009D" 20 | ]; 21 | 22 | -------------------------------------------------------------------------------- /app/src/crypto/aes.coffee: -------------------------------------------------------------------------------- 1 | @ledger.crypto ?= {} 2 | 3 | # Wrapper around Stanford AES Library for encyrpt/decrypt data with AES 4 | class @ledger.crypto.AES 5 | 6 | constructor: (@key, iv = '554f0cafd67ddcaa', salt = '846cea3ae6a33474d6ae2221d8563eaaba73ef9ea20e1803') -> 7 | @_params = 8 | v: 1 9 | iter: 1000 10 | ks: 256 11 | ts: 128 12 | mode: 'ccm' 13 | adata: '' 14 | cipher: 'aes' 15 | iv: sjcl.codec.base64.toBits(iv) 16 | salt: sjcl.codec.base64.toBits(salt) 17 | 18 | # Encrypts the given string using AES-256 19 | # @param [String] data Data to encrypt 20 | encrypt: (data) -> 21 | encryption = sjcl.json._encrypt(@key, data, @_params) 22 | sjcl.codec.base64.fromBits(encryption.ct,0) 23 | 24 | # Decrypts the given encrypted data 25 | # @param [String] encryptedData An encrypted string 26 | decrypt: (encryptedData) -> 27 | params = _.clone(@_params) 28 | params.ct = sjcl.codec.base64.toBits(encryptedData) 29 | sjcl.json._decrypt(@key, params) -------------------------------------------------------------------------------- /app/src/widgets/circle_progress_bar.coffee: -------------------------------------------------------------------------------- 1 | ledger.widgets ?= {} 2 | 3 | class ledger.widgets.CircleProgressBar extends EventEmitter 4 | 5 | constructor: (node, {width, height} = {}) -> 6 | node.width(width) if width? 7 | node.height(height) if height? 8 | node.addClass("circle-progress-bar-container") 9 | @_view = new ProgressBar.Circle node.selector, 10 | color: '#999999' 11 | trailColor: '#CCCCCC' 12 | strokeWidth: 3 13 | trailWidth: 3 14 | text: 15 | className: 'progress-text' 16 | style: 17 | color: '#000' 18 | position: 'absolute' 19 | left: '50%' 20 | top: '50%' 21 | padding: 0 22 | margin: 0 23 | transform: 24 | prefix: true 25 | value: 'translate(-50%, -50%)' 26 | 27 | step: (state, bar) => 28 | bar.setText((bar.value() * 100).toFixed(0) + '%'); 29 | 30 | 31 | setProgress: (progress, animated = yes) -> 32 | if animated 33 | @_view.animate(progress) 34 | -------------------------------------------------------------------------------- /app/assets/css/wallet/pairing/index.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../common"; 2 | 3 | section#pairing_index_dialog { 4 | width: @dialog-width-pairing; 5 | 6 | > .step-container { 7 | display: flex; 8 | flex-direction: row; 9 | margin-top: @metrics-almost-medium-padding; 10 | 11 | > .step-number { 12 | .light-grey-text-huge; 13 | flex-shrink: 0; 14 | } 15 | 16 | > .step-content { 17 | margin-left: @metrics-almost-medium-padding; 18 | 19 | > .step-indication { 20 | .regular-text; 21 | } 22 | 23 | > .step-explanation { 24 | .regular-grey-text-small; 25 | margin-top: @metrics-very-small-padding; 26 | line-height: 20px; 27 | } 28 | } 29 | } 30 | 31 | > #qrcode_container { 32 | display: flex; 33 | flex-direction: column; 34 | align-items: center; 35 | margin-top: @metrics-medium-padding; 36 | 37 | > .qrcode-indication { 38 | .regular-grey-text-small; 39 | margin-top: @metrics-small-padding; 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /app/views/onboarding/device/firmware.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
<%= t 'onboarding.device.firmware.new_firmware_available' %>
<%= t 'onboarding.device.firmware.new_firmware_available_2' %>
8 |
<%= t 'onboarding.device.firmware.indications' %>
9 | 13 |
14 |
15 | <%= t 'onboading.common.help' %> 16 |
17 |
-------------------------------------------------------------------------------- /app/assets/css/onboarding/device/chains/message.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../../common"; 2 | @import (reference) "../../../mixins"; 3 | @import (reference) "../../../constants"; 4 | 5 | section#dialogs_message_dialog { 6 | display:flex; 7 | max-width: 450px; 8 | 9 | > .content-container { 10 | margin-top: 0px; 11 | 12 | > .uppercase-section-title { 13 | margin-top: 0px; 14 | } 15 | 16 | .medium-indication { 17 | line-height: 20px; 18 | } 19 | 20 | .greyed-action { 21 | font-size: @font-size-very-small; 22 | color: @color-soft-grey; 23 | text-decoration: none; 24 | margin: 40%; 25 | } 26 | 27 | a.greyed-action:hover { 28 | color: darken(@color-soft-grey, @color-strong-darken-value); 29 | } 30 | 31 | > .regular-text-small { 32 | margin-top: 20px; 33 | line-height: 20px; 34 | } 35 | 36 | > .cancel-rounded-button { 37 | margin-top: @metrics-almost-medium-padding; 38 | } 39 | } 40 | > .spacer { 41 | width: 10 px; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/views/onboarding/device/update.eco: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 7 |
<%= _.str.sprintf(t('onboarding.device.update.new_firmware_available'), ledger.fup.utils.versionToString(ledger.fup.versions.Nano.CurrentVersion.Os)) %>
8 |
<%= t ledger.fup.versions.Nano.CurrentVersion.WhatsNew %>
9 | 13 |
14 |
15 | <%= t 'onboading.common.help' %> 16 |
17 |
-------------------------------------------------------------------------------- /app/src/tasks/operations_consumption_task.coffee: -------------------------------------------------------------------------------- 1 | class ledger.tasks.OperationsConsumptionTask extends ledger.tasks.Task 2 | 3 | constructor: () -> super 'global_operations_consumer' 4 | @instance: new @() 5 | 6 | onStart: () -> 7 | clearTimeout(@_scheduledStart) 8 | @_retryNumber ||= 0 9 | stream = ledger.api.TransactionsRestClient.instance.createTransactionStreamForAllObservedPaths() 10 | .stopOnError (err) => 11 | @stopIfNeccessary() 12 | ledger.app.emit 'wallet:operations:sync:failed', err 13 | @_retryNumber = Math.min(@_retryNumber + 1, 12) 14 | @_scheduledStart = _.delay (=> @startIfNeccessary()), ledger.math.fibonacci(@_retryNumber) * 500 15 | 16 | ledger.tasks.TransactionConsumerTask.instance.pushTransactionsFromStream(stream) 17 | stream.observe().done => 18 | @stopIfNeccessary() 19 | _.defer -> ledger.app.emit 'wallet:operations:sync:done' 20 | 21 | onStop: -> 22 | super 23 | 24 | @reset: () -> 25 | clearTimeout(@instance._scheduledStart) 26 | @instance = new @ -------------------------------------------------------------------------------- /app/src/controllers/wallet/api/wallet_api_addresses_dialog_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletApiAddressesDialogViewController extends ledger.common.DialogViewController 2 | 3 | cancellable: no 4 | 5 | view: 6 | accountName: '#account_name' 7 | count: '#count' 8 | confirmButton: '#confirmButton' 9 | 10 | onAfterRender: -> 11 | super 12 | @account_id = parseInt(@params.account_id) || 0 13 | @account = Account.findById(@account_id) 14 | @count = parseInt(@params.count) || 1 15 | @view.count.text @count 16 | if @account 17 | @view.accountName.text @account.get('name') 18 | else 19 | @view.accountName.text t('wallet.api.errors.account_not_found') 20 | @view.confirmButton.addClass "disabled" 21 | Api.callback_cancel 'get_new_addresses', t('wallet.api.errors.account_not_found') 22 | 23 | cancel: -> 24 | Api.callback_cancel 'get_net_addresses', t('wallet.api.errors.cancelled') 25 | @dismiss() 26 | 27 | confirm: -> 28 | Api.exportNewAddresses(@account_id, @count) 29 | @dismiss() -------------------------------------------------------------------------------- /app/assets/css/wallet/accounts/show.less: -------------------------------------------------------------------------------- 1 | @import (reference) "../../constants"; 2 | 3 | section#account { 4 | 5 | > table { 6 | 7 | > thead tr:first-child td { 8 | padding-bottom: 0px; 9 | 10 | &.countervalue-balance { 11 | color: @color-dark-grey; 12 | } 13 | } 14 | 15 | > thead { 16 | > tr { 17 | > td { 18 | .tinySpinner { 19 | } 20 | } 21 | } 22 | } 23 | 24 | > tbody tr:first-child td { 25 | .price { 26 | font-size: @font-size-giga-large; 27 | font-weight: @font-weight-semibold; 28 | letter-spacing: -2px; 29 | } 30 | 31 | .btc-acronyme { 32 | font-size: @font-size-giga-large; 33 | font-weight: @font-weight-light; 34 | letter-spacing: -2px; 35 | } 36 | 37 | &.countervalue-balance { 38 | color: @color-soft-grey; 39 | font-size: @font-size-giga-large; 40 | font-weight: @font-weight-light; 41 | letter-spacing: -2.5px; 42 | } 43 | 44 | } 45 | 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /app/src/controllers/apps/coinkite/dashboard/apps_coinkite_dashboard_compatibility_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @AppsCoinkiteDashboardCompatibilityDialogViewController extends ledger.common.DialogViewController 2 | 3 | view: 4 | contentContainer: '#content_container' 5 | 6 | onAfterRender: -> 7 | super 8 | @view.spinner = ledger.spinners.createLargeSpinner(@view.contentContainer[0]) 9 | ck = new Coinkite() 10 | ck.testDongleCompatibility (success) => 11 | if success 12 | @dismiss => 13 | dialog = new CommonDialogsMessageDialogViewController(kind: "success", title: t("apps.coinkite.dashboard.compatibility.success"), subtitle: t("apps.coinkite.dashboard.compatibility.success_text")) 14 | dialog.show() 15 | else 16 | @dismiss => 17 | dialog = new CommonDialogsMessageDialogViewController(kind: "error", title: t("apps.coinkite.dashboard.compatibility.fail"), subtitle: _.str.sprintf(t("apps.coinkite.dashboard.compatibility.fail_text"), ledger.config.network.plural)) 18 | dialog.show() 19 | -------------------------------------------------------------------------------- /app/src/controllers/wallet/settings/bitcoin/wallet_settings_bitcoin_fees_setting_view_controller.coffee: -------------------------------------------------------------------------------- 1 | class @WalletSettingsBitcoinFeesSettingViewController extends WalletSettingsSettingViewController 2 | 3 | renderSelector: "#fees_table_container" 4 | view: 5 | feesSelect: "#fees_select" 6 | 7 | onAfterRender: -> 8 | super 9 | @_updateFees() 10 | @_listenEvents() 11 | 12 | _updateFees: -> 13 | # add fees 14 | @view.feesSelect.empty() 15 | for id in _.sortBy(_.keys(ledger.preferences.defaults.Coin.fees), (id) -> ledger.preferences.defaults.Coin.fees[id].value).reverse() 16 | fee = ledger.preferences.defaults.Coin.fees[id] 17 | text = t(fee.localization) 18 | node = $("").text(text).attr('value', fee.value) 19 | if fee.value == ledger.preferences.instance.getMiningFee() 20 | node.attr 'selected', true 21 | @view.feesSelect.append node 22 | 23 | _listenEvents: -> 24 | @view.feesSelect.on 'change', => 25 | ledger.preferences.instance.setMiningFee(@view.feesSelect.val().toString()) --------------------------------------------------------------------------------