use crate::types::{Address, BigInt, CurrencyAmount, H256};
use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
macro_rules! into_transaction {
($name: ident) => {
impl $name {
pub fn into_transaction(self) -> Transaction {
let mut tx = Transaction::default();
tx.tx = Some(TransactionType::$name(self));
tx
}
}
};
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Default)]
#[serde(rename_all = "PascalCase")]
pub struct Transaction {
pub account: Address,
pub fee: BigInt,
pub sequence: u32,
pub last_ledger_sequence: u32,
pub signing_pub_key: String,
pub txn_signature: Option<String>,
pub flags: Option<TFFlag>,
#[serde(flatten)]
pub tx: Option<TransactionType>,
pub hash: Option<String>,
}
type TFFlag = u32;
pub const TF_SETF_AUTH: TFFlag = 65536;
pub const TF_SET_NO_RIPPLE: TFFlag = 131072;
pub const TF_CLEAR_NO_RIPPLE: TFFlag = 262144;
pub const TF_SET_FREEZE: TFFlag = 1048576;
pub const TF_CLEAR_FREEZE: TFFlag = 2097152;
pub const TF_RENEW: TFFlag = 65536;
pub const TF_CLOSE: TFFlag = 131072;
pub const TF_BURNABLE: TFFlag = 0x00000001;
pub const TF_ONLY_XRP: TFFlag = 0x00000002;
pub const TF_TRUSTLINE: TFFlag = 0x00000004;
pub const TF_TRANSFERABLE: TFFlag = 0x00000008;
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(tag = "TransactionType", rename_all = "PascalCase")]
pub enum TransactionType {
Payment(Payment),
AccountSet(AccountSet),
AccountDelete(AccountDelete),
CheckCancel(CheckCancel),
CheckCash(CheckCash),
CheckCreate(CheckCreate),
TrustSet(TrustSet),
PaymentChannelClaim(PaymentChannelClaim),
PaymentChannelCreate(PaymentChannelCreate),
PaymentChannelFund(PaymentChannelFund),
NFTokenMint(NFTokenMint),
}
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub struct EscrowCreate {}
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Payment {
pub amount: CurrencyAmount,
pub destination: Address,
}
into_transaction!(Payment);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct AccountSet {
pub clear_flag: Option<u32>,
pub domain: Option<String>,
pub email_hash: Option<String>,
pub message_key: Option<String>,
pub set_flag: Option<AccountSetFlag>,
pub transfer_rate: Option<u32>,
pub tick_size: Option<u8>,
}
type AccountSetFlag = u32;
pub const ASF_ACCOUNT_TXN_ID: AccountSetFlag = 5;
pub const ASF_DEFAULT_RIPPLE: AccountSetFlag = 8;
pub const ASF_DEPOSIT_AUTH: AccountSetFlag = 9;
pub const ASF_DISABLE_MASTER: AccountSetFlag = 4;
pub const ASF_DISALLOW_XRP: AccountSetFlag = 3;
pub const ASF_GLOBAL_FREEZE: AccountSetFlag = 7;
pub const ASF_NO_FREEZE: AccountSetFlag = 6;
pub const ASF_REQUIRE_AUTH: AccountSetFlag = 2;
pub const ASF_REQUIRE_DEST: AccountSetFlag = 1;
into_transaction!(AccountSet);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct AccountDelete {
pub destination: Address,
pub destination_tag: Option<u32>,
}
into_transaction!(AccountDelete);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct CheckCancel {
pub check_id: H256,
}
into_transaction!(CheckCancel);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct CheckCash {
pub check_id: H256,
pub amount: Option<CurrencyAmount>,
pub deliver_min: Option<CurrencyAmount>,
}
into_transaction!(CheckCash);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct CheckCreate {
pub destination: Address,
pub send_max: CurrencyAmount,
pub destination_tag: Option<u32>,
pub expiration: Option<u32>,
#[serde(rename = "InvoiceID")]
pub invoice_id: Option<H256>,
}
into_transaction!(CheckCreate);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct TrustSet {
pub limit_amount: TrustSetLimitAmount,
pub quality_in: Option<u32>,
pub quality_out: Option<u32>,
}
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub struct TrustSetLimitAmount {
pub currency: String,
pub issuer: String,
pub value: Decimal,
}
into_transaction!(TrustSet);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct PaymentChannelClaim {
pub channel: H256,
pub balance: Option<BigInt>,
pub amount: Option<BigInt>,
pub signature: Option<String>,
pub public_key: Option<String>,
}
into_transaction!(PaymentChannelClaim);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct PaymentChannelCreate {
pub amount: BigInt,
pub destination: Address,
pub settle_delay: u32,
pub public_key: String,
pub cancel_after: Option<u32>,
pub destination_tag: Option<u32>,
}
into_transaction!(PaymentChannelCreate);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct PaymentChannelFund {}
into_transaction!(PaymentChannelFund);
#[derive(Default, Debug, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct NFTokenMint {
pub issuer: Option<Address>,
pub token_taxon: u32,
pub transfer_fee: u16,
pub uri: String,
}
into_transaction!(NFTokenMint);