use compact_str::CompactString;
use r402_core::error::ErrorReason;
use r402_core::wire::VerifyResponse;
pub const ERR_EXACT_TVM_UNSUPPORTED_VERSION: &str = "unsupported_version";
pub const ERR_EXACT_TVM_UNSUPPORTED_SCHEME: &str = "unsupported_scheme";
pub const ERR_EXACT_TVM_UNSUPPORTED_NETWORK: &str = "unsupported_network";
pub const ERR_EXACT_TVM_NETWORK_MISMATCH: &str = "network_mismatch";
pub const ERR_EXACT_TVM_INVALID_PAYLOAD: &str = "invalid_exact_tvm_payload";
pub const ERR_EXACT_TVM_INVALID_SETTLEMENT_BOC: &str = "invalid_exact_tvm_payload_settlement_boc";
pub const ERR_EXACT_TVM_INVALID_W5_MESSAGE: &str =
"invalid_exact_tvm_payload_w5_internal_signed_request";
pub const ERR_EXACT_TVM_INVALID_W5_ACTIONS: &str = "invalid_exact_tvm_payload_w5_actions";
pub const ERR_EXACT_TVM_INVALID_JETTON_TRANSFER: &str = "invalid_exact_tvm_payload_jetton_transfer";
pub const ERR_EXACT_TVM_INVALID_SIGNATURE: &str = "invalid_exact_tvm_payload_invalid_signature";
pub const ERR_EXACT_TVM_INVALID_CODE_HASH: &str = "invalid_exact_tvm_payload_invalid_code_hash";
pub const ERR_EXACT_TVM_INVALID_ASSET: &str = "invalid_exact_tvm_payload_asset_mismatch";
pub const ERR_EXACT_TVM_INVALID_RECIPIENT: &str = "invalid_exact_tvm_payload_recipient_mismatch";
pub const ERR_EXACT_TVM_INVALID_AMOUNT: &str = "invalid_exact_tvm_payload_amount_mismatch";
pub const ERR_EXACT_TVM_INVALID_SIGNATURE_MODE: &str =
"invalid_exact_tvm_payload_signature_mode_mismatch";
pub const ERR_EXACT_TVM_INVALID_SEQNO: &str = "invalid_exact_tvm_payload_seqno_mismatch";
pub const ERR_EXACT_TVM_INVALID_WALLET_ID: &str = "invalid_exact_tvm_payload_wallet_id_mismatch";
pub const ERR_EXACT_TVM_INVALID_EXTENSIONS_DICT: &str =
"invalid_exact_tvm_payload_extensions_dict_mismatch";
pub const ERR_EXACT_TVM_TON_AMOUNT_TOO_HIGH: &str =
"invalid_exact_tvm_payload_attached_ton_amount_too_high";
pub const ERR_EXACT_TVM_ACCOUNT_FROZEN: &str = "account_frozen";
pub const ERR_EXACT_TVM_INVALID_UNTIL_EXPIRED: &str =
"invalid_exact_tvm_payload_valid_until_expired";
pub const ERR_EXACT_TVM_VALID_UNTIL_TOO_FAR: &str = "invalid_exact_tvm_payload_valid_until_too_far";
pub const ERR_EXACT_TVM_INSUFFICIENT_BALANCE: &str = "insufficient_balance";
pub const ERR_EXACT_TVM_FACILITATOR_INSUFFICIENT_BALANCE: &str = "facilitator_insufficient_balance";
pub const ERR_EXACT_TVM_DUPLICATE_SETTLEMENT: &str = "duplicate_settlement";
pub const ERR_EXACT_TVM_SIMULATION_FAILED: &str = "simulation_failed";
pub const ERR_EXACT_TVM_TRANSACTION_FAILED: &str = "transaction_failed";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TvmInvalid {
pub reason: ErrorReason,
pub message: Option<CompactString>,
pub payer: Option<CompactString>,
}
impl TvmInvalid {
#[must_use]
pub fn new(reason: &'static str) -> Self {
Self {
reason: ErrorReason::from_wire(reason),
message: None,
payer: None,
}
}
#[must_use]
pub fn from_reason(reason: impl AsRef<str>) -> Self {
Self {
reason: ErrorReason::from_wire(reason.as_ref()),
message: None,
payer: None,
}
}
#[must_use]
pub fn with_payer(mut self, payer: impl Into<CompactString>) -> Self {
self.payer = Some(payer.into());
self
}
#[must_use]
pub fn with_message(mut self, message: impl Into<CompactString>) -> Self {
self.message = Some(message.into());
self
}
#[must_use]
pub fn into_response(self) -> VerifyResponse {
match self.message {
Some(message) => VerifyResponse::invalid_with_message(self.payer, self.reason, message),
None => VerifyResponse::invalid(self.payer, self.reason),
}
}
}
#[must_use]
pub fn invalid(reason: &'static str) -> TvmInvalid {
TvmInvalid::new(reason)
}