packages/oo7-substrate/src/pretty.js
const { ss58Encode } = require('./ss58')
const { bytesToHex } = require('./utils')
const { VecU8, AccountId, Hash, SlashPreference, VoteThreshold, Moment, Balance, BlockNumber, AccountIndex, Tuple, reviver } = require('./types')
const { denominationInfo } = require('./denominationInfo')
const numberWithCommas = n => {
let x = n.toString();
if (x.indexOf('.') > -1) {
let [a, b] = x.split('.');
return numberWithCommas(a) + '.' + b;
} else {
return x.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
}
//TODO: AccountIndex
function pretty(expr) {
if (expr === null) {
return 'null';
}
if (expr instanceof VoteThreshold) {
return 'VoteThreshold.' + expr;
}
if (expr instanceof SlashPreference) {
return 'SlashPreference{unstake_threshold=' + expr + '}';
}
if (expr instanceof Balance) {
let di = denominationInfo
let denomincationSearch = [di.primary, Object.keys(di.denominations)]
let unit = null
let dp = 0
for (ii in denomincationSearch) {
let i = denomincationSearch[ii]
let denom = di.denominations[i]
let divisor = Math.pow(10, denom)
let lower = divisor / 30
let upper = divisor * 30000
if (expr > lower && expr < upper) {
unit = i
expr /= divisor
for (; expr < 3000 / Math.pow(10, dp); dp++) {}
break;
}
}
if (unit === null) {
// default
if (expr < Math.pow(10, di.denominations[di.primary]) / 30 && expr !== 0) {
unit = di.unit
} else {
unit = di.primary
expr /= Math.pow(10, di.denominations[unit])
expr = Math.round(expr)
}
}
return numberWithCommas(Math.round(expr * Math.pow(10, dp)) / Math.pow(10, dp)) + ' ' + unit
}
if (expr instanceof BlockNumber) {
return numberWithCommas(expr);
}
if (expr instanceof Hash) {
return '0x' + bytesToHex(expr);
}
if (expr instanceof Moment) {
return expr.toLocaleString() + " (" + expr.number + " seconds)";
}
if (expr instanceof AccountId) {
return ss58Encode(expr);
}
if (expr instanceof Tuple) {
return '(' + expr.map(pretty).join(', ') + ')';
}
if (expr instanceof VecU8 || expr instanceof Uint8Array) {
if (expr.length <= 256) {
return '[' + bytesToHex(expr) + ']';
} else {
return `[${bytesToHex(expr.slice(0, 256))}...] (${expr.length} bytes)`;
}
}
if (expr instanceof Array) {
return '[' + expr.map(pretty).join(', ') + ']';
}
if (typeof expr === 'object') {
return '{' + Object.keys(expr).map(k => k + ': ' + pretty(expr[k])).join(', ') + '}';
}
return '' + expr;
}
module.exports = { pretty };