domain-fintech

Use when building fintech apps. Keywords: fintech, trading, decimal, currency, financial, money, transaction, ledger, payment, exchange rate, precision,…

INSTALLATION
npx skills add https://github.com/actionbook/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 RuleDesign ConstraintRust Implication
Audit trailImmutable recordsArc, no mutation
PrecisionNo floating pointrust_decimal
ConsistencyTransaction boundariesClear ownership
ComplianceComplete loggingStructured tracing
ReproducibilityDeterministic executionNo 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

PurposeCrate
Decimal mathrust_decimal
Date/timechrono, time
UUIDuuid
Serializationserde
Validationvalidator

Design Patterns

PatternPurposeImplementation
Currency newtypeType safetystruct Amount(Decimal);
TransactionAtomic operationsEvent sourcing
Audit logTraceabilityStructured logging with trace IDs
LedgerDouble-entryDebit/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

MistakeDomain ViolationFix
Using f64Precision lossrust_decimal
Mutable transactionAudit trail brokenImmutable + events
String for amountNo validationValidated newtype
Silent overflowMoney disappearsChecked arithmetic

Trace to Layer 1

ConstraintLayer 2 PatternLayer 1 Implementation
Immutable recordsEvent sourcingArc, Clone
Transaction scopeAggregateOwned children
PrecisionValue Objectrust_decimal newtype
Thread-safe sharingShared immutableArc (not Rc)

Related Skills

WhenSee
Value Object designm09-domain
Ownership for immutablem01-ownership
Arc for sharingm02-resource
Error handlingm13-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