ETH Price: $3,451.89 (+1.78%)
Gas: 4 Gwei

Contract

0xC00EC94e7746C6b695869580d6D2DB50cda86094
 

Overview

ETH Balance

0.8 ETH

Eth Value

$2,761.51 (@ $3,451.89/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Push Management187299842023-12-06 21:35:23204 days ago1701898523IN
Syncus: Treasury
0 ETH0.0018298565.71321491
Push Management187298832023-12-06 21:14:47204 days ago1701897287IN
Syncus: Treasury
0 ETH0.0031488565.9502078
Toggle187294142023-12-06 19:39:59204 days ago1701891599IN
Syncus: Treasury
0 ETH0.003232766.07070117
Queue187294142023-12-06 19:39:59204 days ago1701891599IN
Syncus: Treasury
0 ETH0.0022073566.07070117
Queue187294132023-12-06 19:39:47204 days ago1701891587IN
Syncus: Treasury
0 ETH0.0030823361.02553024
Toggle187294102023-12-06 19:39:11204 days ago1701891551IN
Syncus: Treasury
0 ETH0.0052074265.37229368
Queue187294102023-12-06 19:39:11204 days ago1701891551IN
Syncus: Treasury
0 ETH0.0033065365.37229368
Toggle187294062023-12-06 19:38:23204 days ago1701891503IN
Syncus: Treasury
0 ETH0.0060782564.48733779
Queue187294062023-12-06 19:38:23204 days ago1701891503IN
Syncus: Treasury
0 ETH0.0032609964.48733779
Toggle187294032023-12-06 19:37:47204 days ago1701891467IN
Syncus: Treasury
0 ETH0.0058629662.11223865
Queue187294032023-12-06 19:37:47204 days ago1701891467IN
Syncus: Treasury
0 ETH0.0031287162.11223865
Toggle187293992023-12-06 19:36:59204 days ago1701891419IN
Syncus: Treasury
0 ETH0.006079164.78232299
Queue187293952023-12-06 19:36:11204 days ago1701891371IN
Syncus: Treasury
0 ETH0.0033897767.59010619
0x60a06040187293292023-12-06 19:22:47204 days ago1701890567IN
 Create: SyncusTreasury
0 ETH0.2332260664.84261877

Latest 11 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
188194852023-12-19 10:44:23192 days ago1702982663
Syncus: Treasury
25 ETH
187933242023-12-15 18:33:11195 days ago1702665191
Syncus: Treasury
5 ETH
187928052023-12-15 16:48:35195 days ago1702658915
Syncus: Treasury
30 ETH
187488512023-12-09 13:04:35201 days ago1702127075
Syncus: Treasury
13.2 ETH
187356522023-12-07 16:38:23203 days ago1701967103
Syncus: Treasury
2 ETH
187356482023-12-07 16:37:35203 days ago1701967055
Syncus: Treasury
2 ETH
187356432023-12-07 16:36:35203 days ago1701966995
Syncus: Treasury
3 ETH
187347662023-12-07 13:38:35203 days ago1701956315
Syncus: Treasury
3 ETH
187300612023-12-06 21:50:47204 days ago1701899447
Syncus: Treasury
84 ETH
187300482023-12-06 21:48:11204 days ago1701899291
Syncus: Treasury
1 ETH
187299702023-12-06 21:32:35204 days ago1701898355
Syncus: Treasury
1 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SyncusTreasury

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion
File 1 of 11 : SyncusTreasury.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "./lib/SafeMath.sol";
import "./lib/Address.sol";
import "./lib/IERC20.sol";
import "./lib/SafeERC20.sol";
import "./lib/ISyncus.sol";
import "./lib/IERC20Mintable.sol";
import "./lib/ISyncusCalculator.sol";
import "./lib/IOwnable.sol";
import "./OwnableManagement.sol";

contract SyncusTreasury is OwnableManagement {
    using SafeMath for uint;
    using SafeMath for uint32;
    using SafeERC20 for IERC20;

    event Deposit(address indexed token, uint amount, uint value);
    event Withdrawal(address indexed token, uint amount, uint value);
    event CreateDebt(
        address indexed debtor,
        address indexed token,
        uint amount,
        uint value
    );
    event RepayDebt(
        address indexed debtor,
        address indexed token,
        uint amount,
        uint value
    );
    event ReservesManaged(address indexed token, uint amount);
    event ReservesUpdated(uint indexed totalReserves);
    event ReservesAudited(uint indexed totalReserves);
    event RewardsMinted(
        address indexed caller,
        address indexed recipient,
        uint amount
    );
    event ChangeQueued(MANAGING indexed managing, address queued);
    event ChangeActivated(
        MANAGING indexed managing,
        address activated,
        bool result
    );

    enum MANAGING {
        RESERVEDEPOSITOR,
        RESERVESPENDER,
        RESERVETOKEN,
        RESERVEMANAGER,
        LIQUIDITYDEPOSITOR,
        LIQUIDITYTOKEN,
        LIQUIDITYMANAGER,
        DEBTOR,
        REWARDMANAGER,
        VESYNC
    }

    address public immutable Sync;
    uint32 public secondsNeededForQueue;

    address[] public reserveTokens; // Push only, beware false-positives.
    mapping(address => bool) public isReserveToken;
    mapping(address => uint32) public reserveTokenQueue; // Delays changes to mapping.

    address[] public reserveDepositors; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isReserveDepositor;
    mapping(address => uint32) public reserveDepositorQueue; // Delays changes to mapping.

    address[] public reserveSpenders; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isReserveSpender;
    mapping(address => uint32) public reserveSpenderQueue; // Delays changes to mapping.

    address[] public liquidityTokens; // Push only, beware false-positives.
    mapping(address => bool) public isLiquidityToken;
    mapping(address => uint32) public LiquidityTokenQueue; // Delays changes to mapping.

    address[] public liquidityDepositors; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isLiquidityDepositor;
    mapping(address => uint32) public LiquidityDepositorQueue; // Delays changes to mapping.

    mapping(address => address) public syncusCalculator; //  calculator for liquidity token

    address[] public reserveManagers; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isReserveManager;
    mapping(address => uint32) public ReserveManagerQueue; // Delays changes to mapping.

    address[] public liquidityManagers; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isLiquidityManager;
    mapping(address => uint32) public LiquidityManagerQueue; // Delays changes to mapping.

    address[] public debtors; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isDebtor;
    mapping(address => uint32) public debtorQueue; // Delays changes to mapping.
    mapping(address => uint) public debtorBalance;

    address[] public rewardManagers; // Push only, beware false-positives. Only for viewing.
    mapping(address => bool) public isRewardManager;
    mapping(address => uint32) public rewardManagerQueue; // Delays changes to mapping.

    address public veSYNC;
    uint public veSYNCQueue; // Delays change to veSYNC address

    uint public totalReserves; // Risk-free value of all assets
    uint public totalDebt;

    bool isBackingEnabled = false;

    receive() external payable {}

    constructor(address _Sync, address _USDC, address _etherCalculator) {
        require(_Sync != address(0));
        require(_USDC != address(0));
        require(_etherCalculator != address(0));
        Sync = _Sync;

        isReserveToken[_USDC] = true;
        reserveTokens.push(_USDC);
        syncusCalculator[address(0)] = _etherCalculator;
    }

    /**
        @notice allow approved address to deposit an asset for SYNC
        @param _amount uint
        @param _token address
        @param _profit uint
        @return send_ uint
     */
    function deposit(
        uint _amount,
        address _token,
        uint _profit //profit in SYNC, 9 decimals needed
    ) external returns (uint send_) {
        require(
            isReserveToken[_token] || isLiquidityToken[_token],
            "Not accepted"
        );
        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);

        if (isReserveToken[_token]) {
            require(isReserveDepositor[msg.sender], "Not approved");
        } else {
            require(isLiquidityDepositor[msg.sender], "Not approved");
        }

        uint value = valueOf(_token, _amount);
        // mint SYNC needed and store amount of rewards for distribution
        send_ = value.sub(_profit);
        IERC20Mintable(Sync).mint(msg.sender, send_);

        totalReserves = totalReserves.add(value);
        emit ReservesUpdated(totalReserves);

        emit Deposit(_token, _amount, value);
    }

    /**
        @notice allow approved address to burn SYNC for reserves
        @param _amount uint
        @param _token address
     */
    function withdraw(uint _amount, address _token) external {
        require(isReserveToken[_token], "Not accepted"); // Only reserves can be used for redemptions
        require(isReserveSpender[msg.sender] == true, "Not approved");

        uint value = valueOf(_token, _amount);
        ISyncus(Sync).burnFrom(msg.sender, value);

        totalReserves = totalReserves.sub(value);
        emit ReservesUpdated(totalReserves);

        IERC20(_token).safeTransfer(msg.sender, _amount);

        emit Withdrawal(_token, _amount, value);
    }

    /**
        @notice allow approved address to borrow reserves
        @param _amount uint
        @param _token address
     */
    function incurDebt(uint _amount, address _token) external {
        require(isDebtor[msg.sender], "Not approved");
        require(isReserveToken[_token], "Not accepted");

        uint value = valueOf(_token, _amount);

        uint maximumDebt = IERC20(veSYNC).balanceOf(msg.sender); // Can only borrow against veSYNC held
        uint availableDebt = maximumDebt.sub(debtorBalance[msg.sender]);
        require(value <= availableDebt, "Exceeds debt limit");

        debtorBalance[msg.sender] = debtorBalance[msg.sender].add(value);
        totalDebt = totalDebt.add(value);

        totalReserves = totalReserves.sub(value);
        emit ReservesUpdated(totalReserves);

        IERC20(_token).transfer(msg.sender, _amount);

        emit CreateDebt(msg.sender, _token, _amount, value);
    }

    /**
        @notice allow approved address to repay borrowed reserves with reserves
        @param _amount uint
        @param _token address
     */
    function repayDebtWithReserve(uint _amount, address _token) external {
        require(isDebtor[msg.sender], "Not approved");
        require(isReserveToken[_token], "Not accepted");

        IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);

        uint value = valueOf(_token, _amount);
        debtorBalance[msg.sender] = debtorBalance[msg.sender].sub(value);
        totalDebt = totalDebt.sub(value);

        totalReserves = totalReserves.add(value);
        emit ReservesUpdated(totalReserves);

        emit RepayDebt(msg.sender, _token, _amount, value);
    }

    /**
        @notice allow approved address to repay borrowed reserves with SYNC
        @param _amount uint
     */
    function repayDebtWithSYNC(uint _amount) external {
        require(isDebtor[msg.sender], "Not approved");

        ISyncus(Sync).burnFrom(msg.sender, _amount);

        debtorBalance[msg.sender] = debtorBalance[msg.sender].sub(_amount);
        totalDebt = totalDebt.sub(_amount);

        emit RepayDebt(msg.sender, Sync, _amount, _amount);
    }

    /**
        @notice allow approved address to withdraw assets
        @param _token address
        @param _amount uint
     */
    function manage(address _token, uint _amount) external {
        if (isLiquidityToken[_token]) {
            require(isLiquidityManager[msg.sender], "Not approved");
        } else {
            require(isReserveManager[msg.sender], "Not approved");
        }

        uint value = valueOf(_token, _amount);

        if (isBackingEnabled) {
            require(value <= excessReserves(), "Insufficient reserves");
        }

        totalReserves = totalReserves.sub(value);
        emit ReservesUpdated(totalReserves);

        IERC20(_token).safeTransfer(msg.sender, _amount);

        emit ReservesManaged(_token, _amount);
    }

    /**
        @notice send epoch reward to staking contract
     */
    function mintRewards(address _recipient, uint _amount) external {
        require(isRewardManager[msg.sender], "Not approved");
        if (isBackingEnabled) {
            require(_amount <= excessReserves(), "Insufficient reserves");
        }

        IERC20Mintable(Sync).mint(_recipient, _amount);

        emit RewardsMinted(msg.sender, _recipient, _amount);
    }

    /**
        @notice returns excess reserves not backing tokens
        @return uint
     */
    function excessReserves() public view returns (uint) {
        uint supply = IERC20(Sync).totalSupply().sub(totalDebt);
        if (supply > totalReserves) {
            return 0;
        }

        return totalReserves.sub(supply);
    }

    /**
        @notice takes inventory of all tracked assets
        @notice always consolidate to recognized reserves before audit
     */
    function auditReserves() external onlyManager {
        uint reserves;
        for (uint i = 0; i < reserveTokens.length; i++) {
            reserves = reserves.add(
                valueOf(
                    reserveTokens[i],
                    IERC20(reserveTokens[i]).balanceOf(address(this))
                )
            );
        }
        for (uint i = 0; i < liquidityTokens.length; i++) {
            reserves = reserves.add(
                valueOf(
                    liquidityTokens[i],
                    IERC20(liquidityTokens[i]).balanceOf(address(this))
                )
            );
        }
        reserves = reserves.add(valueOf(address(0), address(this).balance));

        totalReserves = reserves;
        emit ReservesUpdated(reserves);
        emit ReservesAudited(reserves);
    }

    /**
        @notice returns SYNC valuation of asset
        @param _token address
        @param _amount uint
        @return value_ uint
     */
    function valueOf(
        address _token,
        uint _amount
    ) public view returns (uint value_) {
        if (_token == address(0)) {
            value_ = ISyncusCalculator(syncusCalculator[_token]).valuationEther(
                _amount
            );
        } else if (isReserveToken[_token]) {
            // convert amount to match SYNC decimals
            value_ = _amount.mul(10 ** IERC20(Sync).decimals()).div(
                10 ** IERC20(_token).decimals()
            );
        } else if (isLiquidityToken[_token]) {
            value_ = ISyncusCalculator(syncusCalculator[_token]).valuation(
                _token,
                _amount
            );
        }
    }

    /**
        @notice queue address to change boolean in mapping
        @param _managing MANAGING
        @param _address address
        @return bool
     */
    function queue(
        MANAGING _managing,
        address _address
    ) external onlyManager returns (bool) {
        require(_address != address(0));
        if (_managing == MANAGING.RESERVEDEPOSITOR) {
            // 0
            reserveDepositorQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.RESERVESPENDER) {
            // 1
            reserveSpenderQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.RESERVETOKEN) {
            // 2
            reserveTokenQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.RESERVEMANAGER) {
            // 3
            ReserveManagerQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue.mul32(2)
            );
        } else if (_managing == MANAGING.LIQUIDITYDEPOSITOR) {
            // 4
            LiquidityDepositorQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.LIQUIDITYTOKEN) {
            // 5
            LiquidityTokenQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.LIQUIDITYMANAGER) {
            // 6
            LiquidityManagerQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue.mul32(2)
            );
        } else if (_managing == MANAGING.DEBTOR) {
            // 7
            debtorQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.REWARDMANAGER) {
            // 8
            rewardManagerQueue[_address] = uint32(block.timestamp).add32(
                secondsNeededForQueue
            );
        } else if (_managing == MANAGING.VESYNC) {
            // 9
            veSYNCQueue = uint32(block.timestamp).add32(secondsNeededForQueue);
        } else return false;

        emit ChangeQueued(_managing, _address);
        return true;
    }

    /**
        @notice verify queue then set boolean in mapping
        @param _managing MANAGING
        @param _address address
        @param _calculator address
        @return bool
     */
    function toggle(
        MANAGING _managing,
        address _address,
        address _calculator
    ) external onlyManager returns (bool) {
        require(_address != address(0));
        bool result;
        if (_managing == MANAGING.RESERVEDEPOSITOR) {
            // 0
            if (
                requirements(
                    reserveDepositorQueue,
                    isReserveDepositor,
                    _address
                )
            ) {
                reserveDepositorQueue[_address] = 0;
                if (!listContains(reserveDepositors, _address)) {
                    reserveDepositors.push(_address);
                }
            }
            result = !isReserveDepositor[_address];
            isReserveDepositor[_address] = result;
        } else if (_managing == MANAGING.RESERVESPENDER) {
            // 1
            if (requirements(reserveSpenderQueue, isReserveSpender, _address)) {
                reserveSpenderQueue[_address] = 0;
                if (!listContains(reserveSpenders, _address)) {
                    reserveSpenders.push(_address);
                }
            }
            result = !isReserveSpender[_address];
            isReserveSpender[_address] = result;
        } else if (_managing == MANAGING.RESERVETOKEN) {
            // 2
            if (requirements(reserveTokenQueue, isReserveToken, _address)) {
                reserveTokenQueue[_address] = 0;
                if (!listContains(reserveTokens, _address)) {
                    reserveTokens.push(_address);
                }
            }
            result = !isReserveToken[_address];
            isReserveToken[_address] = result;
        } else if (_managing == MANAGING.RESERVEMANAGER) {
            // 3
            if (requirements(ReserveManagerQueue, isReserveManager, _address)) {
                reserveManagers.push(_address);
                ReserveManagerQueue[_address] = 0;
                if (!listContains(reserveManagers, _address)) {
                    reserveManagers.push(_address);
                }
            }
            result = !isReserveManager[_address];
            isReserveManager[_address] = result;
        } else if (_managing == MANAGING.LIQUIDITYDEPOSITOR) {
            // 4
            if (
                requirements(
                    LiquidityDepositorQueue,
                    isLiquidityDepositor,
                    _address
                )
            ) {
                liquidityDepositors.push(_address);
                LiquidityDepositorQueue[_address] = 0;
                if (!listContains(liquidityDepositors, _address)) {
                    liquidityDepositors.push(_address);
                }
            }
            result = !isLiquidityDepositor[_address];
            isLiquidityDepositor[_address] = result;
        } else if (_managing == MANAGING.LIQUIDITYTOKEN) {
            // 5
            if (requirements(LiquidityTokenQueue, isLiquidityToken, _address)) {
                LiquidityTokenQueue[_address] = 0;
                if (!listContains(liquidityTokens, _address)) {
                    liquidityTokens.push(_address);
                }
            }
            result = !isLiquidityToken[_address];
            isLiquidityToken[_address] = result;
            syncusCalculator[_address] = _calculator;
        } else if (_managing == MANAGING.LIQUIDITYMANAGER) {
            // 6
            if (
                requirements(
                    LiquidityManagerQueue,
                    isLiquidityManager,
                    _address
                )
            ) {
                LiquidityManagerQueue[_address] = 0;
                if (!listContains(liquidityManagers, _address)) {
                    liquidityManagers.push(_address);
                }
            }
            result = !isLiquidityManager[_address];
            isLiquidityManager[_address] = result;
        } else if (_managing == MANAGING.DEBTOR) {
            // 7
            if (requirements(debtorQueue, isDebtor, _address)) {
                debtorQueue[_address] = 0;
                if (!listContains(debtors, _address)) {
                    debtors.push(_address);
                }
            }
            result = !isDebtor[_address];
            isDebtor[_address] = result;
        } else if (_managing == MANAGING.REWARDMANAGER) {
            // 8
            if (requirements(rewardManagerQueue, isRewardManager, _address)) {
                rewardManagerQueue[_address] = 0;
                if (!listContains(rewardManagers, _address)) {
                    rewardManagers.push(_address);
                }
            }
            result = !isRewardManager[_address];
            isRewardManager[_address] = result;
        } else if (_managing == MANAGING.VESYNC) {
            // 9
            veSYNCQueue = 0;
            veSYNC = _address;
            result = true;
        } else return false;

        emit ChangeActivated(_managing, _address, result);
        return true;
    }

    /**
        @notice checks requirements and returns altered structs
        @param queue_ mapping( address => uint )
        @param status_ mapping( address => bool )
        @param _address address
        @return bool 
     */
    function requirements(
        mapping(address => uint32) storage queue_,
        mapping(address => bool) storage status_,
        address _address
    ) internal view returns (bool) {
        if (!status_[_address]) {
            require(queue_[_address] != 0, "Must queue");
            require(
                queue_[_address] <= uint32(block.timestamp),
                "Queue not expired"
            );
            return true;
        }
        return false;
    }

    /**
        @notice checks array to ensure against duplicate
        @param _list address[]
        @param _token address
        @return bool
     */
    function listContains(
        address[] storage _list,
        address _token
    ) internal view returns (bool) {
        for (uint i = 0; i < _list.length; i++) {
            if (_list[i] == _token) {
                return true;
            }
        }
        return false;
    }

    function setEtherCalculator(address _calculator) external onlyManager {
        syncusCalculator[address(0)] = _calculator;
    }

    function setIsBackingEnabled(bool _isBackingEnabled) external onlyManager {
        isBackingEnabled = _isBackingEnabled;
    }

    function withdrawEther(uint _amount) external onlyManager {
        msg.sender.transfer(_amount);
    }

    // sync taxes and lost tokens
    function withdrawToken(address _token, uint _amount) external onlyManager {
        IERC20(_token).safeTransfer(msg.sender, _amount);
    }

    function emergencyWithdrawEther(address _recipient) external onlyManager {
        require(_recipient != address(0), "Invalid recipient address");

        uint balance = address(this).balance;

        (bool success, ) = _recipient.call{value: balance}("");
        require(success, "Transfer failed");
    }
}

File 2 of 11 : SafeMath.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function add32(uint32 a, uint32 b) internal pure returns (uint32) {
        uint32 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function sub32(uint32 a, uint32 b) internal pure returns (uint32) {
        return sub32(a, b, "SafeMath: subtraction overflow");
    }

    function sub32(
        uint32 a,
        uint32 b,
        string memory errorMessage
    ) internal pure returns (uint32) {
        require(b <= a, errorMessage);
        uint32 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function mul32(uint32 a, uint32 b) internal pure returns (uint32) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by 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;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add(div(a, 2), 1);
            while (b < c) {
                c = b;
                b = div(add(div(a, b), b), 2);
            }
        } else if (a != 0) {
            c = 1;
        }
    }

    function percentageAmount(
        uint256 total_,
        uint8 percentage_
    ) internal pure returns (uint256 percentAmount_) {
        return div(mul(total_, percentage_), 1000);
    }

    function substractPercentage(
        uint256 total_,
        uint8 percentageToSub_
    ) internal pure returns (uint256 result_) {
        return sub(total_, div(mul(total_, percentageToSub_), 1000));
    }

    function percentageOfTotal(
        uint256 part_,
        uint256 total_
    ) internal pure returns (uint256 percent_) {
        return div(mul(part_, 100), total_);
    }

    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
    }

    function quadraticPricing(
        uint256 payment_,
        uint256 multiplier_
    ) internal pure returns (uint256) {
        return sqrrt(mul(multiplier_, payment_));
    }

    function bondingCurve(
        uint256 supply_,
        uint256 multiplier_
    ) internal pure returns (uint256) {
        return mul(multiplier_, supply_);
    }
}

File 3 of 11 : Address.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 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}
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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).
     *
     * 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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(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");

        // solhint-disable-next-line avoid-low-level-calls
        (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.3._
     */
    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.3._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function addressToString(
        address _address
    ) internal pure returns (string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = "0";
        _addr[1] = "x";

        for (uint256 i = 0; i < 20; i++) {
            _addr[2 + i * 2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3 + i * 2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);
    }
}

File 4 of 11 : IERC20.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IERC20 {
    function decimals() external view returns (uint8);

    /**
     * @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 5 of 11 : SafeERC20.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "./SafeMath.sol";
import "./Address.sol";
import "./IERC20.sol";

library SafeERC20 {
    using SafeMath for uint256;
    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));
    }

    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'
        // solhint-disable-next-line max-line-length
        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).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        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.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 6 of 11 : ISyncus.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface ISyncus {
    function burn(uint256 amount) external;

    function burnFrom(address account_, uint256 amount_) external;
}

File 7 of 11 : IERC20Mintable.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IERC20Mintable {
    function mint(uint256 amount_) external;

    function mint(address account_, uint256 ammount_) external;
}

File 8 of 11 : ISyncusCalculator.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface ISyncusCalculator {
    function valuation(
        address pair_,
        uint amount_
    ) external view returns (uint _value);

    function valuationEther(uint amount_) external view returns (uint _value);

    function markdown(address _pair) external view returns (uint);
}

File 9 of 11 : IOwnable.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IOwnable {
    function owner() external view returns (address);

    function renounceOwnership() external;

    function transferOwnership(address newOwner_) external;
}

File 10 of 11 : OwnableManagement.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import "./lib/IOwnableManagement.sol";

contract OwnableManagement is IOwnableManagement {
      address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPushed( address(0), _owner );
    }

    function manager() public view override returns (address) {
        return _owner;
    }

    modifier onlyManager() {
        require( _owner == msg.sender, "Ownable: caller is not the owner" );
        _;
    }

    function renounceManagement() public virtual override onlyManager() {
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyManager() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }
    
    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

File 11 of 11 : IOwnableManagement.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

interface IOwnableManagement {
    function manager() external view returns (address);

    function renounceManagement() external;

    function pushManagement(address newOwner_) external;

    function pullManagement() external;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_Sync","type":"address"},{"internalType":"address","name":"_USDC","type":"address"},{"internalType":"address","name":"_etherCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum SyncusTreasury.MANAGING","name":"managing","type":"uint8"},{"indexed":false,"internalType":"address","name":"activated","type":"address"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"ChangeActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum SyncusTreasury.MANAGING","name":"managing","type":"uint8"},{"indexed":false,"internalType":"address","name":"queued","type":"address"}],"name":"ChangeQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CreateDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"debtor","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"RepayDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesAudited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReservesManaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"totalReserves","type":"uint256"}],"name":"ReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityDepositorQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityManagerQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"LiquidityTokenQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ReserveManagerQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Sync","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auditReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtorBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtorQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"debtors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_profit","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"send_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"emergencyWithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"excessReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"incurDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDebtor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityDepositor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveDepositor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveSpender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReserveToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isRewardManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityDepositors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidityTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SyncusTreasury.MANAGING","name":"_managing","type":"uint8"},{"internalType":"address","name":"_address","type":"address"}],"name":"queue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"repayDebtWithReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repayDebtWithSYNC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveDepositorQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveDepositors","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveSpenderQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveSpenders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveTokenQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reserveTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardManagerQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondsNeededForQueue","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_calculator","type":"address"}],"name":"setEtherCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBackingEnabled","type":"bool"}],"name":"setIsBackingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"syncusCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum SyncusTreasury.MANAGING","name":"_managing","type":"uint8"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"_calculator","type":"address"}],"name":"toggle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"valueOf","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veSYNC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"veSYNCQueue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526023805460ff191690553480156200001b57600080fd5b5060405162003faf38038062003faf833981810160405260608110156200004157600080fd5b5080516020820151604092830151600080546001600160a01b031916331780825594519394929391926001600160a01b0316917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038316620000ad57600080fd5b6001600160a01b038216620000c157600080fd5b6001600160a01b038116620000d557600080fd5b606083901b6001600160601b0319166080526001600160a01b03918216600081815260036020908152604082208054600160ff1990911681179091556002805491820190557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b03199081169094179055818052601190527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b78054909216928416929092179055911690613dec90620001c3903980610e5f528061120b52806116ee5280611d3a52806121b452806124db5280612b985280612c4c5250613dec6000f3fe60806040526004361061036e5760003560e01c80638f59c727116101c6578063d031370b116100f7578063ebd83cd811610095578063fbfd393b1161006f578063fbfd393b14610ce5578063fc7b9c1814610d29578063fd1ec01014610d3e578063fff9ee8714610d6857610375565b8063ebd83cd814610c4c578063ee4e19a114610c7f578063fb93958814610cb257610375565b8063deeb2b9c116100d1578063deeb2b9c14610b80578063df89b34414610bb3578063e83afee314610be6578063eb28ad3a14610c2257610375565b8063d031370b14610b08578063d796ffb814610b32578063da35e06c14610b6b57610375565b8063ab319c9a11610164578063bc157ac11161013e578063bc157ac114610a37578063bfc706de14610a76578063c24ad43e14610aa2578063cd85641a14610ad557610375565b8063ab319c9a146109a7578063b1bd38b0146109da578063b5b1d56014610a0d57610375565b8063932cc8c3116101a0578063932cc8c3146108d55780639e281a9814610908578063a1210a2d14610941578063a569e5711461097457610375565b80638f59c727146108635780638f6a7b57146108965780638f840ddd146108c057610375565b80634e83423c116102a0578063731681bb1161023e578063827ce38011610218578063827ce380146107be57806386936386146107f1578063869871bf1461080657806387d67dff1461083057610375565b8063731681bb14610748578063788c6c011461075d5780637a8960d8146107a957610375565b806368c31dd51161027a57806368c31dd5146106885780636a20de92146106bb5780636b5e40a7146106f457806370a0502a1461071e57610375565b80634e83423c1461060d578063517bfc60146106405780635a96ac0a1461067357610375565b806312422d231161030d5780633bed33ce116102e75780633bed33ce14610571578063437f79121461059b57806346f68ee9146105c5578063481c6a75146105f857610375565b806312422d23146104ea5780631eec5a9a146105235780632b7ce5001461055c57610375565b8063094a865111610349578063094a8651146104105780630b0eee30146104555780630c3513a81461048e578063124154ca146104a357610375565b8062f714ce1461037a5780630619aff1146103b5578063089208d8146103fb57610375565b3661037557005b600080fd5b34801561038657600080fd5b506103b36004803603604081101561039d57600080fd5b50803590602001356001600160a01b0316610d9b565b005b3480156103c157600080fd5b506103df600480360360208110156103d857600080fd5b5035610f72565b604080516001600160a01b039092168252519081900360200190f35b34801561040757600080fd5b506103b3610f9c565b34801561041c57600080fd5b506104436004803603602081101561043357600080fd5b50356001600160a01b0316611033565b60408051918252519081900360200190f35b34801561046157600080fd5b506103b36004803603604081101561047857600080fd5b506001600160a01b038135169060200135611045565b34801561049a57600080fd5b50610443611200565b3480156104af57600080fd5b506104d6600480360360208110156104c657600080fd5b50356001600160a01b03166112be565b604080519115158252519081900360200190f35b3480156104f657600080fd5b506103b36004803603604081101561050d57600080fd5b50803590602001356001600160a01b03166112d3565b34801561052f57600080fd5b506104436004803603604081101561054657600080fd5b506001600160a01b0381351690602001356115a3565b34801561056857600080fd5b506103b3611832565b34801561057d57600080fd5b506103b36004803603602081101561059457600080fd5b5035611a0d565b3480156105a757600080fd5b506103df600480360360208110156105be57600080fd5b5035611a8b565b3480156105d157600080fd5b506103b3600480360360208110156105e857600080fd5b50356001600160a01b0316611a9b565b34801561060457600080fd5b506103df611b88565b34801561061957600080fd5b506104d66004803603602081101561063057600080fd5b50356001600160a01b0316611b97565b34801561064c57600080fd5b506103df6004803603602081101561066357600080fd5b50356001600160a01b0316611bac565b34801561067f57600080fd5b506103b3611bc7565b34801561069457600080fd5b506104d6600480360360208110156106ab57600080fd5b50356001600160a01b0316611c71565b3480156106c757600080fd5b506103b3600480360360408110156106de57600080fd5b506001600160a01b038135169060200135611c86565b34801561070057600080fd5b506103df6004803603602081101561071757600080fd5b5035611e0b565b34801561072a57600080fd5b506103df6004803603602081101561074157600080fd5b5035611e1b565b34801561075457600080fd5b506103df611e2b565b34801561076957600080fd5b506107906004803603602081101561078057600080fd5b50356001600160a01b0316611e3a565b6040805163ffffffff9092168252519081900360200190f35b3480156107b557600080fd5b50610790611e52565b3480156107ca57600080fd5b506103b3600480360360208110156107e157600080fd5b50356001600160a01b0316611e65565b3480156107fd57600080fd5b50610443611efc565b34801561081257600080fd5b506103df6004803603602081101561082957600080fd5b5035611f02565b34801561083c57600080fd5b506104d66004803603602081101561085357600080fd5b50356001600160a01b0316611f12565b34801561086f57600080fd5b506107906004803603602081101561088657600080fd5b50356001600160a01b0316611f27565b3480156108a257600080fd5b506103df600480360360208110156108b957600080fd5b5035611f3f565b3480156108cc57600080fd5b50610443611f4f565b3480156108e157600080fd5b50610790600480360360208110156108f857600080fd5b50356001600160a01b0316611f55565b34801561091457600080fd5b506103b36004803603604081101561092b57600080fd5b506001600160a01b038135169060200135611f6d565b34801561094d57600080fd5b506104d66004803603602081101561096457600080fd5b50356001600160a01b0316611fce565b34801561098057600080fd5b506104d66004803603602081101561099757600080fd5b50356001600160a01b0316611fe3565b3480156109b357600080fd5b50610790600480360360208110156109ca57600080fd5b50356001600160a01b0316611ff8565b3480156109e657600080fd5b50610790600480360360208110156109fd57600080fd5b50356001600160a01b0316612010565b348015610a1957600080fd5b506103df60048036036020811015610a3057600080fd5b5035612028565b348015610a4357600080fd5b5061044360048036036060811015610a5a57600080fd5b508035906001600160a01b036020820135169060400135612038565b348015610a8257600080fd5b506103b360048036036020811015610a9957600080fd5b503515156122b6565b348015610aae57600080fd5b5061079060048036036020811015610ac557600080fd5b50356001600160a01b0316612316565b348015610ae157600080fd5b5061079060048036036020811015610af857600080fd5b50356001600160a01b031661232e565b348015610b1457600080fd5b506103df60048036036020811015610b2b57600080fd5b5035612346565b348015610b3e57600080fd5b506103b360048036036040811015610b5557600080fd5b50803590602001356001600160a01b0316612356565b348015610b7757600080fd5b506103df6124d9565b348015610b8c57600080fd5b506103b360048036036020811015610ba357600080fd5b50356001600160a01b03166124fd565b348015610bbf57600080fd5b506104d660048036036020811015610bd657600080fd5b50356001600160a01b0316612644565b348015610bf257600080fd5b506104d660048036036040811015610c0957600080fd5b50803560ff1690602001356001600160a01b0316612659565b348015610c2e57600080fd5b506103b360048036036020811015610c4557600080fd5b5035612b1e565b348015610c5857600080fd5b506104d660048036036020811015610c6f57600080fd5b50356001600160a01b0316612c9d565b348015610c8b57600080fd5b506104d660048036036020811015610ca257600080fd5b50356001600160a01b0316612cb2565b348015610cbe57600080fd5b5061079060048036036020811015610cd557600080fd5b50356001600160a01b0316612cc7565b348015610cf157600080fd5b506104d660048036036060811015610d0857600080fd5b5060ff813516906001600160a01b0360208201358116916040013516612cdf565b348015610d3557600080fd5b506104436135f5565b348015610d4a57600080fd5b506103df60048036036020811015610d6157600080fd5b50356135fb565b348015610d7457600080fd5b5061079060048036036020811015610d8b57600080fd5b50356001600160a01b031661360b565b6001600160a01b03811660009081526003602052604090205460ff16610df7576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b3360009081526009602052604090205460ff161515600114610e4f576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000610e5b82846115a3565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610ed457600080fd5b505af1158015610ee8573d6000803e3d6000fd5b5050602154610efa9250905082613623565b6021819055604051600080516020613d6d83398151915290600090a2610f2a6001600160a01b0383163385613665565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b60128181548110610f8257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610fe9576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b601b6020526000908152604090205481565b6001600160a01b0382166000908152600c602052604090205460ff16156110be573360009081526016602052604090205460ff166110b9576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b611111565b3360009081526013602052604090205460ff16611111576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b600061111d83836115a3565b60235490915060ff161561117f57611133611200565b81111561117f576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b60215461118c9082613623565b6021819055604051600080516020613d6d83398151915290600090a26111bc6001600160a01b0384163384613665565b6040805183815290516001600160a01b038516917f2bb2640731848fe9820ba48dbc978c1fc9bbd5f11b948bfab05b7dee3378fd80919081900360200190a2505050565b6000806112946022547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561126257600080fd5b505afa158015611276573d6000803e3d6000fd5b505050506040513d602081101561128c57600080fd5b505190613623565b90506021548111156112aa5760009150506112bb565b6021546112b79082613623565b9150505b90565b60066020526000908152604090205460ff1681565b3360009081526019602052604090205460ff16611326576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16611382576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b600061138e82846115a3565b601f54604080516370a0823160e01b815233600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156113df57600080fd5b505afa1580156113f3573d6000803e3d6000fd5b505050506040513d602081101561140957600080fd5b5051336000908152601b60205260408120549192509061142a908390613623565b905080831115611476576040805162461bcd60e51b8152602060048201526012602482015271115e18d959591cc81919589d081b1a5b5a5d60721b604482015290519081900360640190fd5b336000908152601b602052604090205461149090846136b7565b336000908152601b60205260409020556022546114ad90846136b7565b6022556021546114bd9084613623565b6021819055604051600080516020613d6d83398151915290600090a26040805163a9059cbb60e01b81523360048201526024810187905290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561152857600080fd5b505af115801561153c573d6000803e3d6000fd5b505050506040513d602081101561155257600080fd5b5050604080518681526020810185905281516001600160a01b0387169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a35050505050565b60006001600160a01b03831661163e576001600160a01b038084166000908152601160209081526040918290205482516325545c6b60e01b81526004810187905292519316926325545c6b926024808201939291829003018186803b15801561160b57600080fd5b505afa15801561161f573d6000803e3d6000fd5b505050506040513d602081101561163557600080fd5b5051905061182c565b6001600160a01b03831660009081526003602052604090205460ff161561177b57611774836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d60208110156116c557600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a9161176e916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163313ce56791600480820192602092909190829003018186803b15801561173557600080fd5b505afa158015611749573d6000803e3d6000fd5b505050506040513d602081101561175f57600080fd5b5051859060ff16600a0a613711565b9061376a565b905061182c565b6001600160a01b0383166000908152600c602052604090205460ff161561182c576001600160a01b03808416600081815260116020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156117fd57600080fd5b505afa158015611811573d6000803e3d6000fd5b505050506040513d602081101561182757600080fd5b505190505b92915050565b6000546001600160a01b0316331461187f576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6000805b6002548110156119575761194d611946600283815481106118a057fe5b600091825260209091200154600280546001600160a01b0390921691859081106118c657fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d602081101561193f57600080fd5b50516115a3565b83906136b7565b9150600101611883565b5060005b600b548110156119a85761199e611946600b838154811061197857fe5b600091825260209091200154600b80546001600160a01b0390921691859081106118c657fe5b915060010161195b565b506119be6119b76000476115a3565b82906136b7565b60218190556040519091508190600080516020613d6d83398151915290600090a260405181907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a250565b6000546001600160a01b03163314611a5a576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b604051339082156108fc029083906000818181858888f19350505050158015611a87573d6000803e3d6000fd5b5050565b60088181548110610f8257600080fd5b6000546001600160a01b03163314611ae8576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b038116611b2d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613ce46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b601d6020526000908152604090205460ff1681565b6011602052600090815260409020546001600160a01b031681565b6001546001600160a01b03163314611c105760405162461bcd60e51b8152600401808060200182810382526022815260200180613d0a6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b60036020526000908152604090205460ff1681565b336000908152601d602052604090205460ff16611cd9576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b60235460ff1615611d3857611cec611200565b811115611d38576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611daf57600080fd5b505af1158015611dc3573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c9181900360200190a35050565b60058181548110610f8257600080fd5b60158181548110610f8257600080fd5b601f546001600160a01b031681565b60046020526000908152604090205463ffffffff1681565b600154600160a01b900463ffffffff1681565b6000546001600160a01b03163314611eb2576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6000805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780546001600160a01b0319166001600160a01b0392909216919091179055565b60205481565b60188181548110610f8257600080fd5b60096020526000908152604090205460ff1681565b600d6020526000908152604090205463ffffffff1681565b600e8181548110610f8257600080fd5b60215481565b60076020526000908152604090205463ffffffff1681565b6000546001600160a01b03163314611fba576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b611a876001600160a01b0383163383613665565b600f6020526000908152604090205460ff1681565b600c6020526000908152604090205460ff1681565b60176020526000908152604090205463ffffffff1681565b60146020526000908152604090205463ffffffff1681565b601c8181548110610f8257600080fd5b6001600160a01b03821660009081526003602052604081205460ff168061207757506001600160a01b0383166000908152600c602052604090205460ff165b6120b7576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b6120cc6001600160a01b0384163330876137ac565b6001600160a01b03831660009081526003602052604090205460ff1615612145573360009081526006602052604090205460ff16612140576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b612198565b336000908152600f602052604090205460ff16612198576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b60006121a484866115a3565b90506121b08184613623565b91507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561222957600080fd5b505af115801561223d573d6000803e3d6000fd5b505060215461224f92509050826136b7565b6021819055604051600080516020613d6d83398151915290600090a2604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b6000546001600160a01b03163314612303576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6023805460ff1916911515919091179055565b600a6020526000908152604090205463ffffffff1681565b601a6020526000908152604090205463ffffffff1681565b60028181548110610f8257600080fd5b3360009081526019602052604090205460ff166123a9576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16612405576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b61241a6001600160a01b0382163330856137ac565b600061242682846115a3565b336000908152601b60205260409020549091506124439082613623565b336000908152601b60205260409020556022546124609082613623565b60225560215461247090826136b7565b6021819055604051600080516020613d6d83398151915290600090a2604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b0316331461254a576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b0381166125a5576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420726563697069656e74206164647265737300000000000000604482015290519081900360640190fd5b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146125f2576040519150601f19603f3d011682016040523d82523d6000602084013e6125f7565b606091505b505090508061263f576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050565b60166020526000908152604090205460ff1681565b600080546001600160a01b031633146126a7576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b0382166126ba57600080fd5b60008360098111156126c857fe5b1415612723576001546126ee9063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600760205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600183600981111561273157fe5b141561278c576001546127579063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600a60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600283600981111561279a57fe5b14156127f5576001546127c09063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600460205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600383600981111561280357fe5b14156128725760015461283d9061282d9063ffffffff600160a01b90910481169060029061386f16565b63ffffffff428116919061380c16565b6001600160a01b0383166000908152601460205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600483600981111561288057fe5b14156128db576001546128a69063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152601060205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b60058360098111156128e957fe5b14156129445760015461290f9063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600d60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600683600981111561295257fe5b14156129b15760015461297c9061282d9063ffffffff600160a01b90910481169060029061386f16565b6001600160a01b0383166000908152601760205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b60078360098111156129bf57fe5b1415612a1a576001546129e59063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152601a60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b6008836009811115612a2857fe5b1415612a8357600154612a4e9063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152601e60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b6009836009811115612a9157fe5b1415612ac557600154612ab79063ffffffff42811691600160a01b900481169061380c16565b63ffffffff16602055612acd565b50600061182c565b826009811115612ad957fe5b604080516001600160a01b038516815290517f0e4f2c4b5bc209d509bc3d49348c787fefadc66a79351b470599ac0f5be52eaf9181900360200190a250600192915050565b3360009081526019602052604090205460ff16612b71576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916379cc679091604480830192600092919082900301818387803b158015612bdf57600080fd5b505af1158015612bf3573d6000803e3d6000fd5b5050336000908152601b6020526040902054612c129250905082613623565b336000908152601b6020526040902055602254612c2f9082613623565b602255604080518281526020810183905281516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60136020526000908152604090205460ff1681565b60196020526000908152604090205460ff1681565b601e6020526000908152604090205463ffffffff1681565b600080546001600160a01b03163314612d2d576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b038316612d4057600080fd5b600080856009811115612d4f57fe5b1415612e1557612d6260076006866138e0565b15612de5576001600160a01b0384166000908152600760205260409020805463ffffffff19169055612d956005856139d9565b612de557600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600660205260409020805460ff81161560ff199091168117909155613597565b6001856009811115612e2357fe5b1415612ee957612e36600a6009866138e0565b15612eb9576001600160a01b0384166000908152600a60205260409020805463ffffffff19169055612e696008856139d9565b612eb957600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600960205260409020805460ff81161560ff199091168117909155613597565b6002856009811115612ef757fe5b1415612fbd57612f0a60046003866138e0565b15612f8d576001600160a01b0384166000908152600460205260409020805463ffffffff19169055612f3d6002856139d9565b612f8d57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600360205260409020805460ff81161560ff199091168117909155613597565b6003856009811115612fcb57fe5b14156130ce57612fde60146013866138e0565b1561309e57601280546001810182557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0387169081179091556000908152601460205260409020805463ffffffff1916905561304e90856139d9565b61309e57601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601360205260409020805460ff81161560ff199091168117909155613597565b60048560098111156130dc57fe5b14156131df576130ef6010600f866138e0565b156131af57600e80546001810182557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0387169081179091556000908152601060205260409020805463ffffffff1916905561315f90856139d9565b6131af57600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600f60205260409020805460ff81161560ff199091168117909155613597565b60058560098111156131ed57fe5b14156132d557613200600d600c866138e0565b15613283576001600160a01b0384166000908152600d60205260409020805463ffffffff19169055613233600b856139d9565b61328357600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b038381166000908152600c60209081526040808320805460ff81161560ff199091168117909155601190925290912080546001600160a01b03191692851692909217909155613597565b60068560098111156132e357fe5b14156133a9576132f660176016866138e0565b15613379576001600160a01b0384166000908152601760205260409020805463ffffffff191690556133296015856139d9565b61337957601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601660205260409020805460ff81161560ff199091168117909155613597565b60078560098111156133b757fe5b141561347d576133ca601a6019866138e0565b1561344d576001600160a01b0384166000908152601a60205260409020805463ffffffff191690556133fd6018856139d9565b61344d57601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601960205260409020805460ff81161560ff199091168117909155613597565b600885600981111561348b57fe5b14156135515761349e601e601d866138e0565b15613521576001600160a01b0384166000908152601e60205260409020805463ffffffff191690556134d1601c856139d9565b61352157601c80546001810182556000919091527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601d60205260409020805460ff81161560ff199091168117909155613597565b600985600981111561355f57fe5b141561358d57506000602055601f80546001600160a01b0319166001600160a01b0385161790556001613597565b60009150506135ee565b8460098111156135a357fe5b604080516001600160a01b0387168152831515602082015281517f0dcacb7e392f3d6a216ed2660e3dcfd40b7793d33591db2ba185a6b8e44fc477929181900390910190a260019150505b9392505050565b60225481565b600b8181548110610f8257600080fd5b60106020526000908152604090205463ffffffff1681565b60006135ee83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a29565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261263f908490613ac0565b6000828201838110156135ee576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826137205750600061182c565b8282028284828161372d57fe5b04146135ee5760405162461bcd60e51b8152600401808060200182810382526021815260200180613d2c6021913960400191505060405180910390fd5b60006135ee83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c78565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613806908590613ac0565b50505050565b600082820163ffffffff80851690821610156135ee576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600063ffffffff83166138845750600061182c565b82820263ffffffff808416908086169083168161389d57fe5b0463ffffffff16146135ee5760405162461bcd60e51b8152600401808060200182810382526021815260200180613d2c6021913960400191505060405180910390fd5b6001600160a01b03811660009081526020839052604081205460ff166139cf576001600160a01b03821660009081526020859052604090205463ffffffff1661395d576040805162461bcd60e51b815260206004820152600a6024820152694d75737420717565756560b01b604482015290519081900360640190fd5b6001600160a01b03821660009081526020859052604090205463ffffffff428116911611156139c7576040805162461bcd60e51b8152602060048201526011602482015270145d595d59481b9bdd08195e1c1a5c9959607a1b604482015290519081900360640190fd5b5060016135ee565b5060009392505050565b6000805b83548110156139cf57826001600160a01b03168482815481106139fc57fe5b6000918252602090912001546001600160a01b03161415613a2157600191505061182c565b6001016139dd565b60008184841115613ab85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a7d578181015183820152602001613a65565b50505050905090810190601f168015613aaa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b613ad2826001600160a01b0316613cdd565b613b23576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613b615780518252601f199092019160209182019101613b42565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613bc3576040519150601f19603f3d011682016040523d82523d6000602084013e613bc8565b606091505b509150915081613c1f576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561380657808060200190516020811015613c3b57600080fd5b50516138065760405162461bcd60e51b815260040180806020018281038252602a815260200180613d8d602a913960400191505060405180910390fd5b60008183613cc75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a7d578181015183820152602001613a65565b506000838581613cd357fe5b0495945050505050565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657293bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d665361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fcc4b73b09c26ca06f20c9c3cd807f9c848200607d5d4f7971ab2ad2eee470ea64736f6c63430007050033000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000003aba3807454c4c62a48f13d4725359ba58eea610

Deployed Bytecode

0x60806040526004361061036e5760003560e01c80638f59c727116101c6578063d031370b116100f7578063ebd83cd811610095578063fbfd393b1161006f578063fbfd393b14610ce5578063fc7b9c1814610d29578063fd1ec01014610d3e578063fff9ee8714610d6857610375565b8063ebd83cd814610c4c578063ee4e19a114610c7f578063fb93958814610cb257610375565b8063deeb2b9c116100d1578063deeb2b9c14610b80578063df89b34414610bb3578063e83afee314610be6578063eb28ad3a14610c2257610375565b8063d031370b14610b08578063d796ffb814610b32578063da35e06c14610b6b57610375565b8063ab319c9a11610164578063bc157ac11161013e578063bc157ac114610a37578063bfc706de14610a76578063c24ad43e14610aa2578063cd85641a14610ad557610375565b8063ab319c9a146109a7578063b1bd38b0146109da578063b5b1d56014610a0d57610375565b8063932cc8c3116101a0578063932cc8c3146108d55780639e281a9814610908578063a1210a2d14610941578063a569e5711461097457610375565b80638f59c727146108635780638f6a7b57146108965780638f840ddd146108c057610375565b80634e83423c116102a0578063731681bb1161023e578063827ce38011610218578063827ce380146107be57806386936386146107f1578063869871bf1461080657806387d67dff1461083057610375565b8063731681bb14610748578063788c6c011461075d5780637a8960d8146107a957610375565b806368c31dd51161027a57806368c31dd5146106885780636a20de92146106bb5780636b5e40a7146106f457806370a0502a1461071e57610375565b80634e83423c1461060d578063517bfc60146106405780635a96ac0a1461067357610375565b806312422d231161030d5780633bed33ce116102e75780633bed33ce14610571578063437f79121461059b57806346f68ee9146105c5578063481c6a75146105f857610375565b806312422d23146104ea5780631eec5a9a146105235780632b7ce5001461055c57610375565b8063094a865111610349578063094a8651146104105780630b0eee30146104555780630c3513a81461048e578063124154ca146104a357610375565b8062f714ce1461037a5780630619aff1146103b5578063089208d8146103fb57610375565b3661037557005b600080fd5b34801561038657600080fd5b506103b36004803603604081101561039d57600080fd5b50803590602001356001600160a01b0316610d9b565b005b3480156103c157600080fd5b506103df600480360360208110156103d857600080fd5b5035610f72565b604080516001600160a01b039092168252519081900360200190f35b34801561040757600080fd5b506103b3610f9c565b34801561041c57600080fd5b506104436004803603602081101561043357600080fd5b50356001600160a01b0316611033565b60408051918252519081900360200190f35b34801561046157600080fd5b506103b36004803603604081101561047857600080fd5b506001600160a01b038135169060200135611045565b34801561049a57600080fd5b50610443611200565b3480156104af57600080fd5b506104d6600480360360208110156104c657600080fd5b50356001600160a01b03166112be565b604080519115158252519081900360200190f35b3480156104f657600080fd5b506103b36004803603604081101561050d57600080fd5b50803590602001356001600160a01b03166112d3565b34801561052f57600080fd5b506104436004803603604081101561054657600080fd5b506001600160a01b0381351690602001356115a3565b34801561056857600080fd5b506103b3611832565b34801561057d57600080fd5b506103b36004803603602081101561059457600080fd5b5035611a0d565b3480156105a757600080fd5b506103df600480360360208110156105be57600080fd5b5035611a8b565b3480156105d157600080fd5b506103b3600480360360208110156105e857600080fd5b50356001600160a01b0316611a9b565b34801561060457600080fd5b506103df611b88565b34801561061957600080fd5b506104d66004803603602081101561063057600080fd5b50356001600160a01b0316611b97565b34801561064c57600080fd5b506103df6004803603602081101561066357600080fd5b50356001600160a01b0316611bac565b34801561067f57600080fd5b506103b3611bc7565b34801561069457600080fd5b506104d6600480360360208110156106ab57600080fd5b50356001600160a01b0316611c71565b3480156106c757600080fd5b506103b3600480360360408110156106de57600080fd5b506001600160a01b038135169060200135611c86565b34801561070057600080fd5b506103df6004803603602081101561071757600080fd5b5035611e0b565b34801561072a57600080fd5b506103df6004803603602081101561074157600080fd5b5035611e1b565b34801561075457600080fd5b506103df611e2b565b34801561076957600080fd5b506107906004803603602081101561078057600080fd5b50356001600160a01b0316611e3a565b6040805163ffffffff9092168252519081900360200190f35b3480156107b557600080fd5b50610790611e52565b3480156107ca57600080fd5b506103b3600480360360208110156107e157600080fd5b50356001600160a01b0316611e65565b3480156107fd57600080fd5b50610443611efc565b34801561081257600080fd5b506103df6004803603602081101561082957600080fd5b5035611f02565b34801561083c57600080fd5b506104d66004803603602081101561085357600080fd5b50356001600160a01b0316611f12565b34801561086f57600080fd5b506107906004803603602081101561088657600080fd5b50356001600160a01b0316611f27565b3480156108a257600080fd5b506103df600480360360208110156108b957600080fd5b5035611f3f565b3480156108cc57600080fd5b50610443611f4f565b3480156108e157600080fd5b50610790600480360360208110156108f857600080fd5b50356001600160a01b0316611f55565b34801561091457600080fd5b506103b36004803603604081101561092b57600080fd5b506001600160a01b038135169060200135611f6d565b34801561094d57600080fd5b506104d66004803603602081101561096457600080fd5b50356001600160a01b0316611fce565b34801561098057600080fd5b506104d66004803603602081101561099757600080fd5b50356001600160a01b0316611fe3565b3480156109b357600080fd5b50610790600480360360208110156109ca57600080fd5b50356001600160a01b0316611ff8565b3480156109e657600080fd5b50610790600480360360208110156109fd57600080fd5b50356001600160a01b0316612010565b348015610a1957600080fd5b506103df60048036036020811015610a3057600080fd5b5035612028565b348015610a4357600080fd5b5061044360048036036060811015610a5a57600080fd5b508035906001600160a01b036020820135169060400135612038565b348015610a8257600080fd5b506103b360048036036020811015610a9957600080fd5b503515156122b6565b348015610aae57600080fd5b5061079060048036036020811015610ac557600080fd5b50356001600160a01b0316612316565b348015610ae157600080fd5b5061079060048036036020811015610af857600080fd5b50356001600160a01b031661232e565b348015610b1457600080fd5b506103df60048036036020811015610b2b57600080fd5b5035612346565b348015610b3e57600080fd5b506103b360048036036040811015610b5557600080fd5b50803590602001356001600160a01b0316612356565b348015610b7757600080fd5b506103df6124d9565b348015610b8c57600080fd5b506103b360048036036020811015610ba357600080fd5b50356001600160a01b03166124fd565b348015610bbf57600080fd5b506104d660048036036020811015610bd657600080fd5b50356001600160a01b0316612644565b348015610bf257600080fd5b506104d660048036036040811015610c0957600080fd5b50803560ff1690602001356001600160a01b0316612659565b348015610c2e57600080fd5b506103b360048036036020811015610c4557600080fd5b5035612b1e565b348015610c5857600080fd5b506104d660048036036020811015610c6f57600080fd5b50356001600160a01b0316612c9d565b348015610c8b57600080fd5b506104d660048036036020811015610ca257600080fd5b50356001600160a01b0316612cb2565b348015610cbe57600080fd5b5061079060048036036020811015610cd557600080fd5b50356001600160a01b0316612cc7565b348015610cf157600080fd5b506104d660048036036060811015610d0857600080fd5b5060ff813516906001600160a01b0360208201358116916040013516612cdf565b348015610d3557600080fd5b506104436135f5565b348015610d4a57600080fd5b506103df60048036036020811015610d6157600080fd5b50356135fb565b348015610d7457600080fd5b5061079060048036036020811015610d8b57600080fd5b50356001600160a01b031661360b565b6001600160a01b03811660009081526003602052604090205460ff16610df7576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b3360009081526009602052604090205460ff161515600114610e4f576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6000610e5b82846115a3565b90507f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f06001600160a01b03166379cc679033836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610ed457600080fd5b505af1158015610ee8573d6000803e3d6000fd5b5050602154610efa9250905082613623565b6021819055604051600080516020613d6d83398151915290600090a2610f2a6001600160a01b0383163385613665565b604080518481526020810183905281516001600160a01b038516927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb928290030190a2505050565b60128181548110610f8257600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b03163314610fe9576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b601b6020526000908152604090205481565b6001600160a01b0382166000908152600c602052604090205460ff16156110be573360009081526016602052604090205460ff166110b9576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b611111565b3360009081526013602052604090205460ff16611111576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b600061111d83836115a3565b60235490915060ff161561117f57611133611200565b81111561117f576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b60215461118c9082613623565b6021819055604051600080516020613d6d83398151915290600090a26111bc6001600160a01b0384163384613665565b6040805183815290516001600160a01b038516917f2bb2640731848fe9820ba48dbc978c1fc9bbd5f11b948bfab05b7dee3378fd80919081900360200190a2505050565b6000806112946022547f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f06001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561126257600080fd5b505afa158015611276573d6000803e3d6000fd5b505050506040513d602081101561128c57600080fd5b505190613623565b90506021548111156112aa5760009150506112bb565b6021546112b79082613623565b9150505b90565b60066020526000908152604090205460ff1681565b3360009081526019602052604090205460ff16611326576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16611382576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b600061138e82846115a3565b601f54604080516370a0823160e01b815233600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156113df57600080fd5b505afa1580156113f3573d6000803e3d6000fd5b505050506040513d602081101561140957600080fd5b5051336000908152601b60205260408120549192509061142a908390613623565b905080831115611476576040805162461bcd60e51b8152602060048201526012602482015271115e18d959591cc81919589d081b1a5b5a5d60721b604482015290519081900360640190fd5b336000908152601b602052604090205461149090846136b7565b336000908152601b60205260409020556022546114ad90846136b7565b6022556021546114bd9084613623565b6021819055604051600080516020613d6d83398151915290600090a26040805163a9059cbb60e01b81523360048201526024810187905290516001600160a01b0386169163a9059cbb9160448083019260209291908290030181600087803b15801561152857600080fd5b505af115801561153c573d6000803e3d6000fd5b505050506040513d602081101561155257600080fd5b5050604080518681526020810185905281516001600160a01b0387169233927f7e1a939bed137a819b5d2979822c67f877689f7a863d5e4cb57cdca97b2977d6929081900390910190a35050505050565b60006001600160a01b03831661163e576001600160a01b038084166000908152601160209081526040918290205482516325545c6b60e01b81526004810187905292519316926325545c6b926024808201939291829003018186803b15801561160b57600080fd5b505afa15801561161f573d6000803e3d6000fd5b505050506040513d602081101561163557600080fd5b5051905061182c565b6001600160a01b03831660009081526003602052604090205460ff161561177b57611774836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561169b57600080fd5b505afa1580156116af573d6000803e3d6000fd5b505050506040513d60208110156116c557600080fd5b50516040805163313ce56760e01b8152905160ff909216600a0a9161176e916001600160a01b037f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f0169163313ce56791600480820192602092909190829003018186803b15801561173557600080fd5b505afa158015611749573d6000803e3d6000fd5b505050506040513d602081101561175f57600080fd5b5051859060ff16600a0a613711565b9061376a565b905061182c565b6001600160a01b0383166000908152600c602052604090205460ff161561182c576001600160a01b03808416600081815260116020908152604091829020548251634249719f60e01b815260048101949094526024840187905291519190931692634249719f9260448082019391829003018186803b1580156117fd57600080fd5b505afa158015611811573d6000803e3d6000fd5b505050506040513d602081101561182757600080fd5b505190505b92915050565b6000546001600160a01b0316331461187f576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6000805b6002548110156119575761194d611946600283815481106118a057fe5b600091825260209091200154600280546001600160a01b0390921691859081106118c657fe5b60009182526020918290200154604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d602081101561193f57600080fd5b50516115a3565b83906136b7565b9150600101611883565b5060005b600b548110156119a85761199e611946600b838154811061197857fe5b600091825260209091200154600b80546001600160a01b0390921691859081106118c657fe5b915060010161195b565b506119be6119b76000476115a3565b82906136b7565b60218190556040519091508190600080516020613d6d83398151915290600090a260405181907fec691f09f6924b27932253f85caf99bacc30360cc0e50a1cc4d2acc24601446690600090a250565b6000546001600160a01b03163314611a5a576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b604051339082156108fc029083906000818181858888f19350505050158015611a87573d6000803e3d6000fd5b5050565b60088181548110610f8257600080fd5b6000546001600160a01b03163314611ae8576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b038116611b2d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613ce46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031690565b601d6020526000908152604090205460ff1681565b6011602052600090815260409020546001600160a01b031681565b6001546001600160a01b03163314611c105760405162461bcd60e51b8152600401808060200182810382526022815260200180613d0a6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b60036020526000908152604090205460ff1681565b336000908152601d602052604090205460ff16611cd9576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b60235460ff1615611d3857611cec611200565b811115611d38576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420726573657276657360581b604482015290519081900360640190fd5b7f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f06001600160a01b03166340c10f1983836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611daf57600080fd5b505af1158015611dc3573d6000803e3d6000fd5b50506040805184815290516001600160a01b03861693503392507ffa8ccab40e7da8146c2304cd0950334fd30a6ba093abe86261aa13911fed849c9181900360200190a35050565b60058181548110610f8257600080fd5b60158181548110610f8257600080fd5b601f546001600160a01b031681565b60046020526000908152604090205463ffffffff1681565b600154600160a01b900463ffffffff1681565b6000546001600160a01b03163314611eb2576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6000805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780546001600160a01b0319166001600160a01b0392909216919091179055565b60205481565b60188181548110610f8257600080fd5b60096020526000908152604090205460ff1681565b600d6020526000908152604090205463ffffffff1681565b600e8181548110610f8257600080fd5b60215481565b60076020526000908152604090205463ffffffff1681565b6000546001600160a01b03163314611fba576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b611a876001600160a01b0383163383613665565b600f6020526000908152604090205460ff1681565b600c6020526000908152604090205460ff1681565b60176020526000908152604090205463ffffffff1681565b60146020526000908152604090205463ffffffff1681565b601c8181548110610f8257600080fd5b6001600160a01b03821660009081526003602052604081205460ff168061207757506001600160a01b0383166000908152600c602052604090205460ff165b6120b7576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b6120cc6001600160a01b0384163330876137ac565b6001600160a01b03831660009081526003602052604090205460ff1615612145573360009081526006602052604090205460ff16612140576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b612198565b336000908152600f602052604090205460ff16612198576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b60006121a484866115a3565b90506121b08184613623565b91507f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f06001600160a01b03166340c10f1933846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561222957600080fd5b505af115801561223d573d6000803e3d6000fd5b505060215461224f92509050826136b7565b6021819055604051600080516020613d6d83398151915290600090a2604080518681526020810183905281516001600160a01b038716927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15928290030190a2509392505050565b6000546001600160a01b03163314612303576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6023805460ff1916911515919091179055565b600a6020526000908152604090205463ffffffff1681565b601a6020526000908152604090205463ffffffff1681565b60028181548110610f8257600080fd5b3360009081526019602052604090205460ff166123a9576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205460ff16612405576040805162461bcd60e51b815260206004820152600c60248201526b139bdd081858d8d95c1d195960a21b604482015290519081900360640190fd5b61241a6001600160a01b0382163330856137ac565b600061242682846115a3565b336000908152601b60205260409020549091506124439082613623565b336000908152601b60205260409020556022546124609082613623565b60225560215461247090826136b7565b6021819055604051600080516020613d6d83398151915290600090a2604080518481526020810183905281516001600160a01b0385169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a3505050565b7f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f081565b6000546001600160a01b0316331461254a576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b0381166125a5576040805162461bcd60e51b815260206004820152601960248201527f496e76616c696420726563697069656e74206164647265737300000000000000604482015290519081900360640190fd5b60405147906000906001600160a01b0384169083908381818185875af1925050503d80600081146125f2576040519150601f19603f3d011682016040523d82523d6000602084013e6125f7565b606091505b505090508061263f576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050565b60166020526000908152604090205460ff1681565b600080546001600160a01b031633146126a7576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b0382166126ba57600080fd5b60008360098111156126c857fe5b1415612723576001546126ee9063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600760205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600183600981111561273157fe5b141561278c576001546127579063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600a60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600283600981111561279a57fe5b14156127f5576001546127c09063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600460205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600383600981111561280357fe5b14156128725760015461283d9061282d9063ffffffff600160a01b90910481169060029061386f16565b63ffffffff428116919061380c16565b6001600160a01b0383166000908152601460205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600483600981111561288057fe5b14156128db576001546128a69063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152601060205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b60058360098111156128e957fe5b14156129445760015461290f9063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152600d60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b600683600981111561295257fe5b14156129b15760015461297c9061282d9063ffffffff600160a01b90910481169060029061386f16565b6001600160a01b0383166000908152601760205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b60078360098111156129bf57fe5b1415612a1a576001546129e59063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152601a60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b6008836009811115612a2857fe5b1415612a8357600154612a4e9063ffffffff42811691600160a01b900481169061380c16565b6001600160a01b0383166000908152601e60205260409020805463ffffffff191663ffffffff92909216919091179055612acd565b6009836009811115612a9157fe5b1415612ac557600154612ab79063ffffffff42811691600160a01b900481169061380c16565b63ffffffff16602055612acd565b50600061182c565b826009811115612ad957fe5b604080516001600160a01b038516815290517f0e4f2c4b5bc209d509bc3d49348c787fefadc66a79351b470599ac0f5be52eaf9181900360200190a250600192915050565b3360009081526019602052604090205460ff16612b71576040805162461bcd60e51b815260206004820152600c60248201526b139bdd08185c1c1c9bdd995960a21b604482015290519081900360640190fd5b6040805163079cc67960e41b81523360048201526024810183905290516001600160a01b037f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f016916379cc679091604480830192600092919082900301818387803b158015612bdf57600080fd5b505af1158015612bf3573d6000803e3d6000fd5b5050336000908152601b6020526040902054612c129250905082613623565b336000908152601b6020526040902055602254612c2f9082613623565b602255604080518281526020810183905281516001600160a01b037f000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f0169233927fc6d98eecfc9c78ab62c89a82950079b54874749f1f6f24090f7acc758bc2f309929081900390910190a350565b60136020526000908152604090205460ff1681565b60196020526000908152604090205460ff1681565b601e6020526000908152604090205463ffffffff1681565b600080546001600160a01b03163314612d2d576040805162461bcd60e51b81526020600482018190526024820152600080516020613d4d833981519152604482015290519081900360640190fd5b6001600160a01b038316612d4057600080fd5b600080856009811115612d4f57fe5b1415612e1557612d6260076006866138e0565b15612de5576001600160a01b0384166000908152600760205260409020805463ffffffff19169055612d956005856139d9565b612de557600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600660205260409020805460ff81161560ff199091168117909155613597565b6001856009811115612e2357fe5b1415612ee957612e36600a6009866138e0565b15612eb9576001600160a01b0384166000908152600a60205260409020805463ffffffff19169055612e696008856139d9565b612eb957600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600960205260409020805460ff81161560ff199091168117909155613597565b6002856009811115612ef757fe5b1415612fbd57612f0a60046003866138e0565b15612f8d576001600160a01b0384166000908152600460205260409020805463ffffffff19169055612f3d6002856139d9565b612f8d57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600360205260409020805460ff81161560ff199091168117909155613597565b6003856009811115612fcb57fe5b14156130ce57612fde60146013866138e0565b1561309e57601280546001810182557fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0387169081179091556000908152601460205260409020805463ffffffff1916905561304e90856139d9565b61309e57601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601360205260409020805460ff81161560ff199091168117909155613597565b60048560098111156130dc57fe5b14156131df576130ef6010600f866138e0565b156131af57600e80546001810182557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0387169081179091556000908152601060205260409020805463ffffffff1916905561315f90856139d9565b6131af57600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152600f60205260409020805460ff81161560ff199091168117909155613597565b60058560098111156131ed57fe5b14156132d557613200600d600c866138e0565b15613283576001600160a01b0384166000908152600d60205260409020805463ffffffff19169055613233600b856139d9565b61328357600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b038381166000908152600c60209081526040808320805460ff81161560ff199091168117909155601190925290912080546001600160a01b03191692851692909217909155613597565b60068560098111156132e357fe5b14156133a9576132f660176016866138e0565b15613379576001600160a01b0384166000908152601760205260409020805463ffffffff191690556133296015856139d9565b61337957601580546001810182556000919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601660205260409020805460ff81161560ff199091168117909155613597565b60078560098111156133b757fe5b141561347d576133ca601a6019866138e0565b1561344d576001600160a01b0384166000908152601a60205260409020805463ffffffff191690556133fd6018856139d9565b61344d57601880546001810182556000919091527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601960205260409020805460ff81161560ff199091168117909155613597565b600885600981111561348b57fe5b14156135515761349e601e601d866138e0565b15613521576001600160a01b0384166000908152601e60205260409020805463ffffffff191690556134d1601c856139d9565b61352157601c80546001810182556000919091527f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a2110180546001600160a01b0319166001600160a01b0386161790555b506001600160a01b0383166000908152601d60205260409020805460ff81161560ff199091168117909155613597565b600985600981111561355f57fe5b141561358d57506000602055601f80546001600160a01b0319166001600160a01b0385161790556001613597565b60009150506135ee565b8460098111156135a357fe5b604080516001600160a01b0387168152831515602082015281517f0dcacb7e392f3d6a216ed2660e3dcfd40b7793d33591db2ba185a6b8e44fc477929181900390910190a260019150505b9392505050565b60225481565b600b8181548110610f8257600080fd5b60106020526000908152604090205463ffffffff1681565b60006135ee83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a29565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261263f908490613ac0565b6000828201838110156135ee576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826137205750600061182c565b8282028284828161372d57fe5b04146135ee5760405162461bcd60e51b8152600401808060200182810382526021815260200180613d2c6021913960400191505060405180910390fd5b60006135ee83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c78565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613806908590613ac0565b50505050565b600082820163ffffffff80851690821610156135ee576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600063ffffffff83166138845750600061182c565b82820263ffffffff808416908086169083168161389d57fe5b0463ffffffff16146135ee5760405162461bcd60e51b8152600401808060200182810382526021815260200180613d2c6021913960400191505060405180910390fd5b6001600160a01b03811660009081526020839052604081205460ff166139cf576001600160a01b03821660009081526020859052604090205463ffffffff1661395d576040805162461bcd60e51b815260206004820152600a6024820152694d75737420717565756560b01b604482015290519081900360640190fd5b6001600160a01b03821660009081526020859052604090205463ffffffff428116911611156139c7576040805162461bcd60e51b8152602060048201526011602482015270145d595d59481b9bdd08195e1c1a5c9959607a1b604482015290519081900360640190fd5b5060016135ee565b5060009392505050565b6000805b83548110156139cf57826001600160a01b03168482815481106139fc57fe5b6000918252602090912001546001600160a01b03161415613a2157600191505061182c565b6001016139dd565b60008184841115613ab85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a7d578181015183820152602001613a65565b50505050905090810190601f168015613aaa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b613ad2826001600160a01b0316613cdd565b613b23576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310613b615780518252601f199092019160209182019101613b42565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613bc3576040519150601f19603f3d011682016040523d82523d6000602084013e613bc8565b606091505b509150915081613c1f576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561380657808060200190516020811015613c3b57600080fd5b50516138065760405162461bcd60e51b815260040180806020018281038252602a815260200180613d8d602a913960400191505060405180910390fd5b60008183613cc75760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a7d578181015183820152602001613a65565b506000838581613cd357fe5b0495945050505050565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657293bb8edd35984706eee1b92541281f7f62d33c01c5b2ec0929a113603bd21d665361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fcc4b73b09c26ca06f20c9c3cd807f9c848200607d5d4f7971ab2ad2eee470ea64736f6c63430007050033

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

000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000003aba3807454c4c62a48f13d4725359ba58eea610

-----Decoded View---------------
Arg [0] : _Sync (address): 0xa41d2f8Ee4F47D3B860A149765A7dF8c3287b7F0
Arg [1] : _USDC (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [2] : _etherCalculator (address): 0x3Aba3807454C4C62A48f13D4725359ba58eeA610

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a41d2f8ee4f47d3b860a149765a7df8c3287b7f0
Arg [1] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [2] : 0000000000000000000000003aba3807454c4c62a48f13d4725359ba58eea610


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Syncus' Treasury wallet.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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