├── 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 |
2 |
3 |
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 |
--------------------------------------------------------------------------------
/.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 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/apps.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= t 'wallet.settings.common.apps' %>
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/bitcoin/blockchain.eco:
--------------------------------------------------------------------------------
1 |
2 |
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 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/tools.eco:
--------------------------------------------------------------------------------
1 |
8 |
9 |
--------------------------------------------------------------------------------
/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 |
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 |
12 |
--------------------------------------------------------------------------------
/app/views/onboarding/device/pin.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
<%= t 'onboarding.device.pin.enter_your_pin_code' %>
7 |
8 |
9 |
12 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/hardware.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= t 'wallet.settings.common.hardware' %>
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
10 |
11 |
12 |
13 |
17 |
18 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/display.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= t 'wallet.settings.common.display' %>
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/bitcoin.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= t 'wallet.settings.common.coin' %>
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/hardware/firmware.eco:
--------------------------------------------------------------------------------
1 |
2 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
16 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/tools/logs.eco:
--------------------------------------------------------------------------------
1 |
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 |
9 | <%= t 'wallet.p2sh.index.info' %>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/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 |
15 |
16 |
--------------------------------------------------------------------------------
/app/views/wallet/api/accounts.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= t 'wallet.api.accounts.title' %>
4 |
5 |
6 |
7 |
8 |
9 | <%= t 'wallet.api.accounts.info' %>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
9 | <%= t 'apps.coinkite.keygen.index.info' %>
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------
/app/views/wallet/bitid/form.eco:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
11 |
<%= t 'common.may_take_a_while' %>
12 |
13 |
14 |
--------------------------------------------------------------------------------
/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 |
11 |
<%= t 'common.may_take_a_while' %>
12 |
13 |
14 |
--------------------------------------------------------------------------------
/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 |
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 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/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 |
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 |
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 |
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 |
18 |
--------------------------------------------------------------------------------
/app/views/wallet/xpubkey/index.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 | <%= t 'wallet.xpubkey.index.title' %>
4 |
5 |
6 |
7 |
8 |
9 | <%= t 'wallet.xpubkey.index.info' %>
10 |
11 |
12 |
13 | <%= t 'wallet.xpubkey.index.path' %>
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/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 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/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 |
9 | <%= t 'wallet.api.operations.info' %>
10 |
11 |
12 |
13 | <%= t 'wallet.api.operations.account_name' %>
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/views/wallet/settings/tools/utilities.eco:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
16 |
17 |
18 |
19 |
24 |
25 |
--------------------------------------------------------------------------------
/app/views/onboarding/live/go.eco:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
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 |
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())
--------------------------------------------------------------------------------