domain-fintech

Fintech domain constraints and design patterns for building precise, auditable financial systems in Rust. Enforces decimal precision (never f64) using rust_decimal, immutable transaction records with Arc, and double-entry accounting principles to prevent money loss or inconsistency Provides currency newtypes, transaction aggregates, and audit logging patterns aligned with regulatory compliance and dispute resolution requirements Maps domain rules (precision, audit trails, consistency, reproducibility) to Rust ownership, type safety, and structured tracing implementations Includes common fintech mistakes (floating-point amounts, mutable transactions, string-based values) with fixes and references to related ownership and error-handling skills

INSTALLATION
npx skills add https://github.com/zhanghandong/rust-skills --skill domain-fintech
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

FinTech Domain

Layer 3: Domain Constraints

Domain Constraints → Design Implications

Domain Rule

Design Constraint

Rust Implication

Audit trail

Immutable records

Arc, 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(&#x26;self, other: &#x26;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, 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

BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card