use candid::CandidType;
pub use ic_cdk_management_canister::{
Bip341, SchnorrAlgorithm, SchnorrAux, SchnorrKeyId, SchnorrPublicKeyArgs, SchnorrPublicKeyResult,
SignWithSchnorrArgs, SignWithSchnorrResult,
};
use serde::{Deserialize, Serialize};
use crate::{identity::CanisterId, types::CanisterCallError};
pub type SchnorrDerivationPath = Vec<Vec<u8>>;
#[derive(CandidType, Serialize, Deserialize, Debug, Clone)]
pub struct SchnorrIdentity {
pub key_id: SchnorrKeyId,
pub derivation_path: SchnorrDerivationPath,
}
pub async fn schnorr_public_key(
canister_id: Option<CanisterId>,
identity: SchnorrIdentity,
) -> super::types::CanisterCallResult<SchnorrPublicKeyResult> {
ic_cdk_management_canister::schnorr_public_key(&SchnorrPublicKeyArgs {
canister_id,
derivation_path: identity.derivation_path,
key_id: identity.key_id,
})
.await
.map_err(|err| CanisterCallError {
canister_id: crate::identity::CanisterId::management_canister(),
method: "ic#schnorr_public_key".to_string(),
message: err.to_string(),
})
}
pub async fn sign_with_schnorr(
identity: SchnorrIdentity,
message: Vec<u8>,
aux: Option<SchnorrAux>,
) -> super::types::CanisterCallResult<SignWithSchnorrResult> {
ic_cdk_management_canister::sign_with_schnorr(&SignWithSchnorrArgs {
message,
derivation_path: identity.derivation_path,
key_id: identity.key_id,
aux,
})
.await
.map_err(|err| CanisterCallError {
canister_id: crate::identity::CanisterId::management_canister(),
method: "ic#sign_with_schnorr".to_string(),
message: err.to_string(),
})
}