// calculate balances after inflation, returns total doled coins function calcInflation(accountObjects, accNum, pool_fee, total_coins){ for(var n=0; n<accNum; n++) accountObjects[n].votes = 0; for ( var n = 0; n < accNum; n++ ) { accountObjects[accountObjects[n].voteForIndex].votes += parseInt( bigint.bigInt2str( accountObjects[n].targetBalance, 10 ) ); } var winningAccountsNum = 0; var winningAccounts = []; var minVotes = INFLATION_WIN_MIN_VOTES*DUST_MULTIPLIER; var sortedAccounts = accountObjects.slice().sort( function(a,b){return b.votes - a.votes} ); for(var n=0; n<accNum && winningAccountsNum<INFLATION_NUM_WINNERS; n++){ if( sortedAccounts[n].votes > minVotes ) { winningAccounts[winningAccountsNum++] = sortedAccounts[n]; } else break; } //no account over min threshold if(winningAccountsNum == 0) for(var n=0; n<accNum && winningAccountsNum<INFLATION_NUM_WINNERS; n++){ winningAccounts[winningAccountsNum++] = sortedAccounts[n]; } //console.log("winning accounts: "+winningAccountsNum); var winBasis = 0; for(var n=0; n<winningAccountsNum; n++){ winBasis += winningAccounts[n].votes; } var bnWinBasis = bigint.str2bigInt(winBasis.toString(), 10); //var totalFees = tx_fee*accNum*2; var coinsToDole = ( DUST_MULTIPLIER * total_coins - pool_fee ) * INFLATION_RATE; var prizePool = bigint.str2bigInt( Math.floor( coinsToDole + pool_fee ).toString(), 10 ); var totalDoledCoins = bigint.int2bigInt(0, INT_SIZE_BITS, 0); //console.log( " total_coins: " + total_coins + " poolFee:" + pool_fee + " toDole:" + Math.floor( coinsToDole + pool_fee ).toString() ); for(var n=0; n<winningAccountsNum; n++){ var votes = bigint.str2bigInt( winningAccounts[n].votes.toString(), 10 ); var prod = bigint.mult( votes, prizePool); var res = bigint.dup(prod); var reminder = bigint.dup(prod); bigint.divide_( prod , bnWinBasis, res, reminder); winningAccounts[n].targetBalance = bigint.add(winningAccounts[n].targetBalance, res); totalDoledCoins = bigint.add(totalDoledCoins, res); } return parseInt( bigint.bigInt2str(totalDoledCoins,10) )/DUST_MULTIPLIER; }
Problem20.prototype.factorial = function (n) { var bn = BigInt.int2bigInt(n, 0, 0); var result = BigInt.int2bigInt(1,0,0); if ( BigInt.equalsInt(bn, 1) ) { return BigInt.int2bigInt(1,0,0); } else { while ( n != 1 ) { result = BigInt.mult(result, bn); n--; bn=BigInt.int2bigInt(n,0,0); } } return result; }
// make initial test accounts, calculate first inflation function makeTestAccounts(accNum, accBalanceFun, accVoteFun, tx_fee){ var accountObjects=[]; for(var n=0; n<accNum; n++) { var bnBalance = bigint.int2bigInt(accBalanceFun(n), INT_SIZE_BITS, 0); bnBalance = bigint.mult(bnBalance, bigint.int2bigInt(DUST_MULTIPLIER, INT_SIZE_BITS, 0)); var bnTargetBalance = bigint.sub(bnBalance,bigint.int2bigInt(tx_fee, INT_SIZE_BITS, 0)); accountObjects[n]={ name:''+n, targetBalance: bnTargetBalance , voteFor:''+accVoteFun(n)}; accountObjects[n].balance=''+bigint.bigInt2str(bnBalance,10); //accountObjects[n].balanceInt=parseInt(accountObjects[n].balance); accountObjects[n].votes = 0; } var totalFees = tx_fee*accNum*2; var doledCoins = calcInflation(accountObjects, accNum, totalFees, TOTAL_COINS); var newTotalCoins = TOTAL_COINS + doledCoins - totalFees/DUST_MULTIPLIER; return {accountObjects:accountObjects, totalCoins: newTotalCoins}; };