ETH Price: $2,497.93 (-2.24%)

Transaction Decoder

Block:
22293589 at Apr-18-2025 04:46:59 AM +UTC
Transaction Fee:
0.000058885172685693 ETH $0.15
Gas Used:
69,991 Gas / 0.841324923 Gwei

Emitted Events:

95 LQTYStaking.StakerSnapshotsUpdated( _staker=[Sender] 0xf1ecc163903fb69cce46d408e171c89eb7ca1899, _F_ETH=185008531450035, _F_LUSD=601242259915761511143 )
96 LQTYStaking.StakingGainsWithdrawn( staker=[Sender] 0xf1ecc163903fb69cce46d408e171c89eb7ca1899, LUSDGain=4559757426235699106490, ETHGain=380392879635060158 )
97 LUSDToken.Transfer( from=[Receiver] LQTYStaking, to=[Sender] 0xf1ecc163903fb69cce46d408e171c89eb7ca1899, value=4559757426235699106490 )
98 LQTYStaking.EtherSent( _account=[Sender] 0xf1ecc163903fb69cce46d408e171c89eb7ca1899, _amount=380392879635060158 )

Account State Difference:

  Address   Before After State Difference Code
(Titan Builder)
14.060182776507096495 Eth14.060217772007096495 Eth0.0000349955
0x4f9Fbb3f...A76Fc605d
(Liquity: LQTY Staking)
122.59315796243131252 Eth122.212765082796252362 Eth0.380392879635060158
0x5f98805A...8C6568bA0
0xf1Ecc163...EB7Ca1899
0.0975363118967859 Eth
Nonce: 475
0.477870306359160365 Eth
Nonce: 476
0.380333994462374465

Execution Trace

LQTYStaking.unstake( _LQTYamount=0 )
  • LUSDToken.transfer( recipient=0xf1Ecc163903FB69Cce46D408E171C89EB7Ca1899, amount=4559757426235699106490 ) => ( True )
  • ETH 0.380392879635060158 0xf1ecc163903fb69cce46d408e171c89eb7ca1899.CALL( )
    File 1 of 2: LQTYStaking
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    import "../Dependencies/BaseMath.sol";
    import "../Dependencies/SafeMath.sol";
    import "../Dependencies/Ownable.sol";
    import "../Dependencies/CheckContract.sol";
    import "../Dependencies/console.sol";
    import "../Interfaces/ILQTYToken.sol";
    import "../Interfaces/ILQTYStaking.sol";
    import "../Dependencies/LiquityMath.sol";
    import "../Interfaces/ILUSDToken.sol";
    contract LQTYStaking is ILQTYStaking, Ownable, CheckContract, BaseMath {
        using SafeMath for uint;
        // --- Data ---
        string constant public NAME = "LQTYStaking";
        mapping( address => uint) public stakes;
        uint public totalLQTYStaked;
        uint public F_ETH;  // Running sum of ETH fees per-LQTY-staked
        uint public F_LUSD; // Running sum of LQTY fees per-LQTY-staked
        // User snapshots of F_ETH and F_LUSD, taken at the point at which their latest deposit was made
        mapping (address => Snapshot) public snapshots; 
        struct Snapshot {
            uint F_ETH_Snapshot;
            uint F_LUSD_Snapshot;
        }
        
        ILQTYToken public lqtyToken;
        ILUSDToken public lusdToken;
        address public troveManagerAddress;
        address public borrowerOperationsAddress;
        address public activePoolAddress;
        // --- Events ---
        event LQTYTokenAddressSet(address _lqtyTokenAddress);
        event LUSDTokenAddressSet(address _lusdTokenAddress);
        event TroveManagerAddressSet(address _troveManager);
        event BorrowerOperationsAddressSet(address _borrowerOperationsAddress);
        event ActivePoolAddressSet(address _activePoolAddress);
        event StakeChanged(address indexed staker, uint newStake);
        event StakingGainsWithdrawn(address indexed staker, uint LUSDGain, uint ETHGain);
        event F_ETHUpdated(uint _F_ETH);
        event F_LUSDUpdated(uint _F_LUSD);
        event TotalLQTYStakedUpdated(uint _totalLQTYStaked);
        event EtherSent(address _account, uint _amount);
        event StakerSnapshotsUpdated(address _staker, uint _F_ETH, uint _F_LUSD);
        // --- Functions ---
        function setAddresses
        (
            address _lqtyTokenAddress,
            address _lusdTokenAddress,
            address _troveManagerAddress, 
            address _borrowerOperationsAddress,
            address _activePoolAddress
        ) 
            external 
            onlyOwner 
            override 
        {
            checkContract(_lqtyTokenAddress);
            checkContract(_lusdTokenAddress);
            checkContract(_troveManagerAddress);
            checkContract(_borrowerOperationsAddress);
            checkContract(_activePoolAddress);
            lqtyToken = ILQTYToken(_lqtyTokenAddress);
            lusdToken = ILUSDToken(_lusdTokenAddress);
            troveManagerAddress = _troveManagerAddress;
            borrowerOperationsAddress = _borrowerOperationsAddress;
            activePoolAddress = _activePoolAddress;
            emit LQTYTokenAddressSet(_lqtyTokenAddress);
            emit LQTYTokenAddressSet(_lusdTokenAddress);
            emit TroveManagerAddressSet(_troveManagerAddress);
            emit BorrowerOperationsAddressSet(_borrowerOperationsAddress);
            emit ActivePoolAddressSet(_activePoolAddress);
            _renounceOwnership();
        }
        // If caller has a pre-existing stake, send any accumulated ETH and LUSD gains to them. 
        function stake(uint _LQTYamount) external override {
            _requireNonZeroAmount(_LQTYamount);
            uint currentStake = stakes[msg.sender];
            uint ETHGain;
            uint LUSDGain;
            // Grab any accumulated ETH and LUSD gains from the current stake
            if (currentStake != 0) {
                ETHGain = _getPendingETHGain(msg.sender);
                LUSDGain = _getPendingLUSDGain(msg.sender);
            }
        
           _updateUserSnapshots(msg.sender);
            uint newStake = currentStake.add(_LQTYamount);
            // Increase user’s stake and total LQTY staked
            stakes[msg.sender] = newStake;
            totalLQTYStaked = totalLQTYStaked.add(_LQTYamount);
            emit TotalLQTYStakedUpdated(totalLQTYStaked);
            // Transfer LQTY from caller to this contract
            lqtyToken.sendToLQTYStaking(msg.sender, _LQTYamount);
            emit StakeChanged(msg.sender, newStake);
            emit StakingGainsWithdrawn(msg.sender, LUSDGain, ETHGain);
             // Send accumulated LUSD and ETH gains to the caller
            if (currentStake != 0) {
                lusdToken.transfer(msg.sender, LUSDGain);
                _sendETHGainToUser(ETHGain);
            }
        }
        // Unstake the LQTY and send the it back to the caller, along with their accumulated LUSD & ETH gains. 
        // If requested amount > stake, send their entire stake.
        function unstake(uint _LQTYamount) external override {
            uint currentStake = stakes[msg.sender];
            _requireUserHasStake(currentStake);
            // Grab any accumulated ETH and LUSD gains from the current stake
            uint ETHGain = _getPendingETHGain(msg.sender);
            uint LUSDGain = _getPendingLUSDGain(msg.sender);
            
            _updateUserSnapshots(msg.sender);
            if (_LQTYamount > 0) {
                uint LQTYToWithdraw = LiquityMath._min(_LQTYamount, currentStake);
                uint newStake = currentStake.sub(LQTYToWithdraw);
                // Decrease user's stake and total LQTY staked
                stakes[msg.sender] = newStake;
                totalLQTYStaked = totalLQTYStaked.sub(LQTYToWithdraw);
                emit TotalLQTYStakedUpdated(totalLQTYStaked);
                // Transfer unstaked LQTY to user
                lqtyToken.transfer(msg.sender, LQTYToWithdraw);
                emit StakeChanged(msg.sender, newStake);
            }
            emit StakingGainsWithdrawn(msg.sender, LUSDGain, ETHGain);
            // Send accumulated LUSD and ETH gains to the caller
            lusdToken.transfer(msg.sender, LUSDGain);
            _sendETHGainToUser(ETHGain);
        }
        // --- Reward-per-unit-staked increase functions. Called by Liquity core contracts ---
        function increaseF_ETH(uint _ETHFee) external override {
            _requireCallerIsTroveManager();
            uint ETHFeePerLQTYStaked;
         
            if (totalLQTYStaked > 0) {ETHFeePerLQTYStaked = _ETHFee.mul(DECIMAL_PRECISION).div(totalLQTYStaked);}
            F_ETH = F_ETH.add(ETHFeePerLQTYStaked); 
            emit F_ETHUpdated(F_ETH);
        }
        function increaseF_LUSD(uint _LUSDFee) external override {
            _requireCallerIsBorrowerOperations();
            uint LUSDFeePerLQTYStaked;
            
            if (totalLQTYStaked > 0) {LUSDFeePerLQTYStaked = _LUSDFee.mul(DECIMAL_PRECISION).div(totalLQTYStaked);}
            
            F_LUSD = F_LUSD.add(LUSDFeePerLQTYStaked);
            emit F_LUSDUpdated(F_LUSD);
        }
        // --- Pending reward functions ---
        function getPendingETHGain(address _user) external view override returns (uint) {
            return _getPendingETHGain(_user);
        }
        function _getPendingETHGain(address _user) internal view returns (uint) {
            uint F_ETH_Snapshot = snapshots[_user].F_ETH_Snapshot;
            uint ETHGain = stakes[_user].mul(F_ETH.sub(F_ETH_Snapshot)).div(DECIMAL_PRECISION);
            return ETHGain;
        }
        function getPendingLUSDGain(address _user) external view override returns (uint) {
            return _getPendingLUSDGain(_user);
        }
        function _getPendingLUSDGain(address _user) internal view returns (uint) {
            uint F_LUSD_Snapshot = snapshots[_user].F_LUSD_Snapshot;
            uint LUSDGain = stakes[_user].mul(F_LUSD.sub(F_LUSD_Snapshot)).div(DECIMAL_PRECISION);
            return LUSDGain;
        }
        // --- Internal helper functions ---
        function _updateUserSnapshots(address _user) internal {
            snapshots[_user].F_ETH_Snapshot = F_ETH;
            snapshots[_user].F_LUSD_Snapshot = F_LUSD;
            emit StakerSnapshotsUpdated(_user, F_ETH, F_LUSD);
        }
        function _sendETHGainToUser(uint ETHGain) internal {
            emit EtherSent(msg.sender, ETHGain);
            (bool success, ) = msg.sender.call{value: ETHGain}("");
            require(success, "LQTYStaking: Failed to send accumulated ETHGain");
        }
        // --- 'require' functions ---
        function _requireCallerIsTroveManager() internal view {
            require(msg.sender == troveManagerAddress, "LQTYStaking: caller is not TroveM");
        }
        function _requireCallerIsBorrowerOperations() internal view {
            require(msg.sender == borrowerOperationsAddress, "LQTYStaking: caller is not BorrowerOps");
        }
         function _requireCallerIsActivePool() internal view {
            require(msg.sender == activePoolAddress, "LQTYStaking: caller is not ActivePool");
        }
        function _requireUserHasStake(uint currentStake) internal pure {  
            require(currentStake > 0, 'LQTYStaking: User must have a non-zero stake');  
        }
        function _requireNonZeroAmount(uint _amount) internal pure {
            require(_amount > 0, 'LQTYStaking: Amount must be non-zero');
        }
        receive() external payable {
            _requireCallerIsActivePool();
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    contract BaseMath {
        uint constant public DECIMAL_PRECISION = 1e18;
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * Based on OpenZeppelin's SafeMath:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
     *
     * @dev Wrappers over Solidity's arithmetic operations with added overflow
     * checks.
     *
     * Arithmetic operations in Solidity wrap on overflow. This can easily result
     * in bugs, because programmers usually assume that an overflow raises an
     * error, which is the standard behavior in high level programming languages.
     * `SafeMath` restores this intuition by reverting the transaction when an
     * operation overflows.
     *
     * Using this library instead of the unchecked operations eliminates an entire
     * class of bugs, so it's recommended to use it always.
     */
    library SafeMath {
        /**
         * @dev Returns the addition of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `+` operator.
         *
         * Requirements:
         * - Addition cannot overflow.
         */
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
            return c;
        }
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         * - Subtraction cannot overflow.
         */
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return sub(a, b, "SafeMath: subtraction overflow");
        }
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         * - Subtraction cannot overflow.
         *
         * _Available since v2.4.0._
         */
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            uint256 c = a - b;
            return c;
        }
        /**
         * @dev Returns the multiplication of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `*` operator.
         *
         * Requirements:
         * - Multiplication cannot overflow.
         */
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) {
                return 0;
            }
            uint256 c = a * b;
            require(c / a == b, "SafeMath: multiplication overflow");
            return c;
        }
        /**
         * @dev Returns the integer division of two unsigned integers. Reverts on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            return div(a, b, "SafeMath: division by zero");
        }
        /**
         * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         *
         * _Available since v2.4.0._
         */
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            // Solidity only automatically asserts when dividing by 0
            require(b > 0, errorMessage);
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
            return c;
        }
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * Reverts when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            return mod(a, b, "SafeMath: modulo by zero");
        }
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * Reverts with custom message when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         *
         * _Available since v2.4.0._
         */
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b != 0, errorMessage);
            return a % b;
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * Based on OpenZeppelin's Ownable contract:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
     *
     * @dev Contract module which provides a basic access control mechanism, where
     * there is an account (an owner) that can be granted exclusive access to
     * specific functions.
     *
     * This module is used through inheritance. It will make available the modifier
     * `onlyOwner`, which can be applied to your functions to restrict their use to
     * the owner.
     */
    contract Ownable {
        address private _owner;
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
        /**
         * @dev Initializes the contract setting the deployer as the initial owner.
         */
        constructor () internal {
            _owner = msg.sender;
            emit OwnershipTransferred(address(0), msg.sender);
        }
        /**
         * @dev Returns the address of the current owner.
         */
        function owner() public view returns (address) {
            return _owner;
        }
        /**
         * @dev Throws if called by any account other than the owner.
         */
        modifier onlyOwner() {
            require(isOwner(), "Ownable: caller is not the owner");
            _;
        }
        /**
         * @dev Returns true if the caller is the current owner.
         */
        function isOwner() public view returns (bool) {
            return msg.sender == _owner;
        }
        /**
         * @dev Leaves the contract without owner. It will not be possible to call
         * `onlyOwner` functions anymore.
         *
         * NOTE: Renouncing ownership will leave the contract without an owner,
         * thereby removing any functionality that is only available to the owner.
         *
         * NOTE: This function is not safe, as it doesn’t check owner is calling it.
         * Make sure you check it before calling it.
         */
        function _renounceOwnership() internal {
            emit OwnershipTransferred(_owner, address(0));
            _owner = address(0);
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    contract CheckContract {
        /**
         * Check that the account is an already deployed non-destroyed contract.
         * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12
         */
        function checkContract(address _account) internal view {
            require(_account != address(0), "Account cannot be zero address");
            uint256 size;
            // solhint-disable-next-line no-inline-assembly
            assembly { size := extcodesize(_account) }
            require(size > 0, "Account code size cannot be zero");
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    // Buidler's helper contract for console logging
    library console {
    \taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
    \tfunction log() internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log()"));
    \t\tignored;
    \t}\tfunction logInt(int p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(int)", p0));
    \t\tignored;
    \t}
    \tfunction logUint(uint p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0));
    \t\tignored;
    \t}
    \tfunction logString(string memory p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0));
    \t\tignored;
    \t}
    \tfunction logBool(bool p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0));
    \t\tignored;
    \t}
    \tfunction logAddress(address p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes(bytes memory p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes)", p0));
    \t\tignored;
    \t}
    \tfunction logByte(byte p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(byte)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes1(bytes1 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes1)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes2(bytes2 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes2)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes3(bytes3 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes3)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes4(bytes4 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes4)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes5(bytes5 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes5)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes6(bytes6 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes6)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes7(bytes7 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes7)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes8(bytes8 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes8)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes9(bytes9 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes9)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes10(bytes10 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes10)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes11(bytes11 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes11)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes12(bytes12 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes12)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes13(bytes13 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes13)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes14(bytes14 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes14)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes15(bytes15 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes15)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes16(bytes16 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes16)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes17(bytes17 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes17)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes18(bytes18 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes18)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes19(bytes19 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes19)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes20(bytes20 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes20)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes21(bytes21 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes21)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes22(bytes22 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes22)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes23(bytes23 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes23)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes24(bytes24 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes24)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes25(bytes25 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes25)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes26(bytes26 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes26)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes27(bytes27 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes27)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes28(bytes28 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes28)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes29(bytes29 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes29)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes30(bytes30 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes30)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes31(bytes31 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes31)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes32(bytes32 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes32)", p0));
    \t\tignored;
    \t}
    \tfunction log(uint p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0));
    \t\tignored;
    \t}
    \tfunction log(string memory p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0));
    \t\tignored;
    \t}
    \tfunction log(bool p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0));
    \t\tignored;
    \t}
    \tfunction log(address p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    import "../Dependencies/IERC20.sol";
    import "../Dependencies/IERC2612.sol";
    interface ILQTYToken is IERC20, IERC2612 { 
       
        // --- Events ---
        
        event CommunityIssuanceAddressSet(address _communityIssuanceAddress);
        event LQTYStakingAddressSet(address _lqtyStakingAddress);
        event LockupContractFactoryAddressSet(address _lockupContractFactoryAddress);
        // --- Functions ---
        
        function sendToLQTYStaking(address _sender, uint256 _amount) external;
        function getDeploymentStartTime() external view returns (uint256);
        function getLpRewardsEntitlement() external view returns (uint256);
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    interface ILQTYStaking {
        // --- Events --
        
        event LQTYTokenAddressSet(address _lqtyTokenAddress);
        event LUSDTokenAddressSet(address _lusdTokenAddress);
        event TroveManagerAddressSet(address _troveManager);
        event BorrowerOperationsAddressSet(address _borrowerOperationsAddress);
        event ActivePoolAddressSet(address _activePoolAddress);
        event StakeChanged(address indexed staker, uint newStake);
        event StakingGainsWithdrawn(address indexed staker, uint LUSDGain, uint ETHGain);
        event F_ETHUpdated(uint _F_ETH);
        event F_LUSDUpdated(uint _F_LUSD);
        event TotalLQTYStakedUpdated(uint _totalLQTYStaked);
        event EtherSent(address _account, uint _amount);
        event StakerSnapshotsUpdated(address _staker, uint _F_ETH, uint _F_LUSD);
        // --- Functions ---
        function setAddresses
        (
            address _lqtyTokenAddress,
            address _lusdTokenAddress,
            address _troveManagerAddress, 
            address _borrowerOperationsAddress,
            address _activePoolAddress
        )  external;
        function stake(uint _LQTYamount) external;
        function unstake(uint _LQTYamount) external;
        function increaseF_ETH(uint _ETHFee) external; 
        function increaseF_LUSD(uint _LQTYFee) external;  
        function getPendingETHGain(address _user) external view returns (uint);
        function getPendingLUSDGain(address _user) external view returns (uint);
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    import "./SafeMath.sol";
    import "./console.sol";
    library LiquityMath {
        using SafeMath for uint;
        uint internal constant DECIMAL_PRECISION = 1e18;
        /* Precision for Nominal ICR (independent of price). Rationale for the value:
         *
         * - Making it “too high” could lead to overflows.
         * - Making it “too low” could lead to an ICR equal to zero, due to truncation from Solidity floor division. 
         *
         * This value of 1e20 is chosen for safety: the NICR will only overflow for numerator > ~1e39 ETH,
         * and will only truncate to 0 if the denominator is at least 1e20 times greater than the numerator.
         *
         */
        uint internal constant NICR_PRECISION = 1e20;
        function _min(uint _a, uint _b) internal pure returns (uint) {
            return (_a < _b) ? _a : _b;
        }
        function _max(uint _a, uint _b) internal pure returns (uint) {
            return (_a >= _b) ? _a : _b;
        }
        /* 
        * Multiply two decimal numbers and use normal rounding rules:
        * -round product up if 19'th mantissa digit >= 5
        * -round product down if 19'th mantissa digit < 5
        *
        * Used only inside the exponentiation, _decPow().
        */
        function decMul(uint x, uint y) internal pure returns (uint decProd) {
            uint prod_xy = x.mul(y);
            decProd = prod_xy.add(DECIMAL_PRECISION / 2).div(DECIMAL_PRECISION);
        }
        /* 
        * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n.
        * 
        * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. 
        * 
        * Called by two functions that represent time in units of minutes:
        * 1) TroveManager._calcDecayedBaseRate
        * 2) CommunityIssuance._getCumulativeIssuanceFraction 
        * 
        * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals
        * "minutes in 1000 years": 60 * 24 * 365 * 1000
        * 
        * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be
        * negligibly different from just passing the cap, since: 
        *
        * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years
        * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible
        */
        function _decPow(uint _base, uint _minutes) internal pure returns (uint) {
           
            if (_minutes > 525600000) {_minutes = 525600000;}  // cap to avoid overflow
        
            if (_minutes == 0) {return DECIMAL_PRECISION;}
            uint y = DECIMAL_PRECISION;
            uint x = _base;
            uint n = _minutes;
            // Exponentiation-by-squaring
            while (n > 1) {
                if (n % 2 == 0) {
                    x = decMul(x, x);
                    n = n.div(2);
                } else { // if (n % 2 != 0)
                    y = decMul(x, y);
                    x = decMul(x, x);
                    n = (n.sub(1)).div(2);
                }
            }
            return decMul(x, y);
      }
        function _getAbsoluteDifference(uint _a, uint _b) internal pure returns (uint) {
            return (_a >= _b) ? _a.sub(_b) : _b.sub(_a);
        }
        function _computeNominalCR(uint _coll, uint _debt) internal pure returns (uint) {
            if (_debt > 0) {
                return _coll.mul(NICR_PRECISION).div(_debt);
            }
            // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR.
            else { // if (_debt == 0)
                return 2**256 - 1;
            }
        }
        function _computeCR(uint _coll, uint _debt, uint _price) internal pure returns (uint) {
            if (_debt > 0) {
                uint newCollRatio = _coll.mul(_price).div(_debt);
                return newCollRatio;
            }
            // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR.
            else { // if (_debt == 0)
                return 2**256 - 1; 
            }
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    import "../Dependencies/IERC20.sol";
    import "../Dependencies/IERC2612.sol";
    interface ILUSDToken is IERC20, IERC2612 { 
        
        // --- Events ---
        event TroveManagerAddressChanged(address _troveManagerAddress);
        event StabilityPoolAddressChanged(address _newStabilityPoolAddress);
        event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
        event LUSDTokenBalanceUpdated(address _user, uint _amount);
        // --- Functions ---
        function mint(address _account, uint256 _amount) external;
        function burn(address _account, uint256 _amount) external;
        function sendToPool(address _sender,  address poolAddress, uint256 _amount) external;
        function returnFromPool(address poolAddress, address user, uint256 _amount ) external;
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * Based on the OpenZeppelin IER20 interface:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
     *
     * @dev Interface of the ERC20 standard as defined in the EIP.
     */
    interface IERC20 {
        /**
         * @dev Returns the amount of tokens in existence.
         */
        function totalSupply() external view returns (uint256);
        /**
         * @dev Returns the amount of tokens owned by `account`.
         */
        function balanceOf(address account) external view returns (uint256);
        /**
         * @dev Moves `amount` tokens from the caller's account to `recipient`.
         *
         * Returns a boolean value indicating whether the operation succeeded.
         *
         * Emits a {Transfer} event.
         */
        function transfer(address recipient, uint256 amount) external returns (bool);
        /**
         * @dev Returns the remaining number of tokens that `spender` will be
         * allowed to spend on behalf of `owner` through {transferFrom}. This is
         * zero by default.
         *
         * This value changes when {approve} or {transferFrom} are called.
         */
        function allowance(address owner, address spender) external view returns (uint256);
        function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
        function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
        /**
         * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
         *
         * Returns a boolean value indicating whether the operation succeeded.
         *
         * IMPORTANT: Beware that changing an allowance with this method brings the risk
         * that someone may use both the old and the new allowance by unfortunate
         * transaction ordering. One possible solution to mitigate this race
         * condition is to first reduce the spender's allowance to 0 and set the
         * desired value afterwards:
         * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
         *
         * Emits an {Approval} event.
         */
        function approve(address spender, uint256 amount) external returns (bool);
        /**
         * @dev Moves `amount` tokens from `sender` to `recipient` using the
         * allowance mechanism. `amount` is then deducted from the caller's
         * allowance.
         *
         * Returns a boolean value indicating whether the operation succeeded.
         *
         * Emits a {Transfer} event.
         */
        function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
        function name() external view returns (string memory);
        function symbol() external view returns (string memory);
        function decimals() external view returns (uint8);
        
        /**
         * @dev Emitted when `value` tokens are moved from one account (`from`) to
         * another (`to`).
         *
         * Note that `value` may be zero.
         */
        event Transfer(address indexed from, address indexed to, uint256 value);
        /**
         * @dev Emitted when the allowance of a `spender` for an `owner` is set by
         * a call to {approve}. `value` is the new allowance.
         */
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }// SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * @dev Interface of the ERC2612 standard as defined in the EIP.
     *
     * Adds the {permit} method, which can be used to change one's
     * {IERC20-allowance} without having to send a transaction, by signing a
     * message. This allows users to spend tokens without having to hold Ether.
     *
     * See https://eips.ethereum.org/EIPS/eip-2612.
     * 
     * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/
     */
    interface IERC2612 {
        /**
         * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
         * given `owner`'s signed approval.
         *
         * IMPORTANT: The same issues {IERC20-approve} has related to transaction
         * ordering also apply here.
         *
         * Emits an {Approval} event.
         *
         * Requirements:
         *
         * - `owner` cannot be the zero address.
         * - `spender` cannot be the zero address.
         * - `deadline` must be a timestamp in the future.
         * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
         * over the EIP712-formatted function arguments.
         * - the signature must use ``owner``'s current nonce (see {nonces}).
         *
         * For more information on the signature format, see the
         * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
         * section].
         */
        function permit(address owner, address spender, uint256 amount, 
                        uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
        
        /**
         * @dev Returns the current ERC2612 nonce for `owner`. This value must be
         * included whenever a signature is generated for {permit}.
         *
         * Every successful call to {permit} increases `owner`'s nonce by one. This
         * prevents a signature from being used multiple times.
         *
         * `owner` can limit the time a Permit is valid for by setting `deadline` to 
         * a value in the near future. The deadline argument can be set to uint(-1) to 
         * create Permits that effectively never expire.
         */
        function nonces(address owner) external view returns (uint256);
        
        function version() external view returns (string memory);
        function permitTypeHash() external view returns (bytes32);
        function domainSeparator() external view returns (bytes32);
    }
    

    File 2 of 2: LUSDToken
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    import "./Interfaces/ILUSDToken.sol";
    import "./Dependencies/SafeMath.sol";
    import "./Dependencies/CheckContract.sol";
    import "./Dependencies/console.sol";
    /*
    *
    * Based upon OpenZeppelin's ERC20 contract:
    * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol
    *  
    * and their EIP2612 (ERC20Permit / ERC712) functionality:
    * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/53516bc555a454862470e7860a9b5254db4d00f5/contracts/token/ERC20/ERC20Permit.sol
    * 
    *
    * --- Functionality added specific to the LUSDToken ---
    * 
    * 1) Transfer protection: blacklist of addresses that are invalid recipients (i.e. core Liquity contracts) in external 
    * transfer() and transferFrom() calls. The purpose is to protect users from losing tokens by mistakenly sending LUSD directly to a Liquity 
    * core contract, when they should rather call the right function. 
    *
    * 2) sendToPool() and returnFromPool(): functions callable only Liquity core contracts, which move LUSD tokens between Liquity <-> user.
    */
    contract LUSDToken is CheckContract, ILUSDToken {
        using SafeMath for uint256;
        
        uint256 private _totalSupply;
        string constant internal _NAME = "LUSD Stablecoin";
        string constant internal _SYMBOL = "LUSD";
        string constant internal _VERSION = "1";
        uint8 constant internal _DECIMALS = 18;
        
        // --- Data for EIP2612 ---
        
        // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
        bytes32 private constant _PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
        // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
        bytes32 private constant _TYPE_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;
        // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
        // invalidate the cached domain separator if the chain id changes.
        bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
        uint256 private immutable _CACHED_CHAIN_ID;
        bytes32 private immutable _HASHED_NAME;
        bytes32 private immutable _HASHED_VERSION;
        
        mapping (address => uint256) private _nonces;
        
        // User data for LUSD token
        mapping (address => uint256) private _balances;
        mapping (address => mapping (address => uint256)) private _allowances;  
        
        // --- Addresses ---
        address public immutable troveManagerAddress;
        address public immutable stabilityPoolAddress;
        address public immutable borrowerOperationsAddress;
        
        // --- Events ---
        event TroveManagerAddressChanged(address _troveManagerAddress);
        event StabilityPoolAddressChanged(address _newStabilityPoolAddress);
        event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
        constructor
        ( 
            address _troveManagerAddress,
            address _stabilityPoolAddress,
            address _borrowerOperationsAddress
        ) 
            public 
        {  
            checkContract(_troveManagerAddress);
            checkContract(_stabilityPoolAddress);
            checkContract(_borrowerOperationsAddress);
            troveManagerAddress = _troveManagerAddress;
            emit TroveManagerAddressChanged(_troveManagerAddress);
            stabilityPoolAddress = _stabilityPoolAddress;
            emit StabilityPoolAddressChanged(_stabilityPoolAddress);
            borrowerOperationsAddress = _borrowerOperationsAddress;        
            emit BorrowerOperationsAddressChanged(_borrowerOperationsAddress);
            
            bytes32 hashedName = keccak256(bytes(_NAME));
            bytes32 hashedVersion = keccak256(bytes(_VERSION));
            
            _HASHED_NAME = hashedName;
            _HASHED_VERSION = hashedVersion;
            _CACHED_CHAIN_ID = _chainID();
            _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(_TYPE_HASH, hashedName, hashedVersion);
        }
        // --- Functions for intra-Liquity calls ---
        function mint(address _account, uint256 _amount) external override {
            _requireCallerIsBorrowerOperations();
            _mint(_account, _amount);
        }
        function burn(address _account, uint256 _amount) external override {
            _requireCallerIsBOorTroveMorSP();
            _burn(_account, _amount);
        }
        function sendToPool(address _sender,  address _poolAddress, uint256 _amount) external override {
            _requireCallerIsStabilityPool();
            _transfer(_sender, _poolAddress, _amount);
        }
        function returnFromPool(address _poolAddress, address _receiver, uint256 _amount) external override {
            _requireCallerIsTroveMorSP();
            _transfer(_poolAddress, _receiver, _amount);
        }
        // --- External functions ---
        function totalSupply() external view override returns (uint256) {
            return _totalSupply;
        }
        function balanceOf(address account) external view override returns (uint256) {
            return _balances[account];
        }
        function transfer(address recipient, uint256 amount) external override returns (bool) {
            _requireValidRecipient(recipient);
            _transfer(msg.sender, recipient, amount);
            return true;
        }
        function allowance(address owner, address spender) external view override returns (uint256) {
            return _allowances[owner][spender];
        }
        function approve(address spender, uint256 amount) external override returns (bool) {
            _approve(msg.sender, spender, amount);
            return true;
        }
        function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
            _requireValidRecipient(recipient);
            _transfer(sender, recipient, amount);
            _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }
        function increaseAllowance(address spender, uint256 addedValue) external override returns (bool) {
            _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
            return true;
        }
        function decreaseAllowance(address spender, uint256 subtractedValue) external override returns (bool) {
            _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
            return true;
        }
        // --- EIP 2612 Functionality ---
        function domainSeparator() public view override returns (bytes32) {    
            if (_chainID() == _CACHED_CHAIN_ID) {
                return _CACHED_DOMAIN_SEPARATOR;
            } else {
                return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
            }
        }
        function permit
        (
            address owner, 
            address spender, 
            uint amount, 
            uint deadline, 
            uint8 v, 
            bytes32 r, 
            bytes32 s
        ) 
            external 
            override 
        {            
            require(deadline >= now, 'LUSD: expired deadline');
            bytes32 digest = keccak256(abi.encodePacked('\\x19\\x01', 
                             domainSeparator(), keccak256(abi.encode(
                             _PERMIT_TYPEHASH, owner, spender, amount, 
                             _nonces[owner]++, deadline))));
            address recoveredAddress = ecrecover(digest, v, r, s);
            require(recoveredAddress == owner, 'LUSD: invalid signature');
            _approve(owner, spender, amount);
        }
        function nonces(address owner) external view override returns (uint256) { // FOR EIP 2612
            return _nonces[owner];
        }
        // --- Internal operations ---
        function _chainID() private pure returns (uint256 chainID) {
            assembly {
                chainID := chainid()
            }
        }
        
        function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
            return keccak256(abi.encode(typeHash, name, version, _chainID(), address(this)));
        }
        // --- Internal operations ---
        // Warning: sanity checks (for sender and recipient) should have been done before calling these internal functions
        function _transfer(address sender, address recipient, uint256 amount) internal {
            assert(sender != address(0));
            assert(recipient != address(0));
            _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
            _balances[recipient] = _balances[recipient].add(amount);
            emit Transfer(sender, recipient, amount);
        }
        function _mint(address account, uint256 amount) internal {
            assert(account != address(0));
            _totalSupply = _totalSupply.add(amount);
            _balances[account] = _balances[account].add(amount);
            emit Transfer(address(0), account, amount);
        }
        function _burn(address account, uint256 amount) internal {
            assert(account != address(0));
            
            _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
            _totalSupply = _totalSupply.sub(amount);
            emit Transfer(account, address(0), amount);
        }
        function _approve(address owner, address spender, uint256 amount) internal {
            assert(owner != address(0));
            assert(spender != address(0));
            _allowances[owner][spender] = amount;
            emit Approval(owner, spender, amount);
        }
        // --- 'require' functions ---
        function _requireValidRecipient(address _recipient) internal view {
            require(
                _recipient != address(0) && 
                _recipient != address(this),
                "LUSD: Cannot transfer tokens directly to the LUSD token contract or the zero address"
            );
            require(
                _recipient != stabilityPoolAddress && 
                _recipient != troveManagerAddress && 
                _recipient != borrowerOperationsAddress, 
                "LUSD: Cannot transfer tokens directly to the StabilityPool, TroveManager or BorrowerOps"
            );
        }
        function _requireCallerIsBorrowerOperations() internal view {
            require(msg.sender == borrowerOperationsAddress, "LUSDToken: Caller is not BorrowerOperations");
        }
        function _requireCallerIsBOorTroveMorSP() internal view {
            require(
                msg.sender == borrowerOperationsAddress ||
                msg.sender == troveManagerAddress ||
                msg.sender == stabilityPoolAddress,
                "LUSD: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool"
            );
        }
        function _requireCallerIsStabilityPool() internal view {
            require(msg.sender == stabilityPoolAddress, "LUSD: Caller is not the StabilityPool");
        }
        function _requireCallerIsTroveMorSP() internal view {
            require(
                msg.sender == troveManagerAddress || msg.sender == stabilityPoolAddress,
                "LUSD: Caller is neither TroveManager nor StabilityPool");
        }
        // --- Optional functions ---
        function name() external view override returns (string memory) {
            return _NAME;
        }
        function symbol() external view override returns (string memory) {
            return _SYMBOL;
        }
        function decimals() external view override returns (uint8) {
            return _DECIMALS;
        }
        function version() external view override returns (string memory) {
            return _VERSION;
        }
        function permitTypeHash() external view override returns (bytes32) {
            return _PERMIT_TYPEHASH;
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    import "../Dependencies/IERC20.sol";
    import "../Dependencies/IERC2612.sol";
    interface ILUSDToken is IERC20, IERC2612 { 
        
        // --- Events ---
        event TroveManagerAddressChanged(address _troveManagerAddress);
        event StabilityPoolAddressChanged(address _newStabilityPoolAddress);
        event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
        event LUSDTokenBalanceUpdated(address _user, uint _amount);
        // --- Functions ---
        function mint(address _account, uint256 _amount) external;
        function burn(address _account, uint256 _amount) external;
        function sendToPool(address _sender,  address poolAddress, uint256 _amount) external;
        function returnFromPool(address poolAddress, address user, uint256 _amount ) external;
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * Based on OpenZeppelin's SafeMath:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
     *
     * @dev Wrappers over Solidity's arithmetic operations with added overflow
     * checks.
     *
     * Arithmetic operations in Solidity wrap on overflow. This can easily result
     * in bugs, because programmers usually assume that an overflow raises an
     * error, which is the standard behavior in high level programming languages.
     * `SafeMath` restores this intuition by reverting the transaction when an
     * operation overflows.
     *
     * Using this library instead of the unchecked operations eliminates an entire
     * class of bugs, so it's recommended to use it always.
     */
    library SafeMath {
        /**
         * @dev Returns the addition of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `+` operator.
         *
         * Requirements:
         * - Addition cannot overflow.
         */
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
            return c;
        }
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         * - Subtraction cannot overflow.
         */
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return sub(a, b, "SafeMath: subtraction overflow");
        }
        /**
         * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
         * overflow (when the result is negative).
         *
         * Counterpart to Solidity's `-` operator.
         *
         * Requirements:
         * - Subtraction cannot overflow.
         *
         * _Available since v2.4.0._
         */
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            uint256 c = a - b;
            return c;
        }
        /**
         * @dev Returns the multiplication of two unsigned integers, reverting on
         * overflow.
         *
         * Counterpart to Solidity's `*` operator.
         *
         * Requirements:
         * - Multiplication cannot overflow.
         */
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) {
                return 0;
            }
            uint256 c = a * b;
            require(c / a == b, "SafeMath: multiplication overflow");
            return c;
        }
        /**
         * @dev Returns the integer division of two unsigned integers. Reverts on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            return div(a, b, "SafeMath: division by zero");
        }
        /**
         * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
         * division by zero. The result is rounded towards zero.
         *
         * Counterpart to Solidity's `/` operator. Note: this function uses a
         * `revert` opcode (which leaves remaining gas untouched) while Solidity
         * uses an invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         *
         * _Available since v2.4.0._
         */
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            // Solidity only automatically asserts when dividing by 0
            require(b > 0, errorMessage);
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
            return c;
        }
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * Reverts when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         */
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            return mod(a, b, "SafeMath: modulo by zero");
        }
        /**
         * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
         * Reverts with custom message when dividing by zero.
         *
         * Counterpart to Solidity's `%` operator. This function uses a `revert`
         * opcode (which leaves remaining gas untouched) while Solidity uses an
         * invalid opcode to revert (consuming all remaining gas).
         *
         * Requirements:
         * - The divisor cannot be zero.
         *
         * _Available since v2.4.0._
         */
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b != 0, errorMessage);
            return a % b;
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    contract CheckContract {
        /**
         * Check that the account is an already deployed non-destroyed contract.
         * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12
         */
        function checkContract(address _account) internal view {
            require(_account != address(0), "Account cannot be zero address");
            uint256 size;
            // solhint-disable-next-line no-inline-assembly
            assembly { size := extcodesize(_account) }
            require(size > 0, "Account code size cannot be zero");
        }
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    // Buidler's helper contract for console logging
    library console {
    \taddress constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);
    \tfunction log() internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log()"));
    \t\tignored;
    \t}\tfunction logInt(int p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(int)", p0));
    \t\tignored;
    \t}
    \tfunction logUint(uint p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0));
    \t\tignored;
    \t}
    \tfunction logString(string memory p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0));
    \t\tignored;
    \t}
    \tfunction logBool(bool p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0));
    \t\tignored;
    \t}
    \tfunction logAddress(address p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes(bytes memory p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes)", p0));
    \t\tignored;
    \t}
    \tfunction logByte(byte p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(byte)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes1(bytes1 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes1)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes2(bytes2 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes2)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes3(bytes3 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes3)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes4(bytes4 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes4)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes5(bytes5 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes5)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes6(bytes6 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes6)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes7(bytes7 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes7)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes8(bytes8 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes8)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes9(bytes9 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes9)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes10(bytes10 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes10)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes11(bytes11 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes11)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes12(bytes12 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes12)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes13(bytes13 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes13)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes14(bytes14 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes14)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes15(bytes15 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes15)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes16(bytes16 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes16)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes17(bytes17 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes17)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes18(bytes18 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes18)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes19(bytes19 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes19)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes20(bytes20 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes20)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes21(bytes21 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes21)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes22(bytes22 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes22)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes23(bytes23 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes23)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes24(bytes24 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes24)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes25(bytes25 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes25)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes26(bytes26 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes26)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes27(bytes27 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes27)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes28(bytes28 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes28)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes29(bytes29 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes29)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes30(bytes30 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes30)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes31(bytes31 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes31)", p0));
    \t\tignored;
    \t}
    \tfunction logBytes32(bytes32 p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes32)", p0));
    \t\tignored;
    \t}
    \tfunction log(uint p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0));
    \t\tignored;
    \t}
    \tfunction log(string memory p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0));
    \t\tignored;
    \t}
    \tfunction log(bool p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0));
    \t\tignored;
    \t}
    \tfunction log(address p0) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address)", p0, p1));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(uint p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(string memory p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(bool p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, uint p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, string memory p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, bool p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, uint p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, string memory p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, bool p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, uint p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, string memory p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, bool p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    \tfunction log(address p0, address p1, address p2, address p3) internal view {
    \t\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    \t\tignored;
    \t}
    }
    // SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * Based on the OpenZeppelin IER20 interface:
     * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
     *
     * @dev Interface of the ERC20 standard as defined in the EIP.
     */
    interface IERC20 {
        /**
         * @dev Returns the amount of tokens in existence.
         */
        function totalSupply() external view returns (uint256);
        /**
         * @dev Returns the amount of tokens owned by `account`.
         */
        function balanceOf(address account) external view returns (uint256);
        /**
         * @dev Moves `amount` tokens from the caller's account to `recipient`.
         *
         * Returns a boolean value indicating whether the operation succeeded.
         *
         * Emits a {Transfer} event.
         */
        function transfer(address recipient, uint256 amount) external returns (bool);
        /**
         * @dev Returns the remaining number of tokens that `spender` will be
         * allowed to spend on behalf of `owner` through {transferFrom}. This is
         * zero by default.
         *
         * This value changes when {approve} or {transferFrom} are called.
         */
        function allowance(address owner, address spender) external view returns (uint256);
        function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
        function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
        /**
         * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
         *
         * Returns a boolean value indicating whether the operation succeeded.
         *
         * IMPORTANT: Beware that changing an allowance with this method brings the risk
         * that someone may use both the old and the new allowance by unfortunate
         * transaction ordering. One possible solution to mitigate this race
         * condition is to first reduce the spender's allowance to 0 and set the
         * desired value afterwards:
         * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
         *
         * Emits an {Approval} event.
         */
        function approve(address spender, uint256 amount) external returns (bool);
        /**
         * @dev Moves `amount` tokens from `sender` to `recipient` using the
         * allowance mechanism. `amount` is then deducted from the caller's
         * allowance.
         *
         * Returns a boolean value indicating whether the operation succeeded.
         *
         * Emits a {Transfer} event.
         */
        function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
        function name() external view returns (string memory);
        function symbol() external view returns (string memory);
        function decimals() external view returns (uint8);
        
        /**
         * @dev Emitted when `value` tokens are moved from one account (`from`) to
         * another (`to`).
         *
         * Note that `value` may be zero.
         */
        event Transfer(address indexed from, address indexed to, uint256 value);
        /**
         * @dev Emitted when the allowance of a `spender` for an `owner` is set by
         * a call to {approve}. `value` is the new allowance.
         */
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }// SPDX-License-Identifier: MIT
    pragma solidity 0.6.11;
    /**
     * @dev Interface of the ERC2612 standard as defined in the EIP.
     *
     * Adds the {permit} method, which can be used to change one's
     * {IERC20-allowance} without having to send a transaction, by signing a
     * message. This allows users to spend tokens without having to hold Ether.
     *
     * See https://eips.ethereum.org/EIPS/eip-2612.
     * 
     * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/
     */
    interface IERC2612 {
        /**
         * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
         * given `owner`'s signed approval.
         *
         * IMPORTANT: The same issues {IERC20-approve} has related to transaction
         * ordering also apply here.
         *
         * Emits an {Approval} event.
         *
         * Requirements:
         *
         * - `owner` cannot be the zero address.
         * - `spender` cannot be the zero address.
         * - `deadline` must be a timestamp in the future.
         * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
         * over the EIP712-formatted function arguments.
         * - the signature must use ``owner``'s current nonce (see {nonces}).
         *
         * For more information on the signature format, see the
         * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
         * section].
         */
        function permit(address owner, address spender, uint256 amount, 
                        uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
        
        /**
         * @dev Returns the current ERC2612 nonce for `owner`. This value must be
         * included whenever a signature is generated for {permit}.
         *
         * Every successful call to {permit} increases `owner`'s nonce by one. This
         * prevents a signature from being used multiple times.
         *
         * `owner` can limit the time a Permit is valid for by setting `deadline` to 
         * a value in the near future. The deadline argument can be set to uint(-1) to 
         * create Permits that effectively never expire.
         */
        function nonces(address owner) external view returns (uint256);
        
        function version() external view returns (string memory);
        function permitTypeHash() external view returns (bytes32);
        function domainSeparator() external view returns (bytes32);
    }