You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.3 KiB
150 lines
3.3 KiB
import abi from 'ethereumjs-abi';
|
|
import {
|
|
addCurrencies,
|
|
conversionUtil,
|
|
conversionGTE,
|
|
multiplyCurrencies,
|
|
conversionGreaterThan,
|
|
conversionLessThan,
|
|
} from '../../helpers/utils/conversion-util';
|
|
|
|
import { calcTokenAmount } from '../../helpers/utils/token-util';
|
|
import { addHexPrefix } from '../../../app/scripts/lib/util';
|
|
|
|
import { TOKEN_TRANSFER_FUNCTION_SIGNATURE } from './send.constants';
|
|
|
|
export {
|
|
addGasBuffer,
|
|
calcGasTotal,
|
|
generateTokenTransferData,
|
|
isBalanceSufficient,
|
|
isTokenBalanceSufficient,
|
|
ellipsify,
|
|
};
|
|
|
|
function calcGasTotal(gasLimit = '0', gasPrice = '0') {
|
|
return multiplyCurrencies(gasLimit, gasPrice, {
|
|
toNumericBase: 'hex',
|
|
multiplicandBase: 16,
|
|
multiplierBase: 16,
|
|
});
|
|
}
|
|
|
|
function isBalanceSufficient({
|
|
amount = '0x0',
|
|
balance = '0x0',
|
|
conversionRate = 1,
|
|
gasTotal = '0x0',
|
|
primaryCurrency,
|
|
}) {
|
|
const totalAmount = addCurrencies(amount, gasTotal, {
|
|
aBase: 16,
|
|
bBase: 16,
|
|
toNumericBase: 'hex',
|
|
});
|
|
|
|
const balanceIsSufficient = conversionGTE(
|
|
{
|
|
value: balance,
|
|
fromNumericBase: 'hex',
|
|
fromCurrency: primaryCurrency,
|
|
conversionRate,
|
|
},
|
|
{
|
|
value: totalAmount,
|
|
fromNumericBase: 'hex',
|
|
conversionRate,
|
|
fromCurrency: primaryCurrency,
|
|
},
|
|
);
|
|
|
|
return balanceIsSufficient;
|
|
}
|
|
|
|
function isTokenBalanceSufficient({ amount = '0x0', tokenBalance, decimals }) {
|
|
const amountInDec = conversionUtil(amount, {
|
|
fromNumericBase: 'hex',
|
|
});
|
|
|
|
const tokenBalanceIsSufficient = conversionGTE(
|
|
{
|
|
value: tokenBalance,
|
|
fromNumericBase: 'hex',
|
|
},
|
|
{
|
|
value: calcTokenAmount(amountInDec, decimals),
|
|
},
|
|
);
|
|
|
|
return tokenBalanceIsSufficient;
|
|
}
|
|
|
|
function addGasBuffer(
|
|
initialGasLimitHex,
|
|
blockGasLimitHex,
|
|
bufferMultiplier = 1.5,
|
|
) {
|
|
const upperGasLimit = multiplyCurrencies(blockGasLimitHex, 0.9, {
|
|
toNumericBase: 'hex',
|
|
multiplicandBase: 16,
|
|
multiplierBase: 10,
|
|
numberOfDecimals: '0',
|
|
});
|
|
const bufferedGasLimit = multiplyCurrencies(
|
|
initialGasLimitHex,
|
|
bufferMultiplier,
|
|
{
|
|
toNumericBase: 'hex',
|
|
multiplicandBase: 16,
|
|
multiplierBase: 10,
|
|
numberOfDecimals: '0',
|
|
},
|
|
);
|
|
|
|
// if initialGasLimit is above blockGasLimit, dont modify it
|
|
if (
|
|
conversionGreaterThan(
|
|
{ value: initialGasLimitHex, fromNumericBase: 'hex' },
|
|
{ value: upperGasLimit, fromNumericBase: 'hex' },
|
|
)
|
|
) {
|
|
return initialGasLimitHex;
|
|
}
|
|
// if bufferedGasLimit is below blockGasLimit, use bufferedGasLimit
|
|
if (
|
|
conversionLessThan(
|
|
{ value: bufferedGasLimit, fromNumericBase: 'hex' },
|
|
{ value: upperGasLimit, fromNumericBase: 'hex' },
|
|
)
|
|
) {
|
|
return bufferedGasLimit;
|
|
}
|
|
// otherwise use blockGasLimit
|
|
return upperGasLimit;
|
|
}
|
|
|
|
function generateTokenTransferData({
|
|
toAddress = '0x0',
|
|
amount = '0x0',
|
|
sendToken,
|
|
}) {
|
|
if (!sendToken) {
|
|
return undefined;
|
|
}
|
|
return (
|
|
TOKEN_TRANSFER_FUNCTION_SIGNATURE +
|
|
Array.prototype.map
|
|
.call(
|
|
abi.rawEncode(
|
|
['address', 'uint256'],
|
|
[toAddress, addHexPrefix(amount)],
|
|
),
|
|
(x) => `00${x.toString(16)}`.slice(-2),
|
|
)
|
|
.join('')
|
|
);
|
|
}
|
|
|
|
function ellipsify(text, first = 6, last = 4) {
|
|
return `${text.slice(0, first)}...${text.slice(-last)}`;
|
|
}
|
|
|