@@ -22,14 +22,13 @@ import Button from '../../components/buttons/Button';
2222import UnitButton from '../Wallets/UnitButton' ;
2323import TransferNumberPad from './TransferNumberPad' ;
2424import type { TransferScreenProps } from '../../navigation/types' ;
25- import { useTransfer } from '../../hooks/transfer' ;
25+ import { useTransfer , useTransferFee } from '../../hooks/transfer' ;
2626import { useAppSelector } from '../../hooks/redux' ;
2727import { useBalance , useSwitchUnit } from '../../hooks/wallet' ;
2828import { convertToSats } from '../../utils/conversion' ;
2929import { showToast } from '../../utils/notifications' ;
3030import { getNumberPadText } from '../../utils/numberpad' ;
3131import { getDisplayValues } from '../../utils/displayValues' ;
32- import { getMaxSendAmount } from '../../utils/wallet/transactions' ;
3332import { transactionSelector } from '../../store/reselect/wallet' ;
3433import {
3534 resetSendTransaction ,
@@ -45,6 +44,7 @@ import {
4544 conversionUnitSelector ,
4645 denominationSelector ,
4746} from '../../store/reselect/settings' ;
47+ import { onChainFeesSelector } from '../../store/reselect/fees' ;
4848
4949const SpendingAmount = ( {
5050 navigation,
@@ -57,37 +57,49 @@ const SpendingAmount = ({
5757 const nextUnit = useAppSelector ( nextUnitSelector ) ;
5858 const conversionUnit = useAppSelector ( conversionUnitSelector ) ;
5959 const denomination = useAppSelector ( denominationSelector ) ;
60+ const fees = useAppSelector ( onChainFeesSelector ) ;
6061
6162 const [ textFieldValue , setTextFieldValue ] = useState ( '' ) ;
6263 const [ loading , setLoading ] = useState ( false ) ;
6364
65+ const clientBalance = useMemo ( ( ) : number => {
66+ return convertToSats ( textFieldValue , conversionUnit ) ;
67+ } , [ textFieldValue , conversionUnit ] ) ;
68+
69+ const transferValues = useTransfer ( clientBalance ) ;
70+ const { defaultLspBalance, maxClientBalance } = transferValues ;
71+
72+ // Calculate the maximum amount that can be transferred
73+ const availableAmount = onchainBalance - transaction . fee ;
74+ const { defaultLspBalance : maxLspBalance } = useTransfer ( availableAmount ) ;
75+ const { fee : maxLspFee } = useTransferFee ( maxLspBalance , availableAmount ) ;
76+ const feeMaximum = Math . floor ( availableAmount - maxLspFee ) ;
77+ const maximum = Math . min ( maxClientBalance , feeMaximum ) ;
78+
6479 useFocusEffect (
6580 useCallback ( ( ) => {
6681 const setupTransfer = async ( ) : Promise < void > => {
82+ // In case of the low fee market, we bump fee by 5 sats
83+ // details: https://github.com/synonymdev/bitkit/issues/2139
84+ const getSatsPerByte = ( fee : number ) : number => {
85+ const MIN_FEE = 10 ;
86+ const BUMP_FEE = 5 ;
87+ return fee <= MIN_FEE ? fee + BUMP_FEE : fee ;
88+ } ;
89+
90+ const satsPerByte = getSatsPerByte ( fees . fast ) ;
91+
6792 await resetSendTransaction ( ) ;
68- await setupOnChainTransaction ( { rbf : false } ) ;
93+ await setupOnChainTransaction ( { satsPerByte , rbf : false } ) ;
6994 refreshBlocktankInfo ( ) . then ( ) ;
7095 } ;
7196 setupTransfer ( ) ;
97+
98+ // onMount
99+ // eslint-disable-next-line react-hooks/exhaustive-deps
72100 } , [ ] ) ,
73101 ) ;
74102
75- const clientBalance = useMemo ( ( ) : number => {
76- return convertToSats ( textFieldValue , conversionUnit ) ;
77- } , [ textFieldValue , conversionUnit ] ) ;
78-
79- const transferValues = useTransfer ( clientBalance ) ;
80- const { defaultLspBalance, maxClientBalance } = transferValues ;
81-
82- const availableAmount = useMemo ( ( ) => {
83- const maxAmountResponse = getMaxSendAmount ( ) ;
84- if ( maxAmountResponse . isOk ( ) ) {
85- return maxAmountResponse . value . amount ;
86- }
87- return 0 ;
88- // eslint-disable-next-line react-hooks/exhaustive-deps
89- } , [ transaction . outputs , transaction . satsPerByte ] ) ;
90-
91103 const onChangeUnit = ( ) : void => {
92104 const result = getNumberPadText ( clientBalance , denomination , nextUnit ) ;
93105 setTextFieldValue ( result ) ;
@@ -96,18 +108,18 @@ const SpendingAmount = ({
96108
97109 const onQuarter = ( ) : void => {
98110 const quarter = Math . round ( onchainBalance / 4 ) ;
99- const amount = Math . min ( quarter , maxClientBalance ) ;
111+ const amount = Math . min ( quarter , maximum ) ;
100112 const result = getNumberPadText ( amount , denomination , unit ) ;
101113 setTextFieldValue ( result ) ;
102114 } ;
103115
104116 const onMaxAmount = ( ) : void => {
105- const result = getNumberPadText ( maxClientBalance , denomination , unit ) ;
117+ const result = getNumberPadText ( maximum , denomination , unit ) ;
106118 setTextFieldValue ( result ) ;
107119 } ;
108120
109121 const onNumberPadError = ( ) : void => {
110- const dv = getDisplayValues ( { satoshis : maxClientBalance } ) ;
122+ const dv = getDisplayValues ( { satoshis : maximum } ) ;
111123 showToast ( {
112124 type : 'warning' ,
113125 title : t ( 'spending_amount.error_max.title' ) ,
@@ -121,12 +133,12 @@ const SpendingAmount = ({
121133 setLoading ( true ) ;
122134
123135 const lspBalance = defaultLspBalance ;
124- const response = await startChannelPurchase ( { clientBalance, lspBalance } ) ;
136+ const result = await startChannelPurchase ( { clientBalance, lspBalance } ) ;
125137
126138 setLoading ( false ) ;
127139
128- if ( response . isErr ( ) ) {
129- const { message } = response . error ;
140+ if ( result . isErr ( ) ) {
141+ const { message } = result . error ;
130142 const nodeCapped = message . includes ( 'channel size check' ) ;
131143 const title = nodeCapped
132144 ? t ( 'spending_amount.error_max.title' )
@@ -143,7 +155,7 @@ const SpendingAmount = ({
143155 return ;
144156 }
145157
146- navigation . navigate ( 'SpendingConfirm' , { order : response . value } ) ;
158+ navigation . navigate ( 'SpendingConfirm' , { order : result . value } ) ;
147159 } ;
148160
149161 return (
@@ -222,7 +234,7 @@ const SpendingAmount = ({
222234 < TransferNumberPad
223235 style = { styles . numberpad }
224236 value = { textFieldValue }
225- maxAmount = { maxClientBalance }
237+ maxAmount = { maximum }
226238 onChange = { setTextFieldValue }
227239 onError = { onNumberPadError }
228240 />
0 commit comments