Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,10 @@ class BillController @Inject constructor(
amount: LocalFiat,
token: Token,
owner: AccountCluster,
verifiedState: VerifiedState,
onFunded: suspend (LocalFiat) -> Unit,
onError: (Throwable) -> Unit,
) = transactionManager.fundGiftCard(giftCard, amount, owner, token, onFunded, onError)
) = transactionManager.fundGiftCard(giftCard, amount, owner, token, verifiedState, onFunded, onError)

/** Initiates the **receive cash link** flow — claims a gift card by entropy. */
fun receiveGiftCard(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.getcode.manager.BottomBarAction
import com.getcode.manager.BottomBarManager
import com.getcode.opencode.controllers.TransactionOperations
import com.getcode.opencode.exchange.Exchange
import com.getcode.opencode.exchange.VerifiedFiatCalculator
import com.getcode.opencode.model.financial.Currency
import com.getcode.opencode.model.financial.CurrencyCode
import com.getcode.opencode.model.financial.Fiat
Expand Down Expand Up @@ -47,6 +48,7 @@ import kotlin.math.min
internal class CashScreenViewModel @Inject constructor(
private val resources: ResourceHelper,
private val exchange: Exchange,
private val verifiedFiatCalculator: VerifiedFiatCalculator,
tokenCoordinator: TokenCoordinator,
transactionController: TransactionOperations,
dispatchers: DispatcherProvider,
Expand Down Expand Up @@ -140,11 +142,11 @@ internal class CashScreenViewModel @Inject constructor(
viewModelScope.launch {
val rate = exchange.entryRate
val (token, balance) = stateFlow.value.token!!
val amountFiat = LocalFiat.valueExchangeIn(
val amountFiat = verifiedFiatCalculator.compute(
amount = Fiat(amount, rate.currency),
token = token,
rate = rate,
)
).localFiat

val neededAmount = amountFiat.nativeAmount - tokenBalance
println("entered amount ${amountFiat.nativeAmount}, tokenbalace=$tokenBalance, needed=$neededAmount")
Expand Down Expand Up @@ -302,7 +304,7 @@ internal class CashScreenViewModel @Inject constructor(
val (token, balance) = stateFlow.value.token!!
val rate = exchange.entryRate

val amountFiat = LocalFiat.valueExchangeIn(
val result = verifiedFiatCalculator.compute(
amount = Fiat(data.amountData.amount, rate.currency),
token = token,
balance = balance.underlyingTokenAmount,
Expand All @@ -311,7 +313,8 @@ internal class CashScreenViewModel @Inject constructor(

val bill = Bill.Cash(
token = stateFlow.value.token!!.token,
amount = amountFiat
amount = result.localFiat,
verifiedState = result.verifiedState,
)

dispatchEvent(Event.UpdateLoadingState(loading = false, success = true))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.flipcash.libs.coroutines.DispatcherProvider
import com.getcode.manager.BottomBarManager
import com.getcode.opencode.controllers.TransactionOperations
import com.getcode.opencode.exchange.Exchange
import com.getcode.opencode.exchange.VerifiedFiatCalculator
import com.getcode.opencode.model.financial.Currency
import com.getcode.opencode.model.financial.CurrencyCode
import com.getcode.opencode.model.financial.Fiat
Expand Down Expand Up @@ -54,6 +55,7 @@ class CashScreenViewModelTest {

private val resources: ResourceHelper = mockk(relaxed = true)
private val exchange: Exchange = mockk(relaxed = true)
private val verifiedFiatCalculator: VerifiedFiatCalculator = mockk(relaxed = true)
private val tokenCoordinator: TokenCoordinator = mockk(relaxed = true)
private val transactionController: TransactionOperations = mockk(relaxed = true)

Expand Down Expand Up @@ -90,6 +92,7 @@ class CashScreenViewModelTest {
return CashScreenViewModel(
resources = resources,
exchange = exchange,
verifiedFiatCalculator = verifiedFiatCalculator,
tokenCoordinator = tokenCoordinator,
transactionController = transactionController,
dispatchers = dispatchers,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,18 +37,22 @@ import com.flipcash.services.user.UserManager
import com.getcode.manager.BottomBarManager
import com.getcode.opencode.controllers.CurrencyController
import com.getcode.opencode.controllers.TransactionController
import com.getcode.opencode.exchange.VerifiedFiat
import com.getcode.opencode.exchange.VerifiedFiatCalculator
import com.getcode.opencode.internal.solana.model.SwapId
import com.getcode.opencode.model.core.errors.CheckTokenAvailabilityError
import com.getcode.opencode.model.core.errors.GetMintsError
import com.getcode.opencode.model.core.errors.LaunchTokenError
import com.getcode.opencode.model.core.errors.ValidationException
import com.getcode.opencode.model.financial.MintMetadata
import com.getcode.opencode.model.financial.Rate
import com.getcode.opencode.model.financial.Token
import com.getcode.opencode.model.financial.TokenCreateRequest
import com.getcode.opencode.model.financial.fromLaunch
import com.getcode.opencode.model.financial.minus
import com.getcode.opencode.model.financial.orZero
import com.getcode.opencode.model.financial.plus
import com.getcode.opencode.model.financial.usdf
import com.getcode.opencode.model.moderation.ModerationAttestation
import com.getcode.opencode.model.transactions.SwapFundingSource
import com.getcode.solana.keys.Mint
Expand Down Expand Up @@ -87,6 +91,7 @@ internal class CurrencyCreatorViewModel @Inject constructor(
moderationController: ModerationController,
currencyController: CurrencyController,
transactionController: TransactionController,
private val verifiedFiatCalculator: VerifiedFiatCalculator,
externalWalletController: ExternalWalletOnRampController,
tokenCoordinator: TokenCoordinator,
balancePoller: BalancePoller,
Expand Down Expand Up @@ -513,8 +518,11 @@ internal class CurrencyCreatorViewModel @Inject constructor(
AppRoute.Token.CurrencyCreator,
OnRampProvider.Phantom
)
val totalAmount = LocalFiat(usdf = event.context.amount)
println("total amount ${totalAmount.underlyingTokenAmount}")
val totalAmount = verifiedFiatCalculator.compute(
amount = event.context.amount,
token = Token.usdf,
rate = Rate.oneToOne,
)
val feeAmount = event.context.feeAmount?.let { LocalFiat(usdf = it) }
externalWalletController.setAmount(amount = totalAmount, feeAmount = feeAmount)
externalWalletController.setTokenToPurchase(event.context.token)
Expand All @@ -529,10 +537,16 @@ internal class CurrencyCreatorViewModel @Inject constructor(
}
.onEach { dispatchEvent(Event.UpdateProcessingState(loading = true)) }
.map { (owner, context) ->
val totalAmount = verifiedFiatCalculator.compute(
amount = context.amount,
token = Token.usdf,
rate = Rate.oneToOne,
)
val feeAmount = context.feeAmount?.let { LocalFiat(usdf = it) }
transactionController.buy(
owner = owner,
amount = LocalFiat(usdf = context.amount),
feeAmount = context.feeAmount?.let { LocalFiat(usdf = it) },
amount = totalAmount,
feeAmount = feeAmount,
of = context.token,
source = SwapFundingSource.SubmitIntent(),
fund = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.flipcash.app.core.AppRoute
import com.getcode.solana.keys.Mint

import com.flipcash.app.onramp.internal.OnRampViewModel
import com.flipcash.app.onramp.internal.screens.OnRampAmountScreen
import com.flipcash.features.onramp.R
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import com.getcode.manager.BottomBarManager
import com.getcode.opencode.controllers.TokenController
import com.getcode.opencode.controllers.TransactionOperations
import com.getcode.opencode.exchange.Exchange
import com.getcode.opencode.exchange.VerifiedFiat
import com.getcode.opencode.exchange.VerifiedFiatCalculator
import com.getcode.opencode.model.financial.Currency
import com.getcode.opencode.model.financial.CurrencyCode
import com.getcode.opencode.model.financial.Fiat
Expand All @@ -24,6 +26,7 @@ import com.getcode.opencode.model.financial.LocalFiat
import com.getcode.opencode.model.financial.SendLimit
import com.getcode.opencode.model.financial.Token
import com.getcode.opencode.model.financial.toFiat
import com.getcode.opencode.model.financial.usdf
import com.getcode.solana.keys.Mint
import com.getcode.ui.components.text.AmountAnimatedInputUiModel
import com.getcode.ui.components.text.NumberInputHelper
Expand All @@ -45,7 +48,7 @@ internal data class AmountEntryState(
val currencyModel: CurrencyHolder = CurrencyHolder(),
val amountAnimatedModel: AmountAnimatedInputUiModel = AmountAnimatedInputUiModel(),
val confirmingAmount: LoadingSuccessState = LoadingSuccessState(),
val selectedAmount: LocalFiat = LocalFiat.Zero,
val selectedAmount: VerifiedFiat = VerifiedFiat(LocalFiat.Zero, null),
) {
val canAdd: Boolean
get() = (amountAnimatedModel.amountData.amount) > 0.00
Expand All @@ -71,6 +74,7 @@ internal data class AmountEntryState(
@HiltViewModel
internal class OnRampViewModel @Inject constructor(
private val exchange: Exchange,
private val verifiedFiatCalculator: VerifiedFiatCalculator,
private val resources: ResourceHelper,
private val onRampController: CoinbaseOnRampController,
tokenController: TokenController,
Expand Down Expand Up @@ -127,9 +131,9 @@ internal class OnRampViewModel @Inject constructor(
val success: Boolean = false
) : Event

data class OnAmountAccepted(val amount: LocalFiat) : Event
data class OnAmountAccepted(val amount: VerifiedFiat) : Event

data class CreateAndSendTransactionToWallet(val amount: LocalFiat) : Event
data class CreateAndSendTransactionToWallet(val amount: VerifiedFiat) : Event
// endregion
}

Expand Down Expand Up @@ -279,9 +283,10 @@ internal class OnRampViewModel @Inject constructor(
}
}

val amountFiat = LocalFiat(
usdf = localizedAmount.convertingTo(exchange.rateToUsd(rate.currency)!!),
nativeAmount = localizedAmount,
val amountFiat = verifiedFiatCalculator.compute(
amount = localizedAmount,
token = Token.usdf,
rate = rate,
)

dispatchEvent(Event.OnAmountAccepted(amountFiat))
Expand Down Expand Up @@ -314,9 +319,9 @@ internal class OnRampViewModel @Inject constructor(
}

onRampController.placeOrderAndStartPayment(
amount = selectedAmount.underlyingTokenAmount,
amount = selectedAmount.localFiat.underlyingTokenAmount,
token = token,
localFiat = selectedAmount,
verifiedFiat = selectedAmount,
).onFailure { error ->
dispatchEvent(Event.UpdateConfirmingAmountState())
when (error) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import com.getcode.manager.BottomBarAction
import com.getcode.manager.BottomBarManager
import com.getcode.opencode.controllers.TransactionOperations
import com.getcode.opencode.exchange.Exchange
import com.getcode.opencode.exchange.VerifiedFiat
import com.getcode.opencode.exchange.VerifiedFiatCalculator
import com.getcode.opencode.model.financial.Currency
import com.getcode.opencode.model.financial.CurrencyCode
import com.getcode.opencode.model.financial.Fiat
Expand Down Expand Up @@ -55,7 +57,7 @@ internal data class AmountEntryState(
val currencyModel: CurrencyHolder = CurrencyHolder(),
val amountAnimatedModel: AmountAnimatedInputUiModel = AmountAnimatedInputUiModel(),
val confirmingAmount: LoadingSuccessState = LoadingSuccessState(),
val selectedAmount: LocalFiat = LocalFiat.Zero,
val selectedAmount: VerifiedFiat = VerifiedFiat(LocalFiat.Zero, null),
)

internal data class DestinationState(
Expand All @@ -68,6 +70,7 @@ internal data class DestinationState(
internal class WithdrawalViewModel @Inject constructor(
private val resources: ResourceHelper,
private val exchange: Exchange,
private val verifiedFiatCalculator: VerifiedFiatCalculator,
private val userManager: UserManager,
transactionController: TransactionOperations,
clipboardManager: ClipboardManager,
Expand Down Expand Up @@ -121,7 +124,7 @@ internal class WithdrawalViewModel @Inject constructor(
data class OnAmountChanged(val amountAnimatedModel: AmountAnimatedInputUiModel) : Event
data class OnCurrencyChanged(val currency: Currency) : Event
data object OnAmountConfirmed : Event
data class OnAmountAccepted(val amount: LocalFiat) : Event
data class OnAmountAccepted(val amount: VerifiedFiat) : Event
data object OnDestinationConfirmed : Event
data class UpdateConfirmingAmountState(
val loading: Boolean = false,
Expand Down Expand Up @@ -267,15 +270,15 @@ internal class WithdrawalViewModel @Inject constructor(
dispatchEvent(Event.UpdateConfirmingAmountState(loading = true))
val rate = exchange.rateForUsd()
val token = stateFlow.value.token!!.token
val amountFiat = LocalFiat.valueExchangeIn(
val amountVerified = verifiedFiatCalculator.compute(
amount = Fiat(data.amountData.amount, rate.currency),
token = token,
balance = stateFlow.value.token!!.balance,
rate = rate,
)

dispatchEvent(Event.UpdateConfirmingAmountState(loading = false, success = true))
dispatchEvent(Event.OnAmountAccepted(amountFiat))
dispatchEvent(Event.OnAmountAccepted(amountVerified))
}.launchIn(viewModelScope)

eventFlow
Expand Down Expand Up @@ -339,7 +342,7 @@ internal class WithdrawalViewModel @Inject constructor(
eventFlow
.filterIsInstance<Event.OnWithdraw>()
.onEach {
val amount = stateFlow.value.amountEntryState.selectedAmount
val amount = stateFlow.value.amountEntryState.selectedAmount.localFiat
val withdrawalChecks = stateFlow.value.destinationState.availability
val fee = withdrawalChecks?.feeAmount
if (amount.nativeAmount - (fee ?: Fiat.Zero) < Fiat.Zero) {
Expand Down Expand Up @@ -394,12 +397,12 @@ internal class WithdrawalViewModel @Inject constructor(
val sendingVault = owner.withTimelockForToken(token)

val feeInMint = feeInUsd?.let { fee ->
LocalFiat.valueExchangeIn(
fee,
verifiedFiatCalculator.compute(
amount = fee,
token = token,
balance = stateFlow.value.token!!.balance,
rate = exchange.rateToUsd(CurrencyCode.USD)!!,
).underlyingTokenAmount
).localFiat.underlyingTokenAmount
}

transactionController.withdraw(
Expand All @@ -415,7 +418,7 @@ internal class WithdrawalViewModel @Inject constructor(
onError = {
analytics.transfer(
event = Analytics.Transfer.Withdrawal,
amount = stateFlow.value.amountEntryState.selectedAmount,
amount = stateFlow.value.amountEntryState.selectedAmount.localFiat,
successful = false,
error = it,
)
Expand All @@ -428,7 +431,7 @@ internal class WithdrawalViewModel @Inject constructor(
onSuccess = {
analytics.transfer(
event = Analytics.Transfer.Withdrawal,
amount = stateFlow.value.amountEntryState.selectedAmount,
amount = stateFlow.value.amountEntryState.selectedAmount.localFiat,
)
viewModelScope.launch {
coroutineScope {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ private fun WithdrawalConfirmationScreenContent(
TransferInfo(
tokenWithBalance = TokenWithBalance(
state.token!!.token,
balance = state.amountEntryState.selectedAmount.nativeAmount,
balance = state.amountEntryState.selectedAmount.localFiat.nativeAmount,
),
destination = state.destinationState.textFieldState.text.toString(),
fee = state.destinationState.availability?.feeAmount,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.flipcash.services.user.UserManager
import com.getcode.manager.BottomBarManager
import com.getcode.opencode.controllers.TransactionOperations
import com.getcode.opencode.exchange.Exchange
import com.getcode.opencode.exchange.VerifiedFiatCalculator
import com.getcode.util.resources.ResourceHelper
import com.flipcash.app.core.MainCoroutineRule
import com.flipcash.app.core.dispatchers.TestDispatchers
Expand All @@ -32,6 +33,7 @@ class WithdrawalViewModelErrorTest {

private val resources = mockk<ResourceHelper>(relaxed = true)
private val exchange = mockk<Exchange>(relaxed = true)
private val verifiedFiatCalculator = mockk<VerifiedFiatCalculator>(relaxed = true)
private val userManager = mockk<UserManager>(relaxed = true)
private val transactionController = mockk<TransactionOperations>(relaxed = true)
private val clipboardManager = mockk<ClipboardManager>(relaxed = true)
Expand All @@ -58,6 +60,7 @@ class WithdrawalViewModelErrorTest {
return WithdrawalViewModel(
resources = resources,
exchange = exchange,
verifiedFiatCalculator = verifiedFiatCalculator,
userManager = userManager,
transactionController = transactionController,
clipboardManager = clipboardManager,
Expand Down
Loading
Loading