104 lines
3.7 KiB
Rust
Raw Normal View History

use std::vec;
use common::HashType;
use nssa::{AccountId, program::Program};
2026-04-15 17:21:16 -03:00
use nssa_core::{Identifier, NullifierPublicKey, SharedSecretKey, encryption::ViewingPublicKey};
use super::{NativeTokenTransfer, auth_transfer_preparation};
2026-05-18 13:44:03 +03:00
use crate::{AccountManagerAccountIdentity, ExecutionFailureKind};
impl NativeTokenTransfer<'_> {
pub async fn register_account_private(
&self,
from: AccountId,
) -> Result<(HashType, SharedSecretKey), ExecutionFailureKind> {
let instruction = authenticated_transfer_core::Instruction::Initialize;
let account = self
.0
.resolve_private_account(from)
.ok_or(ExecutionFailureKind::KeyNotFoundError)?;
self.0
.send_privacy_preserving_tx(
vec![account],
Program::serialize_instruction(instruction).unwrap(),
&Program::authenticated_transfer_program().into(),
)
.await
.map(|(resp, secrets)| {
let mut secrets_iter = secrets.into_iter();
let first = secrets_iter.next().expect("expected sender's secret");
(resp, first)
})
}
pub async fn send_private_transfer_to_outer_account(
&self,
from: AccountId,
to_npk: NullifierPublicKey,
2026-01-21 17:27:23 -05:00
to_vpk: ViewingPublicKey,
2026-04-15 17:21:16 -03:00
to_identifier: Identifier,
balance_to_move: u128,
) -> Result<(HashType, [SharedSecretKey; 2]), ExecutionFailureKind> {
let (instruction_data, program, tx_pre_check) = auth_transfer_preparation(balance_to_move);
self.0
.send_privacy_preserving_tx_with_pre_check(
vec![
self.0
.resolve_private_account(from)
.ok_or(ExecutionFailureKind::KeyNotFoundError)?,
2026-05-18 13:44:03 +03:00
AccountManagerAccountIdentity::PrivateForeign {
npk: to_npk,
2026-01-21 17:27:23 -05:00
vpk: to_vpk,
2026-04-15 17:21:16 -03:00
identifier: to_identifier,
},
],
instruction_data,
&program.into(),
tx_pre_check,
)
.await
.map(|(resp, secrets)| {
let mut secrets_iter = secrets.into_iter();
let first = secrets_iter.next().expect("expected sender's secret");
let second = secrets_iter.next().expect("expected receiver's secret");
(resp, [first, second])
})
}
pub async fn send_private_transfer_to_owned_account(
&self,
from: AccountId,
to: AccountId,
balance_to_move: u128,
) -> Result<(HashType, [SharedSecretKey; 2]), ExecutionFailureKind> {
let (instruction_data, program, tx_pre_check) = auth_transfer_preparation(balance_to_move);
let from_account = self
.0
.resolve_private_account(from)
.ok_or(ExecutionFailureKind::KeyNotFoundError)?;
let to_account = self
.0
.resolve_private_account(to)
.ok_or(ExecutionFailureKind::KeyNotFoundError)?;
self.0
.send_privacy_preserving_tx_with_pre_check(
vec![from_account, to_account],
instruction_data,
&program.into(),
tx_pre_check,
)
.await
.map(|(resp, secrets)| {
let mut secrets_iter = secrets.into_iter();
let first = secrets_iter.next().expect("expected sender's secret");
let second = secrets_iter.next().expect("expected receiver's secret");
(resp, [first, second])
})
}
}