/** * <p>Ping the device</p> * * <p>This will trigger a SHOW_OPERATION_SUCCEEDED</p> */ public void requestPing() { // Let the state changes occur as a result of the internal messages context.getClient().ping(); }
/** * @return True if the hardware wallet has been attached and a successful connection made */ public boolean isDeviceReady() { return context.getFeatures().isPresent(); }
@Override public void transition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { // Handle low level message events for the device switch (event.getEventType()) { case DEVICE_ATTACHED: context.resetToAttached(); return; case DEVICE_DETACHED: client.softDetach(); context.resetToDetached(); return; case DEVICE_CONNECTED: context.resetToConnected(); return; case DEVICE_DISCONNECTED: context.resetToDisconnected(); return; case DEVICE_FAILED: context.resetToFailed(); return; } // Must be unhandled to be here so rely on internal handler // provided by implementation internalTransition(client, context, event); }
case TX_REQUEST: Transaction transaction = context.getTransaction().get(); TxRequest txRequest = ((TxRequest) event.getMessage().get()); int signedInputIndex = serializedType.getSignatureIndex().get(); byte[] signature = serializedType.getSignature().get(); context.getSignatures().put(signedInputIndex, signature); byte[] serializedTx = serializedType.getSerializedTx().get(); try { context.getSerializedTx().write(serializedTx); } catch (IOException e) { break; client.txAck(txRequest, transaction, context.getReceivingAddressPathMap(), context.getChangeAddressPathMap()); break; case BUTTON_REQUEST: context.resetToInitialised(); break; default:
case SUCCESS: switch (context.getCurrentUseCase()) { case CREATE_WALLET: context.setToConfirmResetState(); break; case LOAD_WALLET: context.setToConfirmLoadState(); break; default: context.resetToConnected(); break; context.resetToInitialised(); break; default:
List<ChildNumber> childNumbers = context.getChildNumbers().get(); DeterministicKey parent = context.getDeterministicKey().orNull(); log.debug("Parent key path: {}", parent == null ? "Root" : parent.getPathAsString()); DeterministicKey child = DeterministicKey.deserializeB58(parent, base58Xpub, MainNetParams.get()); log.debug("Child key path: {}", child.getPathAsString()); context.setDeterministicKey(child); context.setDeterministicHierarchy(new DeterministicHierarchy(context.getDeterministicKey().get())); context.resetToInitialised(); break; default:
/** * <p>Provide standard handling for an unexpected message so the downstream consumer can react appropriately</p> * * @param context The current context providing parameters for decisions * @param event The event driving the transition */ protected void handleUnexpectedMessageEvent(HardwareWalletContext context, MessageEvent event) { log.warn("Unexpected message event '{}'", event.getEventType().name()); if (event.getMessage().isPresent()) { HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), context.getClient().name()); } else { HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, context.getClient().name()); } context.resetToConnected(); } }
final DeterministicKey parentKey = hardwareWalletContext.getDeterministicKey().get(); log.info("Parent key path: {}", parentKey.getPathAsString()); DeterministicHierarchy hierarchy = hardwareWalletContext.getDeterministicHierarchy().get(); DeterministicKey childKey = hierarchy.deriveChild( Lists.newArrayList( Optional<Features> features = hardwareWalletContext.getFeatures(); log.debug("Features: {}", features); final String label;
Optional<Features> currentFeatures = currentHardwareWalletService.get().getContext().getFeatures(); String currentSource = currentHardwareWalletService.get().getContext().getClient().name(); String newSource = event.getSource();
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { switch (event.getEventType()) { case BUTTON_REQUEST: // Device is asking for the user to acknowledge a word display HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_BUTTON_PRESS, event.getMessage().get(), client.name()); client.buttonAck(); break; case SUCCESS: // Device has completed the create wallet operation HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); // Ensure the Features are updated context.resetToConnected(); break; case FAILURE: // User has cancelled or operation failed HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_FAILED, event.getMessage().get(), client.name()); context.resetToInitialised(); break; default: handleUnexpectedMessageEvent(context, event); } } }
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { context.resetToConnected(); } }
byte[] deviceTxPayload = CoreServices.getCurrentHardwareWalletService().get().getContext().getSerializedTx().toByteArray();
LanguageConfiguration languageConfiguration = Configurations.currentConfiguration.getLanguage(); Optional<Transaction> currentTransactionOptional = CoreServices.getCurrentHardwareWalletService().get().getContext().getTransaction(); if (currentTransactionOptional.isPresent()) {
/** * Work out which restore method to use, depending on if it is a Trezor wallet or not and what backups there are */ public void calculateRestoreMethod() { Optional<HardwareWalletService> hardwareWalletService = CoreServices.getCurrentHardwareWalletService(); // User has selected restore wallet - see if wallet is hard Trezor wallet // If so no need to enter a seed phrase - use the rootNode from the master public key to work out the wallet id HardwareWalletContext context = hardwareWalletService.get().getContext(); // Create a wallet id from the rootNode to work out the wallet root directory if (context.getDeterministicKey().isPresent()) { walletId = Optional.of(new WalletId(context.getDeterministicKey().get().getIdentifier())); String walletRoot = WalletManager.createWalletRoot(walletId.get()); log.debug("Hardware wallet root : {}", walletRoot); } // Ensure Trezor is cancelled hardwareWalletService.get().requestCancel(); restoreMethod = RESTORE_WALLET_HARD_TREZOR; if (!isLocalZipBackupPresent()) { // Next ask for the cloud backup location state = RESTORE_WALLET_SELECT_BACKUP_LOCATION; } else { // Next select one of the local backups state = RESTORE_WALLET_SELECT_BACKUP; } }
/** * <p>Change or remove the device PIN.</p> * * @param remove True if an existing PIN should be removed */ public void changePIN(boolean remove) { // Set the FSM context context.beginChangePIN(remove); }
/** * @param client The hardware wallet client providing the low level messages */ public HardwareWalletService(HardwareWalletClient client) { Preconditions.checkNotNull(client, "'client' must be present"); context = new HardwareWalletContext(client); }
context.beginCipherKeyUseCase( account, keyPurpose,
context.resetToConnected(); break; case FAILURE: context.resetToInitialised(); break; default:
@Override protected void internalTransition(HardwareWalletClient client, HardwareWalletContext context, MessageEvent event) { // We don't expect any messages switch (event.getEventType()) { case SUCCESS: // Possible Ping HardwareWalletEvents.fireHardwareWalletEvent(HardwareWalletEventType.SHOW_OPERATION_SUCCEEDED, event.getMessage().get(), client.name()); // Ensure the Features are updated context.resetToConnected(); break; default: handleUnexpectedMessageEvent(context, event); } }
byte[] deviceTxPayload = CoreServices.getCurrentHardwareWalletService().get().getContext().getSerializedTx().toByteArray();