Files
koin_ping_0.2.0/backend/shared/weiConverter.js
2026-02-27 09:58:18 -05:00

96 lines
2.3 KiB
JavaScript

const WEI_PER_ETH = 1000000000000000000n; // 10^18 Wei = 1 ETH
/**
* Convert Wei (as string) to ETH (as number)
* Use for display purposes only, not for calculations
* @param {string} weiString - Wei value as string
* @returns {number} ETH value as number
*/
export function weiToEth(weiString) {
if (!weiString || weiString === '0') {
return 0;
}
try {
const wei = BigInt(weiString);
// Convert to number (safe for display values)
return Number(wei) / Number(WEI_PER_ETH);
} catch (error) {
throw new Error(`Invalid Wei value: ${weiString}`);
}
}
/**
* Convert ETH (as number) to Wei (as string)
* Use when converting DB thresholds for comparison
* @param {number} eth - ETH value as number
* @returns {string} Wei value as string
*/
export function ethToWei(eth) {
if (typeof eth !== 'number' || isNaN(eth)) {
throw new Error(`Invalid ETH value: ${eth}`);
}
if (eth === 0) {
return '0';
}
// Convert to string with fixed precision to avoid floating point issues
const ethString = eth.toFixed(18); // Max precision
const [whole, decimal = ''] = ethString.split('.');
const wholePart = BigInt(whole) * WEI_PER_ETH;
const decimalPart = BigInt(decimal.padEnd(18, '0'));
return (wholePart + decimalPart).toString();
}
/**
* Compare two Wei values
* @param {string} weiA
* @param {string} weiB
* @returns {number}
*/
export function compareWei(weiA, weiB) {
const a = BigInt(weiA);
const b = BigInt(weiB);
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
/**
* Check if Wei value A is greater than or equal to Wei value B
* @param {string} weiA - First Wei value as string
* @param {string} weiB - Second Wei value as string
* @returns {boolean}
*/
export function weiGreaterThanOrEqual(weiA, weiB) {
return BigInt(weiA) >= BigInt(weiB);
}
/**
* Check if Wei value A is less than Wei value B
* @param {string} weiA
* @param {string} weiB
* @returns {boolean}
*/
export function weiLessThan(weiA, weiB) {
return BigInt(weiA) < BigInt(weiB);
}
/**
* @param {string} weiString
* @param {number} decimals - Number of decimal places (default: 4)
* @returns {string}
*/
export function formatWeiAsEth(weiString, decimals = 4) {
const eth = weiToEth(weiString);
return `${eth.toFixed(decimals)} ETH`;
}