ETH Price: $1,879.30 (-4.75%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Make Flash Loan243130722026-01-25 16:38:1128 days ago1769359091IN
0x77CA4baA...0b7e36EE3
0 ETH0.000062540.24951262
Make Flash Loan243130362026-01-25 16:30:4728 days ago1769358647IN
0x77CA4baA...0b7e36EE3
0 ETH0.000079070.30580192
Make Flash Loan243128322026-01-25 15:49:5928 days ago1769356199IN
0x77CA4baA...0b7e36EE3
0 ETH0.000008620.03672641
Make Flash Loan243127032026-01-25 15:24:1128 days ago1769354651IN
0x77CA4baA...0b7e36EE3
0 ETH0.000014130.05797753
Make Flash Loan243126812026-01-25 15:19:4728 days ago1769354387IN
0x77CA4baA...0b7e36EE3
0 ETH0.000013290.05706636
Make Flash Loan243126272026-01-25 15:08:5928 days ago1769353739IN
0x77CA4baA...0b7e36EE3
0 ETH0.000009970.04065395
Make Flash Loan243125542026-01-25 14:54:2328 days ago1769352863IN
0x77CA4baA...0b7e36EE3
0 ETH0.000010910.04501087
Make Flash Loan243125262026-01-25 14:48:4728 days ago1769352527IN
0x77CA4baA...0b7e36EE3
0 ETH0.000014470.0597082
Make Flash Loan243125022026-01-25 14:43:5928 days ago1769352239IN
0x77CA4baA...0b7e36EE3
0 ETH0.000011540.0494555
Make Flash Loan243124862026-01-25 14:40:3528 days ago1769352035IN
0x77CA4baA...0b7e36EE3
0 ETH0.000011130.04559006
Make Flash Loan243124512026-01-25 14:33:3528 days ago1769351615IN
0x77CA4baA...0b7e36EE3
0 ETH0.000014170.0573274
Make Flash Loan243123572026-01-25 14:14:4728 days ago1769350487IN
0x77CA4baA...0b7e36EE3
0 ETH0.000010650.04559648
Make Flash Loan243121782026-01-25 13:38:5928 days ago1769348339IN
0x77CA4baA...0b7e36EE3
0 ETH0.000009920.04260784
Make Flash Loan243121602026-01-25 13:35:2328 days ago1769348123IN
0x77CA4baA...0b7e36EE3
0 ETH0.0000120.04923117
Make Flash Loan243121172026-01-25 13:26:4728 days ago1769347607IN
0x77CA4baA...0b7e36EE3
0 ETH0.000009930.04261072
Make Flash Loan243120302026-01-25 13:09:2328 days ago1769346563IN
0x77CA4baA...0b7e36EE3
0 ETH0.000009090.03610697
Make Flash Loan243120122026-01-25 13:05:4728 days ago1769346347IN
0x77CA4baA...0b7e36EE3
0 ETH0.000007930.03395971
Make Flash Loan243120052026-01-25 13:04:2328 days ago1769346263IN
0x77CA4baA...0b7e36EE3
0 ETH0.000008890.03802543
Make Flash Loan243116152026-01-25 11:46:1128 days ago1769341571IN
0x77CA4baA...0b7e36EE3
0 ETH0.000007920.03348908
Make Flash Loan243110912026-01-25 10:00:5928 days ago1769335259IN
0x77CA4baA...0b7e36EE3
0 ETH0.000008340.03154921
Make Flash Loan243107402026-01-25 8:50:2328 days ago1769331023IN
0x77CA4baA...0b7e36EE3
0 ETH0.000009270.0396515
Make Flash Loan243106542026-01-25 8:33:1129 days ago1769329991IN
0x77CA4baA...0b7e36EE3
0 ETH0.000008050.03129341
Make Flash Loan243090002026-01-25 3:00:5929 days ago1769310059IN
0x77CA4baA...0b7e36EE3
0 ETH0.000009120.03746893
Make Flash Loan243087402026-01-25 2:08:5929 days ago1769306939IN
0x77CA4baA...0b7e36EE3
0 ETH0.000007760.03326532
Make Flash Loan243086932026-01-25 1:59:3529 days ago1769306375IN
0x77CA4baA...0b7e36EE3
0 ETH0.000008580.03516344
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer243130722026-01-25 16:38:1128 days ago1769359091
0x77CA4baA...0b7e36EE3
0.00000007 ETH
Transfer243130722026-01-25 16:38:1128 days ago1769359091
0x77CA4baA...0b7e36EE3
0.00000007 ETH
Transfer243130722026-01-25 16:38:1128 days ago1769359091
0x77CA4baA...0b7e36EE3
0.00000014 ETH
Transfer243130362026-01-25 16:30:4728 days ago1769358647
0x77CA4baA...0b7e36EE3
0.00000542 ETH
Transfer243130362026-01-25 16:30:4728 days ago1769358647
0x77CA4baA...0b7e36EE3
0.00000542 ETH
Transfer243130362026-01-25 16:30:4728 days ago1769358647
0x77CA4baA...0b7e36EE3
0.00001085 ETH
Transfer243128322026-01-25 15:49:5928 days ago1769356199
0x77CA4baA...0b7e36EE3
0.00000164 ETH
Transfer243128322026-01-25 15:49:5928 days ago1769356199
0x77CA4baA...0b7e36EE3
0.00000164 ETH
Transfer243128322026-01-25 15:49:5928 days ago1769356199
0x77CA4baA...0b7e36EE3
0.00000328 ETH
Transfer243127032026-01-25 15:24:1128 days ago1769354651
0x77CA4baA...0b7e36EE3
0.00000118 ETH
Transfer243127032026-01-25 15:24:1128 days ago1769354651
0x77CA4baA...0b7e36EE3
0.00000118 ETH
Transfer243127032026-01-25 15:24:1128 days ago1769354651
0x77CA4baA...0b7e36EE3
0.00000237 ETH
Transfer243126812026-01-25 15:19:4728 days ago1769354387
0x77CA4baA...0b7e36EE3
0.00000628 ETH
Transfer243126812026-01-25 15:19:4728 days ago1769354387
0x77CA4baA...0b7e36EE3
0.00000628 ETH
Transfer243126812026-01-25 15:19:4728 days ago1769354387
0x77CA4baA...0b7e36EE3
0.00001256 ETH
Transfer243126272026-01-25 15:08:5928 days ago1769353739
0x77CA4baA...0b7e36EE3
0.00000245 ETH
Transfer243126272026-01-25 15:08:5928 days ago1769353739
0x77CA4baA...0b7e36EE3
0.00000245 ETH
Transfer243126272026-01-25 15:08:5928 days ago1769353739
0x77CA4baA...0b7e36EE3
0.00000491 ETH
Transfer243125542026-01-25 14:54:2328 days ago1769352863
0x77CA4baA...0b7e36EE3
0.0000031 ETH
Transfer243125542026-01-25 14:54:2328 days ago1769352863
0x77CA4baA...0b7e36EE3
0.0000031 ETH
Transfer243125542026-01-25 14:54:2328 days ago1769352863
0x77CA4baA...0b7e36EE3
0.00000621 ETH
Transfer243125262026-01-25 14:48:4728 days ago1769352527
0x77CA4baA...0b7e36EE3
0.00000422 ETH
Transfer243125262026-01-25 14:48:4728 days ago1769352527
0x77CA4baA...0b7e36EE3
0.00000422 ETH
Transfer243125262026-01-25 14:48:4728 days ago1769352527
0x77CA4baA...0b7e36EE3
0.00000845 ETH
Transfer243125022026-01-25 14:43:5928 days ago1769352239
0x77CA4baA...0b7e36EE3
0.00004329 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x9d2F87Ca...7ECB5c7c8
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
BlindBackrunFlashLoan

Compiler Version
v0.8.33+commit.64118f21

Optimization Enabled:
No with 200 runs

Other Settings:
prague EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

pragma solidity ^0.8.19;

import "openzeppelin/token/ERC20/IERC20.sol";
import "forge-std/console.sol";
import "./BlindBackrunLogic.sol";
import "./IWETH.sol";

interface IVault {
    function flashLoan(
        IFlashLoanRecipient recipient,
        IERC20[] memory tokens,
        uint256[] memory amounts,
        bytes memory userData
    ) external;
}

interface IFlashLoanRecipient {
    /**
     * @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient.
     *
     * At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this
     * call returns, the recipient must have transferred `amounts` back or else the entire flash loan will revert. If
     * Balancer implements a fee, this contract will need to be redeployed to include that fee when paying back loan
     *
     * While this contract is `Ownable`, the owner can only help recover locked assets. Many users can operate on this
     * contract as it does not rely on owning WETH or accumulating any balances.
     *
     * `userData` is the same value passed in the `IVault.flashLoan` call.
     */
    function receiveFlashLoan(
        IERC20[] memory tokens,
        uint256[] memory amounts,
        uint256[] memory feeAmounts,
        bytes memory userData
    ) external;
}

contract BlindBackrunFlashLoan is BlindBackrunLogic, IFlashLoanRecipient {
    IVault private constant vault =
        IVault(0xBA12222222228d8Ba445958a75a0704d566BF2C8);

    constructor(IWETH _wethAddress) BlindBackrunLogic(_wethAddress) {}

    // This function is just a convenience function, you can accomplish the same goal by calling the vault.flashLoan
    // directly as the top-level destination of your ethereum transaction
    function makeFlashLoan(
        IERC20[] memory tokens,
        uint256[] memory amounts,
        bytes memory userData
    ) external {
        vault.flashLoan(this, tokens, amounts, userData);
    }

    function receiveFlashLoan(
        IERC20[] memory tokens,
        uint256[] memory amounts,
        uint256[] memory feeAmounts,
        bytes memory userData
    ) external {
        tokens;feeAmounts; // suppress warnings about unused variables by referencing them
        require(
            msg.sender == address(vault),
            "FlashLoanRecipient: caller is not the vault"
        );
        console.log("receiveFlashLoan");

        (
            address firstPairAddress,
            address secondPairAddress,
            uint256 percentageToPayToCoinbase
        ) = abi.decode(userData, (address, address, uint256));

        // If Balancer implements a Flash Loan fee, we will need to pass it in here so that we leave some WETH after
        // Paying out the executor and block coinbase.
        _executeArbitrage(
            secondPairAddress,
            firstPairAddress,
            percentageToPayToCoinbase
        );

        // This contract will not work if balancer implements a flash loan fee as we are not adding "feeAmounts[0]" below
        WETH.transfer(
            address(vault),
            amounts[0]
        );
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * 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.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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);

    /**
     * @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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 5 of 7 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

    function _sendLogPayload(bytes memory payload) private view {
        uint256 payloadLength = payload.length;
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            let payloadStart := add(payload, 32)
            let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
        }
    }

    function log() internal view {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }

    function logInt(int p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(int)", p0));
    }

    function logUint(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function logString(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
    }

    function log(string memory p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
    }

    function log(uint p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
    }

    function log(uint p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
    }

    function log(uint p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
    }

    function log(string memory p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
    }

    function log(bool p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
    }

    function log(address p0, string memory p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
    }

    function log(uint p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
    }

    function log(uint p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
    }

    function log(uint p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
    }

    function log(uint p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
    }

    function log(uint p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
    }

    function log(uint p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
    }

    function log(uint p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
    }

    function log(uint p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
    }

    function log(uint p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
    }

    function log(uint p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
    }

    function log(uint p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
    }

    function log(uint p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
    }

    function log(bool p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
    }

    function log(bool p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
    }

    function log(bool p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
    }

    function log(address p0, uint p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
    }

    function log(address p0, uint p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
    }

    function log(address p0, uint p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal view {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

pragma solidity ^0.8.19;

import "openzeppelin/access/Ownable.sol";

import "forge-std/console.sol";
import "./IWETH.sol";

interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function token0() external view returns (address);
    function token1() external view returns (address);
}

interface IPairReserves{
     struct PairReserves {
        uint256 reserve0;
        uint256 reserve1;
        uint256 price;
        bool isWETHZero;
    }
}

// Do not simply open up _executeArbitrage to any caller, this code should either be protected by onlyOwner or should not maintain a WETH balance
abstract contract BlindBackrunLogic is Ownable {
    uint256 constant uniswappyFee = 997;

    IWETH public immutable WETH;

    constructor(IWETH _wethAddress) {
        WETH = _wethAddress;
    }

    /// @notice Executes an arbitrage transaction between two Uniswap V2 pairs.
    /// @notice Pair addresses need to be computed off-chain.
    /// @dev Only the contract owner can call this function.
    /// @param firstPairAddress Address of the first Uniswap V2 pair.
    /// @param secondPairAddress Address of the second Uniswap V2 pair.
    function _executeArbitrage(
        address firstPairAddress,
        address secondPairAddress,
        uint percentageToPayToCoinbase
    ) internal {
        uint256 balanceBefore = WETH.balanceOf(address(this));
        console.log("Starting balance  : %s", balanceBefore);
        IUniswapV2Pair firstPair = IUniswapV2Pair(firstPairAddress);
        IUniswapV2Pair secondPair = IUniswapV2Pair(secondPairAddress);

        console.log("\n--------- PAIR DATA ---------");

        IPairReserves.PairReserves memory firstPairData = getPairData(firstPair);
        IPairReserves.PairReserves memory secondPairData = getPairData(secondPair);

        console.log("\n--------- PRICES ---------");
        console.log("firstPair price   : %s", firstPairData.price);
        console.log("secondPair price  : %s", secondPairData.price);

        uint256 amountIn = getAmountIn(firstPairData, secondPairData);
            console.log("\n--------- TRADE AMOUNTS ---------");
            console.log("amountIn          : %s", amountIn);

        WETH.transfer(firstPairAddress, amountIn);
        
        uint256 firstPairAmountOut;
        uint256 finalAmountOut;
        if (firstPairData.isWETHZero == true){
            firstPairAmountOut = getAmountOut(amountIn, firstPairData.reserve0, firstPairData.reserve1);
            finalAmountOut = getAmountOut(firstPairAmountOut, secondPairData.reserve1, secondPairData.reserve0);

            console.log("firstPairAmountOut: %s", firstPairAmountOut);
            console.log("finalAmountOut    : %s", finalAmountOut);
            console.log("arb profit        : %s", finalAmountOut - amountIn);
            
            console.log("\n--------- TRADING ---------");

            firstPair.swap(0, firstPairAmountOut, secondPairAddress, "");
            console.log("firstPair swap done");
            
            secondPair.swap(finalAmountOut, 0, address(this), "");
            console.log("secondPair swap done");
        } else {
            firstPairAmountOut = getAmountOut(amountIn, firstPairData.reserve1, firstPairData.reserve0);
            finalAmountOut = getAmountOut(firstPairAmountOut, secondPairData.reserve0, secondPairData.reserve1);
            console.log("\n--------- TRADE AMOUNTS ---------");
            console.log("amountIn          : %s", amountIn);
            console.log("firstPairAmountOut: %s", firstPairAmountOut);
            console.log("finalAmountOut    : %s", finalAmountOut);
            console.log("arb profit        : %s", finalAmountOut - amountIn);
            
            console.log("\n--------- TRADING ---------");

            firstPair.swap(firstPairAmountOut, 0, secondPairAddress, "");
            console.log("firstPair swap done");
            
            secondPair.swap(0, finalAmountOut, address(this), "");
            console.log("secondPair swap done");
        }
        
        uint256 balanceAfter = WETH.balanceOf(address(this));
        require(balanceAfter > balanceBefore, "Arbitrage failed");
        console.log("\n--------- SUCCESS ---------");
        console.log("Ending balance    : %s", balanceAfter);
        uint profit = balanceAfter - balanceBefore;
        console.log("Profit            : %s", profit);
        WETH.withdraw(profit);
        uint profitToCoinbase = profit * percentageToPayToCoinbase / 100;
        uint profitToCaller = profit - profitToCoinbase;
        block.coinbase.transfer(profitToCoinbase);
        payable(tx.origin).transfer(profitToCaller);
    }

    /// @notice Calculates the required input amount for the arbitrage transaction.
    /// @param firstPairData Struct containing data about the first Uniswap V2 pair.
    /// @param secondPairData Struct containing data about the second Uniswap V2 pair.
    /// @return amountIn, the optimal amount to trade to arbitrage two v2 pairs.
    function getAmountIn(
        IPairReserves.PairReserves memory firstPairData, 
        IPairReserves.PairReserves memory secondPairData
    ) public view returns (uint256) {
        uint256 numerator = getNumerator(firstPairData, secondPairData);
        console.log("numerator: %s", numerator);
        uint256 denominator = getDenominator(firstPairData, secondPairData);
        console.log("denominator: %s", denominator);
        uint256 amountIn = 
            numerator
            * 1000
            / denominator;

        return amountIn;
    }

    function getNumerator(
        IPairReserves.PairReserves memory firstPairData, 
        IPairReserves.PairReserves memory secondPairData
    ) public view returns (uint256) {
        if (firstPairData.isWETHZero == true) {
            uint presqrt = uniswappyFee
                    * uniswappyFee
                    * firstPairData.reserve1
                    * secondPairData.reserve0
                    / secondPairData.reserve1
                    / firstPairData.reserve0;
            console.log("presqrt: %s", presqrt);
            console.log("sqrt(presqrt): %s", sqrt(presqrt));
            uint256 numerator = 
            (
                sqrt(presqrt)
                - 1e3
            )            
            * secondPairData.reserve1
            * firstPairData.reserve0;

            return numerator;
        } else {
            uint presqrt = uniswappyFee
                * uniswappyFee
                * firstPairData.reserve0
                * secondPairData.reserve1
                / secondPairData.reserve0
                / firstPairData.reserve1;


            uint256 numerator = 
            (
                sqrt(presqrt)
                - 1e3
            )            
            * secondPairData.reserve0
            * firstPairData.reserve1;

            return numerator;
        }
    }

    function getDenominator(
            IPairReserves.PairReserves memory firstPairData, 
            IPairReserves.PairReserves memory secondPairData
        ) public pure returns (uint256){
        if (firstPairData.isWETHZero == true) {
            uint256 denominator = 
                (
                    uniswappyFee
                    * secondPairData.reserve1
                    * 1000
                )
                + (
                    uniswappyFee
                    * uniswappyFee
                    * firstPairData.reserve1
                );
            return denominator;
        } else {
            uint256 denominator = 
                (
                    uniswappyFee
                    * secondPairData.reserve0
                    * 1000
                )
                + (
                    uniswappyFee
                    * uniswappyFee
                    * firstPairData.reserve0
                );
            return denominator;
        }
    }

    /// @notice Retrieves price and reserve data for a given Uniswap V2 pair. Also checks which token is WETH.
    /// @param pair The Uniswap V2 pair to retrieve data for.
    /// @return A IPairReserves.PairReserves struct containing price and reserve data for the given pair.
    function getPairData(IUniswapV2Pair pair) private view returns (IPairReserves.PairReserves memory) {
        (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
        console.log("pair:", address(pair));
        console.log("reserve0:",reserve0);
        console.log("reserve1:", reserve1);

        uint256 price;

        bool isWETHZero = false;
        if (pair.token0() == address(WETH)) {
            price = reserve1 * 1e18 / reserve0;
            isWETHZero = true;
        } else {
            price = reserve0 * 1e18 / reserve1;
        }

        return IPairReserves.PairReserves(reserve0, reserve1, price, isWETHZero);
    }

    /// @notice Calculates the square root of a given number.
    /// @param x The number to calculate the square root of.
    /// @return y, The square root of the given number.
    function sqrt(uint256 x) private pure returns (uint256) {
        if (x == 0) return 0;
        uint256 z = (x + 1) / 2;
        uint256 y = x;
        while (z < y) {
            y = z;
            z = ((x / z) + z) / 2;
        }
        return y;
    }

    /// @notice Calculates the output amount for a given input amount and reserves.
    /// @param amountIn The input amount.
    /// @param reserveIn The reserve of the input token.
    /// @param reserveOut The reserve of the output token.
    /// @return amountOut The output amount.
    function getAmountOut(uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) internal pure returns (uint amountOut) {
        uint amountInWithFee = amountIn * 997;
        uint numerator = amountInWithFee * reserveOut;
        uint denominator = reserveIn * 1000 + amountInWithFee;
        amountOut = numerator / denominator;
        return amountOut;
    }

    /// @notice Executes a call to another contract with the provided data and value. The owner of this contract can help rescue assets accidentally left on contract, but in normal operation, this contract does not hold assets and is not centrally controlled.
    /// @dev Only the contract owner can call this function.
    /// @dev Reverted calls will result in a revert. 
    /// @param _to The address of the contract to call.
    /// @param _value The amount of Ether to send with the call.
    /// @param _data The calldata to send with the call.
    function call(address payable _to, uint256 _value, bytes memory _data) external onlyOwner {
        (bool success, ) = _to.call{value: _value}(_data);
        require(success, "External call failed");
    }

    /// @notice Fallback function that allows the contract to receive Ether.
    receive() external payable {}
}

pragma solidity ^0.8.21;

import "openzeppelin/token/ERC20/IERC20.sol";

interface IWETH is IERC20 {
    function deposit() external payable;
    function withdraw(uint) external;
}

Settings
{
  "evmVersion": "prague",
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": [
    ":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    ":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    ":forge-std/=lib/openzeppelin-contracts/lib/forge-std/src/",
    ":openzeppelin-contracts/=lib/openzeppelin-contracts/",
    ":openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"contract IWETH","name":"_wethAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"call","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWETHZero","type":"bool"}],"internalType":"struct IPairReserves.PairReserves","name":"firstPairData","type":"tuple"},{"components":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWETHZero","type":"bool"}],"internalType":"struct IPairReserves.PairReserves","name":"secondPairData","type":"tuple"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWETHZero","type":"bool"}],"internalType":"struct IPairReserves.PairReserves","name":"firstPairData","type":"tuple"},{"components":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWETHZero","type":"bool"}],"internalType":"struct IPairReserves.PairReserves","name":"secondPairData","type":"tuple"}],"name":"getDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWETHZero","type":"bool"}],"internalType":"struct IPairReserves.PairReserves","name":"firstPairData","type":"tuple"},{"components":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isWETHZero","type":"bool"}],"internalType":"struct IPairReserves.PairReserves","name":"secondPairData","type":"tuple"}],"name":"getNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"makeFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

0x60a060405234801561000f575f5ffd5b50604051612fc3380380612fc3833981810160405281019061003191906101c0565b8061004e61004361008960201b60201c565b61009060201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050506101eb565b5f33905090565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61017e82610155565b9050919050565b5f61018f82610174565b9050919050565b61019f81610185565b81146101a9575f5ffd5b50565b5f815190506101ba81610196565b92915050565b5f602082840312156101d5576101d4610151565b5b5f6101e2848285016101ac565b91505092915050565b608051612d9661022d5f395f81816105b40152818161080601528181610c4101528181610ea9015281816114ba0152818161166101526119350152612d965ff3fe608060405260043610610093575f3560e01c8063ad5c464811610058578063ad5c46481461017e578063c9a69562146101a8578063eb6b2116146101d0578063f04f27071461020c578063f2fde38b146102345761009a565b8062bb7d671461009e5780631fa7d39b146100da5780636dbf2fa014610116578063715018a61461013e5780638da5cb5b146101545761009a565b3661009a57005b5f5ffd5b3480156100a9575f5ffd5b506100c460048036038101906100bf9190611cfd565b61025c565b6040516100d19190611d4b565b60405180910390f35b3480156100e5575f5ffd5b5061010060048036038101906100fb9190611cfd565b61040b565b60405161010d9190611d4b565b60405180910390f35b348015610121575f5ffd5b5061013c60048036038101906101379190611e72565b6104c0565b005b348015610149575f5ffd5b50610152610578565b005b34801561015f575f5ffd5b5061016861058b565b6040516101759190611efe565b60405180910390f35b348015610189575f5ffd5b506101926105b2565b60405161019f9190611f72565b60405180910390f35b3480156101b3575f5ffd5b506101ce60048036038101906101c9919061214a565b6105d6565b005b3480156101db575f5ffd5b506101f660048036038101906101f19190611cfd565b61065b565b6040516102039190611d4b565b60405180910390f35b348015610217575f5ffd5b50610232600480360381019061022d91906121ee565b61071c565b005b34801561023f575f5ffd5b5061025a600480360381019061025591906122ec565b6108d7565b005b5f60011515836060015115150361037e575f835f01518360200151845f015186602001516103e58061028e9190612344565b6102989190612344565b6102a29190612344565b6102ac91906123b2565b6102b691906123b2565b90506102f76040518060400160405280600b81526020017f707265737172743a20257300000000000000000000000000000000000000000081525082610959565b61033e6040518060400160405280601181526020017f737172742870726573717274293a202573000000000000000000000000000000815250610339836109f5565b610959565b5f845f015184602001516103e8610354856109f5565b61035e91906123e2565b6103689190612344565b6103729190612344565b90508092505050610405565b5f8360200151835f01518460200151865f01516103e58061039f9190612344565b6103a99190612344565b6103b39190612344565b6103bd91906123b2565b6103c791906123b2565b90505f8460200151845f01516103e86103df856109f5565b6103e991906123e2565b6103f39190612344565b6103fd9190612344565b905080925050505b92915050565b5f60011515836060015115150361046e575f83602001516103e5806104309190612344565b61043a9190612344565b6103e884602001516103e561044f9190612344565b6104599190612344565b6104639190612415565b9050809150506104ba565b5f835f01516103e5806104819190612344565b61048b9190612344565b6103e8845f01516103e561049f9190612344565b6104a99190612344565b6104b39190612415565b9050809150505b92915050565b6104c8610a66565b5f8373ffffffffffffffffffffffffffffffffffffffff1683836040516104ef919061249a565b5f6040518083038185875af1925050503d805f8114610529576040519150601f19603f3d011682016040523d82523d5f602084013e61052e565b606091505b5050905080610572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105699061250a565b60405180910390fd5b50505050565b610580610a66565b6105895f610ae4565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b8152600401610629949392919061270f565b5f604051808303815f87803b158015610640575f5ffd5b505af1158015610652573d5f5f3e3d5ffd5b50505050505050565b5f5f610667848461025c565b90506106a86040518060400160405280600d81526020017f6e756d657261746f723a2025730000000000000000000000000000000000000081525082610959565b5f6106b3858561040b565b90506106f46040518060400160405280600f81526020017f64656e6f6d696e61746f723a202573000000000000000000000000000000000081525082610959565b5f816103e8846107049190612344565b61070e91906123b2565b905080935050505092915050565b73ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610795906127d7565b60405180910390fd5b6107dc6040518060400160405280601081526020017f72656365697665466c6173684c6f616e00000000000000000000000000000000815250610ba5565b5f5f5f838060200190518101906107f3919061281d565b925092509250610804828483610c3e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb73ba12222222228d8ba445958a75a0704d566bf2c8885f815181106108685761086761286d565b5b60200260200101516040518363ffffffff1660e01b815260040161088d92919061289a565b6020604051808303815f875af11580156108a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd91906128d5565b5050505050505050565b6108df610a66565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490612970565b60405180910390fd5b61095681610ae4565b50565b6109f1828260405160240161096f9291906129d0565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117a8565b5050565b5f5f8203610a05575f9050610a61565b5f6002600184610a159190612415565b610a1f91906123b2565b90505f8390505b80821015610a5b578190506002828386610a4091906123b2565b610a4a9190612415565b610a5491906123b2565b9150610a26565b80925050505b919050565b610a6e6117ce565b73ffffffffffffffffffffffffffffffffffffffff16610a8c61058b565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990612a48565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c3b81604051602401610bb99190612a66565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117a8565b50565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c989190611efe565b602060405180830381865afa158015610cb3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd79190612a86565b9050610d186040518060400160405280601681526020017f5374617274696e672062616c616e636520203a2025730000000000000000000081525082610959565b5f8490505f849050610d5e6040518060400160405280601e81526020017f0a2d2d2d2d2d2d2d2d2d20504149522044415441202d2d2d2d2d2d2d2d2d0000815250610ba5565b5f610d68836117d5565b90505f610d74836117d5565b9050610db46040518060400160405280601b81526020017f0a2d2d2d2d2d2d2d2d2d20505249434553202d2d2d2d2d2d2d2d2d0000000000815250610ba5565b610df76040518060400160405280601681526020017f6669727374506169722070726963652020203a202573000000000000000000008152508360400151610959565b610e3a6040518060400160405280601681526020017f7365636f6e645061697220707269636520203a202573000000000000000000008152508260400151610959565b5f610e45838361065b565b9050610e68604051806060016040528060228152602001612d3f60229139610ba5565b610ea76040518060400160405280601681526020017f616d6f756e74496e202020202020202020203a2025730000000000000000000081525082610959565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a836040518363ffffffff1660e01b8152600401610f0292919061289a565b6020604051808303815f875af1158015610f1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4291906128d5565b505f5f6001151585606001511515036111d857610f6783865f01518760200151611a6c565b9150610f7b828560200151865f0151611a6c565b9050610fbc6040518060400160405280601681526020017f666972737450616972416d6f756e744f75743a2025730000000000000000000081525083610959565b610ffb6040518060400160405280601681526020017f66696e616c416d6f756e744f7574202020203a2025730000000000000000000081525082610959565b6110456040518060400160405280601681526020017f6172622070726f66697420202020202020203a20257300000000000000000000815250848361104091906123e2565b610959565b6110836040518060400160405280601c81526020017f0a2d2d2d2d2d2d2d2d2d2054524144494e47202d2d2d2d2d2d2d2d2d00000000815250610ba5565b8673ffffffffffffffffffffffffffffffffffffffff1663022c0d9f5f848d6040518463ffffffff1660e01b81526004016110c093929190612b0d565b5f604051808303815f87803b1580156110d7575f5ffd5b505af11580156110e9573d5f5f3e3d5ffd5b5050505061112b6040518060400160405280601381526020017f666972737450616972207377617020646f6e6500000000000000000000000000815250610ba5565b8573ffffffffffffffffffffffffffffffffffffffff1663022c0d9f825f306040518463ffffffff1660e01b815260040161116893929190612b55565b5f604051808303815f87803b15801561117f575f5ffd5b505af1158015611191573d5f5f3e3d5ffd5b505050506111d36040518060400160405280601481526020017f7365636f6e6450616972207377617020646f6e65000000000000000000000000815250610ba5565b6114b7565b6111ea838660200151875f0151611a6c565b91506111fe82855f01518660200151611a6c565b9050611221604051806060016040528060228152602001612d3f60229139610ba5565b6112606040518060400160405280601681526020017f616d6f756e74496e202020202020202020203a2025730000000000000000000081525084610959565b61129f6040518060400160405280601681526020017f666972737450616972416d6f756e744f75743a2025730000000000000000000081525083610959565b6112de6040518060400160405280601681526020017f66696e616c416d6f756e744f7574202020203a2025730000000000000000000081525082610959565b6113286040518060400160405280601681526020017f6172622070726f66697420202020202020203a20257300000000000000000000815250848361132391906123e2565b610959565b6113666040518060400160405280601c81526020017f0a2d2d2d2d2d2d2d2d2d2054524144494e47202d2d2d2d2d2d2d2d2d00000000815250610ba5565b8673ffffffffffffffffffffffffffffffffffffffff1663022c0d9f835f8d6040518463ffffffff1660e01b81526004016113a393929190612b55565b5f604051808303815f87803b1580156113ba575f5ffd5b505af11580156113cc573d5f5f3e3d5ffd5b5050505061140e6040518060400160405280601381526020017f666972737450616972207377617020646f6e6500000000000000000000000000815250610ba5565b8573ffffffffffffffffffffffffffffffffffffffff1663022c0d9f5f83306040518463ffffffff1660e01b815260040161144b93929190612b0d565b5f604051808303815f87803b158015611462575f5ffd5b505af1158015611474573d5f5f3e3d5ffd5b505050506114b66040518060400160405280601481526020017f7365636f6e6450616972207377617020646f6e65000000000000000000000000815250610ba5565b5b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115119190611efe565b602060405180830381865afa15801561152c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190612a86565b9050888111611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90612be7565b60405180910390fd5b6115d26040518060400160405280601c81526020017f0a2d2d2d2d2d2d2d2d2d2053554343455353202d2d2d2d2d2d2d2d2d00000000815250610ba5565b6116116040518060400160405280601681526020017f456e64696e672062616c616e6365202020203a2025730000000000000000000081525082610959565b5f898261161e91906123e2565b905061165f6040518060400160405280601681526020017f50726f6669742020202020202020202020203a2025730000000000000000000081525082610959565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016116b89190611d4b565b5f604051808303815f87803b1580156116cf575f5ffd5b505af11580156116e1573d5f5f3e3d5ffd5b505050505f60648c836116f49190612344565b6116fe91906123b2565b90505f818361170d91906123e2565b90504173ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611752573d5f5f3e3d5ffd5b503273ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611796573d5f5f3e3d5ffd5b50505050505050505050505050505050565b5f815190505f6a636f6e736f6c652e6c6f679050602083015f5f8483855afa5050505050565b5f33905090565b6117dd611b5d565b5f5f8373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611828573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184c9190612c81565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506118b06040518060400160405280600581526020017f706169723a00000000000000000000000000000000000000000000000000000081525085611ac1565b6118ef6040518060400160405280600981526020017f72657365727665303a000000000000000000000000000000000000000000000081525083610959565b61192e6040518060400160405280600981526020017f72657365727665313a000000000000000000000000000000000000000000000081525082610959565b5f5f5f90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d79190612ce5565b73ffffffffffffffffffffffffffffffffffffffff1603611a1c5783670de0b6b3a764000084611a079190612344565b611a1191906123b2565b915060019050611a3e565b82670de0b6b3a764000085611a319190612344565b611a3b91906123b2565b91505b6040518060800160405280858152602001848152602001838152602001821515815250945050505050919050565b5f5f6103e585611a7c9190612344565b90505f8382611a8b9190612344565b90505f826103e887611a9d9190612344565b611aa79190612415565b90508082611ab591906123b2565b93505050509392505050565b611b598282604051602401611ad7929190612d10565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117a8565b5050565b60405180608001604052805f81526020015f81526020015f81526020015f151581525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611bde82611b98565b810181811067ffffffffffffffff82111715611bfd57611bfc611ba8565b5b80604052505050565b5f611c0f611b83565b9050611c1b8282611bd5565b919050565b5f819050919050565b611c3281611c20565b8114611c3c575f5ffd5b50565b5f81359050611c4d81611c29565b92915050565b5f8115159050919050565b611c6781611c53565b8114611c71575f5ffd5b50565b5f81359050611c8281611c5e565b92915050565b5f60808284031215611c9d57611c9c611b94565b5b611ca76080611c06565b90505f611cb684828501611c3f565b5f830152506020611cc984828501611c3f565b6020830152506040611cdd84828501611c3f565b6040830152506060611cf184828501611c74565b60608301525092915050565b5f5f6101008385031215611d1457611d13611b8c565b5b5f611d2185828601611c88565b9250506080611d3285828601611c88565b9150509250929050565b611d4581611c20565b82525050565b5f602082019050611d5e5f830184611d3c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611d8d82611d64565b9050919050565b611d9d81611d83565b8114611da7575f5ffd5b50565b5f81359050611db881611d94565b92915050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115611de057611ddf611ba8565b5b611de982611b98565b9050602081019050919050565b828183375f83830152505050565b5f611e16611e1184611dc6565b611c06565b905082815260208101848484011115611e3257611e31611dc2565b5b611e3d848285611df6565b509392505050565b5f82601f830112611e5957611e58611dbe565b5b8135611e69848260208601611e04565b91505092915050565b5f5f5f60608486031215611e8957611e88611b8c565b5b5f611e9686828701611daa565b9350506020611ea786828701611c3f565b925050604084013567ffffffffffffffff811115611ec857611ec7611b90565b5b611ed486828701611e45565b9150509250925092565b5f611ee882611d64565b9050919050565b611ef881611ede565b82525050565b5f602082019050611f115f830184611eef565b92915050565b5f819050919050565b5f611f3a611f35611f3084611d64565b611f17565b611d64565b9050919050565b5f611f4b82611f20565b9050919050565b5f611f5c82611f41565b9050919050565b611f6c81611f52565b82525050565b5f602082019050611f855f830184611f63565b92915050565b5f67ffffffffffffffff821115611fa557611fa4611ba8565b5b602082029050602081019050919050565b5f5ffd5b5f611fc482611ede565b9050919050565b611fd481611fba565b8114611fde575f5ffd5b50565b5f81359050611fef81611fcb565b92915050565b5f61200761200284611f8b565b611c06565b9050808382526020820190506020840283018581111561202a57612029611fb6565b5b835b81811015612053578061203f8882611fe1565b84526020840193505060208101905061202c565b5050509392505050565b5f82601f83011261207157612070611dbe565b5b8135612081848260208601611ff5565b91505092915050565b5f67ffffffffffffffff8211156120a4576120a3611ba8565b5b602082029050602081019050919050565b5f6120c76120c28461208a565b611c06565b905080838252602082019050602084028301858111156120ea576120e9611fb6565b5b835b8181101561211357806120ff8882611c3f565b8452602084019350506020810190506120ec565b5050509392505050565b5f82601f83011261213157612130611dbe565b5b81356121418482602086016120b5565b91505092915050565b5f5f5f6060848603121561216157612160611b8c565b5b5f84013567ffffffffffffffff81111561217e5761217d611b90565b5b61218a8682870161205d565b935050602084013567ffffffffffffffff8111156121ab576121aa611b90565b5b6121b78682870161211d565b925050604084013567ffffffffffffffff8111156121d8576121d7611b90565b5b6121e486828701611e45565b9150509250925092565b5f5f5f5f6080858703121561220657612205611b8c565b5b5f85013567ffffffffffffffff81111561222357612222611b90565b5b61222f8782880161205d565b945050602085013567ffffffffffffffff8111156122505761224f611b90565b5b61225c8782880161211d565b935050604085013567ffffffffffffffff81111561227d5761227c611b90565b5b6122898782880161211d565b925050606085013567ffffffffffffffff8111156122aa576122a9611b90565b5b6122b687828801611e45565b91505092959194509250565b6122cb81611ede565b81146122d5575f5ffd5b50565b5f813590506122e6816122c2565b92915050565b5f6020828403121561230157612300611b8c565b5b5f61230e848285016122d8565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61234e82611c20565b915061235983611c20565b925082820261236781611c20565b9150828204841483151761237e5761237d612317565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6123bc82611c20565b91506123c783611c20565b9250826123d7576123d6612385565b5b828204905092915050565b5f6123ec82611c20565b91506123f783611c20565b925082820390508181111561240f5761240e612317565b5b92915050565b5f61241f82611c20565b915061242a83611c20565b925082820190508082111561244257612441612317565b5b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61247482612448565b61247e8185612452565b935061248e81856020860161245c565b80840191505092915050565b5f6124a5828461246a565b915081905092915050565b5f82825260208201905092915050565b7f45787465726e616c2063616c6c206661696c65640000000000000000000000005f82015250565b5f6124f46014836124b0565b91506124ff826124c0565b602082019050919050565b5f6020820190508181035f830152612521816124e8565b9050919050565b5f61253282611f41565b9050919050565b61254281612528565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61257b82611f41565b9050919050565b61258b81612571565b82525050565b5f61259c8383612582565b60208301905092915050565b5f602082019050919050565b5f6125be82612548565b6125c88185612552565b93506125d383612562565b805f5b838110156126035781516125ea8882612591565b97506125f5836125a8565b9250506001810190506125d6565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61264281611c20565b82525050565b5f6126538383612639565b60208301905092915050565b5f602082019050919050565b5f61267582612610565b61267f818561261a565b935061268a8361262a565b805f5b838110156126ba5781516126a18882612648565b97506126ac8361265f565b92505060018101905061268d565b5085935050505092915050565b5f82825260208201905092915050565b5f6126e182612448565b6126eb81856126c7565b93506126fb81856020860161245c565b61270481611b98565b840191505092915050565b5f6080820190506127225f830187612539565b818103602083015261273481866125b4565b90508181036040830152612748818561266b565b9050818103606083015261275c81846126d7565b905095945050505050565b7f466c6173684c6f616e526563697069656e743a2063616c6c6572206973206e6f5f8201527f7420746865207661756c74000000000000000000000000000000000000000000602082015250565b5f6127c1602b836124b0565b91506127cc82612767565b604082019050919050565b5f6020820190508181035f8301526127ee816127b5565b9050919050565b5f8151905061280381611d94565b92915050565b5f8151905061281781611c29565b92915050565b5f5f5f6060848603121561283457612833611b8c565b5b5f612841868287016127f5565b9350506020612852868287016127f5565b925050604061286386828701612809565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6040820190506128ad5f830185611eef565b6128ba6020830184611d3c565b9392505050565b5f815190506128cf81611c5e565b92915050565b5f602082840312156128ea576128e9611b8c565b5b5f6128f7848285016128c1565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61295a6026836124b0565b915061296582612900565b604082019050919050565b5f6020820190508181035f8301526129878161294e565b9050919050565b5f81519050919050565b5f6129a28261298e565b6129ac81856124b0565b93506129bc81856020860161245c565b6129c581611b98565b840191505092915050565b5f6040820190508181035f8301526129e88185612998565b90506129f76020830184611d3c565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612a326020836124b0565b9150612a3d826129fe565b602082019050919050565b5f6020820190508181035f830152612a5f81612a26565b9050919050565b5f6020820190508181035f830152612a7e8184612998565b905092915050565b5f60208284031215612a9b57612a9a611b8c565b5b5f612aa884828501612809565b91505092915050565b5f819050919050565b5f612ad4612acf612aca84612ab1565b611f17565b611c20565b9050919050565b612ae481612aba565b82525050565b50565b5f612af85f836126c7565b9150612b0382612aea565b5f82019050919050565b5f608082019050612b205f830186612adb565b612b2d6020830185611d3c565b612b3a6040830184611eef565b8181036060830152612b4b81612aed565b9050949350505050565b5f608082019050612b685f830186611d3c565b612b756020830185612adb565b612b826040830184611eef565b8181036060830152612b9381612aed565b9050949350505050565b7f417262697472616765206661696c6564000000000000000000000000000000005f82015250565b5f612bd16010836124b0565b9150612bdc82612b9d565b602082019050919050565b5f6020820190508181035f830152612bfe81612bc5565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b612c2781612c05565b8114612c31575f5ffd5b50565b5f81519050612c4281612c1e565b92915050565b5f63ffffffff82169050919050565b612c6081612c48565b8114612c6a575f5ffd5b50565b5f81519050612c7b81612c57565b92915050565b5f5f5f60608486031215612c9857612c97611b8c565b5b5f612ca586828701612c34565b9350506020612cb686828701612c34565b9250506040612cc786828701612c6d565b9150509250925092565b5f81519050612cdf816122c2565b92915050565b5f60208284031215612cfa57612cf9611b8c565b5b5f612d0784828501612cd1565b91505092915050565b5f6040820190508181035f830152612d288185612998565b9050612d376020830184611eef565b939250505056fe0a2d2d2d2d2d2d2d2d2d20545241444520414d4f554e5453202d2d2d2d2d2d2d2d2da2646970667358221220aff83a5a3cc864c4489fbe3f0f778959d29545bc64f03bc951391b7023e0494264736f6c63430008210033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x608060405260043610610093575f3560e01c8063ad5c464811610058578063ad5c46481461017e578063c9a69562146101a8578063eb6b2116146101d0578063f04f27071461020c578063f2fde38b146102345761009a565b8062bb7d671461009e5780631fa7d39b146100da5780636dbf2fa014610116578063715018a61461013e5780638da5cb5b146101545761009a565b3661009a57005b5f5ffd5b3480156100a9575f5ffd5b506100c460048036038101906100bf9190611cfd565b61025c565b6040516100d19190611d4b565b60405180910390f35b3480156100e5575f5ffd5b5061010060048036038101906100fb9190611cfd565b61040b565b60405161010d9190611d4b565b60405180910390f35b348015610121575f5ffd5b5061013c60048036038101906101379190611e72565b6104c0565b005b348015610149575f5ffd5b50610152610578565b005b34801561015f575f5ffd5b5061016861058b565b6040516101759190611efe565b60405180910390f35b348015610189575f5ffd5b506101926105b2565b60405161019f9190611f72565b60405180910390f35b3480156101b3575f5ffd5b506101ce60048036038101906101c9919061214a565b6105d6565b005b3480156101db575f5ffd5b506101f660048036038101906101f19190611cfd565b61065b565b6040516102039190611d4b565b60405180910390f35b348015610217575f5ffd5b50610232600480360381019061022d91906121ee565b61071c565b005b34801561023f575f5ffd5b5061025a600480360381019061025591906122ec565b6108d7565b005b5f60011515836060015115150361037e575f835f01518360200151845f015186602001516103e58061028e9190612344565b6102989190612344565b6102a29190612344565b6102ac91906123b2565b6102b691906123b2565b90506102f76040518060400160405280600b81526020017f707265737172743a20257300000000000000000000000000000000000000000081525082610959565b61033e6040518060400160405280601181526020017f737172742870726573717274293a202573000000000000000000000000000000815250610339836109f5565b610959565b5f845f015184602001516103e8610354856109f5565b61035e91906123e2565b6103689190612344565b6103729190612344565b90508092505050610405565b5f8360200151835f01518460200151865f01516103e58061039f9190612344565b6103a99190612344565b6103b39190612344565b6103bd91906123b2565b6103c791906123b2565b90505f8460200151845f01516103e86103df856109f5565b6103e991906123e2565b6103f39190612344565b6103fd9190612344565b905080925050505b92915050565b5f60011515836060015115150361046e575f83602001516103e5806104309190612344565b61043a9190612344565b6103e884602001516103e561044f9190612344565b6104599190612344565b6104639190612415565b9050809150506104ba565b5f835f01516103e5806104819190612344565b61048b9190612344565b6103e8845f01516103e561049f9190612344565b6104a99190612344565b6104b39190612415565b9050809150505b92915050565b6104c8610a66565b5f8373ffffffffffffffffffffffffffffffffffffffff1683836040516104ef919061249a565b5f6040518083038185875af1925050503d805f8114610529576040519150601f19603f3d011682016040523d82523d5f602084013e61052e565b606091505b5050905080610572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105699061250a565b60405180910390fd5b50505050565b610580610a66565b6105895f610ae4565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b73ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff16635c38449e308585856040518563ffffffff1660e01b8152600401610629949392919061270f565b5f604051808303815f87803b158015610640575f5ffd5b505af1158015610652573d5f5f3e3d5ffd5b50505050505050565b5f5f610667848461025c565b90506106a86040518060400160405280600d81526020017f6e756d657261746f723a2025730000000000000000000000000000000000000081525082610959565b5f6106b3858561040b565b90506106f46040518060400160405280600f81526020017f64656e6f6d696e61746f723a202573000000000000000000000000000000000081525082610959565b5f816103e8846107049190612344565b61070e91906123b2565b905080935050505092915050565b73ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610795906127d7565b60405180910390fd5b6107dc6040518060400160405280601081526020017f72656365697665466c6173684c6f616e00000000000000000000000000000000815250610ba5565b5f5f5f838060200190518101906107f3919061281d565b925092509250610804828483610c3e565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb73ba12222222228d8ba445958a75a0704d566bf2c8885f815181106108685761086761286d565b5b60200260200101516040518363ffffffff1660e01b815260040161088d92919061289a565b6020604051808303815f875af11580156108a9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cd91906128d5565b5050505050505050565b6108df610a66565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361094d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094490612970565b60405180910390fd5b61095681610ae4565b50565b6109f1828260405160240161096f9291906129d0565b6040516020818303038152906040527f9710a9d0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117a8565b5050565b5f5f8203610a05575f9050610a61565b5f6002600184610a159190612415565b610a1f91906123b2565b90505f8390505b80821015610a5b578190506002828386610a4091906123b2565b610a4a9190612415565b610a5491906123b2565b9150610a26565b80925050505b919050565b610a6e6117ce565b73ffffffffffffffffffffffffffffffffffffffff16610a8c61058b565b73ffffffffffffffffffffffffffffffffffffffff1614610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990612a48565b60405180910390fd5b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c3b81604051602401610bb99190612a66565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117a8565b50565b5f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c989190611efe565b602060405180830381865afa158015610cb3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd79190612a86565b9050610d186040518060400160405280601681526020017f5374617274696e672062616c616e636520203a2025730000000000000000000081525082610959565b5f8490505f849050610d5e6040518060400160405280601e81526020017f0a2d2d2d2d2d2d2d2d2d20504149522044415441202d2d2d2d2d2d2d2d2d0000815250610ba5565b5f610d68836117d5565b90505f610d74836117d5565b9050610db46040518060400160405280601b81526020017f0a2d2d2d2d2d2d2d2d2d20505249434553202d2d2d2d2d2d2d2d2d0000000000815250610ba5565b610df76040518060400160405280601681526020017f6669727374506169722070726963652020203a202573000000000000000000008152508360400151610959565b610e3a6040518060400160405280601681526020017f7365636f6e645061697220707269636520203a202573000000000000000000008152508260400151610959565b5f610e45838361065b565b9050610e68604051806060016040528060228152602001612d3f60229139610ba5565b610ea76040518060400160405280601681526020017f616d6f756e74496e202020202020202020203a2025730000000000000000000081525082610959565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8a836040518363ffffffff1660e01b8152600401610f0292919061289a565b6020604051808303815f875af1158015610f1e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4291906128d5565b505f5f6001151585606001511515036111d857610f6783865f01518760200151611a6c565b9150610f7b828560200151865f0151611a6c565b9050610fbc6040518060400160405280601681526020017f666972737450616972416d6f756e744f75743a2025730000000000000000000081525083610959565b610ffb6040518060400160405280601681526020017f66696e616c416d6f756e744f7574202020203a2025730000000000000000000081525082610959565b6110456040518060400160405280601681526020017f6172622070726f66697420202020202020203a20257300000000000000000000815250848361104091906123e2565b610959565b6110836040518060400160405280601c81526020017f0a2d2d2d2d2d2d2d2d2d2054524144494e47202d2d2d2d2d2d2d2d2d00000000815250610ba5565b8673ffffffffffffffffffffffffffffffffffffffff1663022c0d9f5f848d6040518463ffffffff1660e01b81526004016110c093929190612b0d565b5f604051808303815f87803b1580156110d7575f5ffd5b505af11580156110e9573d5f5f3e3d5ffd5b5050505061112b6040518060400160405280601381526020017f666972737450616972207377617020646f6e6500000000000000000000000000815250610ba5565b8573ffffffffffffffffffffffffffffffffffffffff1663022c0d9f825f306040518463ffffffff1660e01b815260040161116893929190612b55565b5f604051808303815f87803b15801561117f575f5ffd5b505af1158015611191573d5f5f3e3d5ffd5b505050506111d36040518060400160405280601481526020017f7365636f6e6450616972207377617020646f6e65000000000000000000000000815250610ba5565b6114b7565b6111ea838660200151875f0151611a6c565b91506111fe82855f01518660200151611a6c565b9050611221604051806060016040528060228152602001612d3f60229139610ba5565b6112606040518060400160405280601681526020017f616d6f756e74496e202020202020202020203a2025730000000000000000000081525084610959565b61129f6040518060400160405280601681526020017f666972737450616972416d6f756e744f75743a2025730000000000000000000081525083610959565b6112de6040518060400160405280601681526020017f66696e616c416d6f756e744f7574202020203a2025730000000000000000000081525082610959565b6113286040518060400160405280601681526020017f6172622070726f66697420202020202020203a20257300000000000000000000815250848361132391906123e2565b610959565b6113666040518060400160405280601c81526020017f0a2d2d2d2d2d2d2d2d2d2054524144494e47202d2d2d2d2d2d2d2d2d00000000815250610ba5565b8673ffffffffffffffffffffffffffffffffffffffff1663022c0d9f835f8d6040518463ffffffff1660e01b81526004016113a393929190612b55565b5f604051808303815f87803b1580156113ba575f5ffd5b505af11580156113cc573d5f5f3e3d5ffd5b5050505061140e6040518060400160405280601381526020017f666972737450616972207377617020646f6e6500000000000000000000000000815250610ba5565b8573ffffffffffffffffffffffffffffffffffffffff1663022c0d9f5f83306040518463ffffffff1660e01b815260040161144b93929190612b0d565b5f604051808303815f87803b158015611462575f5ffd5b505af1158015611474573d5f5f3e3d5ffd5b505050506114b66040518060400160405280601481526020017f7365636f6e6450616972207377617020646f6e65000000000000000000000000815250610ba5565b5b5f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115119190611efe565b602060405180830381865afa15801561152c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190612a86565b9050888111611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90612be7565b60405180910390fd5b6115d26040518060400160405280601c81526020017f0a2d2d2d2d2d2d2d2d2d2053554343455353202d2d2d2d2d2d2d2d2d00000000815250610ba5565b6116116040518060400160405280601681526020017f456e64696e672062616c616e6365202020203a2025730000000000000000000081525082610959565b5f898261161e91906123e2565b905061165f6040518060400160405280601681526020017f50726f6669742020202020202020202020203a2025730000000000000000000081525082610959565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b81526004016116b89190611d4b565b5f604051808303815f87803b1580156116cf575f5ffd5b505af11580156116e1573d5f5f3e3d5ffd5b505050505f60648c836116f49190612344565b6116fe91906123b2565b90505f818361170d91906123e2565b90504173ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611752573d5f5f3e3d5ffd5b503273ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611796573d5f5f3e3d5ffd5b50505050505050505050505050505050565b5f815190505f6a636f6e736f6c652e6c6f679050602083015f5f8483855afa5050505050565b5f33905090565b6117dd611b5d565b5f5f8373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611828573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184c9190612c81565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506118b06040518060400160405280600581526020017f706169723a00000000000000000000000000000000000000000000000000000081525085611ac1565b6118ef6040518060400160405280600981526020017f72657365727665303a000000000000000000000000000000000000000000000081525083610959565b61192e6040518060400160405280600981526020017f72657365727665313a000000000000000000000000000000000000000000000081525082610959565b5f5f5f90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d79190612ce5565b73ffffffffffffffffffffffffffffffffffffffff1603611a1c5783670de0b6b3a764000084611a079190612344565b611a1191906123b2565b915060019050611a3e565b82670de0b6b3a764000085611a319190612344565b611a3b91906123b2565b91505b6040518060800160405280858152602001848152602001838152602001821515815250945050505050919050565b5f5f6103e585611a7c9190612344565b90505f8382611a8b9190612344565b90505f826103e887611a9d9190612344565b611aa79190612415565b90508082611ab591906123b2565b93505050509392505050565b611b598282604051602401611ad7929190612d10565b6040516020818303038152906040527f319af333000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117a8565b5050565b60405180608001604052805f81526020015f81526020015f81526020015f151581525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611bde82611b98565b810181811067ffffffffffffffff82111715611bfd57611bfc611ba8565b5b80604052505050565b5f611c0f611b83565b9050611c1b8282611bd5565b919050565b5f819050919050565b611c3281611c20565b8114611c3c575f5ffd5b50565b5f81359050611c4d81611c29565b92915050565b5f8115159050919050565b611c6781611c53565b8114611c71575f5ffd5b50565b5f81359050611c8281611c5e565b92915050565b5f60808284031215611c9d57611c9c611b94565b5b611ca76080611c06565b90505f611cb684828501611c3f565b5f830152506020611cc984828501611c3f565b6020830152506040611cdd84828501611c3f565b6040830152506060611cf184828501611c74565b60608301525092915050565b5f5f6101008385031215611d1457611d13611b8c565b5b5f611d2185828601611c88565b9250506080611d3285828601611c88565b9150509250929050565b611d4581611c20565b82525050565b5f602082019050611d5e5f830184611d3c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611d8d82611d64565b9050919050565b611d9d81611d83565b8114611da7575f5ffd5b50565b5f81359050611db881611d94565b92915050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115611de057611ddf611ba8565b5b611de982611b98565b9050602081019050919050565b828183375f83830152505050565b5f611e16611e1184611dc6565b611c06565b905082815260208101848484011115611e3257611e31611dc2565b5b611e3d848285611df6565b509392505050565b5f82601f830112611e5957611e58611dbe565b5b8135611e69848260208601611e04565b91505092915050565b5f5f5f60608486031215611e8957611e88611b8c565b5b5f611e9686828701611daa565b9350506020611ea786828701611c3f565b925050604084013567ffffffffffffffff811115611ec857611ec7611b90565b5b611ed486828701611e45565b9150509250925092565b5f611ee882611d64565b9050919050565b611ef881611ede565b82525050565b5f602082019050611f115f830184611eef565b92915050565b5f819050919050565b5f611f3a611f35611f3084611d64565b611f17565b611d64565b9050919050565b5f611f4b82611f20565b9050919050565b5f611f5c82611f41565b9050919050565b611f6c81611f52565b82525050565b5f602082019050611f855f830184611f63565b92915050565b5f67ffffffffffffffff821115611fa557611fa4611ba8565b5b602082029050602081019050919050565b5f5ffd5b5f611fc482611ede565b9050919050565b611fd481611fba565b8114611fde575f5ffd5b50565b5f81359050611fef81611fcb565b92915050565b5f61200761200284611f8b565b611c06565b9050808382526020820190506020840283018581111561202a57612029611fb6565b5b835b81811015612053578061203f8882611fe1565b84526020840193505060208101905061202c565b5050509392505050565b5f82601f83011261207157612070611dbe565b5b8135612081848260208601611ff5565b91505092915050565b5f67ffffffffffffffff8211156120a4576120a3611ba8565b5b602082029050602081019050919050565b5f6120c76120c28461208a565b611c06565b905080838252602082019050602084028301858111156120ea576120e9611fb6565b5b835b8181101561211357806120ff8882611c3f565b8452602084019350506020810190506120ec565b5050509392505050565b5f82601f83011261213157612130611dbe565b5b81356121418482602086016120b5565b91505092915050565b5f5f5f6060848603121561216157612160611b8c565b5b5f84013567ffffffffffffffff81111561217e5761217d611b90565b5b61218a8682870161205d565b935050602084013567ffffffffffffffff8111156121ab576121aa611b90565b5b6121b78682870161211d565b925050604084013567ffffffffffffffff8111156121d8576121d7611b90565b5b6121e486828701611e45565b9150509250925092565b5f5f5f5f6080858703121561220657612205611b8c565b5b5f85013567ffffffffffffffff81111561222357612222611b90565b5b61222f8782880161205d565b945050602085013567ffffffffffffffff8111156122505761224f611b90565b5b61225c8782880161211d565b935050604085013567ffffffffffffffff81111561227d5761227c611b90565b5b6122898782880161211d565b925050606085013567ffffffffffffffff8111156122aa576122a9611b90565b5b6122b687828801611e45565b91505092959194509250565b6122cb81611ede565b81146122d5575f5ffd5b50565b5f813590506122e6816122c2565b92915050565b5f6020828403121561230157612300611b8c565b5b5f61230e848285016122d8565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61234e82611c20565b915061235983611c20565b925082820261236781611c20565b9150828204841483151761237e5761237d612317565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6123bc82611c20565b91506123c783611c20565b9250826123d7576123d6612385565b5b828204905092915050565b5f6123ec82611c20565b91506123f783611c20565b925082820390508181111561240f5761240e612317565b5b92915050565b5f61241f82611c20565b915061242a83611c20565b925082820190508082111561244257612441612317565b5b92915050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61247482612448565b61247e8185612452565b935061248e81856020860161245c565b80840191505092915050565b5f6124a5828461246a565b915081905092915050565b5f82825260208201905092915050565b7f45787465726e616c2063616c6c206661696c65640000000000000000000000005f82015250565b5f6124f46014836124b0565b91506124ff826124c0565b602082019050919050565b5f6020820190508181035f830152612521816124e8565b9050919050565b5f61253282611f41565b9050919050565b61254281612528565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f61257b82611f41565b9050919050565b61258b81612571565b82525050565b5f61259c8383612582565b60208301905092915050565b5f602082019050919050565b5f6125be82612548565b6125c88185612552565b93506125d383612562565b805f5b838110156126035781516125ea8882612591565b97506125f5836125a8565b9250506001810190506125d6565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61264281611c20565b82525050565b5f6126538383612639565b60208301905092915050565b5f602082019050919050565b5f61267582612610565b61267f818561261a565b935061268a8361262a565b805f5b838110156126ba5781516126a18882612648565b97506126ac8361265f565b92505060018101905061268d565b5085935050505092915050565b5f82825260208201905092915050565b5f6126e182612448565b6126eb81856126c7565b93506126fb81856020860161245c565b61270481611b98565b840191505092915050565b5f6080820190506127225f830187612539565b818103602083015261273481866125b4565b90508181036040830152612748818561266b565b9050818103606083015261275c81846126d7565b905095945050505050565b7f466c6173684c6f616e526563697069656e743a2063616c6c6572206973206e6f5f8201527f7420746865207661756c74000000000000000000000000000000000000000000602082015250565b5f6127c1602b836124b0565b91506127cc82612767565b604082019050919050565b5f6020820190508181035f8301526127ee816127b5565b9050919050565b5f8151905061280381611d94565b92915050565b5f8151905061281781611c29565b92915050565b5f5f5f6060848603121561283457612833611b8c565b5b5f612841868287016127f5565b9350506020612852868287016127f5565b925050604061286386828701612809565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6040820190506128ad5f830185611eef565b6128ba6020830184611d3c565b9392505050565b5f815190506128cf81611c5e565b92915050565b5f602082840312156128ea576128e9611b8c565b5b5f6128f7848285016128c1565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61295a6026836124b0565b915061296582612900565b604082019050919050565b5f6020820190508181035f8301526129878161294e565b9050919050565b5f81519050919050565b5f6129a28261298e565b6129ac81856124b0565b93506129bc81856020860161245c565b6129c581611b98565b840191505092915050565b5f6040820190508181035f8301526129e88185612998565b90506129f76020830184611d3c565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612a326020836124b0565b9150612a3d826129fe565b602082019050919050565b5f6020820190508181035f830152612a5f81612a26565b9050919050565b5f6020820190508181035f830152612a7e8184612998565b905092915050565b5f60208284031215612a9b57612a9a611b8c565b5b5f612aa884828501612809565b91505092915050565b5f819050919050565b5f612ad4612acf612aca84612ab1565b611f17565b611c20565b9050919050565b612ae481612aba565b82525050565b50565b5f612af85f836126c7565b9150612b0382612aea565b5f82019050919050565b5f608082019050612b205f830186612adb565b612b2d6020830185611d3c565b612b3a6040830184611eef565b8181036060830152612b4b81612aed565b9050949350505050565b5f608082019050612b685f830186611d3c565b612b756020830185612adb565b612b826040830184611eef565b8181036060830152612b9381612aed565b9050949350505050565b7f417262697472616765206661696c6564000000000000000000000000000000005f82015250565b5f612bd16010836124b0565b9150612bdc82612b9d565b602082019050919050565b5f6020820190508181035f830152612bfe81612bc5565b9050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b612c2781612c05565b8114612c31575f5ffd5b50565b5f81519050612c4281612c1e565b92915050565b5f63ffffffff82169050919050565b612c6081612c48565b8114612c6a575f5ffd5b50565b5f81519050612c7b81612c57565b92915050565b5f5f5f60608486031215612c9857612c97611b8c565b5b5f612ca586828701612c34565b9350506020612cb686828701612c34565b9250506040612cc786828701612c6d565b9150509250925092565b5f81519050612cdf816122c2565b92915050565b5f60208284031215612cfa57612cf9611b8c565b5b5f612d0784828501612cd1565b91505092915050565b5f6040820190508181035f830152612d288185612998565b9050612d376020830184611eef565b939250505056fe0a2d2d2d2d2d2d2d2d2d20545241444520414d4f554e5453202d2d2d2d2d2d2d2d2da2646970667358221220aff83a5a3cc864c4489fbe3f0f778959d29545bc64f03bc951391b7023e0494264736f6c63430008210033

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.