Skip to content
Open
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
3 changes: 3 additions & 0 deletions src/Components/Reusable/GasFeeSpeed/GasFeeSpeed.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type Props = {
[token: string]: boolean
}
containerStyle?: StyleProp<ViewStyle>
sendingTokenSymbol?: string
}

const AnimatedBaseCard = Animated.createAnimatedComponent(wrapFunctionComponent(BaseCard))
Expand All @@ -53,6 +54,7 @@ export const GasFeeSpeed = ({
isFirstTimeLoadingFees,
hasEnoughBalanceOnToken,
containerStyle,
sendingTokenSymbol,
}: PropsWithChildren<Props>) => {
const { styles } = useThemedStyles(baseStyles)

Expand Down Expand Up @@ -120,6 +122,7 @@ export const GasFeeSpeed = ({
selectedToken={delegationToken}
setSelectedToken={setDelegationToken}
hasEnoughBalanceOnToken={hasEnoughBalanceOnToken}
sendingTokenSymbol={sendingTokenSymbol}
/>
</AnimatedBaseCard>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ type Props = {
hasEnoughBalanceOnToken: {
[token: string]: boolean
}

sendingTokenSymbol?: string
}

type EnhancedTokenCardProps = {
Expand All @@ -49,7 +51,7 @@ const EnhancedTokenCard = ({ item, selected, onSelectedToken, disabled }: Enhanc
}

export const GasFeeTokenBottomSheet = forwardRef<BottomSheetModalMethods, Props>(function GasFeeSpeedBottomSheet(
{ selectedToken, setSelectedToken, onClose, availableTokens, hasEnoughBalanceOnToken },
{ selectedToken, setSelectedToken, onClose, availableTokens, hasEnoughBalanceOnToken, sendingTokenSymbol },
ref,
) {
const { LL } = useI18nContext()
Expand Down Expand Up @@ -147,7 +149,7 @@ export const GasFeeTokenBottomSheet = forwardRef<BottomSheetModalMethods, Props>
key={tk.symbol}
onSelectedToken={setInternalToken}
selected={internalToken === tk.symbol}
disabled={!hasEnoughBalanceOnToken[tk.symbol]}
disabled={!hasEnoughBalanceOnToken[tk.symbol] && tk.symbol !== sendingTokenSymbol}
/>
))}
</BaseView>
Expand Down
24 changes: 23 additions & 1 deletion src/Hooks/useIsEnoughGas/useIsEnoughGas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type Args = {
isLoadingFees: boolean
transactionOutputs: InspectableOutput[] | undefined
origin: string
enableSameTokenFeeHandling?: boolean
}

const calculateClausesValue = ({
Expand Down Expand Up @@ -64,6 +65,7 @@ export const useIsEnoughGas = ({
isLoadingFees,
transactionOutputs,
origin,
enableSameTokenFeeHandling = false,
}: Args) => {
const officialTokens = useAppSelector(selectOfficialTokens)
const { B3TR: networkB3TR } = useAppSelector(selectNetworkVBDTokens)
Expand Down Expand Up @@ -94,16 +96,36 @@ export const useIsEnoughGas = ({
network: network.type,
origin,
})

//Delegation with VTHO should count as "0" for fees
if (tokenSymbol === VTHO.symbol && isDelegated)
return [tokenSymbol, BigNutils(balance).minus(clausesValue.toBN).isBiggerThanOrEqual("0")] as const

if (enableSameTokenFeeHandling && tokenSymbol === selectedToken && tokenSymbol !== VTHO.symbol) {
return [
tokenSymbol,
BigNutils(balance).isBiggerThanOrEqual(allFeeOptions[tokenSymbol].toBN),
] as const
}

return [
tokenSymbol,
BigNutils(balance).minus(clausesValue.toBN).isBiggerThanOrEqual(allFeeOptions[tokenSymbol].toBN),
] as const
}),
)
}, [isLoadingFees, allFeeOptions, transactionOutputs, officialTokens, balances, network.type, origin, isDelegated])
}, [
isLoadingFees,
allFeeOptions,
transactionOutputs,
officialTokens,
balances,
network.type,
origin,
isDelegated,
enableSameTokenFeeHandling,
selectedToken,
])

const hasEnoughBalanceOnAny = useMemo(() => {
return Object.values(hasEnoughBalanceOnToken).some(Boolean)
Expand Down
6 changes: 6 additions & 0 deletions src/Hooks/useTransactionScreen/useTransactionScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ type Props = {
* Fallback to VTHO for delegation fees if the user doesn't have enough of the selected token
*/
autoVTHOFallback?: boolean
/**
* When enabled, skips the clauses value check to allow sending tokens while using them for gas fees
*/
enableSameTokenFeeHandling?: boolean
onNavigateToLedger?: () => void
}

Expand Down Expand Up @@ -102,6 +106,7 @@ export const useTransactionScreen = ({
initialRoute,
onNavigateToLedger,
autoVTHOFallback = true,
enableSameTokenFeeHandling = false,
}: Props) => {
const { LL } = useI18nContext()
const dispatch = useAppDispatch()
Expand Down Expand Up @@ -273,6 +278,7 @@ export const useTransactionScreen = ({
isLoadingFees: isFirstTimeLoadingFees,
transactionOutputs,
origin: selectedAccount.address,
enableSameTokenFeeHandling,
})

const { buildTransaction } = useTransactionBuilder({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ export const TransactionSummarySendScreen = ({ route }: Props) => {
const pendingTransaction = useAppSelector(state => selectPendingTx(state, token.address))
const accounts = useAppSelector(selectAccounts)

const [enableSameTokenFeeHandling, setEnableSameTokenFeeHandling] = useState(false)

const [finalAmount, setFinalAmount] = useState(amount)

const receiverIsAccount = accounts.find(_account => AddressUtils.compareAddresses(_account.address, address))
Expand Down Expand Up @@ -145,12 +147,12 @@ export const TransactionSummarySendScreen = ({ route }: Props) => {
onTransactionSuccess,
onTransactionFailure,
autoVTHOFallback: false,
enableSameTokenFeeHandling,
})

/**
* If user is sending a token and gas is not enough, we will adjust the amount to send.
*/
useEffect(() => {
setEnableSameTokenFeeHandling(selectedDelegationToken.toLowerCase() === token.symbol.toLowerCase())

if (isDelegated && selectedDelegationToken === VTHO.symbol) {
return
}
Expand Down Expand Up @@ -242,7 +244,8 @@ export const TransactionSummarySendScreen = ({ route }: Props) => {
isEnoughBalance={isEnoughGas}
hasEnoughBalanceOnAny={hasEnoughBalanceOnAny}
isFirstTimeLoadingFees={isFirstTimeLoadingFees}
hasEnoughBalanceOnToken={hasEnoughBalanceOnToken}>
hasEnoughBalanceOnToken={hasEnoughBalanceOnToken}
sendingTokenSymbol={token.symbol}>
<DelegationView
setNoDelegation={resetDelegation}
selectedDelegationOption={selectedDelegationOption}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ describe("TransactionSummarySendScreen", () => {
onTransactionSuccess: expect.any(Function),
onTransactionFailure: expect.any(Function),
autoVTHOFallback: false,
enableSameTokenFeeHandling: true,
clauses: [
{
to: "0xf077b491b355E64048cE21E3A6Fc4751eEeA77fa",
Expand Down