use anyhow::{bail, Result};
#[cfg(feature = "native")]
use sov_modules_api::macros::CliWalletArg;
use sov_modules_api::CallResponse;
use sov_state::WorkingSet;
use crate::{DaAddress, SequencerRegistry};
#[cfg_attr(
feature = "native",
derive(serde::Serialize),
derive(serde::Deserialize),
derive(schemars::JsonSchema),
derive(CliWalletArg)
)]
#[derive(borsh::BorshDeserialize, borsh::BorshSerialize, Debug, PartialEq, Clone)]
pub enum CallMessage {
Register {
da_address: DaAddress,
},
Exit {
da_address: DaAddress,
},
}
impl<C: sov_modules_api::Context> SequencerRegistry<C> {
pub(crate) fn register(
&self,
da_address: Vec<u8>,
context: &C,
working_set: &mut WorkingSet<C::Storage>,
) -> Result<CallResponse> {
let sequencer = context.sender();
self.register_sequencer(da_address, sequencer, working_set)?;
Ok(CallResponse::default())
}
pub(crate) fn exit(
&self,
da_address: Vec<u8>,
context: &C,
working_set: &mut WorkingSet<C::Storage>,
) -> Result<CallResponse> {
let locker = &self.address;
let coins = self.coins_to_lock.get_or_err(working_set)?;
let sequencer = context.sender();
let belongs_to = self
.allowed_sequencers
.get_or_err(&da_address, working_set)?;
if sequencer != &belongs_to {
bail!("Unauthorized exit attempt");
}
self.delete(da_address, working_set);
self.bank
.transfer_from(locker, sequencer, coins, working_set)?;
Ok(CallResponse::default())
}
pub(crate) fn delete(&self, da_address: Vec<u8>, working_set: &mut WorkingSet<C::Storage>) {
self.allowed_sequencers.delete(&da_address, working_set);
if let Some(preferred_sequencer) = self.preferred_sequencer.get(working_set) {
if da_address == preferred_sequencer {
self.preferred_sequencer.delete(working_set);
}
}
}
}