diff --git a/src/main/cli/rpc.ts b/src/main/cli/rpc.ts index cfda063..ee0545d 100644 --- a/src/main/cli/rpc.ts +++ b/src/main/cli/rpc.ts @@ -278,7 +278,7 @@ export async function getSwapInfoBatch( export async function buyXmr( redeemAddress: string, - refundAddress: string, + refundAddress: string | null, provider: Provider, ) { store.dispatch( @@ -289,14 +289,22 @@ export async function buyXmr( }), ); + let params = + refundAddress === null + ? { + monero_receive_address: redeemAddress, + seller: providerToConcatenatedMultiAddr(provider), + } + : { + bitcoin_change_address: refundAddress, + monero_receive_address: redeemAddress, + seller: providerToConcatenatedMultiAddr(provider), + }; + try { await makeRpcRequest( RpcMethod.BUY_XMR, - { - bitcoin_change_address: refundAddress, - monero_receive_address: redeemAddress, - seller: providerToConcatenatedMultiAddr(provider), - }, + params, (logs) => { store.dispatch( swapAddLog({ diff --git a/src/renderer/components/inputs/BitcoinAddressTextField.tsx b/src/renderer/components/inputs/BitcoinAddressTextField.tsx index a5ec21d..d0f020c 100644 --- a/src/renderer/components/inputs/BitcoinAddressTextField.tsx +++ b/src/renderer/components/inputs/BitcoinAddressTextField.tsx @@ -1,8 +1,9 @@ import { useEffect } from 'react'; -import { TextField } from '@material-ui/core'; +import { InputAdornment, TextField } from '@material-ui/core'; import { TextFieldProps } from '@material-ui/core/TextField/TextField'; import { isBtcAddressValid } from 'utils/conversionUtils'; import { isTestnet } from 'store/config'; +import BitcoinIcon from '../icons/BitcoinIcon'; export default function BitcoinAddressTextField({ address, @@ -35,6 +36,13 @@ export default function BitcoinAddressTextField({ helperText={address.length > 0 ? errorText || helperText : helperText} placeholder={placeholder} variant="outlined" + InputProps={{ + startAdornment: ( + + + + ) + }} {...props} /> ); diff --git a/src/renderer/components/inputs/MoneroAddressTextField.tsx b/src/renderer/components/inputs/MoneroAddressTextField.tsx index 4418c58..20a1aee 100644 --- a/src/renderer/components/inputs/MoneroAddressTextField.tsx +++ b/src/renderer/components/inputs/MoneroAddressTextField.tsx @@ -1,8 +1,9 @@ import { useEffect } from 'react'; -import { TextField } from '@material-ui/core'; +import { InputAdornment, TextField } from '@material-ui/core'; import { TextFieldProps } from '@material-ui/core/TextField/TextField'; import { isXmrAddressValid } from 'utils/conversionUtils'; import { isTestnet } from 'store/config'; +import MoneroIcon from '../icons/MoneroIcon'; export default function MoneroAddressTextField({ address, @@ -33,6 +34,13 @@ export default function MoneroAddressTextField({ helperText={address.length > 0 ? errorText || helperText : helperText} placeholder={placeholder} variant="outlined" + InputProps={{ + startAdornment: ( + + + + ) + }} {...props} /> ); diff --git a/src/renderer/components/modal/swap/pages/init/InitPage.tsx b/src/renderer/components/modal/swap/pages/init/InitPage.tsx index dfef7ca..11efbd7 100644 --- a/src/renderer/components/modal/swap/pages/init/InitPage.tsx +++ b/src/renderer/components/modal/swap/pages/init/InitPage.tsx @@ -1,4 +1,4 @@ -import { Box, DialogContentText, makeStyles } from '@material-ui/core'; +import { Box, DialogContentText, makeStyles, Paper, Tab, Tabs, Typography } from '@material-ui/core'; import { useState } from 'react'; import BitcoinAddressTextField from 'renderer/components/inputs/BitcoinAddressTextField'; import MoneroAddressTextField from 'renderer/components/inputs/MoneroAddressTextField'; @@ -13,14 +13,19 @@ const useStyles = makeStyles((theme) => ({ marginTop: theme.spacing(1), }, fieldsOuter: { + paddingTop: theme.spacing(1), display: 'flex', flexDirection: 'column', - gap: theme.spacing(2), + gap: theme.spacing(1), }, })); export default function InitPage() { + const selectedProvider = useAppSelector( + (state) => state.providers.selectedProvider, + ); const classes = useStyles(); + const [redeemAddress, setRedeemAddress] = useState( isTestnet() && process.env.TESTNET_AUTOFILL_XMR_ADDRESS ? process.env.TESTNET_AUTOFILL_XMR_ADDRESS @@ -33,54 +38,65 @@ export default function InitPage() { ); const [redeemAddressValid, setRedeemAddressValid] = useState(false); const [refundAddressValid, setRefundAddressValid] = useState(false); - const selectedProvider = useAppSelector( - (state) => state.providers.selectedProvider, - ); + const [useExternalRefundAddress, setUseExternalRefundAddress] = useState(false); return ( - - Please specify the address to which the Monero should be sent upon - completion of the swap and the address for receiving a Bitcoin refund if - the swap fails. - - - + + setUseExternalRefundAddress(newValue === 1)}> + + + + + { + useExternalRefundAddress ? ( + + ) : ( + + In case something goes wrong, the Bitcoin will be refunded to the internal Bitcoin wallet of the GUI. You can then withdraw them from there or use them for another swap directly. + + ) + } + + + + + } + ipcChannel="spawn-buy-xmr" + ipcArgs={[selectedProvider, redeemAddress, useExternalRefundAddress ? refundAddress : null]} + displayErrorSnackbar={false} + > + Request quote and start swap + - - } - ipcChannel="spawn-buy-xmr" - ipcArgs={[selectedProvider, redeemAddress, refundAddress]} - displayErrorSnackbar={false} - > - Start swap - ); }