use crate::amount::Amount;
use crate::error::BlockError;
use crate::signer::AccountRef;
use super::{AdjustMethod, BlockOperation, OperationContext, OperationType};
#[derive(Debug, Clone)]
pub struct TokenAdminModifyBalance {
pub token: AccountRef,
pub amount: Amount,
pub method: AdjustMethod,
}
impl BlockOperation for TokenAdminModifyBalance {
const TYPE: OperationType = OperationType::TokenAdminModifyBalance;
fn validate(&self, ctx: &OperationContext<'_>) -> Result<(), BlockError> {
ctx.guard_token_amount(&self.token, self.amount.as_bigint())?;
ctx.reject_token_account()?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::operation::harness::{assert_validation, token, Harness};
use crate::testing::generate_ed25519_ref;
#[test]
fn test_modify_balance_validation() {
assert_validation! {
"rejects_non_token_field":
(
Harness::new(generate_ed25519_ref(1)),
TokenAdminModifyBalance {
token: generate_ed25519_ref(2),
amount: Amount::from(1u64),
method: AdjustMethod::Add,
}
.into(),
) => Err(BlockError::TokenFieldNotToken),
"rejects_token_account":
(
Harness::new(token(0)),
TokenAdminModifyBalance {
token: token(0),
amount: Amount::from(1u64),
method: AdjustMethod::Add,
}
.into(),
) => Err(BlockError::TokenOperationForbidden),
}
}
}