Repository navigation
[Bug]: Solana USDT quote minimum shows decimal-format error and persists after amount edits #964
Description
What happened?
Valid Solana USDT send amounts show the wrong rejection message: “Enter a valid amount with up to 6 decimal places.” In the supplied Polish recording this is “Wprowadź prawidłową kwotę z maksymalnie 6 miejscami po przecinku.” The amount already meets that decimal limit. The old error also remains visible after editing the amount.
Observed in the iOS recording: quotes for 1 and 1.1 USDT fail; 2 USDT reaches payment review. Piotr separately confirms the same behavior on Android. No payment is submitted in the recording.
Expected behavior
Report the actual route rejection (for example, amount below the route minimum), rather than suggesting invalid decimal precision. Where provider limits are known, show them; do not invent a fixed minimum. Keep too-small, too-large and insufficient-liquidity failures distinguishable. Clear an outdated quote error when the amount changes and validate the new quote normally.
Steps to Reproduce
- Open a funded mainnet USDT wallet and start Send.
- Select Solana and enter a valid, owned Solana recipient address.
- Enter 1 USDT and tap Continue. Observe the decimal-format error.
- Repeat with 1.1 USDT (1,1 in a comma-decimal locale).
- Edit the amount: the previous error remains until another quote starts.
- Enter 2 USDT and request a quote; in the recorded session this reaches review. Stop before payment submission.
Amounts and route availability are provider/time dependent. This is not a claim that 2 USDT is a universal minimum.
Logs / Screenshots / Recordings
Recording captured on the physical iPhone running the mainnet candidate.
2026-10-16-solana-quote-error-recording.mp4
Unsigned requests to the public https://bitkit.to/v1/usdt/bridges quote endpoint returned:
| Principal | HTTP | Provider result |
|---|---|---|
| 1 USDT (1000000 atomic) | 409 | amount_too_small |
| 1.1 USDT (1100000 atomic) | 409 | amount_too_small |
| 2 USDT (2000000 atomic) | 200 | Quote, estimated receipt 1.793656 USDT |
These requests used a synthetic owner and no wallet credentials, signing or transfer of funds. The successful response is a quote, not settlement evidence.
Bitkit Version
3.0.0 (200), mainnet RC2; release head 59278ad871381f8ac4b9d4d0f70953643d59243e.
Device / OS
Physical iPhone; model and iOS version not captured.
Reproducibility
Repeated in the supplied session for the affected quote amounts; confirmed by Piotr on both platforms. Exact frequency across routes is not measured.
Additional context
Both release apps pin Core 0.8.0-rc6. In Core orchestra.rs, amount_too_small, amount_too_large and amount_exceeds_liquidity all map to UsdtError::InvalidAmount. Only xchain_amount_too_small maps to BridgeAmountTooSmall. Both apps translate InvalidAmount to usdt__error_amount, the decimal-format instruction. This loses the provider rejection semantics; the values above are accepted by amount parsing.
Shared Core tracking: synonymdev/bitkit-core#171
iOS UsdtWalletManager.message(for:) maps .InvalidAmount to the decimal message. UsdtSendView.enterAmount changes the amount without clearing error. Locale normalization is already performed before Core parsing.
No incorrect payment or loss of funds is demonstrated. No product changes or new builds were made during investigation.
Companion Android issue: synonymdev/bitkit-android#1520
Activity
ovitrif commentedon Oct 16, 2026
Heads-up for the bitkit-core bump: synonymdev/bitkit-core#172 (bitkit-core 0.8.0-rc7) adds three quote rejection cases: below the route minimum, above its maximum, and no liquidity. The switch in
UsdtWalletManager.swift:455has no default, so iOS won't compile on rc7 until it handles them. The bridge route doesn't send min/max limits yet, so the limit values are always empty for now.