Contract 0x283366bb42ef49a994913baf22263c6562e588a4 4

 

Contract Overview

Balance:
781.933762116458319496 MATIC

MATIC Value:
$691.07 (@ $0.88/MATIC)

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7de0132297945ac4c0e35be08a3fd37644a4d7d082fb6920dce537e473ce757dApprove315933822022-08-06 16:26:343 days 15 hrs ago0xf15e603e71325526e995634adb15ed61f41db564 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.001680879477 36.000074478
0x4986eafcd6ef36d7570d935dafa3dc623923a962e0d025a2ea81acd28b443f1bApprove315082242022-08-04 11:04:225 days 20 hrs ago0x7de7827880766489f0fb35685fe55409bc6f433c IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000783269686 32.092009933
0x195e7be9b569c17ca174587d52e391449eea50ede43a147736198730f5a1162fApprove314674722022-08-03 9:29:036 days 22 hrs ago0x7568614a27117eeeb6e06022d74540c3c5749b84 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.001047385304 42.913316055
0xf04363a82fc21bf6f4b8b2e147af8e7c958f1b3a8d98662f4f3e3a3bc349f77aApprove314674652022-08-03 9:28:356 days 22 hrs ago0x7568614a27117eeeb6e06022d74540c3c5749b84 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.001060386261 43.44598934
0xecce231241bacd2ac2998134ac99675dbf6cf21fb1026d28ff8d3c7188ab9ae7Approve310223542022-07-22 19:25:2518 days 12 hrs ago0x504db7223aee2b4cd8809786e3a916bf24f76b2a IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073221 30.000000016
0x2fc65797474d7ac46f3fbb79dacef7148b0f2376b89dfa225b90c12cc46e6f9bApprove310223452022-07-22 19:25:0718 days 12 hrs ago0x504db7223aee2b4cd8809786e3a916bf24f76b2a IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073221 30.000000017
0xc5797daedc623fa87c901d47c5e7ace1ff55148bba006a8b26a7ebeaa43c13f0Approve310223362022-07-22 19:24:4918 days 12 hrs ago0x504db7223aee2b4cd8809786e3a916bf24f76b2a IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000741483556 30.379954805
0x2020518b6ec198a8b1cc8928c96162b6c3e95134d36185be8aff33580979709bApprove310223222022-07-22 19:24:1718 days 12 hrs ago0x504db7223aee2b4cd8809786e3a916bf24f76b2a IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000757830028 31.049700019
0x704ac2de8a5f1d0d7b915eb666ea69741932fa25d53087dd7eeac747908cb6c7Approve310222722022-07-22 19:22:3718 days 12 hrs ago0x504db7223aee2b4cd8809786e3a916bf24f76b2a IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00078126807 32.010000016
0x5584d9bef8aa9782989ddd0709879295bb28c8f3eb1d354bfcd0e4bea5048610Approve310070012022-07-22 9:30:2718 days 22 hrs ago0x9aa1b93a3e850181b0209370154f905653a11e89 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000860716214 35.265137657
0x8cd45ce743d2107726258404b7976b0fd6dba2706c49877ef34edc63ca82a486Approve310069992022-07-22 9:30:1518 days 22 hrs ago0x9aa1b93a3e850181b0209370154f905653a11e89 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000878707009 36.002253841
0x14458f0e6bd25a370a41b47c0b323fbb078a191aed142393b5d3c188f2fba527Approve310069932022-07-22 9:29:3918 days 22 hrs ago0x9aa1b93a3e850181b0209370154f905653a11e89 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000839443159 34.393541175
0x7bb5ce82f67de78a5c471fa2f10a835bf1d51129bf7a2792ac026ff4f1925c97Approve309269292022-07-20 6:47:1921 days 49 mins ago0xfab979ef0af8c1da8dc8d43d7ffcc168c6cb5509 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.007003650001 150.000000032
0xa168ef00ed76637a93a4dcf90ac88fc41695499a15f431a8495897bf2a904bd5Approve309117682022-07-19 21:29:2321 days 10 hrs ago0xaa29a0ad9b8d530868d0df7dfa68bf992f9f0492 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.001400730002 30.00000005
0x0331beae224fa7be7d2e2de952f2efa30ec104919965f979a056a560c4e4828cApprove306241352022-07-12 1:34:5529 days 6 hrs ago0x26b0fc6ad6c759446485c27dbf2c4369089f8834 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.000732210015 30.000000641
0x2cd0d6651ba73d22c360f6a01bf49b20619bf237c4754ab4690d7df3fa4e0465Approve306062492022-07-11 14:39:1529 days 16 hrs ago0xd54b89ec660e2be67fd4d4013d4fc21830a822eb IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.001441423594 30.871551142
0x1f5788f6e63e508bbe25299cf39648570aee372d293d28681a0e1ba217e77575Transfer305392202022-07-09 22:31:0331 days 9 hrs ago0x1d738b6af91a3ddd1a81f6e3a7e3b42e4edd42ab IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00145041 30.000000017
0x2a83855488cafb3b0897aa69cb264305081bef9d62efaaa63a44f589cd688832Approve304506342022-07-07 17:01:0233 days 14 hrs ago0xf774f030f0c0573dde70e85df8ca60cd26451657 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00075021366930.767898519
0x2f1e2d3d15d5ed290021c1323b656041488b7338cd8d6288874ad952fe29468eApprove304506332022-07-07 17:00:5833 days 14 hrs ago0xf774f030f0c0573dde70e85df8ca60cd26451657 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073923894630.287988962
0x3dcbc848499d26244123415f0832a9264d5c67cc8c15ed52816cf4e9809577caApprove304506332022-07-07 17:00:5833 days 14 hrs ago0xf774f030f0c0573dde70e85df8ca60cd26451657 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073923894630.287988962
0x502d47e9be2730a7927e17eebe395211ebe6a0e99c8a00f54b11560ad7ad6afeApprove304495792022-07-07 16:24:2233 days 15 hrs ago0xf774f030f0c0573dde70e85df8ca60cd26451657 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073923894630.287988962
0x6d02c9d62c7b5ee5054b032593d9cbcca15e8a306150f0a05c09061f202b9445Approve304495582022-07-07 16:23:4033 days 15 hrs ago0xf774f030f0c0573dde70e85df8ca60cd26451657 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073814204530.243046899
0xbb8ed225c119b5f687d68d6997a7673e339660b4fe5d1c23caef6d121e7f591dApprove304440122022-07-07 13:08:4433 days 18 hrs ago0x9bcc379fe398f15f8165ffca8d7a4155b774c782 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00079221 30
0xe7471806349ed05f4a2c5f446b17e2ed796124d99e6718da1ad5022ad2dd9753Approve304440072022-07-07 13:08:3433 days 18 hrs ago0x9bcc379fe398f15f8165ffca8d7a4155b774c782 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073221 30
0x93c54fec0288406b71892ee1fa8add0636e668110b784ad1b9a1c792315fe23aApprove304439932022-07-07 13:08:0633 days 18 hrs ago0x9bcc379fe398f15f8165ffca8d7a4155b774c782 IN  0x283366bb42ef49a994913baf22263c6562e588a40 MATIC0.00073221 30.000000024
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x99b87a480cc474c888e003eca454e3489be777b93282b0006f9fd3773dcfa2b1248299382022-02-11 22:42:26179 days 8 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa6.275810124950092487 MATIC
0x99b87a480cc474c888e003eca454e3489be777b93282b0006f9fd3773dcfa2b1248299382022-02-11 22:42:26179 days 8 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a46.275810124950092487 MATIC
0x317550e3940cd481691d980510048f62c8d2fbd34bc057b812f0690a8e37a172248298042022-02-11 22:37:49179 days 8 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa6.035099659883619986 MATIC
0x317550e3940cd481691d980510048f62c8d2fbd34bc057b812f0690a8e37a172248298042022-02-11 22:37:49179 days 8 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a46.035099659883619986 MATIC
0xac62540ccd3bb8237a62131987bccf7c3ed25f196dbd8ad7ed7f67c84011c23c248296472022-02-11 22:32:27179 days 9 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa3.63602652424210846 MATIC
0xac62540ccd3bb8237a62131987bccf7c3ed25f196dbd8ad7ed7f67c84011c23c248296472022-02-11 22:32:27179 days 9 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a43.63602652424210846 MATIC
0xc3410648fb5400a0b00142693c5fbe277a8082fe05a2b8c7fcdb0cf7e4b88786248295802022-02-11 22:30:06179 days 9 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a4 0x064a4fb29a53b8b0ffec43c1dfd38f18b29a286a357.879026149387742751 MATIC
0xc3410648fb5400a0b00142693c5fbe277a8082fe05a2b8c7fcdb0cf7e4b88786248295802022-02-11 22:30:06179 days 9 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a4357.879026149387742751 MATIC
0xc3410648fb5400a0b00142693c5fbe277a8082fe05a2b8c7fcdb0cf7e4b88786248295802022-02-11 22:30:06179 days 9 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa181.220852324404812546 MATIC
0xc3410648fb5400a0b00142693c5fbe277a8082fe05a2b8c7fcdb0cf7e4b88786248295802022-02-11 22:30:06179 days 9 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a4181.220852324404812546 MATIC
0xc3410648fb5400a0b00142693c5fbe277a8082fe05a2b8c7fcdb0cf7e4b88786248295802022-02-11 22:30:06179 days 9 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a4 QuickSwap: Router91.189679504888858857 MATIC
0xc3410648fb5400a0b00142693c5fbe277a8082fe05a2b8c7fcdb0cf7e4b88786248295802022-02-11 22:30:06179 days 9 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a491.189679504888858857 MATIC
0x0dc4de810dc275be2f0f11ec44198104542c5a08ccbc226091329e706f792bdd248286592022-02-11 21:58:22179 days 9 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa0.556000843534098508 MATIC
0x0dc4de810dc275be2f0f11ec44198104542c5a08ccbc226091329e706f792bdd248286592022-02-11 21:58:22179 days 9 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a40.556000843534098508 MATIC
0xbdcf93c26dafe675eccbc0c3347dcdcf25d6a62956f78411a6aa4a98a2ca4563248280672022-02-11 21:38:02179 days 9 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa0.799263857015966191 MATIC
0xbdcf93c26dafe675eccbc0c3347dcdcf25d6a62956f78411a6aa4a98a2ca4563248280672022-02-11 21:38:02179 days 9 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a40.799263857015966191 MATIC
0x64797d08dd29b264201bca05b095fb0b0b88e6d3824e478d74da5004e8c4e6c1248278292022-02-11 21:29:50179 days 10 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a4 0x064a4fb29a53b8b0ffec43c1dfd38f18b29a286a4.485896766256439875 MATIC
0x64797d08dd29b264201bca05b095fb0b0b88e6d3824e478d74da5004e8c4e6c1248278292022-02-11 21:29:50179 days 10 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a44.485896766256439875 MATIC
0x0985b6fafeccb3571c1569e3b81412b75b98ce95ced5042d75e9939437305e30248275882022-02-11 21:21:36179 days 10 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa28.693535027578239265 MATIC
0x0985b6fafeccb3571c1569e3b81412b75b98ce95ced5042d75e9939437305e30248275882022-02-11 21:21:36179 days 10 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a428.693535027578239265 MATIC
0xd5913bacc76bae0fa7afeab12498b8e4678f81d6e2e22ffa1243645bd1263902248269622022-02-11 21:00:04179 days 10 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa42.945462645833396354 MATIC
0xd5913bacc76bae0fa7afeab12498b8e4678f81d6e2e22ffa1243645bd1263902248269622022-02-11 21:00:04179 days 10 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a442.945462645833396354 MATIC
0x710ee450ef114ca03d06c637b8f80cf9dbbf263a5123fbbf0e1bd59bc787c8b5248269082022-02-11 20:58:12179 days 10 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa0.105316647550392614 MATIC
0x710ee450ef114ca03d06c637b8f80cf9dbbf263a5123fbbf0e1bd59bc787c8b5248269082022-02-11 20:58:12179 days 10 hrs ago QuickSwap: Router 0x283366bb42ef49a994913baf22263c6562e588a40.105316647550392614 MATIC
0xc867d6ed7332952e4899c46818a684c8abdf7957c9a3fb685b9bd5190d2780f3248255582022-02-11 20:09:23179 days 11 hrs ago 0x283366bb42ef49a994913baf22263c6562e588a40xe339cf3c5034bc4a07a70467460295c3a0638aaa2.146250977097632586 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PENT

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 10 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 14 : PENT.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/INODERewardManagement.sol";

import "./types/ERC20.sol";
import "./types/Ownable.sol";

import "./PaymentSplitter.sol";

import "hardhat/console.sol";

contract PENT is ERC20, Ownable, PaymentSplitter {
    using SafeMath for uint256;

    INODERewardManagement public immutable nodeRewardManagement;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public vault;
    address public rewardsPool;
	address public stakingPool;
    address public treasury;

    address public deadWallet = 0x000000000000000000000000000000000000dEaD;

    uint256 public rewardsFee;
    uint256 public liquidityPoolFee;
    uint256 public vaultFee;
    uint256 public treasuryFee;

    uint256 public cashoutFee;

    bool private swapping = false;
    bool private swapLiquify = true;
    uint256 public swapTokensAmount;
	uint256[] private nodeFees;

    mapping(address => bool) public _isBlacklisted;
	mapping(address => bool) public _isExcluded;
    mapping(address => bool) public automatedMarketMakerPairs;

	bool private protectSale = false;

	struct StakePosition {
        uint256 creationTime;
        uint256 expireTime;
        uint256 balance;
		uint256 id;
    }

	mapping(address => StakePosition[]) public stakePositions;
	uint256 stakePositionIndex = 0;

    uint256 public immutable deployedTime;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );


    
    address public teamWallet;

    uint256 private transferAmountForTeam;

    uint256 private firstStepAmount = 833333333333333333333;
    uint256 private secondStepAmount = 208333333333333333333;

    constructor(
        address[] memory payees,
        uint256[] memory shares,
        address[] memory addresses,
        uint256[] memory balances,
        uint256[] memory fees,
        uint256 swapAmount,
        address uniV2Router,
        address _nodeRewardManagement
    ) ERC20("PENT", "PENT") PaymentSplitter(payees, shares) {

        deployedTime = block.timestamp;

        nodeRewardManagement = INODERewardManagement(_nodeRewardManagement);

        require(uniV2Router != address(0), "ROUTER CANNOT BE ZERO");
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(uniV2Router);

        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        teamWallet = addresses[0];
        treasury = addresses[1];
        vault = addresses[2];
        rewardsPool = addresses[3];
        stakingPool = addresses[5];

        require(vault != address(0) && rewardsPool != address(0), "ADDRESS CANNOT BE ZERO");

        require(
            fees[0] != 0 && fees[1] != 0 && fees[2] != 0 && fees[3] != 0,
            "FEES EQUAL 0"
        );

        vaultFee = fees[0];
        rewardsFee = fees[1];
        liquidityPoolFee = fees[2];
        treasuryFee = fees[3];
        cashoutFee = fees[4];

		nodeFees = [8000000000000000000, 7330000000000000000, 6670000000000000000, 6000000000000000000, 5330000000000000000, 4670000000000000000, 4000000000000000000, 3880000000000000000, 3770000000000000000, 3650000000000000000, 3540000000000000000, 3420000000000000000, 3310000000000000000, 3190000000000000000, 3080000000000000000, 2960000000000000000, 2850000000000000000, 2730000000000000000, 2620000000000000000, 2500000000000000000, 2299999999999999700, 2100000000000000000, 1900000000000000000, 1700000000000000000, 1500000000000000000, 1300000000000000000, 1100000000000000100, 900000000000000000, 700000000000000000, 500000000000000000];

        require(addresses.length > 0 && balances.length > 0, "ADDRESS ARRAY ERROR");
        require(addresses.length == balances.length, "ADDRESS LENGTH MISMATCH");

        address[] memory _addresses = addresses; 
        uint256[] memory _balances = balances;

        for (uint256 i = 0; i < _addresses.length; i++) {
			_isExcluded[_addresses[i]] = true;
            _mint(_addresses[i], _balances[i] * (10**18));
        }
        require(totalSupply() == 20456743e18, "TOTALSUPPLY ERROR");
        require(swapAmount > 0, "SWAP AMOUNT ERROR");
        swapTokensAmount = swapAmount * (10**18);
		
		protectSale = true;
    }

	function getStakePositions(address staker) public view returns (StakePosition[] memory positions){
		return stakePositions[staker];
	}

    function getNodeNumberOf(address account) public view returns (uint256) {
        return nodeRewardManagement._getNodeNumberOf(account);
    }

    function getRewardAmount() public view returns (uint256) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getRewardAmountOf(msg.sender);
    }

    function getFusionCost() public view returns(uint256, uint256, uint256) {
        return nodeRewardManagement._getFusionCost();
    }

    function getNodePrices() public view returns (uint256, uint256, uint256) {
        return nodeRewardManagement._getNodePrices();
    } 

    function getNodePrice(uint256 _type, bool isFusion) public view returns (uint256) {
        return nodeRewardManagement.getNodePrice(_type, isFusion);
    }

    function getTaxForFusion() public view returns (uint256, uint256, uint256) {
        return nodeRewardManagement._getTaxForFusion();
    }

    function getClaimInterval() public view returns (uint256) {
        return nodeRewardManagement.claimInterval();
    }

    function getRewardsPerMinute() public view returns (uint256, uint256, uint256) {
        return (nodeRewardManagement.rewardsPerMinuteOne(), nodeRewardManagement.rewardsPerMinuteFive(), nodeRewardManagement.rewardsPerMinuteTen() );
    }

    function getNodeCounts() public view returns (uint256, uint256, uint256, uint256) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodeCounts(msg.sender);
    }

    function getNodesInfo () public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesInfo(msg.sender);
    }

    function getNodesType() public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesType(msg.sender);
    }

    function getNodesName() public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesName(msg.sender);
    }

    function getNodesCreatime() public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesCreationTime(msg.sender);
    }

	function getNodesExpireTime() public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesExpireTime(msg.sender);
    }

    function getNodesRewards() public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesRewardAvailable(msg.sender);
    }

    function getNodesLastClaims() public view returns (string memory) {
        require(
            nodeRewardManagement._isNodeOwner(msg.sender),
            "NO NODE OWNER"
        );
        return nodeRewardManagement._getNodesLastClaimTime(msg.sender);
    }

    function getTotalNodesCreated() public view returns (uint256) {
        return nodeRewardManagement.totalNodesCreated();
    }

	function withdrawStakingPosition(uint256 index) public {
		address staker = msg.sender;
		StakePosition storage position = stakePositions[staker][index];
		require(position.expireTime <= block.timestamp, "NOT ELIIGIBLE TO CLAIM");
		require(position.balance > 0, "NOTHING TO CLAIM");
		
		uint256 amount = position.balance;
		position.balance = 0;
		super._transfer(stakingPool, msg.sender, amount);
	}

	function createNodeWithStakePosition(string memory name, uint256 stakeDays, uint256 _type) public {
        require(bytes(name).length > 3 && bytes(name).length < 32, "NAME SIZE INVALID");
        require(_type > 0 && _type < 4, "NOT AVAILABLE"); 

		address sender = msg.sender;

	    require(sender != address(0), "ZERO ADDRESS");

	    require(!_isBlacklisted[sender], "BLACKLISTED ADDRESS");

		require(sender != vault && sender != rewardsPool, "CANNOT CREATE NODE");
        require(stakeDays >= 1 && stakeDays <= 30, "STAKE TIME ERROR");

		uint256 duration = stakeDays * 1 days;
		uint256 nodeFee = nodeFees[stakeDays - 1];

		uint256 nodePrice = nodeRewardManagement.getNodePrice(_type, false);
		require(balanceOf(sender) >= nodePrice + nodeFee, "BALANCE TOO LOW");
        uint256 contractTokenBalance = balanceOf(address(this));

        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;

        super._transfer(sender, address(stakingPool), nodePrice);

        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 rewardsPoolTokens = contractTokenBalance
                .mul(rewardsFee)
                .div(100);

            super._transfer(
                address(this),
                rewardsPool,
                rewardsPoolTokens
            );

            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(
                100
            );

            swapAndLiquify(swapTokens);

            uint256 vaultTokens = contractTokenBalance.mul(vaultFee).div(100);
            swapAndSendToFee(vault, vaultTokens);

            uint256 treasuryTokens = contractTokenBalance.mul(treasuryFee).div(100);
            swapAndSendToFee(treasury, treasuryTokens);

            swapping = false;
        }

        super._transfer(sender, address(this), nodeFee);
        swapAndSendToFee(treasury, nodeFee);
		createStakePosition(nodePrice, duration);
        nodeRewardManagement.createNode(sender, name, duration, _type, 1);
    }

    function cashoutReward(uint256 blocktime) public {
        address sender = msg.sender;
        require(sender != address(0), "ZERO ADDRESS");
        require(!_isBlacklisted[sender], "BLACKLISTED ADDRESS");
        require(
            sender != treasury && sender != rewardsPool && sender != vault,
            "CANNOT CASHOUT REWARDS"
        );
        uint256 rewardAmount = nodeRewardManagement._getRewardAmountOf( sender, blocktime );
        require(
            rewardAmount > 0,
            "NOT ENOUGH REWARD TO CASH OUT"
        );

		uint256 feeAmount = rewardAmount.mul(cashoutFee).div(100);
		rewardAmount = rewardAmount.sub(feeAmount);
        if (swapLiquify && cashoutFee > 0) {
			super._transfer(rewardsPool, address(this), feeAmount);
			swapAndSendToFee(treasury, feeAmount);
        }
        super._transfer(rewardsPool, sender, rewardAmount);
        nodeRewardManagement._cashoutNodeReward(sender, blocktime);
    }

    function cashoutAll() public {
        address sender = msg.sender;
        cashoutAllInternal(sender);
    }

    function createNodeWithTokens(string memory name, uint256 _type) public {
        require(_type > 0 &&  _type < 4, "NOT ALLOWED");
        _createNodeWithTokens(name, _type, false);
    }

    function fusionNode(uint256 _method, string memory name) public {
        address sender = msg.sender;
        cashoutAllInternal(sender);
        nodeRewardManagement.fusionNode(_method, sender);
        _createNodeWithTokens(name, _method.add(1), true);
    }

    // Only Owner

    function updateLockAmount(uint256 _firstStep, uint256 _secondStep) public onlyOwner {
        firstStepAmount = _firstStep;
        secondStepAmount = _secondStep;
    }

    function getRewardAmountOf(address account)
        public
        view
        onlyOwner
        returns (uint256)
    {
        return nodeRewardManagement._getRewardAmountOf(account);
    }

	function changeNodeFees(uint256[] memory newNodeFees) public onlyOwner {
		require(newNodeFees.length == 30, "ITEM ERROR");
		nodeFees = newNodeFees;
	}

    function changeNodePrices(uint256 newNodePriceOne, uint256 newNodePriceFive, uint256 newNodePriceTen) public onlyOwner {
        nodeRewardManagement._changeNodePrice(newNodePriceOne, newNodePriceFive, newNodePriceTen);
    }

    function changeClaimInterval(uint256 newInterval) public onlyOwner {
        nodeRewardManagement._changeClaimInterval(newInterval);
    }

    function changeRewardsPerMinute(uint256 newPriceOne, uint256 newPriceFive, uint256 newPriceTen, uint256 newPriceOMEGA) public onlyOwner {
        nodeRewardManagement._changeRewardsPerMinute(newPriceOne, newPriceFive, newPriceTen, newPriceOMEGA);
    }

	function manualswap(uint amount) public onlyOwner {
		if (amount > balanceOf(address(this))) amount = balanceOf(address(this));
		swapTokensForEth(amount);
	}

	function manualsend(uint amount) public onlyOwner {
		if (amount > address(this).balance) amount = address(this).balance;
		payable(owner()).transfer(amount);
	}

    // Fusion Node
    function toggleFusionMode() public onlyOwner {
        nodeRewardManagement.toggleFusionMode();
    }

    function setNodeCountForFusion(uint256 _nodeCountForLesser, uint256 _nodeCountForCommon, uint256 _nodeCountForLegendary) public onlyOwner {
        nodeRewardManagement.setNodeCountForFusion(_nodeCountForLesser, _nodeCountForCommon, _nodeCountForLegendary);
    }

    function setTaxForFusion(uint256 _taxForLesser, uint256 _taxForCommon, uint256 _taxForLegendary) public onlyOwner {
        nodeRewardManagement.setTaxForFusion(_taxForLesser, _taxForCommon, _taxForLegendary);
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "ALEADY SET");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function updateSwapTokensAmount(uint256 newVal) external onlyOwner {
        swapTokensAmount = newVal;
    }

    function updateVaultWall(address payable wall) external onlyOwner {
        vault = wall;
    }

    function updateRewardsWall(address payable wall) external onlyOwner {
        rewardsPool = wall;
    }

    function updateTeamWalleet(address payable wall) external onlyOwner {
        teamWallet = wall;
    }

	function updateStakingPool(address payable wall) external onlyOwner {
        stakingPool = wall;
    }

    function updateTreasuryWall(address payable wall) external onlyOwner {
        treasury = wall;
    }

    function updateRewardsFee(uint256 value) external onlyOwner {
        rewardsFee = value;
    }

    function updateLiquidityFee(uint256 value) external onlyOwner {
        liquidityPoolFee = value;
    }

    function updateVaultFee(uint256 value) external onlyOwner {
        vaultFee = value;
    }

    function updateTreasuryFee(uint256 value) external onlyOwner {
        treasuryFee = value;
    }

    function updateCashoutFee(uint256 value) external onlyOwner {
        cashoutFee = value;
    }

	function changeProtectSale(bool value) external onlyOwner {
		protectSale = value;
	}

    function changeSwapLiquify(bool newVal) public onlyOwner {
        swapLiquify = newVal;
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function blacklistMalicious(address account, bool value)
        external
        onlyOwner
    {
        _isBlacklisted[account] = value;
    }

	function setIsExcluded(address account, bool value)
        external
        onlyOwner
    {
        _isExcluded[account] = value;
    }

    // Private

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "TRANSFER FROM ZERO ADDRESS");
        require(to != address(0), "TRANSFER TO ZERO ADDRESS");
        require(
            !_isBlacklisted[from] && !_isBlacklisted[to],
            "Blacklisted address"
        );

		if (from != owner() && to != owner() && from != address(this) && to != address(this) && !_isExcluded[from] && !_isExcluded[to]) {
			if (protectSale && to == uniswapV2Pair) {
				_isBlacklisted[from] = true;
			}
		}

        if (from == address(teamWallet)) {
            uint256 monthsPassed = (block.timestamp).sub(deployedTime).div(2592000);
            if (monthsPassed < 6) {
                require(transferAmountForTeam + amount < firstStepAmount * (monthsPassed + 1), "Not Allowed");
            } else {
                require(transferAmountForTeam + amount < secondStepAmount * (monthsPassed + 1), "Not Allowed");
            }
        }

        super._transfer(from, to, amount);
    }

    function swapAndSendToFee(address destination, uint256 tokens) private {
        uint256 initialETHBalance = address(this).balance;
        swapTokensForEth(tokens);
        uint256 newBalance = (address(this).balance).sub(initialETHBalance);
        (bool success, ) = destination.call{value: newBalance}("");
        require(success, "PAYMENT FAIL");
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(half);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

	function swapTokensForEth(uint256 tokenAmount) private {
		address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);
		
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
	}

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0),
            block.timestamp
        );
    }

	function createStakePosition(uint256 amount, uint256 duration) private {
		address staker = msg.sender;
		
		uint256 positionId = stakePositionIndex++;
		stakePositions[staker].push(
			StakePosition({
				creationTime: block.timestamp,
				expireTime: block.timestamp + duration,
				balance: amount,
				id: positionId
			})
		);
	}

    function _createNodeWithTokens(string memory name, uint256 _type, bool isFusion) private {
        require(bytes(name).length > 3 && bytes(name).length < 20, "NAME SIZE INVALID");
        if (_type == 4) {
            require(isFusion, "ONLY ENABLE WHEN FUSING");
        }

		address sender = msg.sender;

	    require(sender != address(0), "ZERO ADDRESS");
       
	    require(!_isBlacklisted[sender], "BLACKLISSTED ADDRESS");
        
		require(sender != vault && sender != rewardsPool && sender != treasury, "CANNOT CREATE NODE");
        
		uint256 nodePrice = nodeRewardManagement.getNodePrice(_type, isFusion);
		require(balanceOf(sender) >= nodePrice, "BALANCE TOO LOW");
        uint256 contractTokenBalance = balanceOf(address(this));
        bool swapAmountOk = contractTokenBalance >= swapTokensAmount;

        if (
            swapAmountOk &&
            swapLiquify &&
            !swapping &&
            sender != owner() &&
            !automatedMarketMakerPairs[sender]
        ) {
            swapping = true;

            uint256 rewardsPoolTokens = contractTokenBalance
                .mul(rewardsFee)
                .div(100);

            super._transfer(
                address(this),
                rewardsPool,
                rewardsPoolTokens
            );
			
            uint256 swapTokens = contractTokenBalance.mul(liquidityPoolFee).div(
                100
            );

            swapAndLiquify(swapTokens);

            uint256 vaultTokens = contractTokenBalance.mul(vaultFee).div(100);
            swapAndSendToFee(vault, vaultTokens);

            uint256 treasuryTokens = contractTokenBalance.mul(treasuryFee).div(100);
            swapAndSendToFee(treasury, treasuryTokens);

            swapping = false;
        }
        super._transfer(sender, address(this), nodePrice);
        if (isFusion) {
            super._transfer(address(this), deadWallet, nodePrice);
        }
        nodeRewardManagement.createNode(sender, name, 0, _type, 0);
    }

    function cashoutAllInternal(address _account) private {
        address sender = _account;
        require(
            sender != address(0),
            "ZERO ADDRESS"
        );
        require(!_isBlacklisted[sender], "BLACKLISTED ADDRESS");
        require(
            sender != vault && sender != rewardsPool && sender != vault,
            "CANNOT CASHOUT REWARDS"
        );
        uint256 rewardAmount = nodeRewardManagement._getRewardAmountOf(sender);
        require(
            rewardAmount > 0,
            "NOT ENOUGH TO CASH OUT"
        );
		
        uint256 feeAmount = rewardAmount.mul(cashoutFee).div(100);
		rewardAmount = rewardAmount.sub(feeAmount);

        if (swapLiquify && cashoutFee > 0) {
			super._transfer(rewardsPool, address(this), feeAmount);
			swapAndSendToFee(vault, feeAmount);
        }
        super._transfer(rewardsPool, sender, rewardAmount);
        nodeRewardManagement._cashoutAllNodesReward(sender);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "ALREADY SET"
        );
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }
}

File 2 of 14 : IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IUniswapV2Router01.sol";

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

File 3 of 14 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

File 4 of 14 : INODERewardManagement.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface INODERewardManagement {
    function getNodePrice(uint256 _type, bool isFusion) external view returns (uint256);

    function createNode(address account, string memory name, uint256 expireTime, uint256 _type, uint256 isStake) external;
    
    function _getRewardAmountOf(address account) external view returns (uint256);

    function _getRewardAmountOf(address account, uint256 index) external view returns (uint256);

    function _cashoutNodeReward(address account, uint256 index) external returns (uint256);

    function _cashoutAllNodesReward(address account) external returns (uint256);

    function _getNodeNumberOf(address account) external view returns (uint256);

    function _isNodeOwner(address account) external view returns (bool);

    function _changeNodePrice(uint256 newNodePriceOne, uint256 newNodePriceFive, uint256 newNodePriceTen) external;

    function _changeClaimInterval(uint256 newInterval) external;

    function claimInterval() external view returns (uint256);

    function _changeRewardsPerMinute(uint256 newPriceOne, uint256 newPriceFive, uint256 newPriceTen, uint256 newPriceOMEGA) external;

    function rewardsPerMinuteOne() external view returns (uint256);

    function rewardsPerMinuteFive() external view returns (uint256);

    function rewardsPerMinuteTen() external view returns (uint256);

    function _getFusionCost() external view returns (uint256, uint256, uint256);

    function _getNodePrices() external view returns (uint256, uint256, uint256);

    function _getNodeCounts(address account) external view returns (uint256, uint256, uint256, uint256);

    function _getTaxForFusion() external view returns (uint256, uint256, uint256);

    function _getNodesType(address account) external view returns (string memory);

    function _getNodesInfo(address account) external view returns (string memory);

    function _getNodesName(address account) external view returns (string memory);

    function _getNodesCreationTime(address account) external view returns (string memory);

    function _getNodesExpireTime(address account) external view returns (string memory);

    function _getNodesRewardAvailable(address account) external view returns (string memory);

    function _getNodesLastClaimTime(address account) external view returns (string memory);

    function totalNodesCreated() external view returns (uint256);

    // Fusion
    function toggleFusionMode() external;

    function setNodeCountForFusion(uint256 _nodeCountForLesser, uint256 _nodeCountForCommon, uint256 _nodeCountForLegendary) external;

    function setTaxForFusion(uint256 _taxForLesser, uint256 _taxForCommon, uint256 _taxForLegendary) external;

    function fusionNode(uint256 _method, address _account) external;

    // migrate
    function migrateNode(address _account, string memory _name, uint256 _creationTime, uint256 _lastClaimTime, uint256 _expireTime, uint256 _type, uint256 _isStake) external;
}

File 5 of 14 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../interfaces/IERC20.sol";
import "../interfaces/IERC20Metadata.sol";

import "../libraries/SafeMath.sol";

contract ERC20 is IERC20, IERC20Metadata {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            msg.sender,
            _allowances[sender][msg.sender].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][spender].add(addedValue)
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 6 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }

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

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

File 7 of 14 : PaymentSplitter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./interfaces/IERC20.sol";

import "./libraries/Address.sol";
import "./libraries/SafeERC20.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(msg.sender, msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
        public
        view
        returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);

        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
            totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
            (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

File 9 of 14 : IUniswapV2Router01.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

File 10 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

File 11 of 14 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 12 of 14 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is TKNaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouTKNd) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouTKNd) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouTKNd) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouTKNd) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 13 of 14 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 14 of 14 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../interfaces/IERC20.sol";

import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"},{"internalType":"uint256","name":"swapAmount","type":"uint256"},{"internalType":"address","name":"uniV2Router","type":"address"},{"internalType":"address","name":"_nodeRewardManagement","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistMalicious","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cashoutFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocktime","type":"uint256"}],"name":"cashoutReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newInterval","type":"uint256"}],"name":"changeClaimInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"newNodeFees","type":"uint256[]"}],"name":"changeNodeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNodePriceOne","type":"uint256"},{"internalType":"uint256","name":"newNodePriceFive","type":"uint256"},{"internalType":"uint256","name":"newNodePriceTen","type":"uint256"}],"name":"changeNodePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"changeProtectSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceOne","type":"uint256"},{"internalType":"uint256","name":"newPriceFive","type":"uint256"},{"internalType":"uint256","name":"newPriceTen","type":"uint256"},{"internalType":"uint256","name":"newPriceOMEGA","type":"uint256"}],"name":"changeRewardsPerMinute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newVal","type":"bool"}],"name":"changeSwapLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"stakeDays","type":"uint256"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"createNodeWithStakePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"_type","type":"uint256"}],"name":"createNodeWithTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deployedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_method","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"fusionNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFusionCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodeCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNodeNumberOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"bool","name":"isFusion","type":"bool"}],"name":"getNodePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodePrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesCreatime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesExpireTime","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesInfo","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesLastClaims","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesRewards","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNodesType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getRewardAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsPerMinute","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakePositions","outputs":[{"components":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"internalType":"struct PENT.StakePosition[]","name":"positions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxForFusion","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalNodesCreated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityPoolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodeRewardManagement","outputs":[{"internalType":"contract INODERewardManagement","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsExcluded","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeCountForLesser","type":"uint256"},{"internalType":"uint256","name":"_nodeCountForCommon","type":"uint256"},{"internalType":"uint256","name":"_nodeCountForLegendary","type":"uint256"}],"name":"setNodeCountForFusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxForLesser","type":"uint256"},{"internalType":"uint256","name":"_taxForCommon","type":"uint256"},{"internalType":"uint256","name":"_taxForLegendary","type":"uint256"}],"name":"setTaxForFusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakePositions","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"expireTime","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleFusionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateCashoutFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_firstStep","type":"uint256"},{"internalType":"uint256","name":"_secondStep","type":"uint256"}],"name":"updateLockAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateRewardsWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"updateSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateTeamWalleet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateTreasuryWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateVaultFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wall","type":"address"}],"name":"updateVaultWall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"withdrawStakingPosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052601380546001600160a01b03191661dead1790556019805461ffff1916610100179055601f805460ff191690556000602155682d2cd2bb7a39855555602455680b4b34aede8e6155556025553480156200005d57600080fd5b506040516200745238038062007452833981016040819052620000809162001238565b6040805180820182526004808252631411539560e21b6020808401828152855180870190965292855284015281518b938b93929091620000c3916003916200102b565b508051620000d99060049060208401906200102b565b5050600580546001600160a01b031916339081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38051825114620001905760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001e35760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f20706179656573000000000000604482015260640162000187565b60005b82518110156200026757620002528382815181106200021557634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106200023e57634e487b7160e01b600052603260045260246000fd5b602002602001015162000cd760201b60201c565b806200025e8162001415565b915050620001e6565b50504260a052506001600160601b0319606082901b166080526001600160a01b038216620002d85760405162461bcd60e51b815260206004820152601560248201527f524f555445522043414e4e4f54204245205a45524f0000000000000000000000604482015260640162000187565b60008290506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200031957600080fd5b505afa1580156200032e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200035491906200121b565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200039d57600080fd5b505afa158015620003b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d891906200121b565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200042157600080fd5b505af115801562000436573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045c91906200121b565b600d80546001600160a01b038086166001600160a01b031992831617909255600e80549284169290911691909117905588519091508890600090620004b157634e487b7160e01b600052603260045260246000fd5b6020026020010151602260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550876001815181106200050157634e487b7160e01b600052603260045260246000fd5b6020026020010151601260006101000a8154816001600160a01b0302191690836001600160a01b03160217905550876002815181106200055157634e487b7160e01b600052603260045260246000fd5b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555087600381518110620005a157634e487b7160e01b600052603260045260246000fd5b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555087600581518110620005f157634e487b7160e01b600052603260045260246000fd5b6020908102919091010151601180546001600160a01b0319166001600160a01b03928316179055600f5416158015906200063557506010546001600160a01b031615155b620006835760405162461bcd60e51b815260206004820152601660248201527f414444524553532043414e4e4f54204245205a45524f00000000000000000000604482015260640162000187565b85600081518110620006a557634e487b7160e01b600052603260045260246000fd5b6020026020010151600014158015620006e8575085600181518110620006db57634e487b7160e01b600052603260045260246000fd5b6020026020010151600014155b80156200071f5750856002815181106200071257634e487b7160e01b600052603260045260246000fd5b6020026020010151600014155b8015620007565750856003815181106200074957634e487b7160e01b600052603260045260246000fd5b6020026020010151600014155b620007935760405162461bcd60e51b815260206004820152600c60248201526b04645455320455155414c20360a41b604482015260640162000187565b85600081518110620007b557634e487b7160e01b600052603260045260246000fd5b602002602001015160168190555085600181518110620007e557634e487b7160e01b600052603260045260246000fd5b6020026020010151601481905550856002815181106200081557634e487b7160e01b600052603260045260246000fd5b6020026020010151601581905550856003815181106200084557634e487b7160e01b600052603260045260246000fd5b6020026020010151601781905550856004815181106200087557634e487b7160e01b600052603260045260246000fd5b602090810291909101810151601855604080516103c081018252676f05b59d3b20000081526765b96429fb9d000092810192909252675c9099a92bdb0000908201526753444835ec58000060608201526749f7f6c2acd5000060808201526740cf2c41dd13000060a0820152673782dace9d90000060c08201526735d887716084000060e0820152673451bb06933900006101008201526732a767a9562d00006101208201526731209b3e88e20000610140820152672f7647e14bd60000610160820152672def7b767e8b0000610180820152672c452819417f00006101a0820152672abe5bae743400006101c08201526729140851372800006101e082015267278d3be669dd00006102008201526725e2e8892cd1000061022082015267245c1c1e5f8600006102408201526722b1c8c1227a0000610260820152671feb3dd06765fed4610280820152671d24b2dfac5200006102a0820152671a5e27eef13e00006102c08201526717979cfe362a00006102e08201526714d1120d7b16000061030082015267120a871cc0020000610320820152670f43fc2c04ee0064610340820152670c7d713b49da00006103608201526709b6e64a8ec600006103808201526706f05b59d3b200006103a082015262000a5790601b90601e620010ba565b506000885111801562000a6b575060008751115b62000ab95760405162461bcd60e51b815260206004820152601360248201527f41444452455353204152524159204552524f5200000000000000000000000000604482015260640162000187565b865188511462000b0c5760405162461bcd60e51b815260206004820152601760248201527f41444452455353204c454e475448204d49534d41544348000000000000000000604482015260640162000187565b878760005b825181101562000c07576001601d600085848151811062000b4257634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555062000bf283828151811062000ba657634e487b7160e01b600052603260045260246000fd5b602002602001015183838151811062000bcf57634e487b7160e01b600052603260045260246000fd5b6020026020010151670de0b6b3a764000062000bec9190620013b6565b62000ec5565b8062000bfe8162001415565b91505062000b11565b506002546a10ebe24297ce6ff43c00001462000c5a5760405162461bcd60e51b81526020600482015260116024820152702a27aa20a629aaa828262c9022a92927a960791b604482015260640162000187565b6000871162000ca05760405162461bcd60e51b815260206004820152601160248201527029aba0a81020a6a7aaa72a1022a92927a960791b604482015260640162000187565b62000cb487670de0b6b3a7640000620013b6565b601a555050601f805460ff19166001179055506200145f98505050505050505050565b6001600160a01b03821662000d445760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b606482015260840162000187565b6000811162000d965760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a20736861726573206172652030000000604482015260640162000187565b6001600160a01b0382166000908152600860205260409020541562000e125760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b606482015260840162000187565b600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038416908117909155600090815260086020526040902081905560065462000e7c9082906200139b565b600655604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b6001600160a01b03821662000f1d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000187565b62000f398160025462000fc160201b62003c7e1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000f6c91839062003c7e62000fc1821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60008062000fd083856200139b565b905083811015620010245760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000187565b9392505050565b8280546200103990620013d8565b90600052602060002090601f0160209004810192826200105d5760008555620010a8565b82601f106200107857805160ff1916838001178555620010a8565b82800160010185558215620010a8579182015b82811115620010a85782518255916020019190600101906200108b565b50620010b692915062001103565b5090565b828054828255906000526020600020908101928215620010a8579160200282015b82811115620010a857825182906001600160401b0316905591602001919060010190620010db565b5b80821115620010b6576000815560010162001104565b80516001600160a01b03811681146200113257600080fd5b919050565b600082601f83011262001148578081fd5b81516020620011616200115b8362001375565b62001342565b80838252828201915082860187848660051b890101111562001181578586fd5b855b85811015620011aa5762001197826200111a565b8452928401929084019060010162001183565b5090979650505050505050565b600082601f830112620011c8578081fd5b81516020620011db6200115b8362001375565b80838252828201915082860187848660051b8901011115620011fb578586fd5b855b85811015620011aa57815184529284019290840190600101620011fd565b6000602082840312156200122d578081fd5b62001024826200111a565b600080600080600080600080610100898b03121562001255578384fd5b88516001600160401b03808211156200126c578586fd5b6200127a8c838d0162001137565b995060208b015191508082111562001290578586fd5b6200129e8c838d01620011b7565b985060408b0151915080821115620012b4578586fd5b620012c28c838d0162001137565b975060608b0151915080821115620012d8578586fd5b620012e68c838d01620011b7565b965060808b0151915080821115620012fc578586fd5b506200130b8b828c01620011b7565b94505060a089015192506200132360c08a016200111a565b91506200133360e08a016200111a565b90509295985092959890939650565b604051601f8201601f191681016001600160401b03811182821017156200136d576200136d62001449565b604052919050565b60006001600160401b0382111562001391576200139162001449565b5060051b60200190565b60008219821115620013b157620013b162001433565b500190565b6000816000190483118215151615620013d357620013d362001433565b500290565b600181811c90821680620013ed57607f821691505b602082108114156200140f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200142c576200142c62001433565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160601c60a051615e8f620015c36000396000818161080401526141ac015260008181610a4301528181611035015281816110f6015281816111c50152818161123f015281816113cb01528181611483015281816118d50152818161198d015281816119f401528181611c4201528181611d1d01528181611dd501528181611ea601528181611f6901528181611fa90152818161203a015281816120cb015281816124a501528181612628015281816127d301528181612866015281816129b801528181612a8801528181612e290152818161309f015281816131b7015281816132ac01528181613364015281816133a10152818161346e0152818161351b015281816135d30152818161367e015281816136d10152818161378901528181613926015281816139de01528181613b6401528181613beb01528181613c2701528181614562015281816146d601528181614bb90152614e0c0152615e8f6000f3fe60806040526004361061043b5760003560e01c80636d9ae0be116102325780636d9ae0be14610a6557806370a0823114610a7b578063715018a614610a9b578063796f838e14610ab05780637b2834f514610ad0578063823349b314610af057806385141a7714610b05578063881dce6014610b255780638b83209b14610b455780638da5cb5b14610b655780638e67566314610b7a578063921e245514610b9a5780639349c47d14610bba57806394471c4214610bda57806395d89b4114610bef5780639723283014610c045780639852595c14610c245780639a7a23d614610c44578063a04ec53914610c64578063a457c2d714610c91578063a52a39f614610cb1578063a9059cbb14610cd1578063a99bc40914610cf1578063b62496f514610d11578063b96392c114610d41578063bbc6799814610d61578063bdf24a5314610d81578063bef92f8514610d96578063cb0ade8114610dab578063cb471c8514610dc0578063cc32d17614610de0578063ce44c65a14610df6578063ce7c2ac214610e16578063cedeb59014610e4c578063cf8e2f8e14610e61578063d79779b214610e81578063d892934214610ea1578063dd62ed3e14610ec1578063e12e3ca514610f07578063e33b7de314610f27578063e94941b114610f3c578063ee1afdbf14610f5c578063f2fde38b14610f71578063f5c3749514610f91578063f65b302014610fb1578063f74c993414610fc6578063f7b1efb614610fe6578063fbfa77cf14610ffb57600080fd5b80623f43d21461048057806301ac145b146104ab5780630359fea9146104cf57806303caf422146104fc5780630454e3c11461051e57806306fdde0314610542578063084a6bff14610557578063095ea7b31461057757806309a69f57146105a75780630b285b1f146105bc5780630c56ae3b146105ec5780631694505e1461060c57806318160ddd1461062c57806319165587146106415780631ad34a4f146106615780631cdd3be31461068157806323b872dd146106b15780632403bd77146106d15780632bb14e1d14610701578063313ce567146107175780633307aab11461073357806339509351146107535780633a98ef39146107735780633c33f9a7146107885780633f7b97bb146107a8578063406072a9146107bd57806345c18691146107dd578063461ac019146107f257806348b750441461082657806349bd5a5e14610846578063507d379c14610866578063545579731461088657806354f12f1f1461089b578063583bd7a6146108b157806359927044146108d15780635b0d4674146108f15780635d512ac7146109065780635e795b56146109265780635f1c3182146109465780635f2fe0341461095c57806361d027b31461097c578063642d7e6e1461099c57806365b8dbc0146109b157806365bfe430146109d15780636770474b146109f15780636815a91c14610a11578063697e2f8e14610a3157600080fd5b3661047b577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033346040516104719291906158a9565b60405180910390a1005b600080fd5b34801561048c57600080fd5b5061049561101b565b6040516104a29190615967565b60405180910390f35b3480156104b757600080fd5b506104c160165481565b6040519081526020016104a2565b3480156104db57600080fd5b506010546104ef906001600160a01b031681565b6040516104a29190615895565b34801561050857600080fd5b5061051c6105173660046157e7565b611184565b005b34801561052a57600080fd5b50610533611238565b6040516104a293929190615bff565b34801561054e57600080fd5b506104956112d9565b34801561056357600080fd5b5061051c6105723660046156d6565b61136b565b34801561058357600080fd5b506105976105923660046154c4565b61139a565b60405190151581526020016104a2565b3480156105b357600080fd5b506104c16113b1565b3480156105c857600080fd5b506105976105d73660046153e7565b601d6020526000908152604090205460ff1681565b3480156105f857600080fd5b506011546104ef906001600160a01b031681565b34801561061857600080fd5b50600d546104ef906001600160a01b031681565b34801561063857600080fd5b506002546104c1565b34801561064d57600080fd5b5061051c61065c3660046153e7565b611508565b34801561066d57600080fd5b5061051c61067c3660046156d6565b611617565b34801561068d57600080fd5b5061059761069c3660046153e7565b601c6020526000908152604090205460ff1681565b3480156106bd57600080fd5b506105976106cc366004615457565b611690565b3480156106dd57600080fd5b506106f16106ec3660046154c4565b6116fa565b6040516104a29493929190615c15565b34801561070d57600080fd5b506104c160145481565b34801561072357600080fd5b50604051601281526020016104a2565b34801561073f57600080fd5b5061051c61074e3660046153e7565b61173f565b34801561075f57600080fd5b5061059761076e3660046154c4565b61178b565b34801561077f57600080fd5b506006546104c1565b34801561079457600080fd5b5061051c6107a33660046156d6565b6117c1565b3480156107b457600080fd5b506104956118bb565b3480156107c957600080fd5b506104c16107d83660046155ce565b6119c2565b3480156107e957600080fd5b506105336119ed565b3480156107fe57600080fd5b506104c17f000000000000000000000000000000000000000000000000000000000000000081565b34801561083257600080fd5b5061051c6108413660046155ce565b611a4b565b34801561085257600080fd5b50600e546104ef906001600160a01b031681565b34801561087257600080fd5b5061051c61088136600461578f565b611c01565b34801561089257600080fd5b5061051c611cb2565b3480156108a757600080fd5b506104c160155481565b3480156108bd57600080fd5b5061051c6108cc366004615596565b611cbf565b3480156108dd57600080fd5b506022546104ef906001600160a01b031681565b3480156108fd57600080fd5b50610495611d03565b34801561091257600080fd5b5061051c6109213660046154ef565b611e0a565b34801561093257600080fd5b506104c1610941366004615706565b611e85565b34801561095257600080fd5b506104c1601a5481565b34801561096857600080fd5b5061051c61097736600461578f565b611f28565b34801561098857600080fd5b506012546104ef906001600160a01b031681565b3480156109a857600080fd5b50610533611fa2565b3480156109bd57600080fd5b5061051c6109cc3660046153e7565b61215a565b3480156109dd57600080fd5b5061051c6109ec3660046156d6565b6123d2565b3480156109fd57600080fd5b5061051c610a0c3660046156d6565b6126b8565b348015610a1d57600080fd5b5061051c610a2c3660046156d6565b6126e7565b348015610a3d57600080fd5b506104ef7f000000000000000000000000000000000000000000000000000000000000000081565b348015610a7157600080fd5b506104c160185481565b348015610a8757600080fd5b506104c1610a963660046153e7565b612716565b348015610aa757600080fd5b5061051c612731565b348015610abc57600080fd5b5061051c610acb3660046156d6565b612793565b348015610adc57600080fd5b5061051c610aeb3660046156d6565b612833565b348015610afc57600080fd5b506104c1612862565b348015610b1157600080fd5b506013546104ef906001600160a01b031681565b348015610b3157600080fd5b5061051c610b403660046156d6565b6128bd565b348015610b5157600080fd5b506104ef610b603660046156d6565b61290c565b348015610b7157600080fd5b506104ef61294a565b348015610b8657600080fd5b5061051c610b953660046156d6565b612959565b348015610ba657600080fd5b5061051c610bb536600461572a565b612988565b348015610bc657600080fd5b5061051c610bd53660046153e7565b612a38565b348015610be657600080fd5b506104c1612a84565b348015610bfb57600080fd5b50610495612adf565b348015610c1057600080fd5b5061051c610c1f3660046156d6565b612aee565b348015610c3057600080fd5b506104c1610c3f3660046153e7565b612b1d565b348015610c5057600080fd5b5061051c610c5f366004615497565b612b38565b348015610c7057600080fd5b50610c84610c7f3660046153e7565b612b6c565b6040516104a29190615903565b348015610c9d57600080fd5b50610597610cac3660046154c4565b612c07565b348015610cbd57600080fd5b5061051c610ccc36600461568b565b612c56565b348015610cdd57600080fd5b50610597610cec3660046154c4565b61311a565b348015610cfd57600080fd5b5061051c610d0c3660046153e7565b613127565b348015610d1d57600080fd5b50610597610d2c3660046153e7565b601e6020526000908152604090205460ff1681565b348015610d4d57600080fd5b506104c1610d5c3660046153e7565b613173565b348015610d6d57600080fd5b5061051c610d7c366004615649565b61323c565b348015610d8d57600080fd5b50610495613292565b348015610da257600080fd5b506106f1613399565b348015610db757600080fd5b50610495613501565b348015610dcc57600080fd5b5061051c610ddb36600461576e565b613608565b348015610dec57600080fd5b506104c160175481565b348015610e0257600080fd5b5061051c610e1136600461578f565b61363d565b348015610e2257600080fd5b506104c1610e313660046153e7565b6001600160a01b031660009081526008602052604090205490565b348015610e5857600080fd5b506104956136b7565b348015610e6d57600080fd5b5061051c610e7c366004615497565b6137be565b348015610e8d57600080fd5b506104c1610e9c3660046153e7565b613813565b348015610ead57600080fd5b5061051c610ebc366004615497565b61382e565b348015610ecd57600080fd5b506104c1610edc36600461541f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610f1357600080fd5b5061051c610f22366004615596565b613883565b348015610f3357600080fd5b506007546104c1565b348015610f4857600080fd5b5061051c610f573660046153e7565b6138c0565b348015610f6857600080fd5b5061049561390c565b348015610f7d57600080fd5b5061051c610f8c3660046153e7565b613a13565b348015610f9d57600080fd5b5061051c610fac3660046153e7565b613aec565b348015610fbd57600080fd5b5061051c613b38565b348015610fd257600080fd5b506104c1610fe13660046153e7565b613bd1565b348015610ff257600080fd5b50610533613c20565b34801561100757600080fd5b50600f546104ef906001600160a01b031681565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b09061106a903390600401615895565b60206040518083038186803b15801561108257600080fd5b505afa158015611096573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ba91906155b2565b6110df5760405162461bcd60e51b81526004016110d6906159a6565b60405180910390fd5b6040516329a87a8560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a6a1ea149061112b903390600401615895565b60006040518083038186803b15801561114357600080fd5b505afa158015611157573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261117f91908101906155e0565b905090565b6005546001600160a01b031633146111ae5760405162461bcd60e51b81526004016110d690615adf565b60405163020d4f6760e51b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341a9ece090611200908790879087908790600401615c15565b600060405180830381600087803b15801561121a57600080fd5b505af115801561122e573d6000803e3d6000fd5b5050505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dc22baa96040518163ffffffff1660e01b815260040160606040518083038186803b15801561129657600080fd5b505afa1580156112aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce91906157ba565b925092509250909192565b6060600380546112e890615d21565b80601f016020809104026020016040519081016040528092919081815260200182805461131490615d21565b80156113615780601f1061133657610100808354040283529160200191611361565b820191906000526020600020905b81548152906001019060200180831161134457829003601f168201915b5050505050905090565b6005546001600160a01b031633146113955760405162461bcd60e51b81526004016110d690615adf565b601455565b60006113a7338484613cdb565b5060015b92915050565b60405163041ac82b60e41b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b090611400903390600401615895565b60206040518083038186803b15801561141857600080fd5b505afa15801561142c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145091906155b2565b61146c5760405162461bcd60e51b81526004016110d6906159a6565b6040516330cd31af60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063619a635e906114b8903390600401615895565b60206040518083038186803b1580156114d057600080fd5b505afa1580156114e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117f91906156ee565b6001600160a01b03811660009081526008602052604090205461153d5760405162461bcd60e51b81526004016110d690615a23565b600061154860075490565b6115529047615c87565b90506000611569838361156486612b1d565b613e00565b9050806115885760405162461bcd60e51b81526004016110d690615a69565b6001600160a01b038316600090815260096020526040812080548392906115b0908490615c87565b9250508190555080600760008282546115c99190615c87565b909155506115d990508382613e46565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161160a9291906158a9565b60405180910390a1505050565b6005546001600160a01b031633146116415760405162461bcd60e51b81526004016110d690615adf565b4781111561164c5750475b61165461294a565b6001600160a01b03166108fc829081150290604051600060405180830381858888f1935050505015801561168c573d6000803e3d6000fd5b5050565b600061169d848484613f5c565b6116ef84336116ea85604051806060016040528060288152602001615ded602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614273565b613cdb565b5060015b9392505050565b60208052816000526040600020818154811061171557600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919450925084565b6005546001600160a01b031633146117695760405162461bcd60e51b81526004016110d690615adf565b602280546001600160a01b0319166001600160a01b0392909216919091179055565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916113a79185906116ea9086613c7e565b33600081815260208052604081208054849081106117ef57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600402019050428160010154111561184c5760405162461bcd60e51b81526020600482015260166024820152754e4f5420454c49494749424c4520544f20434c41494d60501b60448201526064016110d6565b60008160020154116118935760405162461bcd60e51b815260206004820152601060248201526f4e4f5448494e4720544f20434c41494d60801b60448201526064016110d6565b60028101805460009091556011546118b5906001600160a01b031633836142ad565b50505050565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b09061190a903390600401615895565b60206040518083038186803b15801561192257600080fd5b505afa158015611936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195a91906155b2565b6119765760405162461bcd60e51b81526004016110d6906159a6565b60405163c87aefa160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c87aefa19061112b903390600401615895565b6001600160a01b039182166000908152600c6020908152604080832093909416825291909152205490565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663013c2b5e6040518163ffffffff1660e01b815260040160606040518083038186803b15801561129657600080fd5b6001600160a01b038116600090815260086020526040902054611a805760405162461bcd60e51b81526004016110d690615a23565b6000611a8b83613813565b6040516370a0823160e01b81526001600160a01b038516906370a0823190611ab7903090600401615895565b60206040518083038186803b158015611acf57600080fd5b505afa158015611ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0791906156ee565b611b119190615c87565b90506000611b24838361156487876119c2565b905080611b435760405162461bcd60e51b81526004016110d690615a69565b6001600160a01b038085166000908152600c6020908152604080832093871683529290529081208054839290611b7a908490615c87565b90915550506001600160a01b0384166000908152600b602052604081208054839290611ba7908490615c87565b90915550611bb89050848483614430565b836001600160a01b03167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a8483604051611bf39291906158a9565b60405180910390a250505050565b6005546001600160a01b03163314611c2b5760405162461bcd60e51b81526004016110d690615adf565b60405163141f4de760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063507d379c90611c7b90869086908690600401615bff565b600060405180830381600087803b158015611c9557600080fd5b505af1158015611ca9573d6000803e3d6000fd5b50505050505050565b33611cbc81614486565b50565b6005546001600160a01b03163314611ce95760405162461bcd60e51b81526004016110d690615adf565b601980549115156101000261ff0019909216919091179055565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b090611d52903390600401615895565b60206040518083038186803b158015611d6a57600080fd5b505afa158015611d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da291906155b2565b611dbe5760405162461bcd60e51b81526004016110d6906159a6565b60405163251c4fd760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634a389fae9061112b903390600401615895565b6005546001600160a01b03163314611e345760405162461bcd60e51b81526004016110d690615adf565b8051601e14611e725760405162461bcd60e51b815260206004820152600a60248201526924aa22a69022a92927a960b11b60448201526064016110d6565b805161168c90601b906020840190615336565b604051632f3cadab60e11b81526004810183905281151560248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635e795b569060440160206040518083038186803b158015611ef057600080fd5b505afa158015611f04573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f391906156ee565b6005546001600160a01b03163314611f525760405162461bcd60e51b81526004016110d690615adf565b6040516317cbf80d60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635f2fe03490611c7b90869086908690600401615bff565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633cfe2f656040518163ffffffff1660e01b815260040160206040518083038186803b15801561200057600080fd5b505afa158015612014573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203891906156ee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633b4308f46040518163ffffffff1660e01b815260040160206040518083038186803b15801561209157600080fd5b505afa1580156120a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c991906156ee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636ad583606040518163ffffffff1660e01b815260040160206040518083038186803b15801561212257600080fd5b505afa158015612136573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ce91906156ee565b6005546001600160a01b031633146121845760405162461bcd60e51b81526004016110d690615adf565b600d546001600160a01b03828116911614156121cf5760405162461bcd60e51b815260206004820152600a6024820152691053115051164814d15560b21b60448201526064016110d6565b600d546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600d80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290516000929163c45a0155916004808301926020929190829003018186803b15801561226157600080fd5b505afa158015612275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122999190615403565b6001600160a01b031663c9c6539630600d60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232e9190615403565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561237657600080fd5b505af115801561238a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ae9190615403565b600e80546001600160a01b0319166001600160a01b03929092169190911790555050565b33806123f05760405162461bcd60e51b81526004016110d690615b14565b6001600160a01b0381166000908152601c602052604090205460ff16156124295760405162461bcd60e51b81526004016110d6906159f6565b6012546001600160a01b0382811691161480159061245557506010546001600160a01b03828116911614155b801561246f5750600f546001600160a01b03828116911614155b61248b5760405162461bcd60e51b81526004016110d690615b3a565b6040516329b8573160e21b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a6e15cc4906124dc90859087906004016158a9565b60206040518083038186803b1580156124f457600080fd5b505afa158015612508573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252c91906156ee565b90506000811161257e5760405162461bcd60e51b815260206004820152601d60248201527f4e4f5420454e4f5547482052455741524420544f2043415348204f555400000060448201526064016110d6565b60006125a0606461259a6018548561470b90919063ffffffff16565b9061478a565b90506125ac82826147c9565b601954909250610100900460ff1680156125c857506000601854115b156125fa576010546125e4906001600160a01b031630836142ad565b6012546125fa906001600160a01b03168261480b565b601054612611906001600160a01b031684846142ad565b60405163376db80160e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636edb70029061265f90869088906004016158a9565b602060405180830381600087803b15801561267957600080fd5b505af115801561268d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b191906156ee565b5050505050565b6005546001600160a01b031633146126e25760405162461bcd60e51b81526004016110d690615adf565b601a55565b6005546001600160a01b031633146127115760405162461bcd60e51b81526004016110d690615adf565b601855565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461275b5760405162461bcd60e51b81526004016110d690615adf565b6005546040516000916001600160a01b031690600080516020615e15833981519152908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146127bd5760405162461bcd60e51b81526004016110d690615adf565b604051633ee278b960e21b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063fb89e2e490602401600060405180830381600087803b15801561281f57600080fd5b505af11580156126b1573d6000803e3d6000fd5b6005546001600160a01b0316331461285d5760405162461bcd60e51b81526004016110d690615adf565b601655565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b8527aef6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d057600080fd5b6005546001600160a01b031633146128e75760405162461bcd60e51b81526004016110d690615adf565b6128f030612716565b8111156129035761290030612716565b90505b611cbc816148b5565b6000600a828154811061292f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6005546001600160a01b031690565b6005546001600160a01b031633146129835760405162461bcd60e51b81526004016110d690615adf565b601555565b3361299281614486565b604051633e6cf0d360e01b8152600481018490526001600160a01b0382811660248301527f00000000000000000000000000000000000000000000000000000000000000001690633e6cf0d390604401600060405180830381600087803b1580156129fc57600080fd5b505af1158015612a10573d6000803e3d6000fd5b50505050612a3382612a2c600186613c7e90919063ffffffff16565b6001614a3a565b505050565b6005546001600160a01b03163314612a625760405162461bcd60e51b81526004016110d690615adf565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630b433a126040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d057600080fd5b6060600480546112e890615d21565b6005546001600160a01b03163314612b185760405162461bcd60e51b81526004016110d690615adf565b601755565b6001600160a01b031660009081526009602052604090205490565b6005546001600160a01b03163314612b625760405162461bcd60e51b81526004016110d690615adf565b61168c8282614e85565b6001600160a01b038116600090815260208080526040808320805482518185028101850190935280835260609492939192909184015b82821015612bfc578382906000526020600020906004020160405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505081526020019060010190612ba2565b505050509050919050565b60006113a733846116ea85604051806060016040528060258152602001615e35602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614273565b60038351118015612c68575060208351105b612c845760405162461bcd60e51b81526004016110d690615ab4565b600081118015612c945750600481105b612cd05760405162461bcd60e51b815260206004820152600d60248201526c4e4f5420415641494c41424c4560981b60448201526064016110d6565b3380612cee5760405162461bcd60e51b81526004016110d690615b14565b6001600160a01b0381166000908152601c602052604090205460ff1615612d275760405162461bcd60e51b81526004016110d6906159f6565b600f546001600160a01b03828116911614801590612d5357506010546001600160a01b03828116911614155b612d6f5760405162461bcd60e51b81526004016110d69061597a565b60018310158015612d815750601e8311155b612dc05760405162461bcd60e51b815260206004820152601060248201526f29aa20a5a2902a24a6a29022a92927a960811b60448201526064016110d6565b6000612dcf8462015180615cbf565b90506000601b612de0600187615cde565b81548110612dfe57634e487b7160e01b600052603260045260246000fd5b6000918252602082200154604051632f3cadab60e11b815260048101879052602481018390529092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635e795b569060440160206040518083038186803b158015612e7357600080fd5b505afa158015612e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eab91906156ee565b9050612eb78282615c87565b612ec085612716565b1015612ede5760405162461bcd60e51b81526004016110d6906159cd565b6000612ee930612716565b601a5460115491925082101590612f0b9087906001600160a01b0316856142ad565b808015612f1f5750601954610100900460ff165b8015612f2e575060195460ff16155b8015612f535750612f3d61294a565b6001600160a01b0316866001600160a01b031614155b8015612f7857506001600160a01b0386166000908152601e602052604090205460ff16155b1561305d576019805460ff19166001179055601454600090612fa29060649061259a90869061470b565b601054909150612fbd9030906001600160a01b0316836142ad565b6000612fd9606461259a6015548761470b90919063ffffffff16565b9050612fe481614f36565b6000613000606461259a6016548861470b90919063ffffffff16565b600f54909150613019906001600160a01b03168261480b565b6000613035606461259a6017548961470b90919063ffffffff16565b60125490915061304e906001600160a01b03168261480b565b50506019805460ff1916905550505b6130688630866142ad565b60125461307e906001600160a01b03168561480b565b6130888386614fb7565b604051638ce3bbf760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638ce3bbf7906130dd9089908d908a908d906001906004016158c2565b600060405180830381600087803b1580156130f757600080fd5b505af115801561310b573d6000803e3d6000fd5b50505050505050505050505050565b60006113a7338484613f5c565b6005546001600160a01b031633146131515760405162461bcd60e51b81526004016110d690615adf565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6005546000906001600160a01b031633146131a05760405162461bcd60e51b81526004016110d690615adf565b6040516330cd31af60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063619a635e906131ec908590600401615895565b60206040518083038186803b15801561320457600080fd5b505afa158015613218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab91906156ee565b60008111801561324c5750600481105b6132865760405162461bcd60e51b815260206004820152600b60248201526a1393d50810531313d5d15160aa1b60448201526064016110d6565b61168c82826000614a3a565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b0906132e1903390600401615895565b60206040518083038186803b1580156132f957600080fd5b505afa15801561330d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333191906155b2565b61334d5760405162461bcd60e51b81526004016110d6906159a6565b6040516364940ce760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c92819ce9061112b903390600401615895565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166341ac82b0336040518263ffffffff1660e01b81526004016133eb9190615895565b60206040518083038186803b15801561340357600080fd5b505afa158015613417573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343b91906155b2565b6134575760405162461bcd60e51b81526004016110d6906159a6565b604051634430fdab60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638861fb56906134a3903390600401615895565b60806040518083038186803b1580156134bb57600080fd5b505afa1580156134cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f39190615818565b935093509350935090919293565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b090613550903390600401615895565b60206040518083038186803b15801561356857600080fd5b505afa15801561357c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a091906155b2565b6135bc5760405162461bcd60e51b81526004016110d6906159a6565b6040516305a4131f60e31b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632d2098f89061112b903390600401615895565b6005546001600160a01b031633146136325760405162461bcd60e51b81526004016110d690615adf565b602491909155602555565b6005546001600160a01b031633146136675760405162461bcd60e51b81526004016110d690615adf565b604051634e7eec4760e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639cfdd88e90611c7b90869086908690600401615bff565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b090613706903390600401615895565b60206040518083038186803b15801561371e57600080fd5b505afa158015613732573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375691906155b2565b6137725760405162461bcd60e51b81526004016110d6906159a6565b60405163cc3ad41760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cc3ad4179061112b903390600401615895565b6005546001600160a01b031633146137e85760405162461bcd60e51b81526004016110d690615adf565b6001600160a01b03919091166000908152601d60205260409020805460ff1916911515919091179055565b6001600160a01b03166000908152600b602052604090205490565b6005546001600160a01b031633146138585760405162461bcd60e51b81526004016110d690615adf565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146138ad5760405162461bcd60e51b81526004016110d690615adf565b601f805460ff1916911515919091179055565b6005546001600160a01b031633146138ea5760405162461bcd60e51b81526004016110d690615adf565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60405163041ac82b60e41b81526060906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906341ac82b09061395b903390600401615895565b60206040518083038186803b15801561397357600080fd5b505afa158015613987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ab91906155b2565b6139c75760405162461bcd60e51b81526004016110d6906159a6565b604051632bacfd8160e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635759fb029061112b903390600401615895565b6005546001600160a01b03163314613a3d5760405162461bcd60e51b81526004016110d690615adf565b6001600160a01b038116613aa25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016110d6565b6005546040516001600160a01b03808416921690600080516020615e1583398151915290600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314613b165760405162461bcd60e51b81526004016110d690615adf565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314613b625760405162461bcd60e51b81526004016110d690615adf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f65b30206040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613bbd57600080fd5b505af11580156118b5573d6000803e3d6000fd5b60405163112469f960e21b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634491a7e4906131ec908590600401615895565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c8d527106040518163ffffffff1660e01b815260040160606040518083038186803b15801561129657600080fd5b600080613c8b8385615c87565b9050838110156116f35760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b60448201526064016110d6565b6001600160a01b038316613d3d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016110d6565b6001600160a01b038216613d9e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016110d6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6006546001600160a01b03841660009081526008602052604081205490918391613e2a9086615cbf565b613e349190615c9f565b613e3e9190615cde565b949350505050565b80471015613e965760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016110d6565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613ee3576040519150601f19603f3d011682016040523d82523d6000602084013e613ee8565b606091505b5050905080612a335760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b60648201526084016110d6565b6001600160a01b038316613faf5760405162461bcd60e51b815260206004820152601a6024820152795452414e534645522046524f4d205a45524f204144445245535360301b60448201526064016110d6565b6001600160a01b0382166140005760405162461bcd60e51b81526020600482015260186024820152775452414e5346455220544f205a45524f204144445245535360401b60448201526064016110d6565b6001600160a01b0383166000908152601c602052604090205460ff1615801561404257506001600160a01b0382166000908152601c602052604090205460ff16155b6140845760405162461bcd60e51b8152602060048201526013602482015272426c61636b6c6973746564206164647265737360681b60448201526064016110d6565b61408c61294a565b6001600160a01b0316836001600160a01b0316141580156140c657506140b061294a565b6001600160a01b0316826001600160a01b031614155b80156140db57506001600160a01b0383163014155b80156140f057506001600160a01b0382163014155b801561411557506001600160a01b0383166000908152601d602052604090205460ff16155b801561413a57506001600160a01b0382166000908152601d602052604090205460ff16155b1561418757601f5460ff16801561415e5750600e546001600160a01b038381169116145b15614187576001600160a01b0383166000908152601c60205260409020805460ff191660011790555b6022546001600160a01b03848116911614156142685760006141d062278d0061259a427f00000000000000000000000000000000000000000000000000000000000000006147c9565b90506006811015614223576141e6816001615c87565b6024546141f39190615cbf565b826023546142019190615c87565b1061421e5760405162461bcd60e51b81526004016110d690615b6a565b614266565b61422e816001615c87565b60255461423b9190615cbf565b826023546142499190615c87565b106142665760405162461bcd60e51b81526004016110d690615b6a565b505b612a338383836142ad565b600081848411156142975760405162461bcd60e51b81526004016110d69190615967565b5060006142a48486615cde565b95945050505050565b6001600160a01b0383166143115760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016110d6565b6001600160a01b0382166143735760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016110d6565b6143b081604051806060016040528060268152602001615dc7602691396001600160a01b0386166000908152602081905260409020549190614273565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143df9082613c7e565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613df3565b612a338363a9059cbb60e01b848460405160240161444f9291906158a9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615069565b806001600160a01b0381166144ad5760405162461bcd60e51b81526004016110d690615b14565b6001600160a01b0381166000908152601c602052604090205460ff16156144e65760405162461bcd60e51b81526004016110d6906159f6565b600f546001600160a01b0382811691161480159061451257506010546001600160a01b03828116911614155b801561452c5750600f546001600160a01b03828116911614155b6145485760405162461bcd60e51b81526004016110d690615b3a565b6040516330cd31af60e11b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063619a635e90614597908590600401615895565b60206040518083038186803b1580156145af57600080fd5b505afa1580156145c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e791906156ee565b9050600081116146325760405162461bcd60e51b81526020600482015260166024820152751393d508115393d551d2081513c810d054d20813d55560521b60448201526064016110d6565b600061464e606461259a6018548561470b90919063ffffffff16565b905061465a82826147c9565b601954909250610100900460ff16801561467657506000601854115b156146a857601054614692906001600160a01b031630836142ad565b600f546146a8906001600160a01b03168261480b565b6010546146bf906001600160a01b031684846142ad565b60405163170a62c760e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635c298b1c9061265f908690600401615895565b60008261471a575060006113ab565b60006147268385615cbf565b9050826147338583615c9f565b146116f35760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016110d6565b60006116f383836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061513b565b60006116f383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614273565b47614815826148b5565b600061482147836147c9565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114614870576040519150601f19603f3d011682016040523d82523d6000602084013e614875565b606091505b50509050806126b15760405162461bcd60e51b815260206004820152600c60248201526b14105653515395081190525360a21b60448201526064016110d6565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106148f857634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600d54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561494c57600080fd5b505afa158015614960573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906149849190615403565b816001815181106149a557634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600d546149cb9130911684613cdb565b600d5460405163791ac94760e01b81526001600160a01b039091169063791ac94790614a04908590600090869030904290600401615b8f565b600060405180830381600087803b158015614a1e57600080fd5b505af1158015614a32573d6000803e3d6000fd5b505050505050565b60038351118015614a4c575060148351105b614a685760405162461bcd60e51b81526004016110d690615ab4565b8160041415614ab85780614ab85760405162461bcd60e51b81526020600482015260176024820152764f4e4c5920454e41424c45205748454e20465553494e4760481b60448201526064016110d6565b3380614ad65760405162461bcd60e51b81526004016110d690615b14565b6001600160a01b0381166000908152601c602052604090205460ff1615614b365760405162461bcd60e51b8152602060048201526014602482015273424c41434b4c495353544544204144445245535360601b60448201526064016110d6565b600f546001600160a01b03828116911614801590614b6257506010546001600160a01b03828116911614155b8015614b7c57506012546001600160a01b03828116911614155b614b985760405162461bcd60e51b81526004016110d69061597a565b604051632f3cadab60e11b81526004810184905282151560248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635e795b569060440160206040518083038186803b158015614c0357600080fd5b505afa158015614c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c3b91906156ee565b905080614c4783612716565b1015614c655760405162461bcd60e51b81526004016110d6906159cd565b6000614c7030612716565b601a5490915081108015908190614c8e5750601954610100900460ff165b8015614c9d575060195460ff16155b8015614cc25750614cac61294a565b6001600160a01b0316846001600160a01b031614155b8015614ce757506001600160a01b0384166000908152601e602052604090205460ff16155b15614dcc576019805460ff19166001179055601454600090614d119060649061259a90869061470b565b601054909150614d2c9030906001600160a01b0316836142ad565b6000614d48606461259a6015548761470b90919063ffffffff16565b9050614d5381614f36565b6000614d6f606461259a6016548861470b90919063ffffffff16565b600f54909150614d88906001600160a01b03168261480b565b6000614da4606461259a6017548961470b90919063ffffffff16565b601254909150614dbd906001600160a01b03168261480b565b50506019805460ff1916905550505b614dd78430856142ad565b8415614df557601354614df59030906001600160a01b0316856142ad565b604051638ce3bbf760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638ce3bbf790614e4a9087908b906000908c9082906004016158c2565b600060405180830381600087803b158015614e6457600080fd5b505af1158015614e78573d6000803e3d6000fd5b5050505050505050505050565b6001600160a01b0382166000908152601e602052604090205460ff1615158115151415614ee25760405162461bcd60e51b815260206004820152600b60248201526a105314915051164814d15560aa1b60448201526064016110d6565b6001600160a01b0382166000818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000614f4382600261478a565b90506000614f5183836147c9565b905047614f5d836148b5565b6000614f6947836147c9565b9050614f758382615169565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051614fa893929190615bff565b60405180910390a15050505050565b6021805433916000919082614fcb83615d5c565b91905055905060206000836001600160a01b03166001600160a01b03168152602001908152602001600020604051806080016040528042815260200185426150139190615c87565b815260208082019790975260409081019390935281546001818101845560009384529287902082516004909202019081559581015191860191909155908101516002850155606001516003909301929092555050565b60006150be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166152229092919063ffffffff16565b805190915015612a3357808060200190518101906150dc91906155b2565b612a335760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016110d6565b6000818361515c5760405162461bcd60e51b81526004016110d69190615967565b5060006142a48486615c9f565b600d546151819030906001600160a01b031684613cdb565b600d5460405163f305d71960e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b1580156151e957600080fd5b505af11580156151fd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126b191906157ba565b6060613e3e8484600085856001600160a01b0385163b6152845760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016110d6565b600080866001600160a01b031685876040516152a09190615879565b60006040518083038185875af1925050503d80600081146152dd576040519150601f19603f3d011682016040523d82523d6000602084013e6152e2565b606091505b50915091506152f28282866152fd565b979650505050505050565b6060831561530c5750816116f3565b82511561531c5782518084602001fd5b8160405162461bcd60e51b81526004016110d69190615967565b828054828255906000526020600020908101928215615371579160200282015b82811115615371578251825591602001919060010190615356565b5061537d929150615381565b5090565b5b8082111561537d5760008155600101615382565b600082601f8301126153a6578081fd5b81356153b96153b482615c60565b615c30565b8181528460208386010111156153cd578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156153f8578081fd5b81356116f381615da3565b600060208284031215615414578081fd5b81516116f381615da3565b60008060408385031215615431578081fd5b823561543c81615da3565b9150602083013561544c81615da3565b809150509250929050565b60008060006060848603121561546b578081fd5b833561547681615da3565b9250602084013561548681615da3565b929592945050506040919091013590565b600080604083850312156154a9578182fd5b82356154b481615da3565b9150602083013561544c81615db8565b600080604083850312156154d6578182fd5b82356154e181615da3565b946020939093013593505050565b60006020808385031215615501578182fd5b82356001600160401b0380821115615517578384fd5b818501915085601f83011261552a578384fd5b81358181111561553c5761553c615d8d565b8060051b915061554d848301615c30565b8181528481019084860184860187018a1015615567578788fd5b8795505b8386101561558957803583526001959095019491860191860161556b565b5098975050505050505050565b6000602082840312156155a7578081fd5b81356116f381615db8565b6000602082840312156155c3578081fd5b81516116f381615db8565b60008060408385031215615431578182fd5b6000602082840312156155f1578081fd5b81516001600160401b03811115615606578182fd5b8201601f81018413615616578182fd5b80516156246153b482615c60565b818152856020838501011115615638578384fd5b6142a4826020830160208601615cf5565b6000806040838503121561565b578182fd5b82356001600160401b03811115615670578283fd5b61567c85828601615396565b95602094909401359450505050565b60008060006060848603121561569f578081fd5b83356001600160401b038111156156b4578182fd5b6156c086828701615396565b9660208601359650604090950135949350505050565b6000602082840312156156e7578081fd5b5035919050565b6000602082840312156156ff578081fd5b5051919050565b60008060408385031215615718578182fd5b82359150602083013561544c81615db8565b6000806040838503121561573c578182fd5b8235915060208301356001600160401b03811115615758578182fd5b61576485828601615396565b9150509250929050565b60008060408385031215615780578182fd5b50508035926020909101359150565b6000806000606084860312156157a3578081fd5b505081359360208301359350604090920135919050565b6000806000606084860312156157ce578081fd5b8351925060208401519150604084015190509250925092565b600080600080608085870312156157fc578182fd5b5050823594602084013594506040840135936060013592509050565b6000806000806080858703121561582d578182fd5b505082516020840151604085015160609095015191969095509092509050565b60008151808452615865816020860160208601615cf5565b601f01601f19169290920160200192915050565b6000825161588b818460208701615cf5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038616815260a0602082018190526000906158e69083018761584d565b604083019590955250606081019290925260809091015292915050565b602080825282518282018190526000919060409081850190868401855b8281101561595a57815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101615920565b5091979650505050505050565b6020815260006116f3602083018461584d565b60208082526012908201527143414e4e4f5420435245415445204e4f444560701b604082015260600190565b6020808252600d908201526c2727902727a2229027aba722a960991b604082015260600190565b6020808252600f908201526e42414c414e434520544f4f204c4f5760881b604082015260600190565b602080825260139082015272424c41434b4c4953544544204144445245535360681b604082015260600190565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b602080825260119082015270139053514814d256914812539590531251607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b5a45524f204144445245535360a01b604082015260600190565b60208082526016908201527543414e4e4f5420434153484f5554205245574152445360501b604082015260600190565b6020808252600b908201526a139bdd08105b1b1bddd95960aa1b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015615bde5784516001600160a01b031683529383019391830191600101615bb9565b50506001600160a01b03969096166060850152505050608001529392505050565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715615c5857615c58615d8d565b604052919050565b60006001600160401b03821115615c7957615c79615d8d565b50601f01601f191660200190565b60008219821115615c9a57615c9a615d77565b500190565b600082615cba57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615615cd957615cd9615d77565b500290565b600082821015615cf057615cf0615d77565b500390565b60005b83811015615d10578181015183820152602001615cf8565b838111156118b55750506000910152565b600181811c90821680615d3557607f821691505b60208210811415615d5657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615d7057615d70615d77565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611cbc57600080fd5b8015158114611cbc57600080fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220c968ff1f55ad3ee5da6c7b5188920e5f216c8f4a13e0f48ba1f06b6365843f8664736f6c6343000804003300000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff000000000000000000000000b91b6dc005c7e3ed1716c3ca182c63d34f01ee040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000007000000000000000000000000bbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9000000000000000000000000064a4fb29a53b8b0ffec43c1dfd38f18b29a286a000000000000000000000000e339cf3c5034bc4a07a70467460295c3a0638aaa0000000000000000000000008be65a4a56e1be98fda1024636e6bc5feee4842b000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000008be65a4a56e1be98fda1024636e6bc5feee4842b0000000000000000000000001a98040c2f123e79c6e5404260c433ca7981da1d00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000003a980000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000002bf2000000000000000000000000000000000000000000000000000000000000927c0000000000000000000000000000000000000000000000000000000000128e2e7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff000000000000000000000000b91b6dc005c7e3ed1716c3ca182c63d34f01ee040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000bbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000007000000000000000000000000bbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9000000000000000000000000064a4fb29a53b8b0ffec43c1dfd38f18b29a286a000000000000000000000000e339cf3c5034bc4a07a70467460295c3a0638aaa0000000000000000000000008be65a4a56e1be98fda1024636e6bc5feee4842b000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000008be65a4a56e1be98fda1024636e6bc5feee4842b0000000000000000000000001a98040c2f123e79c6e5404260c433ca7981da1d00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000003a980000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000002bf2000000000000000000000000000000000000000000000000000000000000927c0000000000000000000000000000000000000000000000000000000000128e2e7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013880000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : payees (address[]): 0xbbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9
Arg [1] : shares (uint256[]): 100
Arg [2] : addresses (address[]): 0xbbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9,0x064a4fb29a53b8b0ffec43c1dfd38f18b29a286a,0xe339cf3c5034bc4a07a70467460295c3a0638aaa,0x8be65a4a56e1be98fda1024636e6bc5feee4842b,0x000000000000000000000000000000000000dead,0x8be65a4a56e1be98fda1024636e6bc5feee4842b,0x1a98040c2f123e79c6e5404260c433ca7981da1d
Arg [3] : balances (uint256[]): 15000,200000,180000,600000,19456743,0,5000
Arg [4] : fees (uint256[]): 10,60,10,20,10
Arg [5] : swapAmount (uint256): 30
Arg [6] : uniV2Router (address): 0xa5e0829caced8ffdd4de3c43696c57f7d7a678ff
Arg [7] : _nodeRewardManagement (address): 0xb91b6dc005c7e3ed1716c3ca182c63d34f01ee04

-----Encoded View---------------
34 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [5] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [6] : 000000000000000000000000a5e0829caced8ffdd4de3c43696c57f7d7a678ff
Arg [7] : 000000000000000000000000b91b6dc005c7e3ed1716c3ca182c63d34f01ee04
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 000000000000000000000000bbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [13] : 000000000000000000000000bbc7d865acc07f8ab3eb6bb304e3d79bcc3c4fb9
Arg [14] : 000000000000000000000000064a4fb29a53b8b0ffec43c1dfd38f18b29a286a
Arg [15] : 000000000000000000000000e339cf3c5034bc4a07a70467460295c3a0638aaa
Arg [16] : 0000000000000000000000008be65a4a56e1be98fda1024636e6bc5feee4842b
Arg [17] : 000000000000000000000000000000000000000000000000000000000000dead
Arg [18] : 0000000000000000000000008be65a4a56e1be98fda1024636e6bc5feee4842b
Arg [19] : 0000000000000000000000001a98040c2f123e79c6e5404260c433ca7981da1d
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [21] : 0000000000000000000000000000000000000000000000000000000000003a98
Arg [22] : 0000000000000000000000000000000000000000000000000000000000030d40
Arg [23] : 000000000000000000000000000000000000000000000000000000000002bf20
Arg [24] : 00000000000000000000000000000000000000000000000000000000000927c0
Arg [25] : 000000000000000000000000000000000000000000000000000000000128e2e7
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [29] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [30] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [31] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [33] : 000000000000000000000000000000000000000000000000000000000000000a


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.