The Precision Challenge
Cosmos SDK and Ethereum use different decimal precisions for their native tokens:- Cosmos SDK: 6 decimals (1 ATOM = 10^6 test)
- Ethereum: 18 decimals (1 ETH = 10^18 wei)
Mathematical Foundation
Balance Representation
Any account balance can be decomposed into integer and fractional components:a(n)
in smallest units (18 decimals):
a(n)
= Total balance in 18-decimal units (atest)b(n)
= Integer balance in 6-decimal units (test)f(n)
= Fractional balance (remainder)C
= Conversion factor (10^12)- Constraint:
0 ≤ f(n) < C
Example Decomposition
Consider a balance of 1,234,567,890,123,456,789 atest:The Reserve Account
To maintain supply consistency, a reserve account holds backing for all fractional balances:Reserve Equation
b(R)
= Reserve balance in testΣf(n)
= Sum of all account fractional balancesr
= Remainder (fractional amount not in circulation)- Constraint:
0 ≤ r < C
Supply Invariant
This ensures the fundamental invariant:Operation Algorithms
Transfer Algorithm
Transferring between accounts requires careful handling of carries and borrows: From account 1 to account 2, amounta
:
-
Calculate new fractional balances:
-
Handle integer updates with carry/borrow:
-
Update reserve based on carry conditions:
- Both carry/borrow: No reserve change
- Only sender borrows: Reserve decreases by 1
- Only receiver carries: Reserve increases by 1
Mint Algorithm
Creating new tokens while maintaining backing:-
Update account:
-
Update remainder:
- Adjust reserve for consistency
Burn Algorithm
Removing tokens from circulation:-
Update account:
-
Update remainder:
- Adjust reserve for consistency
Proof: Remainder Unchanged in Transfers
A critical property is that transfers don’t change the global remainder: Proof:- Start with transfer affecting fractional balances
- Take modulo C of the balance equation
- Since reserve changes are multiples of C, they vanish mod C
- Fractional changes sum to zero (amount subtracted equals amount added)
- Therefore:
r' = r
Precision Hierarchy
The system manages three precision levels:Unit | Precision | Decimals | Usage |
---|---|---|---|
ATOM | 10^0 | 0 | Human display |
test | 10^-6 | 6 | Cosmos native |
atest | 10^-18 | 18 | EVM native |
Conversion Examples
Edge Cases and Limits
Minimum Transferable Amount
- In Cosmos: 1 test (0.000001 ATOM)
- In EVM: 1 atest (0.000000000000000001 ATOM)
Maximum Precision
- Cosmos operations: Limited to test granularity
- EVM operations: Full atest precision
- Cross-system: Automatic precision handling
Dust Amounts
Amounts smaller than 1 test but larger than 0 atest:- Tracked in fractional balances
- Accumulate until reaching 1 test
- Never lost or rounded away
Implementation Strategy
Storage Optimization
Rather than storing 18-decimal balances directly:- Store 6-decimal amounts in existing bank module
- Store only the fractional remainder separately
- Reconstruct full precision on demand
- Maintains backward compatibility
- Minimizes storage overhead
- Preserves full precision
Query Performance
When querying balances:Why This Matters
For Users
- No precision loss: Every atest is accounted for
- Seamless experience: Automatic handling across systems
- Fair transactions: No rounding advantages or disadvantages
For Developers
- Standard interfaces: Use familiar decimals for each system
- Automatic conversion: No manual precision management
- Predictable behavior: Mathematical guarantees on operations
For the Ecosystem
- True interoperability: Native precision for both ecosystems
- Future proof: Extensible to other precision requirements
- Efficient design: Minimal overhead for maximum capability
Comparison with Alternatives
Simple Scaling
Fixed-Point Arithmetic
Separate Balances
PreciseBank Solution
Future Extensions
Multi-Precision Support
The mathematical framework extends to any precision:- 8 decimals for certain tokens
- 27 decimals for high-precision applications
- Variable precision based on token type
Cross-Chain Precision
Standardized precision handling for:- IBC transfers with different precisions
- Bridge protocols with varying decimals
- Universal precision abstraction layer