iop_coeus_node/operations/
transfer.rs1use super::*;
2
3impl AuthorizedCommand for DoTransfer {
4 fn validate_auth(&self, state: &State, pk: &MPublicKey) -> Result<()> {
5 state.validate_domain_owner(&self.name, pk)
6 }
7}
8
9impl Command for DoTransfer {
10 fn execute(self, state: &mut State) -> Result<UndoOperation> {
11 ensure!(self.to_owner != Principal::system(), "Cannot transfer a domain to 'system'");
12 let last_block = state.last_seen_height();
13
14 let domain_mut = state.domain_mut(&self.name)?;
15 ensure!(domain_mut.owner() != &Principal::system(), "Cannot transfer a system domain");
16 ensure!(!domain_mut.is_expired_at(last_block), "Domain {} expired", self.name);
17
18 let undo_operation = UndoTransfer { name: self.name, owner: domain_mut.owner().to_owned() };
19 domain_mut.set_owner(self.to_owner);
20
21 Ok(UndoOperation::Transfer(undo_operation))
22 }
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
26#[serde(rename_all = "camelCase")]
27pub struct UndoTransfer {
28 #[serde(with = "serde_str")]
29 pub(super) name: DomainName,
30 pub(super) owner: Principal,
31}
32
33impl UndoCommand for UndoTransfer {
34 fn execute(self, state: &mut State) -> Result<()> {
35 let domain_mut = state.domain_mut(&self.name)?;
36 domain_mut.set_owner(self.owner);
37 Ok(())
38 }
39}