use tape_crypto::address::Address;
use tape_crypto::ed25519::{Keypair, Pubkey};
use crate::keys::tape_key::TapeKey;
pub trait TapeOperator: Send + Sync {
fn keypair(&self) -> &Keypair;
fn pubkey(&self) -> Pubkey;
fn address(&self) -> Address;
}
impl TapeOperator for TapeKey {
fn keypair(&self) -> &Keypair {
TapeKey::keypair(self)
}
fn pubkey(&self) -> Pubkey {
TapeKey::pubkey(self)
}
fn address(&self) -> Address {
TapeKey::address(self)
}
}
pub struct TapeDelegate {
keypair: Keypair,
tape: Address,
}
impl TapeDelegate {
pub fn new(keypair: Keypair, tape: Address) -> Self {
Self { keypair, tape }
}
pub fn tape(&self) -> Address {
self.tape
}
}
impl TapeOperator for TapeDelegate {
fn keypair(&self) -> &Keypair {
&self.keypair
}
fn pubkey(&self) -> Pubkey {
self.keypair.pubkey()
}
fn address(&self) -> Address {
self.tape
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn operator_accessors() {
let key = TapeKey::generate();
let operator: &dyn TapeOperator = &key;
assert_eq!(operator.pubkey(), key.pubkey());
assert_eq!(operator.address(), key.address());
}
#[test]
fn delegate_identity() {
let owner = TapeKey::generate();
let delegate_keypair = Keypair::new(&mut rand::thread_rng());
let delegate_pubkey = delegate_keypair.pubkey();
let delegate = TapeDelegate::new(delegate_keypair, owner.address());
assert_eq!(delegate.pubkey(), delegate_pubkey);
assert_eq!(delegate.address(), owner.address());
assert_ne!(delegate.pubkey(), owner.pubkey());
}
}