use std::fmt::Debug;
use serde::Serialize;
use crate::{BootError, Contract, Daemon, TxResponse};
impl Contract<Daemon> {
pub fn upload_if_needed(&mut self) -> Result<Option<TxResponse<Daemon>>, BootError> {
if self.latest_is_uploaded()? {
log::info!("{} is already uploaded", self.id);
Ok(None)
} else {
Some(self.upload()).transpose()
}
}
pub fn latest_is_uploaded(&self) -> Result<bool, BootError> {
let latest_uploaded_code_id = self.code_id()?;
let chain = self.get_chain();
let on_chain_hash = chain
.runtime
.block_on(super::querier::DaemonQuerier::code_id_hash(
chain.sender.channel(),
latest_uploaded_code_id,
))?;
let local_hash = self.source.checksum(&self.id)?;
Ok(local_hash == on_chain_hash)
}
pub fn migrate_if_needed(
&mut self,
migrate_msg: &(impl Serialize + Debug),
) -> Result<Option<TxResponse<Daemon>>, BootError> {
if self.is_running_latest()? {
log::info!("{} is already running the latest code", self.id);
Ok(None)
} else {
Some(self.migrate(migrate_msg, self.code_id()?)).transpose()
}
}
pub fn is_running_latest(&self) -> Result<bool, BootError> {
let latest_uploaded_code_id = self.code_id()?;
let chain = self.get_chain();
let info = chain
.runtime
.block_on(super::querier::DaemonQuerier::contract_info(
chain.sender.channel(),
self.address()?,
))?;
Ok(latest_uploaded_code_id == info.code_id)
}
}