// 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;
    }
Beispiel #2
0
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};
    };