contract UpdatableRateCrowdsale is AdminRole, Crowdsale {
    using Votings for Votings.Voting;

    // Current vote processes
    Votings.Voting private _votings;

    /**
     * @dev require (N/2)+1 admins to be agreed with the proposal
     * @param rate New conversion rate
     * @return do (N/2)+1 admins agreed with the proposal?
     */
    function consensus(uint256 rate) private returns (bool) {
        return _votings.voteAndCheck(Helpers.idFromUint256(rate), msg.sender, Helpers.majority(countAdmins()));
    }

    /**
     * @dev Vote and apply new conversion rates after consensus
     */
    function changeRate(uint256 rate) AdminOnly public {
        if (consensus(rate)) {
            _changeRate(rate);
        }
    }
}
function consensus(uint256 rate) private returns (bool) {
    return _votings.voteAndCheck(Helpers.idFromUint256(rate), msg.sender, Helpers.majority(countAdmins()));
}

/**
 * @dev require (N/2)+1 admins to be agreed with the proposal
 * @param rate New conversion rate
 * @return do (N/2)+1 admins agreed with the proposal?
 */