#pragma once #include // Pure decisions for the PIN quick-unlock vault (C87), kept free of App/UI/RPC state so they are // unit-testable. The vault seals the wallet passphrase under the PIN. None of these paths deletes // it: a vault whose passphrase the wallet no longer accepts is only marked out of date for the // session (no lockout penalty), and the user removes it and sets the PIN again. The vault may hold // the only copy of a passphrase that still opens an older wallet backup. namespace dragonx { namespace data { // What a completed walletpassphrasechange means for the active wallet's PIN vault. enum class VaultAfterChange { Keep, // no vault, the change failed or kept the same passphrase, or the vault is another wallet's MarkStale, // the vault seals the OLD passphrase: stop offering the PIN this session and warn (keep the file) }; // Decided on the main thread when the change completes, not when it is sent, so a vault created // while the change was in flight is covered too. `pathAtDispatch` is the vault path captured when // the change was sent and `pathNow` the active vault path now: a wallet switch in between makes // them differ, and the other wallet's vault is left alone. inline VaultAfterChange decideVaultAfterPassphraseChange(bool changeSucceeded, bool vaultExistsNow, bool samePassphrase, const std::string& pathAtDispatch, const std::string& pathNow) { if (!changeSucceeded || !vaultExistsNow || samePassphrase) return VaultAfterChange::Keep; if (pathAtDispatch.empty() || pathAtDispatch != pathNow) return VaultAfterChange::Keep; return VaultAfterChange::MarkStale; } // dragonxd's RPC_WALLET_PASSPHRASE_INCORRECT ("The wallet passphrase entered was incorrect."). constexpr int kRpcWalletPassphraseIncorrect = -14; // A PIN unlock whose vault opened (so the PIN was right) but whose walletpassphrase call the daemon // refused with -14: the vault holds a passphrase the wallet no longer accepts (it was changed after // the PIN was set, e.g. with dragonx-cli walletpassphrasechange). Not a wrong-PIN attempt, so no // lockout penalty; the PIN is marked out of date and the vault is kept. inline bool isStaleVaultUnlockFailure(bool vaultDecrypted, int rpcCode) { return vaultDecrypted && rpcCode == kRpcWalletPassphraseIncorrect; } } // namespace data } // namespace dragonx