Skip to content

Commit d8469a4

Browse files
committed
Merge remote-tracking branch 'origin/code/cash' into feat/phantom-sdk-migration
Resolve conflicts keeping phantom SDK approach (connectAndSign/signAndSend) while adopting code/cash FundingSource enum, requestFlowExit(), and deposit/verification changes. Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
2 parents 6e2d0a2 + 0036088 commit d8469a4

68 files changed

Lines changed: 1936 additions & 1308 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.well-known/release-manifest.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
2-
"updated": "2026-05-14T21:12:28Z",
2+
"updated": "2026-05-15T18:05:45Z",
33
"tracks": {
44
"production": {
5-
"versionCode": 3586,
6-
"versionName": "2026.5.3"
5+
"versionCode": 3599,
6+
"versionName": "2026.5.4"
77
},
88
"beta": null,
99
"alpha": null,
1010
"internal": {
11-
"versionCode": 3586,
12-
"versionName": "2026.5.3"
11+
"versionCode": 3599,
12+
"versionName": "2026.5.4"
1313
}
1414
}
1515
}

apps/flipcash/app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@ dependencies {
179179
implementation(project(":apps:flipcash:features:backupkey"))
180180
implementation(project(":apps:flipcash:features:shareapp"))
181181
implementation(project(":apps:flipcash:features:withdrawal"))
182-
implementation(project(":apps:flipcash:features:onramp"))
183182
implementation(project(":apps:flipcash:features:contact-verification"))
184183
implementation(project(":apps:flipcash:features:tokens"))
185184
implementation(project(":apps:flipcash:features:transactions"))

apps/flipcash/app/src/main/kotlin/com/flipcash/app/internal/ui/navigation/AppScreenContent.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import com.flipcash.app.contact.verification.VerificationFlowScreen
2828
import com.flipcash.app.currencycreator.CurrencyCreatorFlowScreen
2929
import com.flipcash.app.core.AppRoute
3030
import com.flipcash.app.currency.RegionSelectionScreen
31-
import com.flipcash.app.deposit.DepositScreen
31+
import com.flipcash.app.deposit.DepositDestinationScreen
32+
import com.flipcash.app.deposit.DepositFlowScreen
3233
import com.flipcash.app.discovery.TokenDiscoveryScreen
3334
import com.flipcash.app.discovery.TokenDiscoverySheet
3435
import com.flipcash.app.internal.ui.navigation.decorators.rememberNavMessagingEntryDecorator
@@ -40,7 +41,6 @@ import com.flipcash.app.login.router.LoginRouter
4041
import com.flipcash.app.login.seed.SeedInputScreen
4142
import com.flipcash.app.menu.MenuScreen
4243
import com.flipcash.app.myaccount.MyAccountScreen
43-
import com.flipcash.app.onramp.OnRampCustomAmountScreen
4444
import com.flipcash.app.permissions.NotificationPermissionRationaleScreen
4545
import com.flipcash.app.permissions.NotificationPermissionScreen
4646
import com.flipcash.app.purchase.PurchaseAccountScreen
@@ -113,7 +113,6 @@ fun appEntryProvider(
113113
annotatedEntry<AppRoute.Token.TxProcessing> { key ->
114114
TokenTxProcessingScreen(key.swapId, key.swapPurpose, key.amount, key.awaitExternalWallet, key.isFundingShortfall)
115115
}
116-
annotatedEntry<AppRoute.Token.OnRamp> { key -> OnRampCustomAmountScreen(key.mint) }
117116
annotatedEntry<AppRoute.Token.Discovery> { TokenDiscoveryScreen() }
118117
annotatedEntry<AppRoute.Token.CurrencyCreator> { key ->
119118
CurrencyCreatorFlowScreen(route = key, resultStateRegistry = resultStateRegistry)
@@ -128,13 +127,15 @@ fun appEntryProvider(
128127
annotatedEntry<AppRoute.Menu.AppSettings> { AppSettingsScreen() }
129128
annotatedEntry<AppRoute.Menu.Lab> { LabsScreen() }
130129
annotatedEntry<AppRoute.Menu.MyAccount> { MyAccountScreen() }
131-
annotatedEntry<AppRoute.Menu.Deposit> { key -> DepositScreen(key.mint) }
132130
annotatedEntry<AppRoute.Menu.BackupKey> { BackupKeyScreen() }
133131
annotatedEntry<AppRoute.Menu.AdvancedFeatures> { AdvancedFeaturesScreen() }
134132
annotatedEntry<AppRoute.Menu.DeviceLogs> { DeviceLogsScreen() }
135133

136134
annotatedEntry<AppRoute.UserFlags> { UserFlagsScreen() }
137135
// Transfers
136+
annotatedEntry<AppRoute.Transfers.Deposit> { key ->
137+
DepositFlowScreen(route = key, resultStateRegistry = resultStateRegistry)
138+
}
138139
annotatedEntry<AppRoute.Transfers.Withdrawal> { key ->
139140
WithdrawalFlowScreen(route = key, resultStateRegistry = resultStateRegistry)
140141
}

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/AppRoute.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.flipcash.app.core
22

33
import android.os.Parcelable
44
import androidx.navigation3.runtime.NavKey
5+
import com.flipcash.app.core.deposit.DepositResult
6+
import com.flipcash.app.core.deposit.DepositStep
57
import com.flipcash.app.core.money.RegionSelectionKind
68
import com.flipcash.app.core.tokens.CurrencyCreatorResult
79
import com.flipcash.app.core.tokens.CurrencyCreatorStep
@@ -137,9 +139,15 @@ sealed interface AppRoute : NavKey, Parcelable {
137139
val shortfall: Fiat? = null,
138140
) : Token, FlowRouteWithResult<SwapResult> {
139141
override val initialStack: List<NavKey>
140-
get() = listOf(SwapStep.Entry(purpose))
142+
get() = listOf(SwapStep.Entry(purpose, initialAmount = shortfall))
141143
}
142144

145+
@Serializable
146+
data object PhantomConnectInfo: Token
147+
148+
@Serializable
149+
data object PhantomConfirmTransaction: Token
150+
143151
@Serializable
144152
data class TxProcessing(
145153
val swapId: SwapId,
@@ -149,9 +157,6 @@ sealed interface AppRoute : NavKey, Parcelable {
149157
val isFundingShortfall: Boolean = false,
150158
) : Token, NonDismissableRoute, NonDraggableRoute
151159

152-
@Serializable
153-
data class OnRamp(val mint: Mint) : Token
154-
155160
@Serializable
156161
data object Discovery: AppRoute
157162

@@ -165,6 +170,15 @@ sealed interface AppRoute : NavKey, Parcelable {
165170
@Serializable
166171
@Parcelize
167172
sealed interface Transfers : AppRoute {
173+
@Serializable
174+
data class Deposit(val mint: Mint): Transfers, FlowRouteWithResult<DepositResult> {
175+
override val initialStack: List<NavKey>
176+
get() = if (mint == Mint.usdf) {
177+
listOf(DepositStep.UsdcInformational)
178+
} else {
179+
listOf(DepositStep.Destination(mint))
180+
}
181+
}
168182

169183
@Serializable
170184
data class Withdrawal(val mint: Mint) : Transfers, FlowRouteWithResult<WithdrawalResult> {
@@ -209,7 +223,7 @@ private fun buildVerificationInitialStack(
209223
emailVerificationCode: String?,
210224
): List<NavKey> {
211225
if (includePhone && includeEmail) {
212-
return listOf(VerificationStep.Intro(origin is AppRoute.Token.OnRamp))
226+
return listOf(VerificationStep.Intro(origin is AppRoute.Token.Swap))
213227
}
214228
if (includePhone) {
215229
return listOf(VerificationStep.PhoneEntry)

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/android/extensions/Context.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ fun Context.launchPhotos(searchQuery: String = "Flipcash") {
2121
if (searchIntent.resolveActivity(packageManager) != null) {
2222
startActivity(searchIntent)
2323
} else {
24-
println("No apps handling image search")
2524
// Fall back to just opening the gallery
2625
val photosIntent = IntentUtils.photosApp()
2726
startActivity(photosIntent)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.flipcash.app.core.deposit
2+
3+
import android.os.Parcelable
4+
import kotlinx.parcelize.Parcelize
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
sealed interface DepositResult : Parcelable {
9+
@Parcelize
10+
@Serializable
11+
data object Success : DepositResult
12+
13+
@Parcelize
14+
@Serializable
15+
data object Canceled : DepositResult
16+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.flipcash.app.core.deposit
2+
3+
import android.os.Parcelable
4+
import com.getcode.navigation.flow.FlowStep
5+
import com.getcode.solana.keys.Mint
6+
import kotlinx.parcelize.Parcelize
7+
import kotlinx.serialization.Serializable
8+
9+
/**
10+
* Steps inside the Withdrawal flow. Owned by [com.flipcash.app.core.AppRoute.Transfers.Withdrawal]
11+
* and rendered inside a [com.getcode.navigation.flow.FlowHost].
12+
*/
13+
@Serializable
14+
sealed interface DepositStep : FlowStep, Parcelable {
15+
@Parcelize
16+
object UsdcInformational : DepositStep
17+
18+
19+
@Parcelize
20+
@Serializable
21+
data class Destination(val mint: Mint) : DepositStep
22+
}

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/tokens/SwapStep.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,27 @@ import com.getcode.navigation.NonDismissableRoute
55
import com.getcode.navigation.NonDraggableRoute
66
import com.getcode.navigation.flow.FlowStep
77
import com.getcode.opencode.internal.solana.model.SwapId
8+
import com.getcode.opencode.model.financial.Fiat
89
import kotlinx.parcelize.Parcelize
910
import kotlinx.serialization.Serializable
1011

1112
@Serializable
1213
sealed interface SwapStep : FlowStep, Parcelable {
1314
@Parcelize
1415
@Serializable
15-
data class Entry(val purpose: SwapPurpose) : SwapStep
16+
data class Entry(val purpose: SwapPurpose, val initialAmount: Fiat? = null) : SwapStep
1617

1718
@Parcelize
1819
@Serializable
1920
data object SellReceipt : SwapStep
2021

22+
@Parcelize
23+
@Serializable
24+
data object PhantomConnect: SwapStep
25+
26+
@Parcelize
27+
@Serializable
28+
data object PhantomConfirmTransaction: SwapStep
2129
@Parcelize
2230
@Serializable
2331
data class Processing(

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/tokens/TokenSwapPurpose.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,22 @@ import kotlinx.serialization.Serializable
1414
* @see Buy Represents a purchase intent (e.g., swapping base currency for a specific token).
1515
* @see Sell Represents a liquidation intent (e.g., swapping a specific token back to base currency).
1616
*/
17+
@Serializable
18+
enum class FundingSource {
19+
Flexible,
20+
Phantom,
21+
Coinbase,
22+
}
23+
1724
@Serializable
1825
@Parcelize
1926
sealed interface SwapPurpose : Parcelable {
27+
val mint: Mint
2028
sealed interface BalanceIncrease
2129
sealed interface BalanceDecrease
22-
@Serializable data class Buy(val mint: Mint) : SwapPurpose, BalanceIncrease
23-
@Serializable data class FundWithWallet(val mint: Mint): SwapPurpose, BalanceIncrease
24-
@Serializable data class Sell(val mint: Mint) : SwapPurpose, BalanceDecrease
30+
@Serializable data class Buy(
31+
override val mint: Mint,
32+
val fundingSource: FundingSource = FundingSource.Flexible,
33+
) : SwapPurpose, BalanceIncrease
34+
@Serializable data class Sell(override val mint: Mint) : SwapPurpose, BalanceDecrease
2535
}

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/transfers/TransferDirection.kt

Lines changed: 0 additions & 54 deletions
This file was deleted.

0 commit comments

Comments
 (0)