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
Creator
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