mod ed25519;
pub use ed25519::Ed25519Verifier;
use siwx::{SiwxError, SiwxMessage};
pub const CHAIN_NAME: &str = "Solana";
pub const SIG_TYPE: &str = "solana:ed25519";
#[must_use]
pub fn format_message(message: &SiwxMessage) -> String {
message.to_sign_string(CHAIN_NAME)
}
pub fn validate_address(address: &str) -> Result<(), SiwxError> {
let bytes = bs58::decode(address)
.into_vec()
.map_err(|e| SiwxError::InvalidAddress(format!("invalid base58: {e}")))?;
if bytes.len() != 32 {
return Err(SiwxError::InvalidAddress(format!(
"expected 32 bytes, got {}",
bytes.len()
)));
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn validate_address_valid() {
assert!(validate_address("11111111111111111111111111111111").is_ok());
assert!(validate_address("GwAF45zjfyGzUbd3i3hXxzGeuchzEZXwpRYHZM5912F1").is_ok());
}
#[test]
fn validate_address_invalid() {
assert!(validate_address("not-valid").is_err());
assert!(validate_address("").is_err());
}
#[test]
fn format_message_preamble() {
let msg = SiwxMessage::new(
"example.com",
"GwAF45zjfyGzUbd3i3hXxzGeuchzEZXwpRYHZM5912F1",
"https://example.com",
"1",
"1",
)
.unwrap();
let text = format_message(&msg);
assert!(text.starts_with("example.com wants you to sign in with your Solana account:"));
}
}