Files
amethyst/GARNET_MERGE_PLAN.md
T
2026-05-20 21:59:37 -07:00

8.3 KiB

Plan: Integrate Garnet (Monero Tipping) into Latest Amethyst

Status

Phase Name Status
1 Investigation COMPLETE
2 Native Libraries COMPLETE
3 Model + Service Layer COMPLETE
4 Quartz Events (KMP) COMPLETE
5 UI Layer IN PROGRESS
6 Resources + Build Config COMPLETE
7 Build and Verify COMPLETE (BUILD SUCCESSFUL)

Key Discoveries

During the port, these breaking changes from Garnet (based on amethyst April 2024) were discovered:

Garnet Assumption Reality in Latest Amethyst
NostrSigner.sign() uses callback NostrSigner.sign() is coroutine-based (suspend)
Note, User in amethyst.model Moved to commons.model (KMP shared)
HexKey from nip01Core.encoders Now at nip01Core.core
KeyPair from nip01Core.crypto Now at nip01Core.crypto (same path but different module layout)
User metadata via getter method StateFlow-based (userMetadataFlow)
LocalCache.consume() takes 2 args Now takes 3 args (type, filter, callback)
TransactionPriority in model/service Lives in ui/screen/loggedIn as an enum
Application context access pattern Amethyst.instance.appContext (not applicationContext)
TipSplit setup as class/inline Extension function on Event?: tipSplitSetup()

What's Done (Phases 1-4, 6-7)

New files created (18):

Model layer (amethyst/src/main/java/.../model/):

  • MoneroWalletListener.kt — Listens to Monero wallet events
  • Wallet.kt — Wallet data class
  • WalletManager.kt — Wallet lifecycle manager
  • PendingTransaction.kt — Pending tx data class
  • ProofInfo.kt — Tip proof info data class
  • Subaddress.kt — Subaddress management
  • Transaction.kt — Transaction data class
  • TransactionHistory.kt — Transaction history
  • TransactionInfo.kt — Transaction info
  • Transfer.kt — Transfer data class

Service layer (amethyst/src/main/java/.../service/):

  • MoneroDataSource.kt — Monero data access
  • TipEventDataSource.kt — Tip event CRUD
  • TipHandler.kt — Tip event handling logic
  • WalletService.kt — Wallet service (702 lines)

Quartz events (quartz/src/commonMain/kotlin/.../):

  • moneroTip/MoneroTipEvent.kt — Kind 1814 Monero tip event
  • moneroTip/TipSplitSetup.kt — Tip split setup extension function on Event?

Other:

  • TransactionPriority.kt (ui/screen/loggedIn/) — Transaction priority enum
  • monero.xml (res/drawable/) — Monero icon
  • wallet2_api.h (cpp/) — Monero wallet API header

Existing files modified (7):

File Changes
Account.kt Added moneroSpendKeyFlow, moneroSeedFlow, moneroRestoreHeightFlow, moneroPasswordFlow + derivation logic + moneroAddressIsValid()
User.kt (commons) Added monero address extraction from metadata
UserMetadataCache.kt (commons) Added monero metadata field
EventFactory.kt (quartz) Added MoneroTipEvent import + parsing in factory
TransactionPriority.kt New enum (31 lines)
strings.xml Added ~53 monero-specific strings
build.gradle.kts Added JNA dependency for monero JNI

Native libraries (in jniLibs, gitignored):

Prebuilt from garnet v0.3.0 APK, placed in 3 ABIs (arm64-v8a, armeabi-v7a, x86_64):

  • libmonerujo.so — Monero JNI bridge
  • libsodium.so — Cryptographic library
  • libjnidispatch.so — JNI dispatch
  • libc++_shared.so — C++ runtime
  • libsecp256k1-jni.so — secp256k1

Build verification

BUILD SUCCESSFUL in 40s (116 tasks)

What's Next: Phase 5 - UI Layer (In Progress)

Garnet had ~20+ UI files. Here is the full list — what needs to be created vs modified.

New UI files to create (11):

Create (high priority):

Garnet Source Destination
MoneroScreen.kt amethyst/.../ui/screen/loggedIn/
TipFeedState.kt amethyst/.../ui/screen/
TipFeedView.kt amethyst/.../ui/screen/
TipFeedViewModel.kt amethyst/.../ui/screen/

Create (medium priority):

Garnet Source Destination
TipNoteCompose.kt amethyst/.../ui/note/
TipUserSetCompose.kt amethyst/.../ui/note/
DisplayTipSplits.kt amethyst/.../ui/note/elements/
UpdateTipAmountDialog.kt amethyst/.../ui/note/
TipCustomDialog.kt amethyst/.../ui/note/
UserProfileTipsFeedFilter.kt amethyst/.../ui/dal/

Existing files that need modification:

File Changes needed
Routes.kt Add monero route
AppNavigation.kt Add monero navigation
AppTopBar.kt Add monero icon/button
MainScreen.kt Add monero screen
NoteCompose.kt Integrate monero tips display
ReactionsRow.kt Add monero tip reactions
ProfileScreen.kt Add monero tips tab
NewPostView.kt / NewPostViewModel.kt Add monero tag to new posts

Material3 API changes to apply:

  • Replace rememberRipple(Boolean, Dp, Color) → use LocalRippleInfo.current
  • Replace autoCorrect parameter → check current TextField API
  • Adapt to any Compose parameter changes since Garnet wrote them

Kotlin 2.x / Coroutines changes to keep in mind:

  • NostrSigner.sign() is suspend — all callers must be coroutines
  • StateFlow-based User.metadata — use subscription instead of direct access
  • LocalCache.consume() takes 3 args — update signatures

Files Complete

New files to create (total):

  • amethyst/src/main/java/.../model/MoneroWalletListener.kt
  • amethyst/src/main/java/.../model/Wallet.kt
  • amethyst/src/main/java/.../model/WalletManager.kt
  • amethyst/src/main/java/.../model/PendingTransaction.kt
  • amethyst/src/main/java/.../model/ProofInfo.kt
  • amethyst/src/main/java/.../model/Subaddress.kt
  • amethyst/src/main/java/.../model/Transaction.kt
  • amethyst/src/main/java/.../model/TransactionHistory.kt
  • amethyst/src/main/java/.../model/TransactionInfo.kt
  • amethyst/src/main/java/.../model/Transfer.kt
  • amethyst/src/main/java/.../service/MoneroDataSource.kt
  • amethyst/src/main/java/.../service/TipEventDataSource.kt
  • amethyst/src/main/java/.../service/TipHandler.kt
  • amethyst/src/main/java/.../service/WalletService.kt
  • amethyst/src/main/java/.../ui/screen/loggedIn/MoneroScreen.kt
  • amethyst/src/main/java/.../ui/screen/TipFeedState.kt
  • amethyst/src/main/java/.../ui/screen/TipFeedView.kt
  • amethyst/src/main/java/.../ui/screen/TipFeedViewModel.kt
  • amethyst/src/main/java/.../ui/components/Tip.kt
  • amethyst/src/main/java/.../ui/note/TipCustomDialog.kt
  • amethyst/src/main/java/.../ui/note/TipNoteCompose.kt
  • amethyst/src/main/java/.../ui/note/TipUserSetCompose.kt
  • amethyst/src/main/java/.../ui/note/UpdateTipAmountDialog.kt
  • amethyst/src/main/java/.../ui/note/elements/DisplayTipSplits.kt
  • amethyst/src/main/java/.../ui/dal/UserProfileTipsFeedFilter.kt
  • amethyst/src/main/java/.../ui/screen/loggedIn/TransactionPriority.kt
  • quartz/src/commonMain/.../moneroTip/MoneroTipEvent.kt
  • quartz/src/commonMain/.../moneroTip/TipSplitSetup.kt

Files modified (total):

  • Account.kt ✓ — Monero address management (spend key, seed, password flows)
  • User.kt (commons) ✓ — Monero address from type-0 event
  • UserMetadataCache.kt (commons) ✓ — Monero metadata field
  • LocalCache.kt — (not needed, User handles metadata)
  • LocalPreferences.kt — (not needed, Account handles prefs directly)
  • Note.kt — Add monero tag extraction (type-0 metadata)
  • ServiceManager.kt — (wallet lifecycle now in WalletService)
  • EventFactory.kt (quartz) ✓ — MoneroTipEvent factory
  • Event.kt (quartz) — Monero metadata extraction (if needed separately from EventFactory)
  • Routes.kt — Add monero route
  • AppNavigation.kt — Add monero navigation
  • AppTopBar.kt — Add monero icon
  • MainScreen.kt — Add monero screen
  • NoteCompose.kt — Display monero tips
  • ReactionsRow.kt — Monero tip reactions
  • ProfileScreen.kt — Monero tips tab
  • NewPostView.kt / NewPostViewModel.kt — Add monero tags
  • strings.xml ✓ — Monero strings
  • build.gradle.kts ✓ — JNA dependency
  • monerujo.cpp, monerujo.h (cpp) ✓ — Native bridge
  • wallet2_api.h (cpp) ✓ — Monero API header
  • monero.xml (drawable) ✓ — Icon