false
false

Contract Address Details

0x6eb987Bd8ACE2a41438a3C747B96b0bB7c654B26

Contract Name
FortGovernance
Creator
0x0e2020–cfcfa4 at 0x62e2de–2a97e3
Balance
0 KCS
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
51440051
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
FortGovernance




Optimization enabled
true
Compiler version
v0.8.13+commit.abaa5c0e




Optimization runs
888888
EVM Version
default




Verified at
2022-03-22T08:32:48.343894Z

Contract source code

// Sources flattened with hardhat v2.5.0 https://hardhat.org

// File contracts/interfaces/IFortMapping.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.8.6;

/// @dev The interface defines methods for Fort builtin contract address mapping
interface IFortMapping {

    /// @dev Address updated event
    /// @param name Address name
    /// @param oldAddress Old address
    /// @param newAddress New address
    event AddressUpdated(string name, address oldAddress, address newAddress);

    /// @dev Set the built-in contract address of the system
    /// @param dcuToken Address of dcu token contract
    /// @param fortDAO IFortDAO implementation contract address
    /// @param fortOptions IFortOptions implementation contract address
    /// @param fortFutures IFortFutures implementation contract address
    /// @param fortVaultForStaking IFortVaultForStaking implementation contract address
    /// @param nestPriceFacade INestPriceFacade implementation contract address
    function setBuiltinAddress(
        address dcuToken,
        address fortDAO,
        address fortOptions,
        address fortFutures,
        address fortVaultForStaking,
        address nestPriceFacade
    ) external;

    /// @dev Get the built-in contract address of the system
    /// @return dcuToken Address of dcu token contract
    /// @return fortDAO IFortDAO implementation contract address
    /// @return fortOptions IFortOptions implementation contract address
    /// @return fortFutures IFortFutures implementation contract address
    /// @return fortVaultForStaking IFortVaultForStaking implementation contract address
    /// @return nestPriceFacade INestPriceFacade implementation contract address
    function getBuiltinAddress() external view returns (
        address dcuToken,
        address fortDAO,
        address fortOptions,
        address fortFutures,
        address fortVaultForStaking,
        address nestPriceFacade
    );

    /// @dev Get address of dcu token contract
    /// @return Address of dcu token contract
    function getDCUTokenAddress() external view returns (address);

    /// @dev Get IFortDAO implementation contract address
    /// @return IFortDAO implementation contract address
    function getFortDAOAddress() external view returns (address);

    /// @dev Get IFortOptions implementation contract address
    /// @return IFortOptions implementation contract address
    function getFortOptionsAddress() external view returns (address);

    /// @dev Get IFortFutures implementation contract address
    /// @return IFortFutures implementation contract address
    function getFortFuturesAddress() external view returns (address);

    /// @dev Get IFortVaultForStaking implementation contract address
    /// @return IFortVaultForStaking implementation contract address
    function getFortVaultForStakingAddress() external view returns (address);

    /// @dev Get INestPriceFacade implementation contract address
    /// @return INestPriceFacade implementation contract address
    function getNestPriceFacade() external view returns (address);

    /// @dev Registered address. The address registered here is the address accepted by Fort system
    /// @param key The key
    /// @param addr Destination address. 0 means to delete the registration information
    function registerAddress(string calldata key, address addr) external;

    /// @dev Get registered address
    /// @param key The key
    /// @return Destination address. 0 means empty
    function checkAddress(string calldata key) external view returns (address);
}


// File contracts/interfaces/IFortGovernance.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev This interface defines the governance methods
interface IFortGovernance is IFortMapping {

    /// @dev Governance flag changed event
    /// @param addr Target address
    /// @param oldFlag Old governance flag
    /// @param newFlag New governance flag
    event FlagChanged(address addr, uint oldFlag, uint newFlag);

    /// @dev Set governance authority
    /// @param addr Destination address
    /// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not 
    ///        implemented in the current system, only the difference between authorized and unauthorized. 
    ///        Here, a uint96 is used to represent the weight, which is only reserved for expansion
    function setGovernance(address addr, uint flag) external;

    /// @dev Get governance rights
    /// @param addr Destination address
    /// @return Weight. 0 means to delete the governance permission of the target address. Weight is not 
    ///        implemented in the current system, only the difference between authorized and unauthorized. 
    ///        Here, a uint96 is used to represent the weight, which is only reserved for expansion
    function getGovernance(address addr) external view returns (uint);

    /// @dev Check whether the target address has governance rights for the given target
    /// @param addr Destination address
    /// @param flag Permission weight. The permission of the target address must be greater than this weight 
    /// to pass the check
    /// @return True indicates permission
    function checkGovernance(address addr, uint flag) external view returns (bool);
}


// File contracts/FortBase.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev Base contract of Fort
contract FortBase {

    /// @dev Governance address changed event
    /// @param oldGovernance Old governance address
    /// @param newGovernance New governance address
    event GovernanceChanged(address oldGovernance, address newGovernance);

    /// @dev IFortGovernance implementation contract address
    address public _governance;

    /// @dev To support open-zeppelin/upgrades
    /// @param governance IFortGovernance implementation contract address
    function initialize(address governance) public virtual {
        require(_governance == address(0), "Fort:!initialize");
        emit GovernanceChanged(address(0), governance);
        _governance = governance;
    }

    /// @dev Rewritten in the implementation contract, for load other contract addresses. Call 
    ///      super.update(newGovernance) when overriding, and override method without onlyGovernance
    /// @param newGovernance IFortGovernance implementation contract address
    function update(address newGovernance) public virtual {

        address governance = _governance;
        require(governance == msg.sender || IFortGovernance(governance).checkGovernance(msg.sender, 0), "Fort:!gov");
        emit GovernanceChanged(governance, newGovernance);
        _governance = newGovernance;
    }

    //---------modifier------------

    modifier onlyGovernance() {
        require(IFortGovernance(_governance).checkGovernance(msg.sender, 0), "Fort:!gov");
        _;
    }
}


// File contracts/FortMapping.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev The contract is for Fort builtin contract address mapping
abstract contract FortMapping is FortBase, IFortMapping {

    /// @dev Address of dcu token contract
    address _dcuToken;

    /// @dev IFortDAO implementation contract address
    address _fortDAO;

    /// @dev IFortOptions implementation contract address
    address _fortOptions;

    /// @dev IFortFutures implementation contract address
    address _fortFutures;

    /// @dev IFortVaultForStaking implementation contract address
    address _fortVaultForStaking;

    /// @dev INestPriceFacade implementation contract address
    address _nestPriceFacade;

    /// @dev Address registered in the system
    mapping(string=>address) _registeredAddress;

    /// @dev Set the built-in contract address of the system
    /// @param dcuToken Address of dcu token contract
    /// @param fortDAO IFortDAO implementation contract address
    /// @param fortOptions IFortOptions implementation contract address for Fort
    /// @param fortFutures IFortFutures implementation contract address
    /// @param fortVaultForStaking IFortVaultForStaking implementation contract address
    /// @param nestPriceFacade INestPriceFacade implementation contract address
    function setBuiltinAddress(
        address dcuToken,
        address fortDAO,
        address fortOptions,
        address fortFutures,
        address fortVaultForStaking,
        address nestPriceFacade
    ) external override onlyGovernance {

        if (dcuToken != address(0)) {
            emit AddressUpdated("dcuToken", _dcuToken, dcuToken);
            _dcuToken = dcuToken;
        }
        if (fortDAO != address(0)) {
            emit AddressUpdated("fortDAO", _fortDAO, fortDAO);
            _fortDAO = fortDAO;
        }
        if (fortOptions != address(0)) {
            emit AddressUpdated("fortOptions", _fortOptions, fortOptions);
            _fortOptions = fortOptions;
        }
        if (fortFutures != address(0)) {
            emit AddressUpdated("fortFutures", _fortFutures, fortFutures);
            _fortFutures = fortFutures;
        }
        if (fortVaultForStaking != address(0)) {
            emit AddressUpdated("fortVaultForStaking", _fortVaultForStaking, fortVaultForStaking);
            _fortVaultForStaking = fortVaultForStaking;
        }
        if (nestPriceFacade != address(0)) {
            emit AddressUpdated("nestPriceFacade", _nestPriceFacade, nestPriceFacade);
            _nestPriceFacade = nestPriceFacade;
        }
    }

    /// @dev Get the built-in contract address of the system
    /// @return dcuToken Address of dcu token contract
    /// @return fortDAO IFortDAO implementation contract address
    /// @return fortOptions IFortOptions implementation contract address
    /// @return fortFutures IFortFutures implementation contract address
    /// @return fortVaultForStaking IFortVaultForStaking implementation contract address
    /// @return nestPriceFacade INestPriceFacade implementation contract address
    function getBuiltinAddress() external view override returns (
        address dcuToken,
        address fortDAO,
        address fortOptions,
        address fortFutures,
        address fortVaultForStaking,
        address nestPriceFacade
    ) {
        return (
            _dcuToken,
            _fortDAO,
            _fortOptions,
            _fortFutures,
            _fortVaultForStaking,
            _nestPriceFacade
        );
    }

    /// @dev Get address of dcu token contract
    /// @return Address of dcu token contract
    function getDCUTokenAddress() external view override returns (address) { return _dcuToken; }

    /// @dev Get IFortDAO implementation contract address
    /// @return IFortDAO implementation contract address
    function getFortDAOAddress() external view override returns (address) { return _fortDAO; }

    /// @dev Get IFortOptions implementation contract address
    /// @return IFortOptions implementation contract address
    function getFortOptionsAddress() external view override returns (address) { return _fortOptions; }

    /// @dev Get IFortFutures implementation contract address
    /// @return IFortFutures implementation contract address
    function getFortFuturesAddress() external view override returns (address) { return _fortFutures; }

    /// @dev Get IFortVaultForStaking implementation contract address
    /// @return IFortVaultForStaking implementation contract address
    function getFortVaultForStakingAddress() external view override returns (address) { return _fortVaultForStaking; }

    /// @dev Get INestPriceFacade implementation contract address
    /// @return INestPriceFacade implementation contract address
    function getNestPriceFacade() external view override returns (address) { return _nestPriceFacade; }

    /// @dev Registered address. The address registered here is the address accepted by Fort system
    /// @param key The key
    /// @param addr Destination address. 0 means to delete the registration information
    function registerAddress(string calldata key, address addr) external override onlyGovernance {
        emit AddressUpdated(key, _registeredAddress[key], addr);
        _registeredAddress[key] = addr;
    }

    /// @dev Get registered address
    /// @param key The key
    /// @return Destination address. 0 means empty
    function checkAddress(string calldata key) external view override returns (address) {
        return _registeredAddress[key];
    }
}


// File contracts/FortGovernance.sol

// GPL-3.0-or-later

pragma solidity ^0.8.6;
/// @dev Fort governance contract
contract FortGovernance is FortMapping, IFortGovernance {

    /// @dev Structure of governance address information
    struct GovernanceInfo {
        address addr;
        uint96 flag;
    }

    /// @dev Governance address information
    mapping(address=>GovernanceInfo) _governanceMapping;

    /// @dev To support open-zeppelin/upgrades
    /// @param governance IFortGovernance implementation contract address
    function initialize(address governance) public override {

        // While initialize FortGovernance, newGovernance is address(this),
        // So must let newGovernance to 0
        require(governance == address(0), "FortGovernance:!address");

        // newGovernance is address(this)
        super.initialize(address(this));

        // Add msg.sender to governance
        _governanceMapping[msg.sender] = GovernanceInfo(msg.sender, uint96(0xFFFFFFFFFFFFFFFFFFFFFFFF));
    }

    /// @dev Set governance authority
    /// @param addr Destination address
    /// @param flag Weight. 0 means to delete the governance permission of the target address. Weight is not 
    ///        implemented in the current system, only the difference between authorized and unauthorized. 
    ///        Here, a uint96 is used to represent the weight, which is only reserved for expansion
    function setGovernance(address addr, uint flag) external override onlyGovernance {
        
        emit FlagChanged(addr, _governanceMapping[addr].flag, flag);

        if (flag > 0) {
            _governanceMapping[addr] = GovernanceInfo(addr, uint96(flag));
        } else {
            _governanceMapping[addr] = GovernanceInfo(address(0), uint96(0));
        }
    }

    /// @dev Get governance rights
    /// @param addr Destination address
    /// @return Weight. 0 means to delete the governance permission of the target address. Weight is not 
    ///        implemented in the current system, only the difference between authorized and unauthorized. 
    ///        Here, a uint96 is used to represent the weight, which is only reserved for expansion
    function getGovernance(address addr) external view override returns (uint) {
        return _governanceMapping[addr].flag;
    }

    /// @dev Check whether the target address has governance rights for the given target
    /// @param addr Destination address
    /// @param flag Permission weight. The permission of the target address must be greater than this 
    /// weight to pass the check
    /// @return True indicates permission
    function checkGovernance(address addr, uint flag) external view override returns (bool) {
        return _governanceMapping[addr].flag > flag;
    }
}
        

Contract ABI

[{"type":"event","name":"AddressUpdated","inputs":[{"type":"string","name":"name","internalType":"string","indexed":false},{"type":"address","name":"oldAddress","internalType":"address","indexed":false},{"type":"address","name":"newAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"FlagChanged","inputs":[{"type":"address","name":"addr","internalType":"address","indexed":false},{"type":"uint256","name":"oldFlag","internalType":"uint256","indexed":false},{"type":"uint256","name":"newFlag","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceChanged","inputs":[{"type":"address","name":"oldGovernance","internalType":"address","indexed":false},{"type":"address","name":"newGovernance","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"checkAddress","inputs":[{"type":"string","name":"key","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkGovernance","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"uint256","name":"flag","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"dcuToken","internalType":"address"},{"type":"address","name":"fortDAO","internalType":"address"},{"type":"address","name":"fortOptions","internalType":"address"},{"type":"address","name":"fortFutures","internalType":"address"},{"type":"address","name":"fortVaultForStaking","internalType":"address"},{"type":"address","name":"nestPriceFacade","internalType":"address"}],"name":"getBuiltinAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getDCUTokenAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortDAOAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortFuturesAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortOptionsAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getFortVaultForStakingAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getGovernance","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getNestPriceFacade","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerAddress","inputs":[{"type":"string","name":"key","internalType":"string"},{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuiltinAddress","inputs":[{"type":"address","name":"dcuToken","internalType":"address"},{"type":"address","name":"fortDAO","internalType":"address"},{"type":"address","name":"fortOptions","internalType":"address"},{"type":"address","name":"fortFutures","internalType":"address"},{"type":"address","name":"fortVaultForStaking","internalType":"address"},{"type":"address","name":"nestPriceFacade","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGovernance","inputs":[{"type":"address","name":"addr","internalType":"address"},{"type":"uint256","name":"flag","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update","inputs":[{"type":"address","name":"newGovernance","internalType":"address"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50611503806100206000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638fe77e8611610097578063c4d66de811610066578063c4d66de814610342578063dc6fa1ff14610355578063deaea6dd14610373578063ff5127261461039157600080fd5b80638fe77e861461028e57806391e1472b146102a1578063b13f5f1914610311578063c47398bd1461032457600080fd5b8063783f5255116100d3578063783f5255146101e05780637917e5a8146101f35780637d88277b146102115780638f9560df1461022457600080fd5b806304837969146101055780631c1b8772146101495780631c2f3e3d1461015e578063746b56f91461017e575b600080fd5b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015c61015736600461128a565b6103af565b005b60005461011f9073ffffffffffffffffffffffffffffffffffffffff1681565b6001546002546003546004546005546006546040805173ffffffffffffffffffffffffffffffffffffffff97881681529587166020870152938616938501939093529084166060840152831660808301529190911660a082015260c001610140565b61015c6101ee3660046112ac565b610569565b60065473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61021f3660046112d6565b6107d7565b61028061023236600461128a565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1690565b604051908152602001610140565b61011f61029c366004611393565b610e36565b6103016102af3660046112ac565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff161190565b6040519015158152602001610140565b61015c61031f3660046113d5565b610e78565b60035473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61035036600461128a565b611056565b60025473ffffffffffffffffffffffffffffffffffffffff1661011f565b60015473ffffffffffffffffffffffffffffffffffffffff1661011f565b60055473ffffffffffffffffffffffffffffffffffffffff1661011f565b60005473ffffffffffffffffffffffffffffffffffffffff163381148061046657506040517f91e1472b0000000000000000000000000000000000000000000000000000000081523360048201526000602482015273ffffffffffffffffffffffffffffffffffffffff8216906391e1472b90604401602060405180830381865afa158015610442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104669190611429565b6104d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a150600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190611429565b610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600860209081526040918290205482519384527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff169083015281018290527fc9086f0885976a8c13df9ddbbe29fa5b49520b84ab86e296f89212b3c3f728829060600160405180910390a180156107695760408051808201825273ffffffffffffffffffffffffffffffffffffffff9384168082526bffffffffffffffffffffffff93841660208084019182526000928352600890529290209051915191909316740100000000000000000000000000000000000000009190921602179055565b6040805180820182526000808252602080830182815273ffffffffffffffffffffffffffffffffffffffff8781168452600890925293909120915192516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000292169190911790555050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611429565b6108d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff8616156109ba576001546040805160608082526008908201527f646375546f6b656e000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291881682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b73ffffffffffffffffffffffffffffffffffffffff851615610a9e576002546040805160608082526007908201527f666f727444414f00000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291871682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161790555b73ffffffffffffffffffffffffffffffffffffffff841615610b8257600354604080516060808252600b908201527f666f72744f7074696f6e73000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291861682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b73ffffffffffffffffffffffffffffffffffffffff831615610c6657600454604080516060808252600b908201527f666f727446757475726573000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291851682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b73ffffffffffffffffffffffffffffffffffffffff821615610d4a576005546040805160608082526013908201527f666f72745661756c74466f725374616b696e6700000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291841682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b73ffffffffffffffffffffffffffffffffffffffff811615610e2e57600654604080516060808252600f908201527f6e65737450726963654661636164650000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505050505050565b600060078383604051610e4a92919061144b565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190611429565b610f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b7f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f8189838360078686604051610fac92919061144b565b90815260405190819003602001812054610fe293929173ffffffffffffffffffffffffffffffffffffffff90911690869061145b565b60405180910390a18060078484604051610ffd92919061144b565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055505050565b73ffffffffffffffffffffffffffffffffffffffff8116156110d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466f7274476f7665726e616e63653a216164647265737300000000000000000060448201526064016104c8565b6110dd3061114b565b50604080518082018252338082526bffffffffffffffffffffffff602080840182815260009384526008909152939091209151925116740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f466f72743a21696e697469616c697a650000000000000000000000000000000060448201526064016104c8565b604080516000815273ffffffffffffffffffffffffffffffffffffffff831660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461128557600080fd5b919050565b60006020828403121561129c57600080fd5b6112a582611261565b9392505050565b600080604083850312156112bf57600080fd5b6112c883611261565b946020939093013593505050565b60008060008060008060c087890312156112ef57600080fd5b6112f887611261565b955061130660208801611261565b945061131460408801611261565b935061132260608801611261565b925061133060808801611261565b915061133e60a08801611261565b90509295509295509295565b60008083601f84011261135c57600080fd5b50813567ffffffffffffffff81111561137457600080fd5b60208301915083602082850101111561138c57600080fd5b9250929050565b600080602083850312156113a657600080fd5b823567ffffffffffffffff8111156113bd57600080fd5b6113c98582860161134a565b90969095509350505050565b6000806000604084860312156113ea57600080fd5b833567ffffffffffffffff81111561140157600080fd5b61140d8682870161134a565b9094509250611420905060208501611261565b90509250925092565b60006020828403121561143b57600080fd5b815180151581146112a557600080fd5b8183823760009101908152919050565b60608152836060820152838560808301376000608085830181019190915273ffffffffffffffffffffffffffffffffffffffff9384166020830152919092166040830152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010191905056fea26469706673582212204eef1efbcfa0ed97d1929fe78b282c0d4e3724cedf41a8d128bfa4665abac2d264736f6c634300080d0033

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638fe77e8611610097578063c4d66de811610066578063c4d66de814610342578063dc6fa1ff14610355578063deaea6dd14610373578063ff5127261461039157600080fd5b80638fe77e861461028e57806391e1472b146102a1578063b13f5f1914610311578063c47398bd1461032457600080fd5b8063783f5255116100d3578063783f5255146101e05780637917e5a8146101f35780637d88277b146102115780638f9560df1461022457600080fd5b806304837969146101055780631c1b8772146101495780631c2f3e3d1461015e578063746b56f91461017e575b600080fd5b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61015c61015736600461128a565b6103af565b005b60005461011f9073ffffffffffffffffffffffffffffffffffffffff1681565b6001546002546003546004546005546006546040805173ffffffffffffffffffffffffffffffffffffffff97881681529587166020870152938616938501939093529084166060840152831660808301529190911660a082015260c001610140565b61015c6101ee3660046112ac565b610569565b60065473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61021f3660046112d6565b6107d7565b61028061023236600461128a565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1690565b604051908152602001610140565b61011f61029c366004611393565b610e36565b6103016102af3660046112ac565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff161190565b6040519015158152602001610140565b61015c61031f3660046113d5565b610e78565b60035473ffffffffffffffffffffffffffffffffffffffff1661011f565b61015c61035036600461128a565b611056565b60025473ffffffffffffffffffffffffffffffffffffffff1661011f565b60015473ffffffffffffffffffffffffffffffffffffffff1661011f565b60055473ffffffffffffffffffffffffffffffffffffffff1661011f565b60005473ffffffffffffffffffffffffffffffffffffffff163381148061046657506040517f91e1472b0000000000000000000000000000000000000000000000000000000081523360048201526000602482015273ffffffffffffffffffffffffffffffffffffffff8216906391e1472b90604401602060405180830381865afa158015610442573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104669190611429565b6104d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8084168252841660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a150600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa1580156105de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106029190611429565b610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff82166000818152600860209081526040918290205482519384527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff169083015281018290527fc9086f0885976a8c13df9ddbbe29fa5b49520b84ab86e296f89212b3c3f728829060600160405180910390a180156107695760408051808201825273ffffffffffffffffffffffffffffffffffffffff9384168082526bffffffffffffffffffffffff93841660208084019182526000928352600890529290209051915191909316740100000000000000000000000000000000000000009190921602179055565b6040805180820182526000808252602080830182815273ffffffffffffffffffffffffffffffffffffffff8781168452600890925293909120915192516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000292169190911790555050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611429565b6108d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b73ffffffffffffffffffffffffffffffffffffffff8616156109ba576001546040805160608082526008908201527f646375546f6b656e000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291881682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b73ffffffffffffffffffffffffffffffffffffffff851615610a9e576002546040805160608082526007908201527f666f727444414f00000000000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291871682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161790555b73ffffffffffffffffffffffffffffffffffffffff841615610b8257600354604080516060808252600b908201527f666f72744f7074696f6e73000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291861682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86161790555b73ffffffffffffffffffffffffffffffffffffffff831615610c6657600454604080516060808252600b908201527f666f727446757475726573000000000000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291851682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b73ffffffffffffffffffffffffffffffffffffffff821615610d4a576005546040805160608082526013908201527f666f72745661756c74466f725374616b696e6700000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291841682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790555b73ffffffffffffffffffffffffffffffffffffffff811615610e2e57600654604080516060808252600f908201527f6e65737450726963654661636164650000000000000000000000000000000000608082015273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f81899181900360a00190a1600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b505050505050565b600060078383604051610e4a92919061144b565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600080546040517f91e1472b000000000000000000000000000000000000000000000000000000008152336004820152602481019290925273ffffffffffffffffffffffffffffffffffffffff16906391e1472b90604401602060405180830381865afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190611429565b610f77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f466f72743a21676f76000000000000000000000000000000000000000000000060448201526064016104c8565b7f7878dffb4ada647885186a00ea129964d140835f125808ba48b1f3974b5f8189838360078686604051610fac92919061144b565b90815260405190819003602001812054610fe293929173ffffffffffffffffffffffffffffffffffffffff90911690869061145b565b60405180910390a18060078484604051610ffd92919061144b565b908152604051908190036020019020805473ffffffffffffffffffffffffffffffffffffffff929092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055505050565b73ffffffffffffffffffffffffffffffffffffffff8116156110d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f466f7274476f7665726e616e63653a216164647265737300000000000000000060448201526064016104c8565b6110dd3061114b565b50604080518082018252338082526bffffffffffffffffffffffff602080840182815260009384526008909152939091209151925116740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16156111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f466f72743a21696e697469616c697a650000000000000000000000000000000060448201526064016104c8565b604080516000815273ffffffffffffffffffffffffffffffffffffffff831660208201527f3aaaebeb4821d6a7e5c77ece53cff0afcc56c82add2c978dbbb7f73e84cbcfd2910160405180910390a1600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b803573ffffffffffffffffffffffffffffffffffffffff8116811461128557600080fd5b919050565b60006020828403121561129c57600080fd5b6112a582611261565b9392505050565b600080604083850312156112bf57600080fd5b6112c883611261565b946020939093013593505050565b60008060008060008060c087890312156112ef57600080fd5b6112f887611261565b955061130660208801611261565b945061131460408801611261565b935061132260608801611261565b925061133060808801611261565b915061133e60a08801611261565b90509295509295509295565b60008083601f84011261135c57600080fd5b50813567ffffffffffffffff81111561137457600080fd5b60208301915083602082850101111561138c57600080fd5b9250929050565b600080602083850312156113a657600080fd5b823567ffffffffffffffff8111156113bd57600080fd5b6113c98582860161134a565b90969095509350505050565b6000806000604084860312156113ea57600080fd5b833567ffffffffffffffff81111561140157600080fd5b61140d8682870161134a565b9094509250611420905060208501611261565b90509250925092565b60006020828403121561143b57600080fd5b815180151581146112a557600080fd5b8183823760009101908152919050565b60608152836060820152838560808301376000608085830181019190915273ffffffffffffffffffffffffffffffffffffffff9384166020830152919092166040830152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010191905056fea26469706673582212204eef1efbcfa0ed97d1929fe78b282c0d4e3724cedf41a8d128bfa4665abac2d264736f6c634300080d0033