mirror of
https://github.com/logos-blockchain/lssa.git
synced 2026-05-22 09:39:44 +00:00
* feat: add basic commands for communicating with keycard * initialize changes * reorganization * add script file for easier wallet access * update commands * fixes * fixed load for non continuous run * Updates for signatures with keycard * fix BIP-340 signatures for fixed sized messages * fmt * refactor and add pin support to program facades * fix unit test * fixes * Revert "fixes" This reverts commit 41f34f4ff4145b7abb60fd9bec168ae4b60f23b4. * fixes * fixes * Removed privacy keycard calls * Revert "Removed privacy keycard calls" This reverts commit d70ef505a1f40b87159099761f5fce5a31e3f17b. * Add domain separators * Removed privacy txs for keycard * CI fixes * CI fixes * addressed some comments * fix ci * ci fixes * fix integration test issue and updated keycard firmware * addressed more comments * fixed deny * remove keycard-py * fixed from earlier merge * add hash_message tests * add test * fix deny * CI fixes * fixed integration tests * Update public.rs * update artifacts * ci and comments * addressed comments * comment fixes * fixes from merging main * first round of comments * Revert "Merge branch 'main' into marvin/keycard-commands" This reverts commit 3fce53f663a3996938dddf77680854570063ca21, reversing changes made to e7b42a5177641455a8917bd2e29db20afd9690e5. * python comments * addressed comments * compile error fixed * fix artifacts * fix main merge error * adjust signer logic workflow * fmt * merge main and shift keycard tests * deny fix * artifacts fix * remove keycard scripts from root * tps fix * fmt
137 lines
4.8 KiB
Rust
137 lines
4.8 KiB
Rust
use anyhow::Result;
|
|
use clap::Subcommand;
|
|
use keycard_wallet::{KeycardWallet, clear_pairing, python_path};
|
|
use pyo3::prelude::*;
|
|
|
|
use crate::{
|
|
WalletCore,
|
|
cli::{SubcommandReturnValue, WalletSubcommand, read_mnemonic, read_pin},
|
|
};
|
|
|
|
/// Represents generic chain CLI subcommand.
|
|
#[derive(Subcommand, Debug, Clone)]
|
|
pub enum KeycardSubcommand {
|
|
Available,
|
|
Connect,
|
|
Disconnect,
|
|
Init,
|
|
Load,
|
|
}
|
|
|
|
impl WalletSubcommand for KeycardSubcommand {
|
|
async fn handle_subcommand(
|
|
self,
|
|
_wallet_core: &mut WalletCore,
|
|
) -> Result<SubcommandReturnValue> {
|
|
match self {
|
|
Self::Available => {
|
|
Python::with_gil(|py| {
|
|
python_path::add_python_path(py).expect("keycard_wallet.py not found");
|
|
|
|
let wallet = KeycardWallet::new(py)
|
|
.expect("`wallet::keycard::available`: invalid data received for pin");
|
|
let available = wallet.is_unpaired_keycard_available(py).expect(
|
|
"`wallet::keycard::available`: received invalid data from Keycard wrapper",
|
|
);
|
|
|
|
if available {
|
|
println!("\u{2705} Keycard is available.");
|
|
} else {
|
|
println!("\u{274c} Keycard is not available.");
|
|
}
|
|
});
|
|
|
|
Ok(SubcommandReturnValue::Empty)
|
|
}
|
|
Self::Connect => {
|
|
let pin = read_pin()?;
|
|
|
|
Python::with_gil(|py| {
|
|
python_path::add_python_path(py).expect("keycard_wallet.py not found");
|
|
|
|
let wallet = KeycardWallet::new(py)
|
|
.expect("`wallet::keycard::connect`: invalid keycard wallet provided");
|
|
|
|
wallet
|
|
.connect(py, &pin)
|
|
.expect("`wallet::keycard::connect`: failed to connect to keycard");
|
|
|
|
println!("\u{2705} Keycard paired and ready.");
|
|
drop(wallet.close_session(py));
|
|
});
|
|
|
|
Ok(SubcommandReturnValue::Empty)
|
|
}
|
|
Self::Disconnect => {
|
|
let pin = read_pin()?;
|
|
|
|
Python::with_gil(|py| {
|
|
python_path::add_python_path(py).expect("keycard_wallet.py not found");
|
|
|
|
let wallet = KeycardWallet::new(py)
|
|
.expect("`wallet::keycard::disconnect`: invalid keycard wallet provided");
|
|
|
|
wallet
|
|
.connect(py, &pin)
|
|
.expect("`wallet::keycard::disconnect`: failed to open session");
|
|
|
|
wallet
|
|
.disconnect(py)
|
|
.expect("`wallet::keycard::disconnect`: failed to unpair keycard");
|
|
|
|
clear_pairing();
|
|
println!("\u{2705} Keycard unpaired and pairing cleared.");
|
|
});
|
|
|
|
Ok(SubcommandReturnValue::Empty)
|
|
}
|
|
Self::Init => {
|
|
let pin = read_pin()?;
|
|
|
|
Python::with_gil(|py| {
|
|
python_path::add_python_path(py).expect("keycard_wallet.py not found");
|
|
|
|
let wallet = KeycardWallet::new(py)
|
|
.expect("`wallet::keycard::init`: invalid keycard wallet provided");
|
|
|
|
let initialized = wallet
|
|
.initialize(py, &pin)
|
|
.expect("`wallet::keycard::init`: failed to initialize keycard");
|
|
|
|
if initialized {
|
|
clear_pairing();
|
|
println!("\u{2705} Keycard initialized successfully.");
|
|
}
|
|
});
|
|
|
|
Ok(SubcommandReturnValue::Empty)
|
|
}
|
|
Self::Load => {
|
|
let pin = read_pin()?;
|
|
let mnemonic = read_mnemonic()?;
|
|
|
|
Python::with_gil(|py| {
|
|
python_path::add_python_path(py).expect("keycard_wallet.py not found");
|
|
|
|
let wallet = KeycardWallet::new(py)
|
|
.expect("`wallet::keycard::load`: invalid keycard wallet provided");
|
|
|
|
wallet
|
|
.connect(py, &pin)
|
|
.expect("`wallet::keycard::load`: failed to connect to keycard");
|
|
|
|
println!("\u{2705} Keycard is now connected to wallet.");
|
|
if wallet.load_mnemonic(py, &mnemonic).is_ok() {
|
|
println!("\u{2705} Mnemonic phrase loaded successfully.");
|
|
} else {
|
|
println!("\u{274c} Failed to load mnemonic phrase.");
|
|
}
|
|
drop(wallet.close_session(py));
|
|
});
|
|
|
|
Ok(SubcommandReturnValue::Empty)
|
|
}
|
|
}
|
|
}
|
|
}
|