MyCrypto/common/sagas/transaction/sendEverything.ts

68 lines
2.3 KiB
TypeScript

import { SagaIterator } from 'redux-saga';
import { apply, put, select, takeEvery } from 'redux-saga/effects';
import {
sendEverythingFailed,
TypeKeys as TK,
setValueField,
setTokenValue,
sendEverythingSucceeded
} from 'actions/transaction';
import { showNotification } from 'actions/notifications';
import {
isEtherTransaction,
getTransaction,
IGetTransaction,
getDecimal
} from 'selectors/transaction';
import { getEtherBalance, getCurrentBalance } from 'selectors/wallet';
import { AppState } from 'reducers';
import { fromTokenBase, fromWei, Wei, TokenValue } from 'libs/units';
export function* handleSendEverything(): SagaIterator {
const { transaction }: IGetTransaction = yield select(getTransaction);
const currentBalance: Wei | TokenValue | null = yield select(getCurrentBalance);
const etherBalance: AppState['wallet']['balance']['wei'] = yield select(getEtherBalance);
if (!etherBalance || !currentBalance) {
return yield put(sendEverythingFailed());
}
transaction.value = Buffer.from([]);
const etherTransaction: boolean = yield select(isEtherTransaction);
const setter = etherTransaction ? setValueField : setTokenValue;
// set transaction value to 0 so it's not calculated in the upfrontcost
const totalCost: Wei = yield apply(transaction, transaction.getUpfrontCost);
if (totalCost.gt(etherBalance)) {
// Dust amount is too small
yield put(
showNotification(
'warning',
`The cost of gas is higher than your balance:
Total cost: ${totalCost} >
Your Ether balance: ${etherBalance}`
)
);
yield put(sendEverythingFailed());
return yield put(setter({ raw: '0', value: null }));
}
if (etherTransaction) {
const remainder = currentBalance.sub(totalCost);
const rawVersion = fromWei(remainder, 'ether');
yield put(setter({ raw: rawVersion, value: remainder }));
yield put(sendEverythingSucceeded());
} else {
// else we just max out the token value
const decimal: number = yield select(getDecimal);
const rawVersion = fromTokenBase(currentBalance, decimal);
yield put(setter({ raw: rawVersion, value: currentBalance }));
yield put(sendEverythingSucceeded());
}
}
export const sendEverything = [takeEvery(TK.SEND_EVERYTHING_REQUESTED, handleSendEverything)];