domain-fintech
actionbook/rust-skills
Fintech domain constraints and patterns for Rust: precision, immutability, and audit trails.
What is domain-fintech?
A domain-specific skill for building financial applications in Rust. Covers critical constraints like decimal precision (never f64), immutable transaction records for audit compliance, and double-entry accounting principles. Use this when designing ledgers, payment systems, or trading platforms.
- Enforces financial precision using rust_decimal instead of floating-point arithmetic
- Implements immutable transaction records with Arc<T> for audit trail compliance
- Provides Currency and Amount newtypes for type-safe money handling
- Guides transaction boundaries and aggregate design for consistency
- Structures logging and tracing for regulatory requirements
- Prevents common mistakes like silent overflow and mutable state
How to install domain-fintech
npx skills add https://github.com/actionbook/rust-skills --skill domain-fintech- Familiarity with Rust ownership and Arc<T>
- Understanding of double-entry accounting principles
- Knowledge of domain-driven design patterns
How to use domain-fintech
- 1.Define Currency and Amount newtypes using rust_decimal::Decimal
- 2.Use Arc<T> for immutable shared transaction records
- 3.Implement transaction types with validated totals to prevent money loss
- 4.Structure audit logs with trace IDs and event sourcing patterns
- 5.Validate all money operations with checked arithmetic and currency matching
Use cases
- Building a payment ledger system with immutable transaction history
- Implementing currency conversion with precise decimal math
- Designing a trading platform with atomic transaction boundaries
- Creating audit-compliant financial records for regulatory reporting
- Handling multi-currency transactions with type-safe Amount validation
- Fintech engineers building payment or trading systems
- Backend developers implementing ledger or accounting features
- Teams requiring regulatory compliance and audit trails
- Rust developers working with financial data
domain-fintech FAQ
Floating-point arithmetic loses precision due to binary representation limits, causing rounding errors in financial calculations. Always use rust_decimal::Decimal for exact decimal math.
Use Arc<T> for shared immutable data and implement event sourcing patterns. Never mutate transaction records after creation; instead, create new immutable events.
Wrap Decimal in a struct with currency metadata: `struct Amount { value: Decimal, currency: Currency }`. This provides type safety and prevents mixing currencies.
Apply double-entry accounting principles: every debit must have a matching credit. Use transaction types with validated totals and checked arithmetic operations.
rust_decimal for math, chrono/time for dates, uuid for transaction IDs, serde for serialization, and validator for input validation.
Full instructions (SKILL.md)
Source of truth, from actionbook/rust-skills.
name: domain-fintech description: "Use when building fintech apps. Keywords: fintech, trading, decimal, currency, financial, money, transaction, ledger, payment, exchange rate, precision, rounding, accounting, 金融, 交易系统, 货币, 支付" user-invocable: false
FinTech Domain
Layer 3: Domain Constraints
Domain Constraints → Design Implications
| Domain Rule | Design Constraint | Rust Implication |
|---|---|---|
| Audit trail | Immutable records | Arc<T>, no mutation |
| Precision | No floating point | rust_decimal |
| Consistency | Transaction boundaries | Clear ownership |
| Compliance | Complete logging | Structured tracing |
| Reproducibility | Deterministic execution | No race conditions |
Critical Constraints
Financial Precision
RULE: Never use f64 for money
WHY: Floating point loses precision
RUST: Use rust_decimal::Decimal
Audit Requirements
RULE: All transactions must be immutable and traceable
WHY: Regulatory compliance, dispute resolution
RUST: Arc<T> for sharing, event sourcing pattern
Consistency
RULE: Money can't disappear or appear
WHY: Double-entry accounting principles
RUST: Transaction types with validated totals
Trace Down ↓
From constraints to design (Layer 2):
"Need immutable transaction records"
↓ m09-domain: Model as Value Objects
↓ m01-ownership: Use Arc for shared immutable data
"Need precise decimal math"
↓ m05-type-driven: Newtype for Currency/Amount
↓ rust_decimal: Use Decimal type
"Need transaction boundaries"
↓ m12-lifecycle: RAII for transaction scope
↓ m09-domain: Aggregate boundaries
Key Crates
| Purpose | Crate |
|---|---|
| Decimal math | rust_decimal |
| Date/time | chrono, time |
| UUID | uuid |
| Serialization | serde |
| Validation | validator |
Design Patterns
| Pattern | Purpose | Implementation |
|---|---|---|
| Currency newtype | Type safety | struct Amount(Decimal); |
| Transaction | Atomic operations | Event sourcing |
| Audit log | Traceability | Structured logging with trace IDs |
| Ledger | Double-entry | Debit/credit balance |
Code Pattern: Currency Type
use rust_decimal::Decimal;
#[derive(Clone, Debug, PartialEq)]
pub struct Amount {
value: Decimal,
currency: Currency,
}
impl Amount {
pub fn new(value: Decimal, currency: Currency) -> Self {
Self { value, currency }
}
pub fn add(&self, other: &Amount) -> Result<Amount, CurrencyMismatch> {
if self.currency != other.currency {
return Err(CurrencyMismatch);
}
Ok(Amount::new(self.value + other.value, self.currency))
}
}
Common Mistakes
| Mistake | Domain Violation | Fix |
|---|---|---|
| Using f64 | Precision loss | rust_decimal |
| Mutable transaction | Audit trail broken | Immutable + events |
| String for amount | No validation | Validated newtype |
| Silent overflow | Money disappears | Checked arithmetic |
Trace to Layer 1
| Constraint | Layer 2 Pattern | Layer 1 Implementation |
|---|---|---|
| Immutable records | Event sourcing | Arc<T>, Clone |
| Transaction scope | Aggregate | Owned children |
| Precision | Value Object | rust_decimal newtype |
| Thread-safe sharing | Shared immutable | Arc (not Rc) |
Related Skills
| When | See |
|---|---|
| Value Object design | m09-domain |
| Ownership for immutable | m01-ownership |
| Arc for sharing | m02-resource |
| Error handling | m13-domain-error |
Related skills
More from actionbook/rust-skills and the wider catalog.

domain-iot
Design IoT apps with offline-first, power-efficient, and secure patterns in Rust.

domain-ml
Build ML/AI applications in Rust with efficient tensor operations, GPU acceleration, and model inference.

domain-web
Build concurrent, type-safe web services with async handlers, middleware, and shared state patterns.

m01-ownership
Diagnose and fix Rust ownership, borrowing, and lifetime errors by understanding data roles and scope boundaries.

m02-resource
Master Rust smart pointers and resource management for correct ownership patterns.

m03-mutability
Resolve Rust mutability conflicts by understanding ownership, borrowing rules, and interior mutability patterns.