Skip to content

💰 Currency / Policies

🎯 Purpose

The Policies layer provides authoring assets for currency rules such as caps and escrow requirements.

Policies are data-only configuration. They do not perform validation or mutation — enforcement is handled by composed currency services.


⚠️ Important Notes

  • Policies do not enforce behaviour
  • Enforcement depends on the composed service stack
  • Policies describe rules, not execution
  • Removing this folder does not affect core Currency functionality

🧩 What Lives Here

CurrencyPolicy

ScriptableObject containing:

  • Per-currency cap rules
  • Global escrow requirement flag

TryGetCapRule

bool TryGetCapRule(CurrencyId id, out CurrencyCapRule rule);
  • Returns a data-only rule (min, max, mode)
  • Returns false when no rule exists

RequireEscrow

bool RequireEscrow { get; }
  • Indicates whether debits and transfers should use escrow
  • Does not provide escrow functionality

CurrencyRuleAuthoring

Inspector-facing authoring data:

  • id
  • min
  • max
  • mode

Runtime systems should use CurrencyCapRule.


🧠 Usage Guidance

Lookup behaviour

  • Currency identifiers are normalized
  • Rules are cached for lookup
  • Duplicate rules use the last entry
  • Missing rules are treated as unbounded

Data sanitisation

During cache rebuild:

  • Negative values are clamped to 0
  • Invalid ranges are corrected
  • Invalid identifiers are ignored

Runtime usage

Policies are consumed by composed services:

  • Caps decorators apply CurrencyCapRule
  • Escrow guards respect RequireEscrow

Policies do not mutate balances or perform validation.


Escrow behaviour

When RequireEscrow is enabled:

  • Debits and transfers must use escrow when supported
  • Behaviour depends on the composed service stack

🚫 Internal Use Only

Policies define configuration only.

Do not:

  • Implement logic here
  • Depend on enforcement behaviour
  • Assume rules are always applied

🧹 Safe to Remove

This folder may be removed if policy constraints are not required.

Currency will continue to operate without caps or escrow requirements.


  • Abstractions — CurrencyCapRule, CapMode, ITransferPolicyProvider
  • Core — service composition and factories
  • Exchange — currency conversion rules
  • Persistence — save/load behaviour