use chia_protocol::SpendBundle;
use chia_wallet_sdk::driver::{decode_offer, Offer, SpendContext};
use crate::error::{Error, Result};
pub fn decode(offer_str: &str) -> Result<SpendBundle> {
let trimmed = offer_str.trim();
if !trimmed.starts_with("offer1") {
return Err(Error::decode(
"not a Chia offer: expected a bech32 string starting with 'offer1'",
));
}
decode_offer(trimmed).map_err(|e| Error::decode(format!("invalid offer: {e}")))
}
pub fn parse(ctx: &mut SpendContext, spend_bundle: &SpendBundle) -> Result<Offer> {
Offer::from_spend_bundle(ctx, spend_bundle)
.map_err(|e| Error::decode(format!("could not parse offer: {e}")))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decode_rejects_non_offer_prefix() {
let err = decode("hello world").unwrap_err();
assert!(matches!(&err, Error::Decode(m) if m.contains("not a Chia offer")));
}
#[test]
fn decode_rejects_blank_string() {
assert!(matches!(decode(" "), Err(Error::Decode(_))));
}
#[test]
fn decode_rejects_malformed_payload() {
assert!(matches!(decode("offer1qqzh3w"), Err(Error::Decode(_))));
}
}