use crate::internal_prelude::*;
use radix_transactions::model::*;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ProtocolUpdateTransaction {
FlashTransactionV1(FlashTransactionV1),
SystemTransactionV1(ProtocolSystemTransactionV1),
}
impl From<FlashTransactionV1> for ProtocolUpdateTransaction {
fn from(value: FlashTransactionV1) -> Self {
Self::FlashTransactionV1(value)
}
}
impl From<ProtocolSystemTransactionV1> for ProtocolUpdateTransaction {
fn from(value: ProtocolSystemTransactionV1) -> Self {
Self::SystemTransactionV1(value)
}
}
impl ProtocolUpdateTransaction {
pub fn flash(name: impl Into<String>, state_updates: StateUpdates) -> Self {
let name = name.into();
if name != name.to_ascii_lowercase().as_str() {
panic!("Protocol transaction names should be in kebab-case for consistency");
}
Self::FlashTransactionV1(FlashTransactionV1 {
name,
state_updates,
})
}
pub fn genesis_transaction(name: impl Into<String>, transaction: SystemTransactionV1) -> Self {
let name = name.into();
if name != name.to_ascii_lowercase().as_str() {
panic!("Protocol transaction names should be in kebab-case for consistency");
}
Self::SystemTransactionV1(ProtocolSystemTransactionV1 {
name,
disable_auth: true,
transaction,
})
}
pub fn name(&self) -> Option<&str> {
match self {
ProtocolUpdateTransaction::FlashTransactionV1(tx) => Some(tx.name.as_str()),
ProtocolUpdateTransaction::SystemTransactionV1(tx) => Some(tx.name.as_str()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, ManifestSbor, ScryptoDescribe)]
pub struct ProtocolSystemTransactionV1 {
pub name: String,
pub disable_auth: bool,
pub transaction: SystemTransactionV1,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProtocolUpdateBatch {
pub transactions: Vec<ProtocolUpdateTransaction>,
}
impl ProtocolUpdateBatch {
pub fn empty() -> Self {
Self {
transactions: vec![],
}
}
pub fn new(transactions: impl IntoIterator<Item = ProtocolUpdateTransaction>) -> Self {
Self {
transactions: transactions.into_iter().collect(),
}
}
pub fn add_flash(mut self, name: impl Into<String>, updates: StateUpdates) -> Self {
self.mut_add_flash(name, updates);
self
}
pub fn mut_add_flash(&mut self, name: impl Into<String>, updates: StateUpdates) {
self.mut_add(ProtocolUpdateTransaction::flash(name, updates))
}
#[allow(clippy::should_implement_trait)]
pub fn add(mut self, transaction: ProtocolUpdateTransaction) -> Self {
self.mut_add(transaction);
self
}
pub fn mut_add(&mut self, transaction: ProtocolUpdateTransaction) {
self.transactions.push(transaction);
}
pub fn single(single_transaction: ProtocolUpdateTransaction) -> Self {
Self {
transactions: vec![single_transaction],
}
}
}