@bzxnetwork/portal
Version:
Frontend demo portal for bZx
133 lines (125 loc) • 4.29 kB
JSX
import styled from "styled-components";
import Dialog from "@material-ui/core/Dialog";
import DialogContent from "@material-ui/core/DialogContent";
import DialogTitle from "@material-ui/core/DialogTitle";
import Input from "@material-ui/core/Input";
import InputLabel from "@material-ui/core/InputLabel";
import InputAdornment from "@material-ui/core/InputAdornment";
import FormControl from "@material-ui/core/FormControl";
import Button from "@material-ui/core/Button";
import { toBigNumber } from "../common/utils";
const TxHashLink = styled.a.attrs({
target: `_blank`,
rel: `noopener noreferrer`
})`
font-family: monospace;
display: block;
text-overflow: ellipsis;
overflow: auto;
}
`;
export default class WithdrawCollateralDialog extends React.Component {
state = { amount: `` };
setAmount = e => this.setState({ amount: e.target.value });
withdrawCollateral = async () => {
const { bZx, accounts, web3, loanOrderHash, collateralToken } = this.props;
const txOpts = {
from: accounts[0],
gas: 2000000,
gasPrice: window.defaultGasPrice.toString()
};
if (bZx.portalProviderName !== `MetaMask`) {
alert(`Please confirm this transaction on your device.`);
}
console.log(this.state.amount);
const txObj = await bZx.withdrawCollateral({
loanOrderHash,
withdrawAmount: toBigNumber(
this.state.amount,
10 ** collateralToken.decimals
),
getObject: true,
txOpts
});
console.log(txOpts);
try {
await txObj
.estimateGas(txOpts)
.then(gas => {
console.log(gas);
txOpts.gas = window.gasValue(gas);
txObj
.send(txOpts)
.once(`transactionHash`, hash => {
alert(`Transaction submitted, transaction hash:`, {
component: () => (
<TxHashLink href={`${bZx.etherscanURL}tx/${hash}`}>
{hash}
</TxHashLink>
)
});
})
.then(() => {
alert(`Execution complete.`);
this.props.onClose();
})
.catch(error => {
console.error(error);
alert(
`We were not able to execute your transaction at this time.`
);
this.props.onClose();
});
})
.catch(error => {
console.error(error);
alert(`The transaction is failing. Please try again later.`);
this.props.onClose();
});
} catch (error) {
console.error(error);
alert(`The transaction is failing. Please try again later.`);
this.props.onClose();
}
};
render() {
const { collateralToken, collateralExcess } = this.props;
return (
<Dialog open={this.props.open} onClose={this.props.onClose}>
<DialogTitle>Withdraw Collateral</DialogTitle>
<DialogContent>
<p>
If the value of your collateral is above the initial margin amount,
you may choose to withdraw some of the excess amount. If you specify too much,
only the excess is withdrawn. If the transaction is failing, your current margin
may already be at or below the initial margin amount.
<br/><br/>
Current Excess: {collateralExcess ? `${collateralExcess}` : `0`} {collateralToken.symbol}
</p>
<FormControl margin="normal" fullWidth>
<InputLabel>Amount to withdraw</InputLabel>
<Input
value={this.state.amount}
type="number"
onChange={this.setAmount}
endAdornment={
<InputAdornment position="end">
{collateralToken.symbol}
</InputAdornment>
}
/>
</FormControl>
<br />
<Button
onClick={this.withdrawCollateral}
variant="raised"
color="primary"
fullWidth
>
Withdraw
</Button>
</DialogContent>
</Dialog>
);
}
}