Contract Address Details
contract

0x83Ca0012F3B9430479CB7D56aa1dA67624D43b79

Sponsored: 

Explore 5dax.com, the premier cryptocurrency exchange, offering unparalleled token listing services to elevate your project's visibility and reach!

Overview

FDX Balance

0 FDX ( )

FDX Value

$0.00

Token Holdings

Fetching tokens...

More Info

Private Name Tags

Last Balance Update

Blocks Validated

Sponsored

Contract name:
BallotsStorage




Optimization enabled
true
Compiler version
v0.4.24+commit.e67f0147




Optimization runs
200
EVM Version
default




Verified at
2023-02-21T06:15:29.045973Z

Contract source code

pragma solidity ^0.4.24;


contract EnumThresholdTypes {
    enum ThresholdTypes {Invalid, Keys, MetadataChange}
}


contract EnumKeyTypes {
    enum KeyTypes {Invalid, MiningKey, VotingKey, PayoutKey}
}


contract EnumBallotTypes {
    enum BallotTypes {
        Invalid,
        KeyAdding,
        KeyRemoval,
        KeySwap,
        MinThreshold,
        ProxyAddress,
        ManageEmissionFunds
    }
}


/**
 * @title EternalStorage
 * @dev This contract holds all the necessary state variables to carry out the storage of any contract
 * and to support the upgrade functionality.
 */
contract EternalStorage {

    // Version number of the current implementation
    uint256 internal _version;

    // Address of the current implementation
    address internal _implementation;

    // Storage mappings
    mapping(bytes32 => uint256) internal uintStorage;
    mapping(bytes32 => string) internal stringStorage;
    mapping(bytes32 => address) internal addressStorage;
    mapping(bytes32 => bytes) internal bytesStorage;
    mapping(bytes32 => bool) internal boolStorage;
    mapping(bytes32 => int256) internal intStorage;
    mapping(bytes32 => bytes32) internal bytes32Storage;

    mapping(bytes32 => uint256[]) internal uintArrayStorage;
    mapping(bytes32 => string[]) internal stringArrayStorage;
    mapping(bytes32 => address[]) internal addressArrayStorage;
    //mapping(bytes32 => bytes[]) internal bytesArrayStorage;
    mapping(bytes32 => bool[]) internal boolArrayStorage;
    mapping(bytes32 => int256[]) internal intArrayStorage;
    mapping(bytes32 => bytes32[]) internal bytes32ArrayStorage;

}



interface IPoaNetworkConsensus {
    function addValidator(address, bool) external returns(bool);
    function finalizeChange() external;
    function removeValidator(address, bool) external returns(bool);
    function swapValidatorKey(address, address) external returns(bool);
    function isMasterOfCeremonyRemoved() external view returns(bool);
    function isValidator(address) external view returns(bool);
    function getCurrentValidatorsLength() external view returns(uint256);
    function getCurrentValidatorsLengthWithoutMoC() external view returns(uint256);
    function getPendingList() external view returns(address[]);
    function getValidators() external view returns(address[]);
    function masterOfCeremony() external view returns(address);
}


interface IPoaNetworkConsensusForVotingToChange {
    function currentValidators(uint256) external view returns(address);
    function getCurrentValidatorsLength() external view returns(uint256);
}


interface IProxyStorage {
    function initializeAddresses(
        address, address, address, address, address, address, address, address
    ) external;

    function setContractAddress(uint256, address) external returns(bool);
    function getBallotsStorage() external view returns(address);
    function getKeysManager() external view returns(address);
    function getPoaConsensus() external view returns(address);
    function getValidatorMetadata() external view returns(address);
    function getVotingToChangeKeys() external view returns(address);
    function getVotingToChangeMinThreshold() external view returns(address);
}


interface IKeysManager {
    function addMiningKey(address) external returns(bool);
    function addVotingKey(address, address) external returns(bool);
    function addPayoutKey(address, address) external returns(bool);
    function createKeys(address, address, address) external;
    function initiateKeys(address) external;
    function migrateInitialKey(address) external;
    function migrateMiningKey(address) external;
    function removeMiningKey(address) external returns(bool);
    function removeVotingKey(address) external returns(bool);
    function removePayoutKey(address) external returns(bool);
    function swapMiningKey(address, address) external returns(bool);
    function swapVotingKey(address, address) external returns(bool);
    function swapPayoutKey(address, address) external returns(bool);
    function checkIfMiningExisted(address, address) external view returns(bool);
    function initialKeysCount() external view returns(uint256);
    function isMiningActive(address) external view returns(bool);
    function isVotingActive(address) external view returns(bool);
    function isPayoutActive(address) external view returns(bool);
    function hasMiningKeyBeenRemoved(address) external view returns(bool);
    function getVotingByMining(address) external view returns(address);
    function getPayoutByMining(address) external view returns(address);
    function getTime() external view returns(uint256);
    function getMiningKeyHistory(address) external view returns(address);
    function getMiningKeyByVoting(address) external view returns(address);
    function getInitialKeyStatus(address) external view returns(uint256);
    function masterOfCeremony() external view returns(address);
    function maxOldMiningKeysDeepCheck() external pure returns(uint256);
    function miningKeyByPayout(address) external view returns(address);
    function miningKeyByVoting(address) external view returns(address);
}


interface IKeysManagerPrev {
    function getInitialKey(address) external view returns(uint8);
}


interface IBallotsStorage {
    function setThreshold(uint256, uint256) external returns(bool);
    function areKeysBallotParamsValid(uint256, uint256, address, address) external view returns(bool);
    function getBallotThreshold(uint256) external view returns(uint256);
    function getVotingToChangeThreshold() external view returns(address);
    function getProxyThreshold() external view returns(uint256);
    function getBallotLimitPerValidator() external view returns(uint256);
    function getMaxLimitBallot() external view returns(uint256);
    function metadataChangeConfirmationsLimit() external pure returns(uint256);
}


interface IBallotsStoragePrev {
    function getBallotThreshold(uint8) external view returns(uint256);
}












/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns(uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns(uint256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns(uint256) {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns(uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}



contract BallotsStorage is EternalStorage, EnumBallotTypes, EnumKeyTypes, EnumThresholdTypes, IBallotsStorage {
    using SafeMath for uint256;

    bytes32 internal constant INIT_DISABLED = keccak256("initDisabled");
    bytes32 internal constant OWNER = keccak256("owner");
    bytes32 internal constant PROXY_STORAGE = keccak256("proxyStorage");

    bytes32 internal constant BALLOT_THRESHOLDS = "ballotThresholds";

    event ThresholdChanged(uint256 indexed thresholdType, uint256 newValue);

    modifier onlyOwner() {
        require(msg.sender == addressStorage[OWNER]);
        _;
    }

    modifier onlyVotingToChangeThreshold() {
        require(msg.sender == getVotingToChangeThreshold());
        _;
    }

    function areKeysBallotParamsValid(
        uint256 _ballotType,
        uint256 _affectedKeyType,
        address _affectedKey,
        address _miningKey
    ) external view returns(bool) {
        require(_ballotType >= uint256(BallotTypes.KeyAdding));
        require(_ballotType <= uint256(BallotTypes.KeySwap));
        require(_affectedKey != address(0));
        require(_affectedKeyType >= uint256(KeyTypes.MiningKey));
        require(_affectedKeyType <= uint256(KeyTypes.PayoutKey));

        if (_ballotType == uint256(BallotTypes.KeyAdding)) {
            return _areKeyAddingBallotParamsValid(
                _affectedKeyType, 
                _affectedKey,
                _miningKey
            );
        }
        if (_ballotType == uint256(BallotTypes.KeyRemoval)) {
            return _areKeyRemovalBallotParamsValid(
                _affectedKeyType,
                _affectedKey,
                _miningKey
            );
        }
        if (_ballotType == uint256(BallotTypes.KeySwap)) {
            return _areKeySwapBallotParamsValid(
                _affectedKeyType,
                _affectedKey,
                _miningKey
            );
        }
    }

    function proxyStorage() public view returns(address) {
        return addressStorage[PROXY_STORAGE];
    }

    function initDisabled() public view returns(bool) {
        return boolStorage[INIT_DISABLED];
    }

    function init(
        uint256[] _thresholds
    ) public onlyOwner {
        require(!initDisabled());
        require(_thresholds.length == uint256(ThresholdTypes.MetadataChange));
        uint256 thresholdType = uint256(ThresholdTypes.Keys);
        for (; thresholdType <= _thresholds.length; thresholdType++) {
            uint256 thresholdValue = _thresholds[thresholdType - uint256(ThresholdTypes.Keys)];
            if (!_setThreshold(thresholdValue, thresholdType)) {
                revert();
            }
        }
        _initDisable();
    }

    function metadataChangeConfirmationsLimit() public pure returns(uint256) {
        return 50;
    }

    function migrate(address _prevBallotsStorage) public onlyOwner {
        require(_prevBallotsStorage != address(0));
        require(!initDisabled());
        uint8 thresholdKeysType = uint8(ThresholdTypes.Keys);
        uint8 thresholdMetadataType = uint8(ThresholdTypes.MetadataChange);
        IBallotsStoragePrev prevBallotsStorage = IBallotsStoragePrev(_prevBallotsStorage);
        if (!_setThreshold(prevBallotsStorage.getBallotThreshold(thresholdKeysType), thresholdKeysType)) {
            revert();
        }
        if (!_setThreshold(prevBallotsStorage.getBallotThreshold(thresholdMetadataType), thresholdMetadataType)) {
            revert();
        }
        _initDisable();
    }

    function setThreshold(uint256 _newValue, uint256 _thresholdType)
        public
        onlyVotingToChangeThreshold
        returns(bool)
    {
        if (_newValue == getBallotThreshold(_thresholdType)) return false;
        if (!_setThreshold(_newValue, _thresholdType)) return false;
        emit ThresholdChanged(_thresholdType, _newValue);
        return true;
    }

    function getBallotThreshold(uint256 _ballotType) public view returns(uint256) {
        return uintStorage[keccak256(abi.encode(BALLOT_THRESHOLDS, _ballotType))];
    }

    function getVotingToChangeThreshold() public view returns(address) {
        return IProxyStorage(proxyStorage()).getVotingToChangeMinThreshold();
    }

    function getProxyThreshold() public view returns(uint256) {
        return _getTotalNumberOfValidators().div(2).add(1);
    }

    function getBallotLimitPerValidator() public view returns(uint256) {
        uint256 validatorsCount = _getTotalNumberOfValidators();
        if (validatorsCount == 0) {
            return getMaxLimitBallot();
        }
        uint256 limit = getMaxLimitBallot().div(validatorsCount);
        if (limit == 0) {
            limit = 1;
        }
        return limit;
    }
    
    function getMaxLimitBallot() public view returns(uint256) {
        return 200;
    }

    function _areKeyAddingBallotParamsValid(
        uint256 _affectedKeyType,
        address _affectedKey,
        address _miningKey
    ) internal view returns(bool) {
        IKeysManager keysManager = _getKeysManager();
        if (_affectedKeyType == uint256(KeyTypes.MiningKey)) {
            return !keysManager.checkIfMiningExisted(_miningKey, _affectedKey);
        }
        if (_affectedKeyType == uint256(KeyTypes.VotingKey)) {
            require(_miningKey != keysManager.masterOfCeremony());
            require(keysManager.miningKeyByVoting(_affectedKey) == address(0));
            return _affectedKey != _miningKey && keysManager.isMiningActive(_miningKey);
        }
        if (_affectedKeyType == uint256(KeyTypes.PayoutKey)) {
            require(keysManager.miningKeyByPayout(_affectedKey) == address(0));
            return _affectedKey != _miningKey && keysManager.isMiningActive(_miningKey);
        }
    }

    function _areKeyRemovalBallotParamsValid(
        uint256 _affectedKeyType,
        address _affectedKey,
        address _miningKey
    ) internal view returns(bool) {
        IKeysManager keysManager = _getKeysManager();
        require(keysManager.isMiningActive(_miningKey));
        if (_affectedKeyType == uint256(KeyTypes.MiningKey)) {
            return true;
        }
        if (_affectedKeyType == uint256(KeyTypes.VotingKey)) {
            require(_affectedKey != _miningKey);
            address votingKey = keysManager.getVotingByMining(_miningKey);
            require(_affectedKey == votingKey);
            return keysManager.isVotingActive(votingKey);
        }
        if (_affectedKeyType == uint256(KeyTypes.PayoutKey)) {
            require(_affectedKey != _miningKey);
            address payoutKey = keysManager.getPayoutByMining(_miningKey);
            require(_affectedKey == payoutKey);
            return keysManager.isPayoutActive(_miningKey);
        }
    }

    function _areKeySwapBallotParamsValid(
        uint256 _affectedKeyType,
        address _affectedKey,
        address _miningKey
    ) internal view returns(bool) {
        require(_affectedKey != _miningKey);
        IKeysManager keysManager = _getKeysManager();
        require(keysManager.isMiningActive(_miningKey));
        if (_affectedKeyType == uint256(KeyTypes.MiningKey)) {
            return !keysManager.checkIfMiningExisted(_miningKey, _affectedKey);
        }
        if (_affectedKeyType == uint256(KeyTypes.VotingKey)) {
            address votingKey = keysManager.getVotingByMining(_miningKey);
            require(_affectedKey != votingKey);
            require(keysManager.miningKeyByVoting(_affectedKey) == address(0));
            return keysManager.isVotingActive(votingKey);
        }
        if (_affectedKeyType == uint256(KeyTypes.PayoutKey)) {
            address payoutKey = keysManager.getPayoutByMining(_miningKey);
            require(_affectedKey != payoutKey);
            require(keysManager.miningKeyByPayout(_affectedKey) == address(0));
            return keysManager.isPayoutActive(_miningKey);
        }
    }

    function _initDisable() internal {
        boolStorage[INIT_DISABLED] = true;
    }

    function _getKeysManager() internal view returns(IKeysManager) {
        return IKeysManager(IProxyStorage(proxyStorage()).getKeysManager());
    }

    function _getTotalNumberOfValidators() internal view returns(uint256) {
        IProxyStorage proxy = IProxyStorage(proxyStorage());
        IPoaNetworkConsensus poa = IPoaNetworkConsensus(proxy.getPoaConsensus());
        return poa.getCurrentValidatorsLengthWithoutMoC();
    }

    function _setThreshold(uint256 _newValue, uint256 _thresholdType) internal returns(bool) {
        if (_newValue == 0) return false;
        if (_thresholdType == uint256(ThresholdTypes.Invalid)) return false;
        if (_thresholdType > uint256(ThresholdTypes.MetadataChange)) return false;
        if (_thresholdType == uint256(ThresholdTypes.MetadataChange)) {
            if (_newValue > metadataChangeConfirmationsLimit()) {
                return false;
            }
        }
        uintStorage[
            keccak256(abi.encode(BALLOT_THRESHOLDS, _thresholdType))
        ] = _newValue;
        return true;
    }
}


        

Contract ABI

[{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getMaxLimitBallot","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"areKeysBallotParamsValid","inputs":[{"type":"uint256","name":"_ballotType"},{"type":"uint256","name":"_affectedKeyType"},{"type":"address","name":"_affectedKey"},{"type":"address","name":"_miningKey"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getBallotThreshold","inputs":[{"type":"uint256","name":"_ballotType"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"initDisabled","inputs":[],"constant":true},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"metadataChangeConfirmationsLimit","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"proxyStorage","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"setThreshold","inputs":[{"type":"uint256","name":"_newValue"},{"type":"uint256","name":"_thresholdType"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"migrate","inputs":[{"type":"address","name":"_prevBallotsStorage"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"getVotingToChangeThreshold","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"init","inputs":[{"type":"uint256[]","name":"_thresholds"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getProxyThreshold","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"getBallotLimitPerValidator","inputs":[],"constant":true},{"type":"event","name":"ThresholdChanged","inputs":[{"type":"uint256","name":"thresholdType","indexed":true},{"type":"uint256","name":"newValue","indexed":false}],"anonymous":false}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50611588806100206000396000f3006080604052600436106100a05763ffffffff60e060020a600035041663247b321081146100a55780633fd626d4146100cc57806345e23b531461010d57806352a3693814610125578063936736201461013a578063ae4b1b5b1461014f578063b9c3620914610180578063ce5494bb1461019b578063d1104cb2146101be578063d88b06db146101d3578063eecd107914610228578063fcff021c1461023d575b600080fd5b3480156100b157600080fd5b506100ba610252565b60408051918252519081900360200190f35b3480156100d857600080fd5b506100f9600435602435600160a060020a0360443581169060643516610257565b604080519115158252519081900360200190f35b34801561011957600080fd5b506100ba6004356102f1565b34801561013157600080fd5b506100f96103ac565b34801561014657600080fd5b506100ba6103f0565b34801561015b57600080fd5b506101646103f5565b60408051600160a060020a039092168252519081900360200190f35b34801561018c57600080fd5b506100f960043560243561043f565b3480156101a757600080fd5b506101bc600160a060020a03600435166104cd565b005b3480156101ca57600080fd5b5061016461068b565b3480156101df57600080fd5b50604080516020600480358082013583810280860185019096528085526101bc953695939460249493850192918291850190849080828437509497506107039650505050505050565b34801561023457600080fd5b506100ba6107d2565b34801561024957600080fd5b506100ba610803565b60c890565b6000600185101561026757600080fd5b600385111561027557600080fd5b600160a060020a038316151561028a57600080fd5b600184101561029857600080fd5b60038411156102a657600080fd5b60018514156102c1576102ba84848461084a565b90506102e9565b60028514156102d5576102ba848484610b52565b60038514156102e9576102ba848484610e7f565b949350505050565b604080517f62616c6c6f745468726573686f6c64730000000000000000000000000000000060208083019190915281830184905282518083038401815260609092019283905281516000936002938593909282918401908083835b6020831061036b5780518252601f19909201916020918201910161034c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205495945050505050565b604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c01902060009081526006602052205460ff1690565b603290565b604080517f70726f787953746f7261676500000000000000000000000000000000000000008152815190819003600c019020600090815260046020522054600160a060020a031690565b600061044961068b565b600160a060020a0316331461045d57600080fd5b610466826102f1565b831415610475575060006104c7565b61047f8383611281565b151561048d575060006104c7565b60408051848152905183917f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a919081900360200190a25060015b92915050565b604080517f6f776e65720000000000000000000000000000000000000000000000000000008152815190819003600501902060009081526004602052908120548190819033600160a060020a039091161461052757600080fd5b600160a060020a038416151561053c57600080fd5b6105446103ac565b1561054e57600080fd5b60019250600291508390506105e081600160a060020a0316632ffdfc8a856040518263ffffffff1660e060020a028152600401808260ff1660ff168152602001915050602060405180830381600087803b1580156105ab57600080fd5b505af11580156105bf573d6000803e3d6000fd5b505050506040513d60208110156105d557600080fd5b505160ff8516611281565b15156105eb57600080fd5b61067281600160a060020a0316632ffdfc8a846040518263ffffffff1660e060020a028152600401808260ff1660ff168152602001915050602060405180830381600087803b15801561063d57600080fd5b505af1158015610651573d6000803e3d6000fd5b505050506040513d602081101561066757600080fd5b505160ff8416611281565b151561067d57600080fd5b610685611393565b50505050565b60006106956103f5565b600160a060020a031663a3b3fff16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505050506040513d60208110156106fc57600080fd5b5051905090565b604080517f6f776e6572000000000000000000000000000000000000000000000000000000815281519081900360050190206000908152600460205290812054819033600160a060020a039091161461075b57600080fd5b6107636103ac565b1561076d57600080fd5b600283511461077b57600080fd5b600191505b825182116107c557826001830381518110151561079957fe5b9060200190602002015190506107af8183611281565b15156107ba57600080fd5b600190910190610780565b6107cd611393565b505050565b60006107fe60016107f260026107e66113dd565b9063ffffffff6114e816565b9063ffffffff6114ff16565b905090565b60008060006108106113dd565b915081151561082857610821610252565b9250610845565b610834826107e6610252565b9050801515610841575060015b8092505b505090565b600080610855611515565b9050600185141561090157604080517f731fcb9a000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152868116602483015291519183169163731fcb9a916044808201926020929091908290030181600087803b1580156108cd57600080fd5b505af11580156108e1573d6000803e3d6000fd5b505050506040513d60208110156108f757600080fd5b5051159150610b4a565b6002851415610adc5780600160a060020a031663fa81b2006040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094857600080fd5b505af115801561095c573d6000803e3d6000fd5b505050506040513d602081101561097257600080fd5b5051600160a060020a038481169116141561098c57600080fd5b604080517ffa46eacd000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009284169163fa46eacd91602480830192602092919082900301818787803b1580156109f157600080fd5b505af1158015610a05573d6000803e3d6000fd5b505050506040513d6020811015610a1b57600080fd5b5051600160a060020a031614610a3057600080fd5b82600160a060020a031684600160a060020a031614158015610ad5575080600160a060020a0316639bc91c22846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b50515b9150610b4a565b6003851415610b4a57604080517fc04455b5000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009284169163c04455b591602480830192602092919082900301818787803b1580156109f157600080fd5b509392505050565b600080600080610b60611515565b925082600160a060020a0316639bc91c22866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610bbd57600080fd5b505af1158015610bd1573d6000803e3d6000fd5b505050506040513d6020811015610be757600080fd5b50511515610bf457600080fd5b6001871415610c065760019350610e75565b6002871415610d5757600160a060020a038681169086161415610c2857600080fd5b82600160a060020a0316632befe2e1866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b505050506040513d6020811015610cad57600080fd5b50519150600160a060020a0386811690831614610cc957600080fd5b82600160a060020a03166362b46d64836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050506040513d6020811015610d4e57600080fd5b50519350610e75565b6003871415610e7557600160a060020a038681169086161415610d7957600080fd5b82600160a060020a0316637cded930866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b505050506040513d6020811015610dfe57600080fd5b50519050600160a060020a0386811690821614610e1a57600080fd5b82600160a060020a031663fee09285866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d2457600080fd5b5050509392505050565b6000808080600160a060020a038681169086161415610e9d57600080fd5b610ea5611515565b925082600160a060020a0316639bc91c22866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610f0257600080fd5b505af1158015610f16573d6000803e3d6000fd5b505050506040513d6020811015610f2c57600080fd5b50511515610f3957600080fd5b6001871415610fe357604080517f731fcb9a000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152888116602483015291519185169163731fcb9a916044808201926020929091908290030181600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b505050506040513d6020811015610fd957600080fd5b5051159350610e75565b60028714156111325782600160a060020a0316632befe2e1866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561104757600080fd5b505af115801561105b573d6000803e3d6000fd5b505050506040513d602081101561107157600080fd5b50519150600160a060020a03868116908316141561108e57600080fd5b604080517ffa46eacd000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009286169163fa46eacd91602480830192602092919082900301818787803b1580156110f357600080fd5b505af1158015611107573d6000803e3d6000fd5b505050506040513d602081101561111d57600080fd5b5051600160a060020a031614610cc957600080fd5b6003871415610e755782600160a060020a0316637cded930866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561119657600080fd5b505af11580156111aa573d6000803e3d6000fd5b505050506040513d60208110156111c057600080fd5b50519050600160a060020a0386811690821614156111dd57600080fd5b604080517fc04455b5000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009286169163c04455b591602480830192602092919082900301818787803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050506040513d602081101561126c57600080fd5b5051600160a060020a031614610e1a57600080fd5b6000821515611292575060006104c7565b8115156112a1575060006104c7565b60028211156112b2575060006104c7565b60028214156112d2576112c36103f0565b8311156112d2575060006104c7565b604080517f62616c6c6f745468726573686f6c64730000000000000000000000000000000060208083019190915281830185905282518083038401815260609092019283905281518693600293600093909282918401908083835b6020831061134c5780518252601f19909201916020918201910161132d565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550600195945050505050565b604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c0190206000908152600660205220805460ff19166001179055565b60008060006113ea6103f5565b915081600160a060020a0316638b8414c46040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561142a57600080fd5b505af115801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b5051604080517fa87563370000000000000000000000000000000000000000000000000000000081529051919250600160a060020a0383169163a8756337916004808201926020929091908290030181600087803b1580156114b557600080fd5b505af11580156114c9573d6000803e3d6000fd5b505050506040513d60208110156114df57600080fd5b50519250505090565b60008082848115156114f657fe5b04949350505050565b60008282018381101561150e57fe5b9392505050565b600061151f6103f5565b600160a060020a0316639a5737866040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d257600080fd00a165627a7a72305820b7093a5887ce96281264a016be0c954edc9715677c5075b8ef574308d6d61f250029

Deployed ByteCode

0x6080604052600436106100a05763ffffffff60e060020a600035041663247b321081146100a55780633fd626d4146100cc57806345e23b531461010d57806352a3693814610125578063936736201461013a578063ae4b1b5b1461014f578063b9c3620914610180578063ce5494bb1461019b578063d1104cb2146101be578063d88b06db146101d3578063eecd107914610228578063fcff021c1461023d575b600080fd5b3480156100b157600080fd5b506100ba610252565b60408051918252519081900360200190f35b3480156100d857600080fd5b506100f9600435602435600160a060020a0360443581169060643516610257565b604080519115158252519081900360200190f35b34801561011957600080fd5b506100ba6004356102f1565b34801561013157600080fd5b506100f96103ac565b34801561014657600080fd5b506100ba6103f0565b34801561015b57600080fd5b506101646103f5565b60408051600160a060020a039092168252519081900360200190f35b34801561018c57600080fd5b506100f960043560243561043f565b3480156101a757600080fd5b506101bc600160a060020a03600435166104cd565b005b3480156101ca57600080fd5b5061016461068b565b3480156101df57600080fd5b50604080516020600480358082013583810280860185019096528085526101bc953695939460249493850192918291850190849080828437509497506107039650505050505050565b34801561023457600080fd5b506100ba6107d2565b34801561024957600080fd5b506100ba610803565b60c890565b6000600185101561026757600080fd5b600385111561027557600080fd5b600160a060020a038316151561028a57600080fd5b600184101561029857600080fd5b60038411156102a657600080fd5b60018514156102c1576102ba84848461084a565b90506102e9565b60028514156102d5576102ba848484610b52565b60038514156102e9576102ba848484610e7f565b949350505050565b604080517f62616c6c6f745468726573686f6c64730000000000000000000000000000000060208083019190915281830184905282518083038401815260609092019283905281516000936002938593909282918401908083835b6020831061036b5780518252601f19909201916020918201910161034c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205495945050505050565b604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c01902060009081526006602052205460ff1690565b603290565b604080517f70726f787953746f7261676500000000000000000000000000000000000000008152815190819003600c019020600090815260046020522054600160a060020a031690565b600061044961068b565b600160a060020a0316331461045d57600080fd5b610466826102f1565b831415610475575060006104c7565b61047f8383611281565b151561048d575060006104c7565b60408051848152905183917f3164947cf0f49f08dd0cd80e671535b1e11590d347c55dcaa97ba3c24a96b33a919081900360200190a25060015b92915050565b604080517f6f776e65720000000000000000000000000000000000000000000000000000008152815190819003600501902060009081526004602052908120548190819033600160a060020a039091161461052757600080fd5b600160a060020a038416151561053c57600080fd5b6105446103ac565b1561054e57600080fd5b60019250600291508390506105e081600160a060020a0316632ffdfc8a856040518263ffffffff1660e060020a028152600401808260ff1660ff168152602001915050602060405180830381600087803b1580156105ab57600080fd5b505af11580156105bf573d6000803e3d6000fd5b505050506040513d60208110156105d557600080fd5b505160ff8516611281565b15156105eb57600080fd5b61067281600160a060020a0316632ffdfc8a846040518263ffffffff1660e060020a028152600401808260ff1660ff168152602001915050602060405180830381600087803b15801561063d57600080fd5b505af1158015610651573d6000803e3d6000fd5b505050506040513d602081101561066757600080fd5b505160ff8416611281565b151561067d57600080fd5b610685611393565b50505050565b60006106956103f5565b600160a060020a031663a3b3fff16040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d257600080fd5b505af11580156106e6573d6000803e3d6000fd5b505050506040513d60208110156106fc57600080fd5b5051905090565b604080517f6f776e6572000000000000000000000000000000000000000000000000000000815281519081900360050190206000908152600460205290812054819033600160a060020a039091161461075b57600080fd5b6107636103ac565b1561076d57600080fd5b600283511461077b57600080fd5b600191505b825182116107c557826001830381518110151561079957fe5b9060200190602002015190506107af8183611281565b15156107ba57600080fd5b600190910190610780565b6107cd611393565b505050565b60006107fe60016107f260026107e66113dd565b9063ffffffff6114e816565b9063ffffffff6114ff16565b905090565b60008060006108106113dd565b915081151561082857610821610252565b9250610845565b610834826107e6610252565b9050801515610841575060015b8092505b505090565b600080610855611515565b9050600185141561090157604080517f731fcb9a000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152868116602483015291519183169163731fcb9a916044808201926020929091908290030181600087803b1580156108cd57600080fd5b505af11580156108e1573d6000803e3d6000fd5b505050506040513d60208110156108f757600080fd5b5051159150610b4a565b6002851415610adc5780600160a060020a031663fa81b2006040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561094857600080fd5b505af115801561095c573d6000803e3d6000fd5b505050506040513d602081101561097257600080fd5b5051600160a060020a038481169116141561098c57600080fd5b604080517ffa46eacd000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009284169163fa46eacd91602480830192602092919082900301818787803b1580156109f157600080fd5b505af1158015610a05573d6000803e3d6000fd5b505050506040513d6020811015610a1b57600080fd5b5051600160a060020a031614610a3057600080fd5b82600160a060020a031684600160a060020a031614158015610ad5575080600160a060020a0316639bc91c22846040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610aa857600080fd5b505af1158015610abc573d6000803e3d6000fd5b505050506040513d6020811015610ad257600080fd5b50515b9150610b4a565b6003851415610b4a57604080517fc04455b5000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009284169163c04455b591602480830192602092919082900301818787803b1580156109f157600080fd5b509392505050565b600080600080610b60611515565b925082600160a060020a0316639bc91c22866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610bbd57600080fd5b505af1158015610bd1573d6000803e3d6000fd5b505050506040513d6020811015610be757600080fd5b50511515610bf457600080fd5b6001871415610c065760019350610e75565b6002871415610d5757600160a060020a038681169086161415610c2857600080fd5b82600160a060020a0316632befe2e1866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b505050506040513d6020811015610cad57600080fd5b50519150600160a060020a0386811690831614610cc957600080fd5b82600160a060020a03166362b46d64836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050506040513d6020811015610d4e57600080fd5b50519350610e75565b6003871415610e7557600160a060020a038681169086161415610d7957600080fd5b82600160a060020a0316637cded930866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b505050506040513d6020811015610dfe57600080fd5b50519050600160a060020a0386811690821614610e1a57600080fd5b82600160a060020a031663fee09285866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d2457600080fd5b5050509392505050565b6000808080600160a060020a038681169086161415610e9d57600080fd5b610ea5611515565b925082600160a060020a0316639bc91c22866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610f0257600080fd5b505af1158015610f16573d6000803e3d6000fd5b505050506040513d6020811015610f2c57600080fd5b50511515610f3957600080fd5b6001871415610fe357604080517f731fcb9a000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152888116602483015291519185169163731fcb9a916044808201926020929091908290030181600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b505050506040513d6020811015610fd957600080fd5b5051159350610e75565b60028714156111325782600160a060020a0316632befe2e1866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561104757600080fd5b505af115801561105b573d6000803e3d6000fd5b505050506040513d602081101561107157600080fd5b50519150600160a060020a03868116908316141561108e57600080fd5b604080517ffa46eacd000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009286169163fa46eacd91602480830192602092919082900301818787803b1580156110f357600080fd5b505af1158015611107573d6000803e3d6000fd5b505050506040513d602081101561111d57600080fd5b5051600160a060020a031614610cc957600080fd5b6003871415610e755782600160a060020a0316637cded930866040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801561119657600080fd5b505af11580156111aa573d6000803e3d6000fd5b505050506040513d60208110156111c057600080fd5b50519050600160a060020a0386811690821614156111dd57600080fd5b604080517fc04455b5000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915160009286169163c04455b591602480830192602092919082900301818787803b15801561124257600080fd5b505af1158015611256573d6000803e3d6000fd5b505050506040513d602081101561126c57600080fd5b5051600160a060020a031614610e1a57600080fd5b6000821515611292575060006104c7565b8115156112a1575060006104c7565b60028211156112b2575060006104c7565b60028214156112d2576112c36103f0565b8311156112d2575060006104c7565b604080517f62616c6c6f745468726573686f6c64730000000000000000000000000000000060208083019190915281830185905282518083038401815260609092019283905281518693600293600093909282918401908083835b6020831061134c5780518252601f19909201916020918201910161132d565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550600195945050505050565b604080517f696e697444697361626c656400000000000000000000000000000000000000008152815190819003600c0190206000908152600660205220805460ff19166001179055565b60008060006113ea6103f5565b915081600160a060020a0316638b8414c46040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561142a57600080fd5b505af115801561143e573d6000803e3d6000fd5b505050506040513d602081101561145457600080fd5b5051604080517fa87563370000000000000000000000000000000000000000000000000000000081529051919250600160a060020a0383169163a8756337916004808201926020929091908290030181600087803b1580156114b557600080fd5b505af11580156114c9573d6000803e3d6000fd5b505050506040513d60208110156114df57600080fd5b50519250505090565b60008082848115156114f657fe5b04949350505050565b60008282018381101561150e57fe5b9392505050565b600061151f6103f5565b600160a060020a0316639a5737866040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156106d257600080fd00a165627a7a72305820b7093a5887ce96281264a016be0c954edc9715677c5075b8ef574308d6d61f250029