use cosmwasm_schema::{cw_serde, QueryResponses};
use cosmwasm_std::{to_vec, Addr};
pub const MAX_TEXT_LENGTH: u32 = 512;
pub type TokenId = String;
#[cw_serde]
pub struct NFT {
pub collection: Addr,
pub token_id: TokenId,
}
impl NFT {
pub fn into_json_string(self: &NFT) -> String {
String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default()
}
}
#[cw_serde]
pub struct TextRecord {
pub name: String, pub value: String, pub verified: Option<bool>, }
impl TextRecord {
pub fn new(name: impl Into<String>, value: impl Into<String>) -> Self {
Self {
name: name.into(),
value: value.into(),
verified: None,
}
}
pub fn into_json_string(self: &TextRecord) -> String {
String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default()
}
}
#[cw_serde]
#[derive(Default)]
pub struct Metadata {
pub image_nft: Option<NFT>,
pub records: Vec<TextRecord>,
}
impl Metadata {
pub fn into_json_string(self: &Metadata) -> String {
String::from_utf8(to_vec(&self).unwrap_or_default()).unwrap_or_default()
}
}
#[cw_serde]
pub enum SgNameExecuteMsg {
SetNameMarketplace { address: String },
AssociateAddress {
name: String,
address: Option<String>,
},
UpdateImageNft { name: String, nft: Option<NFT> },
UpdateMetadata {
name: String,
metadata: Option<Metadata>,
},
AddTextRecord { name: String, record: TextRecord },
RemoveTextRecord { name: String, record_name: String },
UpdateTextRecord { name: String, record: TextRecord },
VerifyTextRecord {
name: String,
record_name: String,
result: bool,
},
UpdateVerifier { verifier: Option<String> },
}
#[cw_serde]
#[derive(QueryResponses)]
pub enum SgNameQueryMsg {
#[returns(String)]
Name { address: String },
#[returns(Addr)]
NameMarketplace {},
#[returns(String)]
AssociatedAddress { name: String },
#[returns(Option<NFT>)]
ImageNFT { name: String },
#[returns(Vec<TextRecord>)]
TextRecords { name: String },
#[returns(bool)]
IsTwitterVerified { name: String },
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn encode_nft() {
let nft = NFT {
collection: Addr::unchecked("stars1y54exmx84cqtasvjnskf9f63djuuj68p2th570"),
token_id: "1".to_string(),
};
let json = nft.into_json_string();
assert_eq!(
json,
r#"{"collection":"stars1y54exmx84cqtasvjnskf9f63djuuj68p2th570","token_id":"1"}"#
);
}
#[test]
fn encode_text_record() {
let mut record = TextRecord::new("twitter", "shan3v");
let json = record.into_json_string();
assert_eq!(
json,
r#"{"name":"twitter","value":"shan3v","verified":null}"#
);
record.verified = Some(true);
let json = record.into_json_string();
assert_eq!(
json,
r#"{"name":"twitter","value":"shan3v","verified":true}"#
);
record.verified = Some(false);
let json = record.into_json_string();
assert_eq!(
json,
r#"{"name":"twitter","value":"shan3v","verified":false}"#
);
}
#[test]
fn encode_metadata() {
let image_nft = Some(NFT {
collection: Addr::unchecked("stars1y54exmx84cqtasvjnskf9f63djuuj68p2th570"),
token_id: "1".to_string(),
});
let record_1 = TextRecord::new("twitter", "shan3v");
let mut record_2 = TextRecord::new("discord", "shan3v");
record_2.verified = Some(true);
let records = vec![record_1, record_2];
let metadata = Metadata { image_nft, records };
let json = metadata.into_json_string();
assert_eq!(
json,
r#"{"image_nft":{"collection":"stars1y54exmx84cqtasvjnskf9f63djuuj68p2th570","token_id":"1"},"records":[{"name":"twitter","value":"shan3v","verified":null},{"name":"discord","value":"shan3v","verified":true}]}"#,
);
}
}