8.3 KiB
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 eventsWallet.kt— Wallet data classWalletManager.kt— Wallet lifecycle managerPendingTransaction.kt— Pending tx data classProofInfo.kt— Tip proof info data classSubaddress.kt— Subaddress managementTransaction.kt— Transaction data classTransactionHistory.kt— Transaction historyTransactionInfo.kt— Transaction infoTransfer.kt— Transfer data class
Service layer (amethyst/src/main/java/.../service/):
MoneroDataSource.kt— Monero data accessTipEventDataSource.kt— Tip event CRUDTipHandler.kt— Tip event handling logicWalletService.kt— Wallet service (702 lines)
Quartz events (quartz/src/commonMain/kotlin/.../):
moneroTip/MoneroTipEvent.kt— Kind 1814 Monero tip eventmoneroTip/TipSplitSetup.kt— Tip split setup extension function onEvent?
Other:
TransactionPriority.kt(ui/screen/loggedIn/) — Transaction priority enummonero.xml(res/drawable/) — Monero iconwallet2_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 bridgelibsodium.so— Cryptographic librarylibjnidispatch.so— JNI dispatchlibc++_shared.so— C++ runtimelibsecp256k1-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)→ useLocalRippleInfo.current - Replace
autoCorrectparameter → 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()issuspend— 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.ktamethyst/src/main/java/.../ui/screen/TipFeedState.ktamethyst/src/main/java/.../ui/screen/TipFeedView.ktamethyst/src/main/java/.../ui/screen/TipFeedViewModel.ktamethyst/src/main/java/.../ui/components/Tip.ktamethyst/src/main/java/.../ui/note/TipCustomDialog.ktamethyst/src/main/java/.../ui/note/TipNoteCompose.ktamethyst/src/main/java/.../ui/note/TipUserSetCompose.ktamethyst/src/main/java/.../ui/note/UpdateTipAmountDialog.ktamethyst/src/main/java/.../ui/note/elements/DisplayTipSplits.ktamethyst/src/main/java/.../ui/dal/UserProfileTipsFeedFilter.ktamethyst/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 eventUserMetadataCache.kt(commons) ✓ — Monero metadata fieldLocalCache.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 factoryEvent.kt(quartz) — Monero metadata extraction (if needed separately from EventFactory)Routes.kt— Add monero routeAppNavigation.kt— Add monero navigationAppTopBar.kt— Add monero iconMainScreen.kt— Add monero screenNoteCompose.kt— Display monero tipsReactionsRow.kt— Monero tip reactionsProfileScreen.kt— Monero tips tabNewPostView.kt/NewPostViewModel.kt— Add monero tagsstrings.xml✓ — Monero stringsbuild.gradle.kts✓ — JNA dependencymonerujo.cpp,monerujo.h(cpp) ✓ — Native bridgewallet2_api.h(cpp) ✓ — Monero API headermonero.xml(drawable) ✓ — Icon