Skip to content

Fix Bitwave CSV export issues - #6131

Open
j0ntz wants to merge 2 commits into
developfrom
jon/bitwave-csv-export-fixes
Open

Fix Bitwave CSV export issues#6131
j0ntz wants to merge 2 commits into
developfrom
jon/bitwave-csv-export-fixes

Conversation

@j0ntz

@j0ntz j0ntz commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Description

Asana task

Fixes the four Bitwave CSV export issues tracked on CSV - Bitwave Export issues. Bitwave changed its import requirements, so the export no longer matched what its importer accepts, and one input defect corrupted the account id.

Timestamps use ISO 8601 UTC (subtask). makeBitwaveDateTime emitted MM/DD/YY HH:MM; it now emits YYYY-MM-DDTHH:MM:SSZ (4-digit year, T separator, seconds, trailing Z).

Fee columns stay blank (subtask). Column G (fee) and column H (feeTicker) now export as empty strings for every transaction. Bitwave calculates fees itself, so populated columns duplicated them after import. Dropping them leaves the wallet and parentMultiplier arguments unused, so those are removed along with the scene prop that supplied parentMultiplier.

Custom metadata 2 mirrors the description (subtask). Column W (metadata:myCustomMetadata2) was the transaction notes; it now carries the same value as column R (description). The notes are still exported in column K (memo), so nothing is lost.

Account id keeps the case and spacing it was entered with (subtask). Root cause: the account-id TextInputModal never passed autoCapitalize, TextInputModal forwards that undefined to ModalFilledTextInput, and FilledTextInput only defaults it to 'none' for secure inputs. So React Native's iOS default of sentences applied and capitalized the first character, turning pgM8cDt7bySnWTzs2MyI into PgM8cDt7bySnWTzs2MyI. The value was then persisted to disklet and reused as the modal's initial value, which is why the correction had to be reapplied at every import rather than sticking. The modal now passes autoCapitalize="none", and the entered value is trimmed since a pasted id often carries surrounding whitespace.

Column letters map to the row object's key order, which csv-stringify uses for the header: A id … G fee, H feeTicker, I time, M accountId, R description, W metadata:myCustomMetadata2.

Four unit tests cover the new behavior. Each asserts the header name at the column index it checks first, so a reordered row object fails loudly instead of silently invalidating the assertions.

CHANGELOG

Does this branch warrant an entry to the CHANGELOG?

  • Yes
  • No

Dependencies

none

Requirements

If you have made any visual changes to the GUI. Make sure you have:

  • Tested on iOS device
  • Tested on Android device
  • Tested on small-screen device (iPod Touch)
  • Tested on large-screen device (tablet)

Driven end to end on the iOS simulator against the edge-funds My Zano wallet: Export Transactions → Bitwave CSV → account id → share sheet. The exported file was pulled off the device and parsed; across all 7 real transactions columns G and H are empty, every timestamp matches ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$, column W equals column R, and column M is exactly pgM8cDt7bySnWTzs2MyI. tsc, eslint (0 errors) and the full jest suite (95 suites, 575 tests) pass.


Note

Low Risk
Export-format and UI input fixes for Bitwave CSV only; no auth, payments, or core wallet logic changes.

Overview
Aligns Bitwave transaction CSV export with Bitwave’s current import rules and fixes account-id entry so imports work without manual edits.

Bitwave CSV output now uses ISO 8601 UTC timestamps (YYYY-MM-DDTHH:MM:SSZ), leaves fee and feeTicker empty so Bitwave does not double-count fees, and sets custom metadata column 2 to the same value as description (notes remain in memo). exportTransactionsToBitwave no longer needs the wallet or parent-chain multiplier.

Account id input on the export scene uses autoCapitalize="none" and trims pasted values so case-sensitive ids are not altered or padded with whitespace.

Adds unit tests for the Bitwave column behavior and minor typing/eslint cleanup in export actions and the export scene.

Reviewed by Cursor Bugbot for commit c2cce5b. Bugbot is set up for automated code reviews on this repo. Configure here.

j0ntz added 2 commits August 3, 2026 13:26
Add explicit return types, replace truthy checks on nullable denominations
with explicit null checks, and type catch callback variables as unknown.
Bitwave changed its import requirements, so the export no longer matched
what the importer accepts:

- Timestamps use ISO 8601 UTC (YYYY-MM-DDTHH:MM:SSZ) instead of MM/DD/YY HH:MM.
- The fee and fee ticker columns stay blank, since Bitwave now calculates
  fees itself and populated columns duplicate them after import.
- The custom metadata 2 column mirrors the description column.
- The account id keeps the case and spacing it was entered with. The input
  modal inherited the platform default of capitalizing the first character,
  which silently corrupted ids beginning with a lowercase letter and forced
  a manual fix on every import.

Dropping the fee columns leaves the wallet and parent multiplier arguments
unused, so they are removed along with the scene prop that supplied them.
@j0ntz

j0ntz commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

📸 Test evidence

export scene bitwave enabled

export scene bitwave enabled

account id preserved lowercase

account id preserved lowercase

bitwave csv exported share sheet

bitwave csv exported share sheet

before fix keyboard autocapitalized

before fix keyboard autocapitalized

Captured by the agent's in-app test run (build-and-test).

@j0ntz
j0ntz marked this pull request as ready for review August 3, 2026 20:49
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant