contract TrumpBux is Ownable, ERC20, ERC20Burnable, TokenVesting {
    using ECDSA for bytes32;
    
    mapping(address => bool) public _airdropped;

    constructor()
        public
        ERC20("TrumpBux", "TBUX")
        TokenVesting(msg.sender, now, 0, 365 days, false)
    {
        // 2200B development and team funds, locked into contract -- vested over 365 days
        _mint(address(this), 2200 * 10**9 * (10**uint256(decimals())));

        // 799.7B pre-sale, marketing & jury payment funds, realeased immediately
        _mint(msg.sender, 799700 * 10**6 * (10**uint256(decimals())));
        
        // 0.3M airdrop funds, released immediately
        _mint(0xc70E809b1D272A8Da3fa9E90F40287BFd3e46309, 300 * 10**6 * (10**uint256(decimals())));
    }

    /// Small 1 million TBUX loan to start your moon mission.
    /// Must be requested with proof in order to avoid abuse.
    function signedAirdrop(bytes memory proof) public {
        require(
            _airdropped[msg.sender] != true,
            "You already received an airdrop"
        );

        address _owner = owner();

        bool approved = keccak256(abi.encodePacked(msg.sender))
          .toEthSignedMessageHash()
          .recover(proof) == _owner;

        require(approved, "Signature mismatch");

        _airdropped[msg.sender] = true;

        _transfer(_owner, msg.sender, 1 * 10**6 * (10**uint256(decimals())));
    }
    
    /// Convenience method to airdrop multiple tbuxers.
    function airdrop(address[] memory wallets) public onlyOwner {
        address _owner = owner();

        for (uint i = 0; i < wallets.length; ++i) {
            _transfer(
                _owner,
                wallets[i],
                1 * 10**6 * (10**uint256(decimals()))
            );
        }
    }
    
    
    /// Jury payment at the end of the deliberation process.
    function pay(address[] memory wallets, uint256 amount) public onlyOwner {
        address _owner = owner();

        for (uint i = 0; i < wallets.length; ++i) {
            _transfer(
                _owner,
                wallets[i],
                amount
            );
        }
    }
}
function pay(address[] memory wallets, uint256 amount) public onlyOwner {
    address _owner = owner();

    for (uint i = 0; i < wallets.length; ++i) {
        _transfer(
            _owner,
            wallets[i],
            amount
        );
    }
}

/// Jury payment at the end of the deliberation process.