ETH Price: $2,134.05 (-15.95%)

Contract

0x3451203fe710C349E317740788Fa9Eb2B00976fA
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SubCapitalVault

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 9 : SubCapitalVault.sol
//SPDX-License-Identifier: UNLICENSED

//  ________  _______  _________  ________  ________
// |\   __  \|\  ___ \|\___   ___\\   __  \|\   ____\
// \ \  \|\  \ \   __/\|___ \  \_\ \  \|\  \ \  \___|_
//  \ \   __  \ \  \_|/__  \ \  \ \ \  \\\  \ \_____  \
//   \ \  \ \  \ \  \_|\ \  \ \  \ \ \  \\\  \|____|\  \
//    \ \__\ \__\ \_______\  \ \__\ \ \_______\____\_\  \
//     \|__|\|__|\|_______|   \|__|  \|_______|\_________\
//                                            \|_________|

pragma solidity ^0.8.9;
import "../interfaces/IAetos.sol";
import "../interfaces/IReturnsVault.sol";
import "../interfaces/IOperationsVault.sol";
import "../interfaces/IProposalManager.sol";
import "../utils/DAO.sol";

contract SubCapitalVault is DAO {
    IAetos aetos;
    IReturnsVault returnsVault;
    IOperationsVault operationsVault;
    /************************* Events **************************/
    event ProposeProposal(uint256 indexed _id, Proposal _proposal);
    event VoteProposal(uint256 indexed _id, Vote indexed _vote);
    event ProcessProposal(uint256 indexed _id, Status _status);

    /******************** Public Variables *********************/
    mapping(address => bool) public managers;

    uint256 public totalManagers;

    bool public isActive;
    bool public initialized = false;

    /******************** Structs and Definitions *********************/

    /*********************** Constructor ************************/
    /**
     * @notice Unused, needed to deploy implementation
     */
    constructor() {}

    function initialize(address _aetosContract, address[] memory _managers) external {
        require(!initialized, "ES8"); //Contract already initialised
        aetos = IAetos(_aetosContract);
        returnsVault = IReturnsVault(aetos.getReturnsVault());
        operationsVault = IOperationsVault(aetos.getOperationsVault());

        for (uint256 i = 0; i < _managers.length; i++) {
            managers[_managers[i]] = true;
        }
        totalManagers = _managers.length;
        isActive = true;
        initialized = true;
    }

    /********************* Getter Functions *********************/
    function getIsManager(address _manager) public view returns (bool) {
        return managers[_manager];
    }

    function getIsActive() public view returns (bool) {
        return isActive;
    }

    /********************* Setter Functions *********************/
    /**
     * @notice propose
     * @param  _proposalDraft Proposal being put forth to the DAO
     */
    function propose(ProposalDraft memory _proposalDraft) external _onlyCouncilOrManager {
        require(_proposalDraft.proposalType <= 5, "ES0"); //Proposal Type Out of Bounds
        require(bytes(_proposalDraft.propVarsDraft.detailsURI).length > 0, "ES6"); //Need details uri

        // Assign object to inherit most relevant members;
        proposals[proposalIndex].proposalType = _proposalDraft.proposalType;
        _proposalDraft.propVarsDraft.proposer = msg.sender;
        proposals[proposalIndex].propVars = IProposalManager(aetos.getProposalManager()).handlePropVars(_proposalDraft.propVarsDraft);
        proposals[proposalIndex].propVars.threshold = aetos.getDAOConfigBaseVotingThreshold();
        proposals[proposalIndex].propVars.endDate = block.timestamp + aetos.getDAOConfigVotingPeriod();
        proposals[proposalIndex].existingAddress = _proposalDraft.existingAddress;
        proposals[proposalIndex].newAddress = _proposalDraft.newAddress;
        proposals[proposalIndex].amountOrIndex = _proposalDraft.amountOrIndex;
        proposals[proposalIndex].propVars.quorum = totalManagers;
        proposals[proposalIndex].propVars.totalMembers = totalManagers;

        /* CustomTxn */
        if (_proposalDraft.proposalType == 0) {
            proposals[proposalIndex].propVars.threshold = 100; // Require 100%
            proposals[proposalIndex].customTxn = _proposalDraft.customTxn;
        }

        /* CloseSub */
        if (_proposalDraft.proposalType == 1) {
            require(getIsActive() != _proposalDraft.active, "ES1"); //Vault already this state

            proposals[proposalIndex].active = _proposalDraft.active;
        }

        /* SubManager */
        if (_proposalDraft.proposalType == 2 || _proposalDraft.proposalType == 3 || _proposalDraft.proposalType == 4) {
            _nullCheck(_proposalDraft.newAddress);
            _nullCheck( _proposalDraft.existingAddress);

            proposals[proposalIndex].newAddress = _proposalDraft.newAddress;
            proposals[proposalIndex].existingAddress = _proposalDraft.existingAddress;
        }

        /* Returns */
        if (_proposalDraft.proposalType == 5) {
            require(!aetos.getCanJoin(), "ES2"); //Signups must have already stopped
            require(operationsVault.getWhitelistedTokens(_proposalDraft.token), "ES3"); //Op Token not approved
            require(returnsVault.getPrimaryToken() == _proposalDraft.token, "ES4"); //Return Vault Token not approved
            proposals[proposalIndex].amountOrIndex = _proposalDraft.amountOrIndex;
            proposals[proposalIndex].token = _proposalDraft.token;
        }

        emit ProposeProposal(proposalIndex, proposals[proposalIndex]);

        proposalIndex++;
    }

    /* Voting */

    /**
     * @notice vote
     * @param  _index The index of the proposal
     * @param _vote What vote the user is casting
     */
    function vote(uint256 _index, Vote _vote) external _onlyCouncilOrManager {
        proposals[_index].propVars = IProposalManager(aetos.getProposalManager()).voteProposal(msg.sender, proposals[_index].propVars, _vote);
        proposals[_index].propVars.voters.push(msg.sender);

        emit VoteProposal(_index, _vote);
    }

    /* Processing */

    /**
     * @notice processInternalProposal
     * @param  _index The index of the proposal
     */
    function process(uint256 _index) external _onlyCouncilOrManager {
        proposals[_index].propVars = IProposalManager(aetos.getProposalManager()).processProposalSecurity(proposals[_index].propVars);

        if (proposals[_index].propVars.status == Status.Passed) {
            /* Token */
            if (proposals[_index].proposalType == 0) {
                processCustomTxn(proposals[_index].customTxn.contractAddress, proposals[_index].customTxn.params);
            }
            if (proposals[_index].proposalType == 1) {
                setIsActive(proposals[_index].active);
            }
            if (proposals[_index].proposalType == 2) {
                addManager(proposals[_index].newAddress);
            }
            if (proposals[_index].proposalType == 3) {
                require(totalManagers > 1, "ES9"); //Need at least 1 manager
                removeManager(proposals[_index].existingAddress);
            }
            if (proposals[_index].proposalType == 4) {
                replaceManager(proposals[_index].existingAddress, proposals[_index].newAddress);
            }

            if (proposals[_index].proposalType == 5) {
                /* Requires a check, because when you proposed is not the same as when you process */
                require(returnsVault.getPrimaryToken() == proposals[_index].token, "ES3");

                /* Send to returns vault */
                uint256 returnsVaultAmount = (proposals[_index].amountOrIndex * _safeSubtract(1000, aetos.getOperationsVaultPercentage())) / 1000;

                IERC20DP tempToken = IERC20DP(proposals[_index].token);

                tempToken.transfer(aetos.getReturnsVault(), returnsVaultAmount);

                /* Send to operations vault */
                uint256 operationsVaultAmount = (proposals[_index].amountOrIndex * aetos.getOperationsVaultPercentage()) / 1000;

                IERC20DP(proposals[_index].token).transfer(aetos.getOperationsVault(), operationsVaultAmount);

                emit CurrentBalance(proposals[_index].token, tempToken.balanceOf(address(this)), address(this));
                emit CurrentBalance(proposals[_index].token, tempToken.balanceOf(aetos.getOperationsVault()), aetos.getOperationsVault());
                emit CurrentBalance(proposals[_index].token, tempToken.balanceOf(aetos.getReturnsVault()), aetos.getReturnsVault());
            }
        }
        emit ProcessProposal(_index, proposals[_index].propVars.status);
    }

    function setIsActive(bool _isActive) private {
        isActive = _isActive;
    }

    function addManager(address _member) private {
        managers[_member] = true;
        totalManagers++;
    }

    function removeManager(address _manager) private {
        managers[_manager] = false;
        totalManagers--;
    }

    function replaceManager(address _oldManager, address _newManager) private {
        managers[_newManager] = true;
        managers[_oldManager] = false;
    }

    function processCustomTxn(address _address, bytes memory _params) private {
        (bool success, ) = _address.call(_params);
        require(success, "ES5"); //Failed txn
    }

    /************************ Modifiers *************************/

    modifier _onlyCouncilOrManager() {
        MemberStatus status = MemberStatus(aetos.getMemberStatus(msg.sender));

        require(status == MemberStatus.Council || managers[msg.sender], "ES7"); //Not a council member or manager
        _;
    }
}

File 2 of 9 : IAetos.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
import "hardhat/console.sol";
import "./IDAO.sol";

interface IAetos is IDAO {
    enum CommitStatus {
        Pending,
        Slashed,
        Met,
        Pardoned
    }

    struct Members {
        uint256 shares;
        MemberStatus status;
        uint256 commited;
        CommitStatus[] commitSchedule;
        uint256 votesCasted;
        uint256 claimed;
        uint256 lastClaimed;
        string nickname;
    }

    enum CallStatus {
        Awaiting,
        Called
    }

    /********************* Getter Functions *********************/
    function getDAOEndTime() external view returns (uint256);

    function getDAOConfigBaseVotingThreshold() external view returns (uint256);

    function getDAOConfigVotingPeriod() external view returns (uint256);

    function getMemberStatus(address _member) external view returns (MemberStatus);

    function getNumMembers() external view returns (uint256);

    function getCanJoin() external view returns (bool);

    function getOperationsVault() external view returns (address);

    function getReturnsVault() external view returns (address);

    function getProposalManager() external view returns (address);

    function getOperationsVaultPercentage() external view returns (uint256);

    function getNumCurrentCouncil() external view returns (uint256);

    function getTotalCouncilLength() external view returns (uint256);
}

File 3 of 9 : IReturnsVault.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

interface IReturnsVault {
    function initialize(address _baseToken) external;

    function getPrimaryToken() external view returns (address);

    function getWhitelistedTokens(address _token) external view returns (bool);

    function getTotalReturns(address _token) external returns (uint256);

    function sync(address _token) external;

    function withdraw(
        address _token,
        address _recipient,
        uint256 _amount
    ) external;
}

File 4 of 9 : IOperationsVault.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

interface IOperationsVault {
    function initialize(address _baseToken) external;

    function getWhitelistedTokens(address _token) external view returns (bool);
}

File 5 of 9 : IProposalManager.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
import "../interfaces/IDAO.sol";

interface IProposalManager is IDAO {
    function handlePropVars(ProposalVariablesDraft calldata _propVarsDraft) external view returns (ProposalVariables memory);

    function voteProposal(address _voter, ProposalVariables calldata _propVars, Vote _vote) external view returns (ProposalVariables memory);

    function processProposalSecurity(ProposalVariables calldata _propVars) external view returns (ProposalVariables memory);
}

File 6 of 9 : DAO.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;
import "../interfaces/IDAO.sol";
import "../tokens/IERC20DP.sol";

contract DAO is IDAO {
    /******************** Constants *********************/

    /******************** Public Variables *********************/
    mapping(address => bool) public whitelistedTokens; //Tokens whitelisted per vault (only stables should be used in v1 due to the shares mechanics) Sub vaults can interact with any tokens.

    uint256 public proposalIndex;

    /******************** Structs and Definitions *********************/
    mapping(uint256 => Proposal) public proposals;

    function _safeSubtract(uint256 _num1, uint256 _num2) internal pure returns (uint256) {
        if (_num2 >= _num1) {
            return 0;
        } else {
            return (_num1 - _num2);
        }
    }

    function _nullCheck(address _address) internal pure {
        require(_address != address(0), "ED0"); //This address cannot be null
    }
}

File 7 of 9 : IDAO.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

interface IDAO {
    event CurrentBalance(address _token, uint256 _amount, address _vault);

    enum Vote {
        Null,
        Yes,
        No
    }

    enum Status {
        Pending,
        Passed,
        Failed
    }

    enum MemberStatus {
        NonMember,
        Member,
        Council
    }

    /* 
        Aetos Proposal Types:
            0: Text vote, 
            1: Replace a single council member, 
            2: Existing member kick, 
            3: Stop signups, 
            4: Stop DAO, 
            5: New Member, 
            6: Slash member, 
            7: Pardon member, 
            8: Issue bonus shares,
            9: Nominate new council,
            10: Assume role and withdraw

        Capital Vault Proposal Types:
            0: AMM Swap,
            1: Token Whitelist,
            2: Funding
        
        Operations Vault Proposal Types:
            0: AMM Swap,
            1: Token Whitelist,
            2: Contributor

        Returns Vault Proposal Types:
            0: AMM Swap,
            1: Token Whitelist

        Sub Vault Proposal Types:
            0: Token Whitelist,
            1: Custom Txn,
            2: Close Sub Vault,
            3: Manager add,
            4: Manager remove,
            5: Manager replace,
            6: Issue Returns to main vaults
        */
    struct Proposal {
        uint256 proposalType;
        address existingAddress; // Used in proposals that require existing member addresses
        address newAddress; // Used in proposals that introduce new member addresses
        address[] addressArray;
        uint256[] amountArray;
        address amm;
        address token;
        uint256 amountOrIndex;
        bool whitelist;
        bool active;
        CustomTxn customTxn;
        ProposalVariables propVars;
    }

    struct ProposalDraft {
        uint256 proposalType;
        address existingAddress; // Used in proposals that require existing member addresses
        address newAddress; // Used in proposals that introduce new member addresses
        address[] addressArray;
        uint256[] amountArray;
        address amm;
        address token;
        uint256 amountOrIndex;
        bool whitelist;
        bool active;
        CustomTxn customTxn;
        ProposalVariablesDraft propVarsDraft;
    }

    struct CustomTxn {
        address contractAddress;
        bytes params;
    }

    struct ProposalVariables {
        address proposer;
        uint256 startDate; // When the proposal was created
        uint256 endDate; // When the voting period ends for the proposal
        uint256 closedDate; // When the proposal was finalised
        uint256 threshold /* Between 0-100, i.e. 50 = 50% */;
        uint256 quorum; // Min amount of votes required
        uint256 totalMembers; //Total members that can potentially vote for this
        string detailsURI;
        uint256 yesVotes;
        uint256 noVotes;
        Status status;
        address[] voters;
    }

    struct ProposalVariablesDraft {
        address proposer;
        string detailsURI;
    }
}

File 8 of 9 : 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;
		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(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

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

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

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

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", 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, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", 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, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", 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(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", 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, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

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

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

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

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", 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, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

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

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

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

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", 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(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", 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));
	}

}

File 9 of 9 : IERC20DP.sol
// 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 IERC20DP {
    /**
     * @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 decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @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;

    /**
     * @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;

    /**
     * @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;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"_vault","type":"address"}],"name":"CurrentBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"enum IDAO.Status","name":"_status","type":"uint8"}],"name":"ProcessProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"address","name":"existingAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"address[]","name":"addressArray","type":"address[]"},{"internalType":"uint256[]","name":"amountArray","type":"uint256[]"},{"internalType":"address","name":"amm","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountOrIndex","type":"uint256"},{"internalType":"bool","name":"whitelist","type":"bool"},{"internalType":"bool","name":"active","type":"bool"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"internalType":"struct IDAO.CustomTxn","name":"customTxn","type":"tuple"},{"components":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"closedDate","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"totalMembers","type":"uint256"},{"internalType":"string","name":"detailsURI","type":"string"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"enum IDAO.Status","name":"status","type":"uint8"},{"internalType":"address[]","name":"voters","type":"address[]"}],"internalType":"struct IDAO.ProposalVariables","name":"propVars","type":"tuple"}],"indexed":false,"internalType":"struct IDAO.Proposal","name":"_proposal","type":"tuple"}],"name":"ProposeProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"enum IDAO.Vote","name":"_vote","type":"uint8"}],"name":"VoteProposal","type":"event"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"getIsManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aetosContract","type":"address"},{"internalType":"address[]","name":"_managers","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"process","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposalIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"address","name":"existingAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"address","name":"amm","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountOrIndex","type":"uint256"},{"internalType":"bool","name":"whitelist","type":"bool"},{"internalType":"bool","name":"active","type":"bool"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"internalType":"struct IDAO.CustomTxn","name":"customTxn","type":"tuple"},{"components":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"endDate","type":"uint256"},{"internalType":"uint256","name":"closedDate","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"totalMembers","type":"uint256"},{"internalType":"string","name":"detailsURI","type":"string"},{"internalType":"uint256","name":"yesVotes","type":"uint256"},{"internalType":"uint256","name":"noVotes","type":"uint256"},{"internalType":"enum IDAO.Status","name":"status","type":"uint8"},{"internalType":"address[]","name":"voters","type":"address[]"}],"internalType":"struct IDAO.ProposalVariables","name":"propVars","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"proposalType","type":"uint256"},{"internalType":"address","name":"existingAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"},{"internalType":"address[]","name":"addressArray","type":"address[]"},{"internalType":"uint256[]","name":"amountArray","type":"uint256[]"},{"internalType":"address","name":"amm","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountOrIndex","type":"uint256"},{"internalType":"bool","name":"whitelist","type":"bool"},{"internalType":"bool","name":"active","type":"bool"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"internalType":"struct IDAO.CustomTxn","name":"customTxn","type":"tuple"},{"components":[{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"detailsURI","type":"string"}],"internalType":"struct IDAO.ProposalVariablesDraft","name":"propVarsDraft","type":"tuple"}],"internalType":"struct IDAO.ProposalDraft","name":"_proposalDraft","type":"tuple"}],"name":"propose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalManagers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"enum IDAO.Vote","name":"_vote","type":"uint8"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526008805461ff001916905534801561001b57600080fd5b506130d48061002b6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063943e82161161008c578063daf9c21011610066578063daf9c210146101bc578063fba7cc79146101df578063fdff9b4d146101ea578063ffb2c4791461020d57600080fd5b8063943e82161461018d578063946d9204146101a0578063d5eb7cf4146101b357600080fd5b8063013cf08b146100d4578063132cd06214610106578063158ef93e1461011b578063198e14f81461013d57806322f3e2d4146101695780635977e0f214610176575b600080fd5b6100e76100e23660046121f8565b610220565b6040516100fd9a9998979695949392919061239d565b60405180910390f35b6101196101143660046126b4565b6104cb565b005b60085461012d90610100900460ff1681565b60405190151581526020016100fd565b61012d61014b366004612810565b6001600160a01b031660009081526006602052604090205460ff1690565b60085461012d9060ff1681565b61017f60015481565b6040519081526020016100fd565b61011961019b366004612841565b610dbe565b6101196101ae366004612871565b6110ce565b61017f60075481565b61012d6101ca366004612810565b60006020819052908152604090205460ff1681565b60085460ff1661012d565b61012d6101f8366004612810565b60066020526000908152604090205460ff1681565b61011961021b3660046121f8565b6112a9565b600260208181526000928352604092839020805460018201549382015460058301546006840154600785015460088601548951808b01909a526009870180546001600160a01b039081168c52600a89018054989c9b82169b9782169a968216999590911697939660ff808516976101009095041695949093840191906102a5906128c1565b80601f01602080910402602001604051908101604052809291908181526020018280546102d1906128c1565b801561031e5780601f106102f35761010080835404028352916020019161031e565b820191906000526020600020905b81548152906001019060200180831161030157829003601f168201915b5050509190925250506040805161018081018252600b850180546001600160a01b03168252600c8601546020830152600d86015492820192909252600e8501546060820152600f8501546080820152601085015460a0820152601185015460c082015260128501805494959491935060e084019161039b906128c1565b80601f01602080910402602001604051908101604052809291908181526020018280546103c7906128c1565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b50505091835250506008820154602082015260098201546040820152600a82015460609091019060ff16600281111561044f5761044f612261565b600281111561046057610460612261565b8152602001600b82018054806020026020016040519081016040528092919081815260200182805480156104bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161049f575b50505050508152505090508a565b60035460405163dde8535f60e01b81523360048201526000916001600160a01b03169063dde8535f90602401602060405180830381865afa158015610514573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105389190612906565b9050600281600281111561054e5761054e612261565b148061056957503360009081526006602052604090205460ff165b61058e5760405162461bcd60e51b815260040161058590612923565b60405180910390fd5b8151600510156105c65760405162461bcd60e51b815260206004820152600360248201526204553360ec1b6044820152606401610585565b60008261016001516020015151116106065760405162461bcd60e51b815260206004820152600360248201526222a99b60e91b6044820152606401610585565b8151600154600090815260026020908152604091829020929092556101608401513390526003548151635d97505b60e01b815291516001600160a01b0390911692635d97505b92600480820193918290030181865afa15801561066d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610691919061294b565b6001600160a01b031663f11202348361016001516040518263ffffffff1660e01b81526004016106c19190612968565b600060405180830381865afa1580156106de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107069190810190612a46565b6001546000908152600260209081526040918290208351600b820180546001600160a01b0319166001600160a01b0390921691909117815591840151600c82015591830151600d8301556060830151600e8301556080830151600f83015560a0830151601083015560c0830151601183015560e083015190916012019061078d9082612b8e565b5061010082015160088201556101208201516009820155610140820151600a8201805460ff191660018360028111156107c8576107c8612261565b021790555061016082015180516107e991600b84019160209091019061217e565b50506003546040805163e3d27f2960e01b815290516001600160a01b03909216925063e3d27f299160048083019260209291908290030181865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190612c4e565b600154600090815260026020908152604091829020600f01929092556003548151634f6c488b60e01b815291516001600160a01b0390911692634f6c488b92600481810193918290030181865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc9190612c4e565b6108e69042612c7d565b600180546000908152600260208181526040808420600d019590955586015183548352848320840180546001600160a01b039283166001600160a01b0319918216179091558786015185548552868520909301805493909216921691909117905560e08501518254825283822060079081019190915554825482528382206010018190559154815291822060110155825190036109e2576001805460009081526002602090815260408083206064600f909101556101408601519354835290912082516009820180546001600160a01b0319166001600160a01b0390921691909117815591830151600a909101906109de9082612b8e565b5050505b8151600103610a655781610120015115156109ff60085460ff1690565b151503610a345760405162461bcd60e51b815260206004820152600360248201526245533160e81b6044820152606401610585565b610120820151600154600090815260026020526040902060080180549115156101000261ff00199092169190911790555b815160021480610a76575081516003145b80610a82575081516004145b15610af857610a94826040015161201c565b610aa1826020015161201c565b6040808301516001805460009081526002602081815285832090910180546001600160a01b039586166001600160a01b03199182161790915590870151835483529490912090910180549390921692169190911790555b8151600503610d5d57600360009054906101000a90046001600160a01b03166001600160a01b031663289c25f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612c90565b15610bab5760405162461bcd60e51b815260206004820152600360248201526222a99960e91b6044820152606401610585565b60055460c08301516040516324d6c8d560e01b81526001600160a01b0391821660048201529116906324d6c8d590602401602060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d9190612c90565b610c4f5760405162461bcd60e51b815260206004820152600360248201526245533360e81b6044820152606401610585565b8160c001516001600160a01b0316600460009054906101000a90046001600160a01b03166001600160a01b031663a77588836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061294b565b6001600160a01b031614610d105760405162461bcd60e51b81526020600482015260036024820152621154cd60ea1b6044820152606401610585565b60e0820151600180546000908152600260205260408082206007019390935560c0850151915481529190912060060180546001600160a01b0319166001600160a01b039092169190911790555b6001546000818152600260205260409081902090517fc71a1e2cb91ef76d3fec5535207e4457a4bd2b772f99618204772d34df8ebb9891610d9d91612e88565b60405180910390a260018054906000610db583612f8d565b91905055505050565b60035460405163dde8535f60e01b81523360048201526000916001600160a01b03169063dde8535f90602401602060405180830381865afa158015610e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2b9190612906565b90506002816002811115610e4157610e41612261565b1480610e5c57503360009081526006602052604090205460ff165b610e785760405162461bcd60e51b815260040161058590612923565b600360009054906101000a90046001600160a01b03166001600160a01b0316635d97505b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef919061294b565b600084815260026020526040908190209051630836aaf960e21b81526001600160a01b0392909216916320daabe491610f32913391600b01908790600401612fa6565b600060405180830381865afa158015610f4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f779190810190612a46565b6000848152600260209081526040918290208351600b820180546001600160a01b0319166001600160a01b0390921691909117815591840151600c82015591830151600d8301556060830151600e8301556080830151600f83015560a0830151601083015560c0830151601183015560e0830151909160120190610ffb9082612b8e565b5061010082015160088201556101208201516009820155610140820151600a8201805460ff1916600183600281111561103657611036612261565b0217905550610160820151805161105791600b84019160209091019061217e565b505050600083815260026020818152604083206016018054600181018255908452922090910180546001600160a01b03191633179055829081111561109e5761109e612261565b60405184907fc92326dacbba7a4c0f0b5ca0bab775311245300cea304ed0655a887fb568662890600090a3505050565b600854610100900460ff161561110c5760405162461bcd60e51b815260206004820152600360248201526208aa6760eb1b6044820152606401610585565b600380546001600160a01b0319166001600160a01b03841690811790915560408051638652169d60e01b81529051638652169d916004808201926020929091908290030181865afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611189919061294b565b600480546001600160a01b0319166001600160a01b039283161781556003546040805163207a069960e11b8152905191909316926340f40d3292818101926020929091908290030181865afa1580156111e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120a919061294b565b600580546001600160a01b0319166001600160a01b039290921691909117905560005b81518110156112925760016006600084848151811061124e5761124e612fe3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061128a81612f8d565b91505061122d565b5051600755506008805461ffff1916610101179055565b60035460405163dde8535f60e01b81523360048201526000916001600160a01b03169063dde8535f90602401602060405180830381865afa1580156112f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113169190612906565b9050600281600281111561132c5761132c612261565b148061134757503360009081526006602052604090205460ff165b6113635760405162461bcd60e51b815260040161058590612923565b600360009054906101000a90046001600160a01b03166001600160a01b0316635d97505b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da919061294b565b6001600160a01b031663e0d90d2260026000858152602001908152602001600020600b016040518263ffffffff1660e01b815260040161141a9190612ff9565b600060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261145f9190810190612a46565b6000838152600260209081526040918290208351600b820180546001600160a01b0319166001600160a01b0390921691909117815591840151600c82015591830151600d8301556060830151600e8301556080830151600f83015560a0830151601083015560c0830151601183015560e08301519091601201906114e39082612b8e565b5061010082015160088201556101208201516009820155610140820151600a8201805460ff1916600183600281111561151e5761151e612261565b0217905550610160820151805161153f91600b84019160209091019061217e565b506001915061154b9050565b60008381526002602081905260409091206015015460ff169081111561157357611573612261565b03611fc95760008281526002602052604081205490036116425760008281526002602052604090206009810154600a9091018054611642926001600160a01b031691906115bf906128c1565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb906128c1565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b505050505061205b565b600082815260026020526040902054600103611681576000828152600260205260409020600890810154815460ff191661010090910460ff1615151790555b60008281526002602081905260409091205490036116be57600082815260026020819052604090912001546116be906001600160a01b03166120f3565b6000828152600260205260409020546003036117305760016007541161170c5760405162461bcd60e51b815260206004820152600360248201526245533960e81b6044820152606401610585565b600082815260026020526040902060010154611730906001600160a01b031661212c565b60008281526002602052604090205460040361179557600082815260026020818152604080842060018082015491909401546001600160a01b0390811686526006909352818520805460ff199081169095179055919091168352909120805490911690555b600082815260026020526040902054600503611fc9576000828152600260209081526040918290206006015460048054845163a775888360e01b815294516001600160a01b0393841695939091169363a77588839380840193919291908290030181865afa15801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f919061294b565b6001600160a01b03161461186b5760405162461bcd60e51b815260206004820152600360248201526245533360e81b6044820152606401610585565b60006103e86118f26103e8600360009054906101000a90046001600160a01b03166001600160a01b0316634e3fe0fd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed9190612c4e565b61215a565b60008581526002602052604090206007015461190e919061300c565b6119189190613023565b600084815260026020908152604091829020600601546003548351638652169d60e01b815293519495506001600160a01b0391821694859463a9059cbb949390921692638652169d92600480820193918290030181865afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a5919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b5050505060006103e8600360009054906101000a90046001600160a01b03166001600160a01b0316634e3fe0fd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a819190612c4e565b600087815260026020526040902060070154611a9d919061300c565b611aa79190613023565b60008681526002602090815260409182902060060154600354835163207a069960e11b815293519495506001600160a01b039182169463a9059cbb9491909216926340f40d32926004808401938290030181865afa158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b31919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611b7957600080fd5b505af1158015611b8d573d6000803e3d6000fd5b505050600086815260026020526040908190206006015490516370a0823160e01b81523060048201527ffbd50798349c0ef233dafbe6eea9f929785731d11f54b610aea96532af84a7fe92506001600160a01b03918216918516906370a0823190602401602060405180830381865afa158015611c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c329190612c4e565b604080516001600160a01b0390931683526020830191909152309082015260600160405180910390a160008581526002602090815260409182902060060154600354835163207a069960e11b815293517ffbd50798349c0ef233dafbe6eea9f929785731d11f54b610aea96532af84a7fe946001600160a01b0393841694888516946370a082319416926340f40d329260048082019392918290030181865afa158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d07919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6f9190612c4e565b600360009054906101000a90046001600160a01b03166001600160a01b03166340f40d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de6919061294b565b604080516001600160a01b039485168152602081019390935292168183015290519081900360600190a1600085815260026020908152604091829020600601546003548351638652169d60e01b815293517ffbd50798349c0ef233dafbe6eea9f929785731d11f54b610aea96532af84a7fe946001600160a01b0393841694888516946370a08231941692638652169d9260048082019392918290030181865afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f249190612c4e565b600360009054906101000a90046001600160a01b03166001600160a01b0316638652169d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9b919061294b565b604080516001600160a01b039485168152602081019390935292168183015290519081900360600190a15050505b6000828152600260205260409081902060150154905183917fbdb492b15201001c44f021370ca5ea73640ddcc4b4ee020fb9791241973cc37e916120109160ff1690613045565b60405180910390a25050565b6001600160a01b0381166120585760405162461bcd60e51b815260206004820152600360248201526204544360ec1b6044820152606401610585565b50565b6000826001600160a01b0316826040516120759190613058565b6000604051808303816000865af19150503d80600081146120b2576040519150601f19603f3d011682016040523d82523d6000602084013e6120b7565b606091505b50509050806120ee5760405162461bcd60e51b815260206004820152600360248201526245533560e81b6044820152606401610585565b505050565b6001600160a01b0381166000908152600660205260408120805460ff19166001179055600780549161212483612f8d565b919050555050565b6001600160a01b0381166000908152600660205260408120805460ff19169055600780549161212483613074565b600082821061216b57506000612178565b612175828461308b565b90505b92915050565b8280548282559060005260206000209081019282156121d3579160200282015b828111156121d357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061219e565b506121df9291506121e3565b5090565b5b808211156121df57600081556001016121e4565b60006020828403121561220a57600080fd5b5035919050565b60005b8381101561222c578181015183820152602001612214565b50506000910152565b6000815180845261224d816020860160208601612211565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6003811061205857634e487b7160e01b600052602160045260246000fd5b61229e81612277565b9052565b600081518084526020808501945080840160005b838110156122db5781516001600160a01b0316875295820195908201906001016122b6565b509495945050505050565b80516001600160a01b0316825260006101806020830151602085015260408301516040850152606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e08301518160e086015261234b82860182612235565b9150506101008084015181860152506101208084015181860152506101408084015161237982870182612295565b5050610160808401518583038287015261239383826122a2565b9695505050505050565b60006101408c835260018060a01b03808d166020850152808c166040850152808b166060850152808a1660808501528860a085015287151560c085015286151560e085015281610100850152808651168285015250506020840151604061016084015261240e610180840182612235565b905082810361012084015261242381856122e6565b9d9c50505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051610180810167ffffffffffffffff8111828210171561246e5761246e612434565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561249d5761249d612434565b604052919050565b6001600160a01b038116811461205857600080fd5b80356124c5816124a5565b919050565b600067ffffffffffffffff8211156124e4576124e4612434565b5060051b60200190565b600082601f8301126124ff57600080fd5b8135602061251461250f836124ca565b612474565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124a5565b8352918301918301612537565b509695505050505050565b600082601f83011261257357600080fd5b8135602061258361250f836124ca565b82815260059290921b840181019181810190868411156125a257600080fd5b8286015b8481101561255757803583529183019183016125a6565b801515811461205857600080fd5b80356124c5816125bd565b600067ffffffffffffffff8211156125f0576125f0612434565b50601f01601f191660200190565b60006040828403121561261057600080fd5b6040516040810167ffffffffffffffff828210818311171561263457612634612434565b8160405282935084359150612648826124a5565b908252602090848201358181111561265f57600080fd5b85019050601f8101861361267257600080fd5b803561268061250f826125d6565b818152878483850101111561269457600080fd5b818484018583013760008483830101528084860152505050505092915050565b6000602082840312156126c657600080fd5b813567ffffffffffffffff808211156126de57600080fd5b9083019061018082860312156126f357600080fd5b6126fb61244a565b8235815261270b602084016124ba565b602082015261271c604084016124ba565b604082015260608301358281111561273357600080fd5b61273f878286016124ee565b60608301525060808301358281111561275757600080fd5b61276387828601612562565b60808301525061277560a084016124ba565b60a082015261278660c084016124ba565b60c082015260e083013560e08201526101006127a38185016125cb565b908201526101206127b58482016125cb565b9082015261014083810135838111156127cd57600080fd5b6127d9888287016125fe565b82840152505061016080840135838111156127f357600080fd5b6127ff888287016125fe565b918301919091525095945050505050565b60006020828403121561282257600080fd5b813561282d816124a5565b9392505050565b6003811061205857600080fd5b6000806040838503121561285457600080fd5b82359150602083013561286681612834565b809150509250929050565b6000806040838503121561288457600080fd5b823561288f816124a5565b9150602083013567ffffffffffffffff8111156128ab57600080fd5b6128b7858286016124ee565b9150509250929050565b600181811c908216806128d557607f821691505b6020821081036128f557634e487b7160e01b600052602260045260246000fd5b50919050565b80516124c581612834565b60006020828403121561291857600080fd5b815161282d81612834565b60208082526003908201526245533760e81b604082015260600190565b80516124c5816124a5565b60006020828403121561295d57600080fd5b815161282d816124a5565b602080825282516001600160a01b0316828201528201516040808301526000906129956060840182612235565b949350505050565b600082601f8301126129ae57600080fd5b81516129bc61250f826125d6565b8181528460208386010111156129d157600080fd5b612995826020830160208701612211565b600082601f8301126129f357600080fd5b81516020612a0361250f836124ca565b82815260059290921b84018101918181019086841115612a2257600080fd5b8286015b84811015612557578051612a39816124a5565b8352918301918301612a26565b600060208284031215612a5857600080fd5b815167ffffffffffffffff80821115612a7057600080fd5b908301906101808286031215612a8557600080fd5b612a8d61244a565b612a9683612940565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015182811115612ae657600080fd5b612af28782860161299d565b60e08301525061010083810151908201526101208084015190820152610140612b1c8185016128fb565b908201526101608381015183811115612b3457600080fd5b6127ff888287016129e2565b601f8211156120ee57600081815260208120601f850160051c81016020861015612b675750805b601f850160051c820191505b81811015612b8657828155600101612b73565b505050505050565b815167ffffffffffffffff811115612ba857612ba8612434565b612bbc81612bb684546128c1565b84612b40565b602080601f831160018114612bf15760008415612bd95750858301515b600019600386901b1c1916600185901b178555612b86565b600085815260208120601f198616915b82811015612c2057888601518255948401946001909101908401612c01565b5085821015612c3e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612c6057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561217857612178612c67565b600060208284031215612ca257600080fd5b815161282d816125bd565b6000815480845260208085019450836000528060002060005b838110156122db5781546001600160a01b031687529582019560019182019101612cc6565b6000815480845260208085019450836000528060002060005b838110156122db57815487529582019560019182019101612d04565b60008154612d2d816128c1565b808552602060018381168015612d4a5760018114612d6457612d92565b60ff1985168884015283151560051b880183019550612d92565b866000528260002060005b85811015612d8a5781548a8201860152908301908401612d6f565b890184019650505b505050505092915050565b80546001600160a01b0316825260406020830181905260009061282d90840160018401612d20565b6000610180612dec84612ddf85546001600160a01b031690565b6001600160a01b03169052565b60018301546020850152600283015460408501526003830154606085015260048301546080850152600583015460a0850152600683015460c08501528060e0850152612e3d81850160078501612d20565b905060088301546101008501526009830154610120850152612e63600a84015460ff1690565b612e71610140860182612295565b5083810361016085015261299581600b8501612cad565b60208152815460208201526000612ea960018401546001600160a01b031690565b6001600160a01b039081166040840152600284015416606083015261018060808301819052612edf6101a0840160038601612cad565b601f19808583030160a0860152612ef98260048801612ceb565b9150612f0f60058701546001600160a01b031690565b6001600160a01b0390811660c087015260068701541660e0860152600786015461010086015260088087015460ff8082161515610120890152911c1615156101408601528482038101610160860152612f6b8260098801612d9d565b915080858303018386015250612f8481600b8701612dc5565b95945050505050565b600060018201612f9f57612f9f612c67565b5060010190565b6001600160a01b0384168152606060208201819052600090612fca90830185612dc5565b9050612fd583612277565b826040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b60208152600061282d6020830184612dc5565b808202811582820484141761217857612178612c67565b60008261304057634e487b7160e01b600052601260045260246000fd5b500490565b6020810161305283612277565b91905290565b6000825161306a818460208701612211565b9190910192915050565b60008161308357613083612c67565b506000190190565b8181038181111561217857612178612c6756fea2646970667358221220ae88138909ec921298cf2b6b266a66313e8e2af021439d218be84960243d1ee864736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c8063943e82161161008c578063daf9c21011610066578063daf9c210146101bc578063fba7cc79146101df578063fdff9b4d146101ea578063ffb2c4791461020d57600080fd5b8063943e82161461018d578063946d9204146101a0578063d5eb7cf4146101b357600080fd5b8063013cf08b146100d4578063132cd06214610106578063158ef93e1461011b578063198e14f81461013d57806322f3e2d4146101695780635977e0f214610176575b600080fd5b6100e76100e23660046121f8565b610220565b6040516100fd9a9998979695949392919061239d565b60405180910390f35b6101196101143660046126b4565b6104cb565b005b60085461012d90610100900460ff1681565b60405190151581526020016100fd565b61012d61014b366004612810565b6001600160a01b031660009081526006602052604090205460ff1690565b60085461012d9060ff1681565b61017f60015481565b6040519081526020016100fd565b61011961019b366004612841565b610dbe565b6101196101ae366004612871565b6110ce565b61017f60075481565b61012d6101ca366004612810565b60006020819052908152604090205460ff1681565b60085460ff1661012d565b61012d6101f8366004612810565b60066020526000908152604090205460ff1681565b61011961021b3660046121f8565b6112a9565b600260208181526000928352604092839020805460018201549382015460058301546006840154600785015460088601548951808b01909a526009870180546001600160a01b039081168c52600a89018054989c9b82169b9782169a968216999590911697939660ff808516976101009095041695949093840191906102a5906128c1565b80601f01602080910402602001604051908101604052809291908181526020018280546102d1906128c1565b801561031e5780601f106102f35761010080835404028352916020019161031e565b820191906000526020600020905b81548152906001019060200180831161030157829003601f168201915b5050509190925250506040805161018081018252600b850180546001600160a01b03168252600c8601546020830152600d86015492820192909252600e8501546060820152600f8501546080820152601085015460a0820152601185015460c082015260128501805494959491935060e084019161039b906128c1565b80601f01602080910402602001604051908101604052809291908181526020018280546103c7906128c1565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b50505091835250506008820154602082015260098201546040820152600a82015460609091019060ff16600281111561044f5761044f612261565b600281111561046057610460612261565b8152602001600b82018054806020026020016040519081016040528092919081815260200182805480156104bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161049f575b50505050508152505090508a565b60035460405163dde8535f60e01b81523360048201526000916001600160a01b03169063dde8535f90602401602060405180830381865afa158015610514573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105389190612906565b9050600281600281111561054e5761054e612261565b148061056957503360009081526006602052604090205460ff165b61058e5760405162461bcd60e51b815260040161058590612923565b60405180910390fd5b8151600510156105c65760405162461bcd60e51b815260206004820152600360248201526204553360ec1b6044820152606401610585565b60008261016001516020015151116106065760405162461bcd60e51b815260206004820152600360248201526222a99b60e91b6044820152606401610585565b8151600154600090815260026020908152604091829020929092556101608401513390526003548151635d97505b60e01b815291516001600160a01b0390911692635d97505b92600480820193918290030181865afa15801561066d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610691919061294b565b6001600160a01b031663f11202348361016001516040518263ffffffff1660e01b81526004016106c19190612968565b600060405180830381865afa1580156106de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107069190810190612a46565b6001546000908152600260209081526040918290208351600b820180546001600160a01b0319166001600160a01b0390921691909117815591840151600c82015591830151600d8301556060830151600e8301556080830151600f83015560a0830151601083015560c0830151601183015560e083015190916012019061078d9082612b8e565b5061010082015160088201556101208201516009820155610140820151600a8201805460ff191660018360028111156107c8576107c8612261565b021790555061016082015180516107e991600b84019160209091019061217e565b50506003546040805163e3d27f2960e01b815290516001600160a01b03909216925063e3d27f299160048083019260209291908290030181865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190612c4e565b600154600090815260026020908152604091829020600f01929092556003548151634f6c488b60e01b815291516001600160a01b0390911692634f6c488b92600481810193918290030181865afa1580156108b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dc9190612c4e565b6108e69042612c7d565b600180546000908152600260208181526040808420600d019590955586015183548352848320840180546001600160a01b039283166001600160a01b0319918216179091558786015185548552868520909301805493909216921691909117905560e08501518254825283822060079081019190915554825482528382206010018190559154815291822060110155825190036109e2576001805460009081526002602090815260408083206064600f909101556101408601519354835290912082516009820180546001600160a01b0319166001600160a01b0390921691909117815591830151600a909101906109de9082612b8e565b5050505b8151600103610a655781610120015115156109ff60085460ff1690565b151503610a345760405162461bcd60e51b815260206004820152600360248201526245533160e81b6044820152606401610585565b610120820151600154600090815260026020526040902060080180549115156101000261ff00199092169190911790555b815160021480610a76575081516003145b80610a82575081516004145b15610af857610a94826040015161201c565b610aa1826020015161201c565b6040808301516001805460009081526002602081815285832090910180546001600160a01b039586166001600160a01b03199182161790915590870151835483529490912090910180549390921692169190911790555b8151600503610d5d57600360009054906101000a90046001600160a01b03166001600160a01b031663289c25f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b789190612c90565b15610bab5760405162461bcd60e51b815260206004820152600360248201526222a99960e91b6044820152606401610585565b60055460c08301516040516324d6c8d560e01b81526001600160a01b0391821660048201529116906324d6c8d590602401602060405180830381865afa158015610bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1d9190612c90565b610c4f5760405162461bcd60e51b815260206004820152600360248201526245533360e81b6044820152606401610585565b8160c001516001600160a01b0316600460009054906101000a90046001600160a01b03166001600160a01b031663a77588836040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061294b565b6001600160a01b031614610d105760405162461bcd60e51b81526020600482015260036024820152621154cd60ea1b6044820152606401610585565b60e0820151600180546000908152600260205260408082206007019390935560c0850151915481529190912060060180546001600160a01b0319166001600160a01b039092169190911790555b6001546000818152600260205260409081902090517fc71a1e2cb91ef76d3fec5535207e4457a4bd2b772f99618204772d34df8ebb9891610d9d91612e88565b60405180910390a260018054906000610db583612f8d565b91905055505050565b60035460405163dde8535f60e01b81523360048201526000916001600160a01b03169063dde8535f90602401602060405180830381865afa158015610e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2b9190612906565b90506002816002811115610e4157610e41612261565b1480610e5c57503360009081526006602052604090205460ff165b610e785760405162461bcd60e51b815260040161058590612923565b600360009054906101000a90046001600160a01b03166001600160a01b0316635d97505b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef919061294b565b600084815260026020526040908190209051630836aaf960e21b81526001600160a01b0392909216916320daabe491610f32913391600b01908790600401612fa6565b600060405180830381865afa158015610f4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f779190810190612a46565b6000848152600260209081526040918290208351600b820180546001600160a01b0319166001600160a01b0390921691909117815591840151600c82015591830151600d8301556060830151600e8301556080830151600f83015560a0830151601083015560c0830151601183015560e0830151909160120190610ffb9082612b8e565b5061010082015160088201556101208201516009820155610140820151600a8201805460ff1916600183600281111561103657611036612261565b0217905550610160820151805161105791600b84019160209091019061217e565b505050600083815260026020818152604083206016018054600181018255908452922090910180546001600160a01b03191633179055829081111561109e5761109e612261565b60405184907fc92326dacbba7a4c0f0b5ca0bab775311245300cea304ed0655a887fb568662890600090a3505050565b600854610100900460ff161561110c5760405162461bcd60e51b815260206004820152600360248201526208aa6760eb1b6044820152606401610585565b600380546001600160a01b0319166001600160a01b03841690811790915560408051638652169d60e01b81529051638652169d916004808201926020929091908290030181865afa158015611165573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611189919061294b565b600480546001600160a01b0319166001600160a01b039283161781556003546040805163207a069960e11b8152905191909316926340f40d3292818101926020929091908290030181865afa1580156111e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120a919061294b565b600580546001600160a01b0319166001600160a01b039290921691909117905560005b81518110156112925760016006600084848151811061124e5761124e612fe3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061128a81612f8d565b91505061122d565b5051600755506008805461ffff1916610101179055565b60035460405163dde8535f60e01b81523360048201526000916001600160a01b03169063dde8535f90602401602060405180830381865afa1580156112f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113169190612906565b9050600281600281111561132c5761132c612261565b148061134757503360009081526006602052604090205460ff165b6113635760405162461bcd60e51b815260040161058590612923565b600360009054906101000a90046001600160a01b03166001600160a01b0316635d97505b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113da919061294b565b6001600160a01b031663e0d90d2260026000858152602001908152602001600020600b016040518263ffffffff1660e01b815260040161141a9190612ff9565b600060405180830381865afa158015611437573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261145f9190810190612a46565b6000838152600260209081526040918290208351600b820180546001600160a01b0319166001600160a01b0390921691909117815591840151600c82015591830151600d8301556060830151600e8301556080830151600f83015560a0830151601083015560c0830151601183015560e08301519091601201906114e39082612b8e565b5061010082015160088201556101208201516009820155610140820151600a8201805460ff1916600183600281111561151e5761151e612261565b0217905550610160820151805161153f91600b84019160209091019061217e565b506001915061154b9050565b60008381526002602081905260409091206015015460ff169081111561157357611573612261565b03611fc95760008281526002602052604081205490036116425760008281526002602052604090206009810154600a9091018054611642926001600160a01b031691906115bf906128c1565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb906128c1565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b505050505061205b565b600082815260026020526040902054600103611681576000828152600260205260409020600890810154815460ff191661010090910460ff1615151790555b60008281526002602081905260409091205490036116be57600082815260026020819052604090912001546116be906001600160a01b03166120f3565b6000828152600260205260409020546003036117305760016007541161170c5760405162461bcd60e51b815260206004820152600360248201526245533960e81b6044820152606401610585565b600082815260026020526040902060010154611730906001600160a01b031661212c565b60008281526002602052604090205460040361179557600082815260026020818152604080842060018082015491909401546001600160a01b0390811686526006909352818520805460ff199081169095179055919091168352909120805490911690555b600082815260026020526040902054600503611fc9576000828152600260209081526040918290206006015460048054845163a775888360e01b815294516001600160a01b0393841695939091169363a77588839380840193919291908290030181865afa15801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f919061294b565b6001600160a01b03161461186b5760405162461bcd60e51b815260206004820152600360248201526245533360e81b6044820152606401610585565b60006103e86118f26103e8600360009054906101000a90046001600160a01b03166001600160a01b0316634e3fe0fd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed9190612c4e565b61215a565b60008581526002602052604090206007015461190e919061300c565b6119189190613023565b600084815260026020908152604091829020600601546003548351638652169d60e01b815293519495506001600160a01b0391821694859463a9059cbb949390921692638652169d92600480820193918290030181865afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a5919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b5050505060006103e8600360009054906101000a90046001600160a01b03166001600160a01b0316634e3fe0fd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a819190612c4e565b600087815260026020526040902060070154611a9d919061300c565b611aa79190613023565b60008681526002602090815260409182902060060154600354835163207a069960e11b815293519495506001600160a01b039182169463a9059cbb9491909216926340f40d32926004808401938290030181865afa158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b31919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611b7957600080fd5b505af1158015611b8d573d6000803e3d6000fd5b505050600086815260026020526040908190206006015490516370a0823160e01b81523060048201527ffbd50798349c0ef233dafbe6eea9f929785731d11f54b610aea96532af84a7fe92506001600160a01b03918216918516906370a0823190602401602060405180830381865afa158015611c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c329190612c4e565b604080516001600160a01b0390931683526020830191909152309082015260600160405180910390a160008581526002602090815260409182902060060154600354835163207a069960e11b815293517ffbd50798349c0ef233dafbe6eea9f929785731d11f54b610aea96532af84a7fe946001600160a01b0393841694888516946370a082319416926340f40d329260048082019392918290030181865afa158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d07919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611d4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6f9190612c4e565b600360009054906101000a90046001600160a01b03166001600160a01b03166340f40d326040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de6919061294b565b604080516001600160a01b039485168152602081019390935292168183015290519081900360600190a1600085815260026020908152604091829020600601546003548351638652169d60e01b815293517ffbd50798349c0ef233dafbe6eea9f929785731d11f54b610aea96532af84a7fe946001600160a01b0393841694888516946370a08231941692638652169d9260048082019392918290030181865afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc919061294b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f249190612c4e565b600360009054906101000a90046001600160a01b03166001600160a01b0316638652169d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9b919061294b565b604080516001600160a01b039485168152602081019390935292168183015290519081900360600190a15050505b6000828152600260205260409081902060150154905183917fbdb492b15201001c44f021370ca5ea73640ddcc4b4ee020fb9791241973cc37e916120109160ff1690613045565b60405180910390a25050565b6001600160a01b0381166120585760405162461bcd60e51b815260206004820152600360248201526204544360ec1b6044820152606401610585565b50565b6000826001600160a01b0316826040516120759190613058565b6000604051808303816000865af19150503d80600081146120b2576040519150601f19603f3d011682016040523d82523d6000602084013e6120b7565b606091505b50509050806120ee5760405162461bcd60e51b815260206004820152600360248201526245533560e81b6044820152606401610585565b505050565b6001600160a01b0381166000908152600660205260408120805460ff19166001179055600780549161212483612f8d565b919050555050565b6001600160a01b0381166000908152600660205260408120805460ff19169055600780549161212483613074565b600082821061216b57506000612178565b612175828461308b565b90505b92915050565b8280548282559060005260206000209081019282156121d3579160200282015b828111156121d357825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061219e565b506121df9291506121e3565b5090565b5b808211156121df57600081556001016121e4565b60006020828403121561220a57600080fd5b5035919050565b60005b8381101561222c578181015183820152602001612214565b50506000910152565b6000815180845261224d816020860160208601612211565b601f01601f19169290920160200192915050565b634e487b7160e01b600052602160045260246000fd5b6003811061205857634e487b7160e01b600052602160045260246000fd5b61229e81612277565b9052565b600081518084526020808501945080840160005b838110156122db5781516001600160a01b0316875295820195908201906001016122b6565b509495945050505050565b80516001600160a01b0316825260006101806020830151602085015260408301516040850152606083015160608501526080830151608085015260a083015160a085015260c083015160c085015260e08301518160e086015261234b82860182612235565b9150506101008084015181860152506101208084015181860152506101408084015161237982870182612295565b5050610160808401518583038287015261239383826122a2565b9695505050505050565b60006101408c835260018060a01b03808d166020850152808c166040850152808b166060850152808a1660808501528860a085015287151560c085015286151560e085015281610100850152808651168285015250506020840151604061016084015261240e610180840182612235565b905082810361012084015261242381856122e6565b9d9c50505050505050505050505050565b634e487b7160e01b600052604160045260246000fd5b604051610180810167ffffffffffffffff8111828210171561246e5761246e612434565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561249d5761249d612434565b604052919050565b6001600160a01b038116811461205857600080fd5b80356124c5816124a5565b919050565b600067ffffffffffffffff8211156124e4576124e4612434565b5060051b60200190565b600082601f8301126124ff57600080fd5b8135602061251461250f836124ca565b612474565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124a5565b8352918301918301612537565b509695505050505050565b600082601f83011261257357600080fd5b8135602061258361250f836124ca565b82815260059290921b840181019181810190868411156125a257600080fd5b8286015b8481101561255757803583529183019183016125a6565b801515811461205857600080fd5b80356124c5816125bd565b600067ffffffffffffffff8211156125f0576125f0612434565b50601f01601f191660200190565b60006040828403121561261057600080fd5b6040516040810167ffffffffffffffff828210818311171561263457612634612434565b8160405282935084359150612648826124a5565b908252602090848201358181111561265f57600080fd5b85019050601f8101861361267257600080fd5b803561268061250f826125d6565b818152878483850101111561269457600080fd5b818484018583013760008483830101528084860152505050505092915050565b6000602082840312156126c657600080fd5b813567ffffffffffffffff808211156126de57600080fd5b9083019061018082860312156126f357600080fd5b6126fb61244a565b8235815261270b602084016124ba565b602082015261271c604084016124ba565b604082015260608301358281111561273357600080fd5b61273f878286016124ee565b60608301525060808301358281111561275757600080fd5b61276387828601612562565b60808301525061277560a084016124ba565b60a082015261278660c084016124ba565b60c082015260e083013560e08201526101006127a38185016125cb565b908201526101206127b58482016125cb565b9082015261014083810135838111156127cd57600080fd5b6127d9888287016125fe565b82840152505061016080840135838111156127f357600080fd5b6127ff888287016125fe565b918301919091525095945050505050565b60006020828403121561282257600080fd5b813561282d816124a5565b9392505050565b6003811061205857600080fd5b6000806040838503121561285457600080fd5b82359150602083013561286681612834565b809150509250929050565b6000806040838503121561288457600080fd5b823561288f816124a5565b9150602083013567ffffffffffffffff8111156128ab57600080fd5b6128b7858286016124ee565b9150509250929050565b600181811c908216806128d557607f821691505b6020821081036128f557634e487b7160e01b600052602260045260246000fd5b50919050565b80516124c581612834565b60006020828403121561291857600080fd5b815161282d81612834565b60208082526003908201526245533760e81b604082015260600190565b80516124c5816124a5565b60006020828403121561295d57600080fd5b815161282d816124a5565b602080825282516001600160a01b0316828201528201516040808301526000906129956060840182612235565b949350505050565b600082601f8301126129ae57600080fd5b81516129bc61250f826125d6565b8181528460208386010111156129d157600080fd5b612995826020830160208701612211565b600082601f8301126129f357600080fd5b81516020612a0361250f836124ca565b82815260059290921b84018101918181019086841115612a2257600080fd5b8286015b84811015612557578051612a39816124a5565b8352918301918301612a26565b600060208284031215612a5857600080fd5b815167ffffffffffffffff80821115612a7057600080fd5b908301906101808286031215612a8557600080fd5b612a8d61244a565b612a9683612940565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015182811115612ae657600080fd5b612af28782860161299d565b60e08301525061010083810151908201526101208084015190820152610140612b1c8185016128fb565b908201526101608381015183811115612b3457600080fd5b6127ff888287016129e2565b601f8211156120ee57600081815260208120601f850160051c81016020861015612b675750805b601f850160051c820191505b81811015612b8657828155600101612b73565b505050505050565b815167ffffffffffffffff811115612ba857612ba8612434565b612bbc81612bb684546128c1565b84612b40565b602080601f831160018114612bf15760008415612bd95750858301515b600019600386901b1c1916600185901b178555612b86565b600085815260208120601f198616915b82811015612c2057888601518255948401946001909101908401612c01565b5085821015612c3e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612c6057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561217857612178612c67565b600060208284031215612ca257600080fd5b815161282d816125bd565b6000815480845260208085019450836000528060002060005b838110156122db5781546001600160a01b031687529582019560019182019101612cc6565b6000815480845260208085019450836000528060002060005b838110156122db57815487529582019560019182019101612d04565b60008154612d2d816128c1565b808552602060018381168015612d4a5760018114612d6457612d92565b60ff1985168884015283151560051b880183019550612d92565b866000528260002060005b85811015612d8a5781548a8201860152908301908401612d6f565b890184019650505b505050505092915050565b80546001600160a01b0316825260406020830181905260009061282d90840160018401612d20565b6000610180612dec84612ddf85546001600160a01b031690565b6001600160a01b03169052565b60018301546020850152600283015460408501526003830154606085015260048301546080850152600583015460a0850152600683015460c08501528060e0850152612e3d81850160078501612d20565b905060088301546101008501526009830154610120850152612e63600a84015460ff1690565b612e71610140860182612295565b5083810361016085015261299581600b8501612cad565b60208152815460208201526000612ea960018401546001600160a01b031690565b6001600160a01b039081166040840152600284015416606083015261018060808301819052612edf6101a0840160038601612cad565b601f19808583030160a0860152612ef98260048801612ceb565b9150612f0f60058701546001600160a01b031690565b6001600160a01b0390811660c087015260068701541660e0860152600786015461010086015260088087015460ff8082161515610120890152911c1615156101408601528482038101610160860152612f6b8260098801612d9d565b915080858303018386015250612f8481600b8701612dc5565b95945050505050565b600060018201612f9f57612f9f612c67565b5060010190565b6001600160a01b0384168152606060208201819052600090612fca90830185612dc5565b9050612fd583612277565b826040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b60208152600061282d6020830184612dc5565b808202811582820484141761217857612178612c67565b60008261304057634e487b7160e01b600052601260045260246000fd5b500490565b6020810161305283612277565b91905290565b6000825161306a818460208701612211565b9190910192915050565b60008161308357613083612c67565b506000190190565b8181038181111561217857612178612c6756fea2646970667358221220ae88138909ec921298cf2b6b266a66313e8e2af021439d218be84960243d1ee864736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

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

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.