|
@@ -28,13 +28,91 @@ pub fn calculate_fee_details(
|
|
|
if zero_fees_for_test {
|
|
if zero_fees_for_test {
|
|
|
return FeeDetails::default();
|
|
return FeeDetails::default();
|
|
|
}
|
|
}
|
|
|
- let signature_fee = message
|
|
|
|
|
- .num_total_signatures()
|
|
|
|
|
- .saturating_mul(lamports_per_signature);
|
|
|
|
|
|
|
|
|
|
FeeDetails::new(
|
|
FeeDetails::new(
|
|
|
- signature_fee,
|
|
|
|
|
|
|
+ calculate_signature_fee(SignatureCounts::from(message), lamports_per_signature),
|
|
|
prioritization_fee,
|
|
prioritization_fee,
|
|
|
remove_rounding_in_fee_calculation,
|
|
remove_rounding_in_fee_calculation,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+/// Calculate fees from signatures.
|
|
|
|
|
+fn calculate_signature_fee(
|
|
|
|
|
+ SignatureCounts {
|
|
|
|
|
+ num_transaction_signatures,
|
|
|
|
|
+ num_ed25519_signatures,
|
|
|
|
|
+ num_secp256k1_signatures,
|
|
|
|
|
+ }: SignatureCounts,
|
|
|
|
|
+ lamports_per_signature: u64,
|
|
|
|
|
+) -> u64 {
|
|
|
|
|
+ let signature_count = num_transaction_signatures
|
|
|
|
|
+ .saturating_add(num_ed25519_signatures)
|
|
|
|
|
+ .saturating_add(num_secp256k1_signatures);
|
|
|
|
|
+
|
|
|
|
|
+ signature_count.saturating_mul(lamports_per_signature)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+struct SignatureCounts {
|
|
|
|
|
+ pub num_transaction_signatures: u64,
|
|
|
|
|
+ pub num_ed25519_signatures: u64,
|
|
|
|
|
+ pub num_secp256k1_signatures: u64,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+impl<Tx: SVMMessage> From<&Tx> for SignatureCounts {
|
|
|
|
|
+ fn from(message: &Tx) -> Self {
|
|
|
|
|
+ Self {
|
|
|
|
|
+ num_transaction_signatures: message.num_transaction_signatures(),
|
|
|
|
|
+ num_ed25519_signatures: message.num_ed25519_signatures(),
|
|
|
|
|
+ num_secp256k1_signatures: message.num_secp256k1_signatures(),
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+#[cfg(test)]
|
|
|
|
|
+mod tests {
|
|
|
|
|
+ use super::*;
|
|
|
|
|
+
|
|
|
|
|
+ #[test]
|
|
|
|
|
+ fn test_calculate_signature_fee() {
|
|
|
|
|
+ const LAMPORTS_PER_SIGNATURE: u64 = 5_000;
|
|
|
|
|
+
|
|
|
|
|
+ // Impossible case - 0 signatures.
|
|
|
|
|
+ assert_eq!(
|
|
|
|
|
+ calculate_signature_fee(
|
|
|
|
|
+ SignatureCounts {
|
|
|
|
|
+ num_transaction_signatures: 0,
|
|
|
|
|
+ num_ed25519_signatures: 0,
|
|
|
|
|
+ num_secp256k1_signatures: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ LAMPORTS_PER_SIGNATURE,
|
|
|
|
|
+ ),
|
|
|
|
|
+ 0
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // Simple signature
|
|
|
|
|
+ assert_eq!(
|
|
|
|
|
+ calculate_signature_fee(
|
|
|
|
|
+ SignatureCounts {
|
|
|
|
|
+ num_transaction_signatures: 1,
|
|
|
|
|
+ num_ed25519_signatures: 0,
|
|
|
|
|
+ num_secp256k1_signatures: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ LAMPORTS_PER_SIGNATURE,
|
|
|
|
|
+ ),
|
|
|
|
|
+ LAMPORTS_PER_SIGNATURE
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // Pre-compile signatures.
|
|
|
|
|
+ assert_eq!(
|
|
|
|
|
+ calculate_signature_fee(
|
|
|
|
|
+ SignatureCounts {
|
|
|
|
|
+ num_transaction_signatures: 1,
|
|
|
|
|
+ num_ed25519_signatures: 2,
|
|
|
|
|
+ num_secp256k1_signatures: 3,
|
|
|
|
|
+ },
|
|
|
|
|
+ LAMPORTS_PER_SIGNATURE,
|
|
|
|
|
+ ),
|
|
|
|
|
+ 6 * LAMPORTS_PER_SIGNATURE
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+}
|