v0.2.6-pre.016
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-wallet-lib/src/transfer.rs
|
||||
// version: 3
|
||||
// version: 4
|
||||
|
||||
//! Explicit OWNER-only Solana keypair import/export adapters.
|
||||
|
||||
@@ -9,7 +9,7 @@ use std::io::Write; // rust-rules: trait-import
|
||||
use std::os::unix::fs::PermissionsExt; // rust-rules: trait-import
|
||||
use zeroize::Zeroize; // rust-rules: trait-import
|
||||
|
||||
/// Explicit secret-transfer formats supported by Wallet `0.2.5`.
|
||||
/// Explicit secret-transfer formats supported by Wallet.
|
||||
#[non_exhaustive]
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum WalletTransferFormat {
|
||||
@@ -106,6 +106,55 @@ pub async fn inspect_wallet_transfer_file(
|
||||
return inspect_wallet_transfer(bytes.as_slice(), format);
|
||||
}
|
||||
|
||||
/// Imports one in-memory Solana keypair transfer payload into a new native Wallet using [`crate::DEFAULT_WALLET_FORMAT`].
|
||||
pub async fn import_wallet_transfer(
|
||||
destination: impl std::convert::AsRef<std::path::Path>,
|
||||
source: &[u8],
|
||||
format: WalletTransferFormat,
|
||||
owner_password: crate::OwnerPassword,
|
||||
view_password: std::option::Option<crate::ViewPassword>,
|
||||
metadata: crate::WalletCreateMetadata,
|
||||
) -> ksp_core_lib::Result<crate::WalletOwner> {
|
||||
return match crate::DEFAULT_WALLET_FORMAT {
|
||||
crate::WalletFormat::V1 => import_wallet_transfer_v1(destination, source, format, owner_password, view_password, metadata).await,
|
||||
crate::WalletFormat::V2 => import_wallet_transfer_v2(destination, source, format, owner_password, view_password, metadata).await,
|
||||
};
|
||||
}
|
||||
|
||||
/// Imports one in-memory Solana keypair transfer payload into a new native `.kspwallet` V2 binary file.
|
||||
pub async fn import_wallet_transfer_v2(
|
||||
destination: impl std::convert::AsRef<std::path::Path>,
|
||||
source: &[u8],
|
||||
format: WalletTransferFormat,
|
||||
owner_password: crate::OwnerPassword,
|
||||
view_password: std::option::Option<crate::ViewPassword>,
|
||||
metadata: crate::WalletCreateMetadata,
|
||||
) -> ksp_core_lib::Result<crate::WalletOwner> {
|
||||
let keypair = match decode_transfer_keypair(source, format) {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let owner = match crate::create_wallet_v2_from_keypair(owner_password, view_password, metadata, keypair).await {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
let serialized = match owner.to_native_bytes() {
|
||||
std::result::Result::Ok(value) => value,
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
if let std::result::Result::Err(error) = crate::persist_new_wallet_content(destination.as_ref().to_path_buf(), serialized).await {
|
||||
return std::result::Result::Err(error);
|
||||
}
|
||||
ksp_logging_lib::debug!(
|
||||
target: crate::TRACING_TARGET,
|
||||
operation = "wallet_import_transfer",
|
||||
format_version = crate::KSPWALLET_FORMAT_VERSION_V2,
|
||||
transfer_format = format.code(),
|
||||
"external Solana keypair imported into a new native wallet"
|
||||
);
|
||||
return std::result::Result::Ok(owner);
|
||||
}
|
||||
|
||||
/// Imports one in-memory Solana keypair transfer payload into a new native `.kspwallet` V1 file.
|
||||
///
|
||||
/// Import always creates a fresh native Wallet envelope around the validated immutable Solana keypair and publishes with the same no-clobber semantics as
|
||||
@@ -143,6 +192,38 @@ pub async fn import_wallet_transfer_v1(
|
||||
return std::result::Result::Ok(owner);
|
||||
}
|
||||
|
||||
/// Imports one bounded external transfer file into a new native Wallet using [`crate::DEFAULT_WALLET_FORMAT`].
|
||||
pub async fn import_wallet_transfer_file(
|
||||
destination: impl std::convert::AsRef<std::path::Path>,
|
||||
source: impl std::convert::AsRef<std::path::Path>,
|
||||
format: WalletTransferFormat,
|
||||
owner_password: crate::OwnerPassword,
|
||||
view_password: std::option::Option<crate::ViewPassword>,
|
||||
metadata: crate::WalletCreateMetadata,
|
||||
) -> ksp_core_lib::Result<crate::WalletOwner> {
|
||||
let bytes = match read_transfer_file_async(source.as_ref().to_path_buf(), format).await {
|
||||
std::result::Result::Ok(value) => zeroize::Zeroizing::new(value),
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
return import_wallet_transfer(destination, bytes.as_slice(), format, owner_password, view_password, metadata).await;
|
||||
}
|
||||
|
||||
/// Imports one bounded external transfer file into a new native `.kspwallet` V2 binary file.
|
||||
pub async fn import_wallet_transfer_file_v2(
|
||||
destination: impl std::convert::AsRef<std::path::Path>,
|
||||
source: impl std::convert::AsRef<std::path::Path>,
|
||||
format: WalletTransferFormat,
|
||||
owner_password: crate::OwnerPassword,
|
||||
view_password: std::option::Option<crate::ViewPassword>,
|
||||
metadata: crate::WalletCreateMetadata,
|
||||
) -> ksp_core_lib::Result<crate::WalletOwner> {
|
||||
let bytes = match read_transfer_file_async(source.as_ref().to_path_buf(), format).await {
|
||||
std::result::Result::Ok(value) => zeroize::Zeroizing::new(value),
|
||||
std::result::Result::Err(error) => return std::result::Result::Err(error),
|
||||
};
|
||||
return import_wallet_transfer_v2(destination, bytes.as_slice(), format, owner_password, view_password, metadata).await;
|
||||
}
|
||||
|
||||
/// Imports one bounded external transfer file into a new native `.kspwallet` V1 file.
|
||||
///
|
||||
/// The source file is never modified and the destination remains no-clobber.
|
||||
@@ -161,8 +242,8 @@ pub async fn import_wallet_transfer_file_v1(
|
||||
return import_wallet_transfer_v1(destination, bytes.as_slice(), format, owner_password, view_password, metadata).await;
|
||||
}
|
||||
|
||||
/// Executes the crate-internal write wallet transfer file v1 operation for the owning module.
|
||||
pub(crate) async fn write_wallet_transfer_file_v1(
|
||||
/// Writes one bounded OWNER export using no-clobber external transfer semantics.
|
||||
pub(crate) async fn write_wallet_transfer_file(
|
||||
destination: std::path::PathBuf,
|
||||
content: std::vec::Vec<u8>,
|
||||
format: WalletTransferFormat,
|
||||
|
||||
Reference in New Issue
Block a user