use soroban_sdk::{
accounts::AccountId, contracttype, Address, Bytes, BytesN, Env, RawVal, Symbol, Vec,
};
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[contracttype(lib = "soroban_auth")]
pub struct Ed25519Signature {
pub public_key: BytesN<32>,
pub signature: BytesN<64>,
}
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[contracttype(lib = "soroban_auth")]
pub struct AccountSignatures {
pub account_id: AccountId,
pub signatures: Vec<Ed25519Signature>,
}
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[contracttype(lib = "soroban_auth")]
pub enum Signature {
Invoker,
Ed25519(Ed25519Signature),
Account(AccountSignatures),
}
impl Signature {
pub fn identifier(&self, env: &Env) -> Identifier {
match self {
Signature::Invoker => match env.invoker() {
Address::Account(a) => Identifier::Account(a),
Address::Contract(c) => Identifier::Contract(c),
},
Signature::Ed25519(e) => Identifier::Ed25519(e.public_key.clone()),
Signature::Account(a) => Identifier::Account(a.account_id.clone()),
}
}
#[doc(hidden)]
#[deprecated(note = "use Signature::identifier(...)")]
pub fn get_identifier(&self, env: &Env) -> Identifier {
self.identifier(env)
}
}
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[contracttype(lib = "soroban_auth")]
pub enum Identifier {
Contract(BytesN<32>),
Ed25519(BytesN<32>),
Account(AccountId),
}
impl From<AccountId> for Identifier {
fn from(v: AccountId) -> Self {
Identifier::Account(v)
}
}
impl From<&AccountId> for Identifier {
fn from(v: &AccountId) -> Self {
Identifier::Account(v.clone())
}
}
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[contracttype(lib = "soroban_auth")]
pub struct SignaturePayloadV0 {
pub network: Bytes,
pub contract: BytesN<32>,
pub name: Symbol,
pub args: Vec<RawVal>,
}
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
#[contracttype(lib = "soroban_auth")]
pub enum SignaturePayload {
V0(SignaturePayloadV0),
}