use super::{AbsoluteTxPosition, ContractCodeId};
use crate::{
proto::{self, traits::ParseOptional},
AccountId, ErrorReport, Result,
};
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
pub struct ContractInfo {
pub code_id: ContractCodeId,
pub creator: AccountId,
pub admin: Option<AccountId>,
pub label: String,
pub created: Option<AbsoluteTxPosition>,
pub ibc_port_id: String,
pub admin_proof: Vec<u8>,
}
impl TryFrom<proto::secret::compute::v1beta1::ContractInfo> for ContractInfo {
type Error = ErrorReport;
fn try_from(proto: proto::secret::compute::v1beta1::ContractInfo) -> Result<ContractInfo> {
Ok(ContractInfo {
code_id: proto.code_id,
creator: AccountId::new("secret", &proto.creator)?,
admin: proto.admin.parse_optional()?,
label: proto.label,
created: proto.created.map(TryFrom::try_from).transpose()?,
ibc_port_id: proto.ibc_port_id,
admin_proof: proto.admin_proof,
})
}
}
impl From<ContractInfo> for proto::secret::compute::v1beta1::ContractInfo {
fn from(info: ContractInfo) -> Self {
proto::secret::compute::v1beta1::ContractInfo {
code_id: info.code_id,
creator: info.creator.to_bytes(),
admin: info
.admin
.map(|admin| admin.to_string())
.unwrap_or_default(),
label: info.label,
created: info.created.map(Into::into),
ibc_port_id: info.ibc_port_id,
admin_proof: info.admin_proof,
}
}
}