Status: Phase 1 blocker (per ENG-315 currency-precision roadmap 5.A)
Reclassified 2026-04-19 from "deferred / low priority." JMD's yaml.ts workaround only covers JMD. Phase 1.C extends price-server into a multi-source aggregator for every currency Flash adds (TTD, HTG, NGN, etc.) — float32 reintroduces silent rounding errors the moment a second fiat goes through gRPC. Must land before Phase 1.C starts.
The Problem
float in protobuf = 32-bit IEEE 754 = ~7 significant digits. Rates like 157.xx (JMD) or 392.xx (NGN) × 8-decimal sat precision exceed that. Result: silent rounding errors on every conversion through the gRPC price service.
The Fix
// src/services/price/protos/price.proto
Apply to every numeric rate field. Regen stubs. Deploy price-server → backend → mobile in that order, in the same release window, with mobile min-supported-version bumped.
Files
src/services/price/protos/price.proto
src/services/price/index.ts
Regenerated stubs + any gRPC consumer importing them (audit before merge)
Verification
Unit test: encode rate > 7 sig digits, decode, bit-equal compare
Integration test: full gRPC round-trip preserves precision
All gRPC consumers audited and listed in PR description
24h dev burn-in before staging promotion
Out of scope
Migrating JMD off yaml.ts (Phase 1.C). RoundingPolicy module (Phase 1.B). New currencies (their own issues post-Phase-1.C).
Status: Phase 1 blocker (per ENG-315 currency-precision roadmap 5.A)
Reclassified 2026-04-19 from "deferred / low priority." JMD's yaml.ts workaround only covers JMD. Phase 1.C extends price-server into a multi-source aggregator for every currency Flash adds (TTD, HTG, NGN, etc.) — float32 reintroduces silent rounding errors the moment a second fiat goes through gRPC. Must land before Phase 1.C starts.
The Problem
float in protobuf = 32-bit IEEE 754 = ~7 significant digits. Rates like 157.xx (JMD) or 392.xx (NGN) × 8-decimal sat precision exceed that. Result: silent rounding errors on every conversion through the gRPC price service.
The Fix
// src/services/price/protos/price.proto
Apply to every numeric rate field. Regen stubs. Deploy price-server → backend → mobile in that order, in the same release window, with mobile min-supported-version bumped.
Files
src/services/price/protos/price.proto
src/services/price/index.ts
Regenerated stubs + any gRPC consumer importing them (audit before merge)
Verification
Unit test: encode rate > 7 sig digits, decode, bit-equal compare
Integration test: full gRPC round-trip preserves precision
All gRPC consumers audited and listed in PR description
24h dev burn-in before staging promotion
Out of scope
Migrating JMD off yaml.ts (Phase 1.C). RoundingPolicy module (Phase 1.B). New currencies (their own issues post-Phase-1.C).