137 lines
4.8 KiB
Rust
Raw Normal View History

use common::{HashType, transaction::NSSATransaction};
use keycard_wallet::KeycardWallet;
2025-10-03 15:59:27 -03:00
use nssa::{
AccountId, PublicTransaction,
2025-10-03 15:59:27 -03:00
program::Program,
public_transaction::{Message, WitnessSet},
};
use sequencer_service_rpc::RpcClient as _;
2025-09-22 16:38:25 +03:00
use super::NativeTokenTransfer;
use crate::{ExecutionFailureKind, WalletCore};
2025-09-22 16:38:25 +03:00
impl NativeTokenTransfer<'_> {
pub async fn send_public_transfer(
2025-09-22 16:38:25 +03:00
&self,
from: AccountId,
to: AccountId,
2025-09-22 16:38:25 +03:00
balance_to_move: u128,
2026-04-23 17:45:43 -04:00
pin: &Option<String>,
key_path: &Option<String>,
) -> Result<HashType, ExecutionFailureKind> {
2026-03-04 18:42:33 +03:00
let balance = self
.0
.get_account_balance(from)
.await
.map_err(ExecutionFailureKind::SequencerError)?;
2025-09-22 16:38:25 +03:00
if balance >= balance_to_move {
let account_ids = vec![from, to];
let program_id = Program::authenticated_transfer_program().id();
2026-04-21 13:40:15 -04:00
let mut sign_ids = Vec::new();
sign_ids.push(from);
let mut nonces = self
2026-03-04 18:42:33 +03:00
.0
.get_accounts_nonces(vec![from])
.await
.map_err(ExecutionFailureKind::SequencerError)?;
let to_signing_key = self.0.storage.user_data.get_pub_account_signing_key(to);
2026-04-21 13:40:15 -04:00
if let Some(_to_signing_key) = to_signing_key {
sign_ids.push(to);
let to_nonces = self
.0
.get_accounts_nonces(vec![to])
.await
.map_err(ExecutionFailureKind::SequencerError)?;
nonces.extend(to_nonces);
} else {
println!(
"Receiver's account ({to}) private key not found in wallet. Proceeding with only sender's key."
);
}
let message =
Message::try_new(program_id, account_ids, nonces, balance_to_move).unwrap();
2026-04-21 13:40:15 -04:00
2026-04-23 17:45:43 -04:00
let witness_set = if pin.is_none() {
WalletCore::sign_public_message(self.0, &message, &sign_ids)
.expect("Expect a valid signature")
} else {
let pub_key = KeycardWallet::get_public_key_for_path_with_connect(
&pin.as_ref().expect("TODO"),
&key_path.as_ref().expect("TODO"),
);
let signature = KeycardWallet::sign_message_for_path_with_connect(
&pin.as_ref().expect("TODO"),
&key_path.as_ref().expect("TODO"),
&message.hash_message(),
)
.expect("Expect valid signature");
WitnessSet::from_list(&[signature], &[pub_key])
};
2025-09-22 16:38:25 +03:00
2025-10-03 15:59:27 -03:00
let tx = PublicTransaction::new(message, witness_set);
2025-09-22 16:38:25 +03:00
Ok(self
.0
.sequencer_client
.send_transaction(NSSATransaction::Public(tx))
.await?)
2025-09-22 16:38:25 +03:00
} else {
Err(ExecutionFailureKind::InsufficientFundsError)
}
}
2025-10-10 17:47:23 -03:00
pub async fn register_account(
2025-10-10 17:47:23 -03:00
&self,
from: AccountId,
2026-04-23 17:45:43 -04:00
pin: &Option<String>, // Used by Keycard.
key_path: &Option<String>, // Used by Keycard.
) -> Result<HashType, ExecutionFailureKind> {
2026-03-04 18:42:33 +03:00
let nonces = self
.0
.get_accounts_nonces(vec![from])
.await
.map_err(ExecutionFailureKind::SequencerError)?;
2025-10-10 17:47:23 -03:00
let instruction: u128 = 0;
let account_ids = vec![from];
2025-10-10 17:47:23 -03:00
let program_id = Program::authenticated_transfer_program().id();
let message = Message::try_new(program_id, account_ids, nonces, instruction).expect("Expect a valid Message");
2025-10-10 17:47:23 -03:00
2026-04-23 17:45:43 -04:00
let witness_set = if pin.is_none() {
let signing_key = self.0.storage.user_data.get_pub_account_signing_key(from);
let Some(signing_key) = signing_key else {
return Err(ExecutionFailureKind::KeyNotFoundError);
};
2025-10-10 17:47:23 -03:00
2026-04-23 17:45:43 -04:00
WitnessSet::for_message(&message, &[signing_key])
} else {
let pub_key = KeycardWallet::get_public_key_for_path_with_connect(
pin.as_ref().expect("TODO"),
key_path.as_ref().expect("TODO"),
);
let signature = KeycardWallet::sign_message_for_path_with_connect(
pin.as_ref().as_ref().expect("TODO"),
key_path.as_ref().expect("TODO"),
&message.hash_message(),
)
.expect("Expect a valid Signature.");
WitnessSet::from_list(&[signature], &[pub_key])
2026-04-23 17:45:43 -04:00
};
2025-10-10 17:47:23 -03:00
let tx = PublicTransaction::new(message, witness_set);
Ok(self
.0
.sequencer_client
.send_transaction(NSSATransaction::Public(tx))
.await?)
2025-10-10 17:47:23 -03:00
}
2025-09-22 16:38:25 +03:00
}