Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 65 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Explicit | 10012826 | 1653 days ago | IN | 0 ETH | 0.00803046 | ||||
Create Explicit | 9993185 | 1656 days ago | IN | 0 ETH | 0.00240913 | ||||
Create Explicit | 9979691 | 1658 days ago | IN | 0 ETH | 0.00266632 | ||||
Create Explicit | 9979670 | 1658 days ago | IN | 0 ETH | 0.00241652 | ||||
Create Explicit | 9979638 | 1658 days ago | IN | 0 ETH | 0.00240913 | ||||
Create Explicit | 9940358 | 1664 days ago | IN | 0 ETH | 0.00265005 | ||||
Create Explicit | 9875378 | 1674 days ago | IN | 0 ETH | 0.00200761 | ||||
Create Explicit | 9844263 | 1679 days ago | IN | 0 ETH | 0.00120456 | ||||
Create Explicit | 9827178 | 1681 days ago | IN | 0 ETH | 0.00084319 | ||||
Create Explicit | 9684678 | 1703 days ago | IN | 0 ETH | 0.00160609 | ||||
Create Explicit | 9582754 | 1719 days ago | IN | 0 ETH | 0.00040152 | ||||
Create Explicit | 9506059 | 1731 days ago | IN | 0 ETH | 0.00040152 | ||||
Create Explicit | 9457451 | 1738 days ago | IN | 0 ETH | 0.00048182 | ||||
Create Explicit | 9301304 | 1762 days ago | IN | 0 ETH | 0.00040152 | ||||
Create Explicit | 9297387 | 1763 days ago | IN | 0 ETH | 0.00119587 | ||||
Create Explicit | 9296313 | 1763 days ago | IN | 0 ETH | 0.00120456 | ||||
Create Explicit | 9282053 | 1765 days ago | IN | 0 ETH | 0.00080304 | ||||
Create Explicit | 9152124 | 1787 days ago | IN | 0 ETH | 0.00160617 | ||||
Create Explicit | 9117056 | 1794 days ago | IN | 0 ETH | 0.00120456 | ||||
Create Explicit | 9079201 | 1801 days ago | IN | 0 ETH | 0.00040152 | ||||
Create Explicit | 9062599 | 1804 days ago | IN | 0 ETH | 0.00407867 | ||||
Create Explicit | 9053249 | 1806 days ago | IN | 0 ETH | 0.00044865 | ||||
Create Explicit | 9049606 | 1807 days ago | IN | 0 ETH | 0.0006118 | ||||
Create Explicit | 9043643 | 1808 days ago | IN | 0 ETH | 0.00040909 | ||||
Create Explicit | 9043611 | 1808 days ago | IN | 0 ETH | 0.00040786 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
OneWayGriefing_Factory
Compiler Version
v0.5.7+commit.6da8b019
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-08-24 */ pragma solidity ^0.5.0; /** * @title Spawn * @author 0age * @notice This contract provides creation code that is used by Spawner in order * to initialize and deploy eip-1167 minimal proxies for a given logic contract. */ contract Spawn { constructor( address logicContract, bytes memory initializationCalldata ) public payable { // delegatecall into the logic contract to perform initialization. (bool ok, ) = logicContract.delegatecall(initializationCalldata); if (!ok) { // pass along failure message from delegatecall and revert. assembly { returndatacopy(0, 0, returndatasize) revert(0, returndatasize) } } // place eip-1167 runtime code in memory. bytes memory runtimeCode = abi.encodePacked( bytes10(0x363d3d373d3d3d363d73), logicContract, bytes15(0x5af43d82803e903d91602b57fd5bf3) ); // return eip-1167 code to write it to spawned contract runtime. assembly { return(add(0x20, runtimeCode), 45) // eip-1167 runtime code, length } } } /** * @title Spawner * @author 0age * @notice This contract spawns and initializes eip-1167 minimal proxies that * point to existing logic contracts. The logic contracts need to have an * intitializer function that should only callable when no contract exists at * their current address (i.e. it is being `DELEGATECALL`ed from a constructor). */ contract Spawner { /** * @notice Internal function for spawning an eip-1167 minimal proxy using * `CREATE2`. * @param logicContract address The address of the logic contract. * @param initializationCalldata bytes The calldata that will be supplied to * the `DELEGATECALL` from the spawned contract to the logic contract during * contract creation. * @return The address of the newly-spawned contract. */ function _spawn( address logicContract, bytes memory initializationCalldata ) internal returns (address spawnedContract) { // place creation code and constructor args of contract to spawn in memory. bytes memory initCode = abi.encodePacked( type(Spawn).creationCode, abi.encode(logicContract, initializationCalldata) ); // spawn the contract using `CREATE2`. spawnedContract = _spawnCreate2(initCode); } /** * @notice Internal view function for finding the address of the next standard * eip-1167 minimal proxy created using `CREATE2` with a given logic contract * and initialization calldata payload. * @param logicContract address The address of the logic contract. * @param initializationCalldata bytes The calldata that will be supplied to * the `DELEGATECALL` from the spawned contract to the logic contract during * contract creation. * @return The address of the next spawned minimal proxy contract with the * given parameters. */ function _computeNextAddress( address logicContract, bytes memory initializationCalldata ) internal view returns (address target) { // place creation code and constructor args of contract to spawn in memory. bytes memory initCode = abi.encodePacked( type(Spawn).creationCode, abi.encode(logicContract, initializationCalldata) ); // get target address using the constructed initialization code. (, target) = _getSaltAndTarget(initCode); } /** * @notice Private function for spawning a compact eip-1167 minimal proxy * using `CREATE2`. Provides logic that is reused by internal functions. A * salt will also be chosen based on the calling address and a computed nonce * that prevents deployments to existing addresses. * @param initCode bytes The contract creation code. * @return The address of the newly-spawned contract. */ function _spawnCreate2( bytes memory initCode ) private returns (address spawnedContract) { // get salt to use during deployment using the supplied initialization code. (bytes32 salt, ) = _getSaltAndTarget(initCode); assembly { let encoded_data := add(0x20, initCode) // load initialization code. let encoded_size := mload(initCode) // load the init code's length. spawnedContract := create2( // call `CREATE2` w/ 4 arguments. callvalue, // forward any supplied endowment. encoded_data, // pass in initialization code. encoded_size, // pass in init code's length. salt // pass in the salt value. ) // pass along failure message from failed contract deployment and revert. if iszero(spawnedContract) { returndatacopy(0, 0, returndatasize) revert(0, returndatasize) } } } /** * @notice Private function for determining the salt and the target deployment * address for the next spawned contract (using create2) based on the contract * creation code. */ function _getSaltAndTarget( bytes memory initCode ) private view returns (bytes32 salt, address target) { // get the keccak256 hash of the init code for address derivation. bytes32 initCodeHash = keccak256(initCode); // set the initial nonce to be provided when constructing the salt. uint256 nonce = 0; // declare variable for code size of derived address. uint256 codeSize; while (true) { // derive `CREATE2` salt using `msg.sender` and nonce. salt = keccak256(abi.encodePacked(msg.sender, nonce)); target = address( // derive the target deployment address. uint160( // downcast to match the address type. uint256( // cast to uint to truncate upper digits. keccak256( // compute CREATE2 hash using 4 inputs. abi.encodePacked( // pack all inputs to the hash together. bytes1(0xff), // pass in the control character. address(this), // pass in the address of this contract. salt, // pass in the salt from above. initCodeHash // pass in hash of contract creation code. ) ) ) ) ); // determine if a contract is already deployed to the target address. assembly { codeSize := extcodesize(target) } // exit the loop if no contract is deployed to the target address. if (codeSize == 0) { break; } // otherwise, increment the nonce and derive a new salt. nonce++; } } } interface iRegistry { enum FactoryStatus { Unregistered, Registered, Retired } event FactoryAdded(address owner, address factory, uint256 factoryID, bytes extraData); event FactoryRetired(address owner, address factory, uint256 factoryID); event InstanceRegistered(address instance, uint256 instanceIndex, address indexed creator, address indexed factory, uint256 indexed factoryID); // factory state functions function addFactory(address factory, bytes calldata extraData ) external; function retireFactory(address factory) external; // factory view functions function getFactoryCount() external view returns (uint256 count); function getFactoryStatus(address factory) external view returns (FactoryStatus status); function getFactoryID(address factory) external view returns (uint16 factoryID); function getFactoryData(address factory) external view returns (bytes memory extraData); function getFactoryAddress(uint16 factoryID) external view returns (address factory); function getFactory(address factory) external view returns (FactoryStatus state, uint16 factoryID, bytes memory extraData); function getFactories() external view returns (address[] memory factories); function getPaginatedFactories(uint256 startIndex, uint256 endIndex) external view returns (address[] memory factories); // instance state functions function register(address instance, address creator, uint80 extraData) external; // instance view functions function getInstanceType() external view returns (bytes4 instanceType); function getInstanceCount() external view returns (uint256 count); function getInstance(uint256 index) external view returns (address instance); function getInstances() external view returns (address[] memory instances); function getPaginatedInstances(uint256 startIndex, uint256 endIndex) external view returns (address[] memory instances); } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error. */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } contract Metadata { bytes private _staticMetadata; bytes private _variableMetadata; event StaticMetadataSet(bytes staticMetadata); event VariableMetadataSet(bytes variableMetadata); // state functions function _setStaticMetadata(bytes memory staticMetadata) internal { require(_staticMetadata.length == 0, "static metadata cannot be changed"); _staticMetadata = staticMetadata; emit StaticMetadataSet(staticMetadata); } function _setVariableMetadata(bytes memory variableMetadata) internal { _variableMetadata = variableMetadata; emit VariableMetadataSet(variableMetadata); } // view functions function getMetadata() public view returns (bytes memory staticMetadata, bytes memory variableMetadata) { staticMetadata = _staticMetadata; variableMetadata = _variableMetadata; } } contract Operated { address private _operator; bool private _status; event OperatorUpdated(address operator, bool status); // state functions function _setOperator(address operator) internal { require(_operator != operator, "cannot set same operator"); _operator = operator; emit OperatorUpdated(operator, hasActiveOperator()); } function _transferOperator(address operator) internal { // transferring operator-ship implies there was an operator set before this require(_operator != address(0), "operator not set"); _setOperator(operator); } function _renounceOperator() internal { require(hasActiveOperator(), "only when operator active"); _operator = address(0); _status = false; emit OperatorUpdated(address(0), false); } function _activateOperator() internal { require(!hasActiveOperator(), "only when operator not active"); _status = true; emit OperatorUpdated(_operator, true); } function _deactivateOperator() internal { require(hasActiveOperator(), "only when operator active"); _status = false; emit OperatorUpdated(_operator, false); } // view functions function getOperator() public view returns (address operator) { operator = _operator; } function isOperator(address caller) public view returns (bool ok) { return (caller == getOperator()); } function hasActiveOperator() public view returns (bool ok) { return _status; } function isActiveOperator(address caller) public view returns (bool ok) { return (isOperator(caller) && hasActiveOperator()); } } /* Deadline * */ contract Deadline { uint256 private _deadline; event DeadlineSet(uint256 deadline); // state functions function _setDeadline(uint256 deadline) internal { _deadline = deadline; emit DeadlineSet(deadline); } // view functions function getDeadline() public view returns (uint256 deadline) { deadline = _deadline; } // if the _deadline is not set yet, isAfterDeadline will return true // due to now - 0 = now function isAfterDeadline() public view returns (bool status) { if (_deadline == 0) { status = false; } else { status = (now >= _deadline); } } } /* @title DecimalMath * @dev taken from https://github.com/PolymathNetwork/polymath-core * @dev Apache v2 License */ library DecimalMath { using SafeMath for uint256; uint256 internal constant e18 = uint256(10) ** uint256(18); /** * @notice This function multiplies two decimals represented as (decimal * 10**DECIMALS) * @return uint256 Result of multiplication represented as (decimal * 10**DECIMALS) */ function mul(uint256 x, uint256 y) internal pure returns(uint256 z) { z = SafeMath.add(SafeMath.mul(x, y), (e18) / 2) / (e18); } /** * @notice This function divides two decimals represented as (decimal * 10**DECIMALS) * @return uint256 Result of division represented as (decimal * 10**DECIMALS) */ function div(uint256 x, uint256 y) internal pure returns(uint256 z) { z = SafeMath.add(SafeMath.mul(x, (e18)), y / 2) / y; } } /* TODO: Update eip165 interface * bytes4(keccak256('create(bytes)')) == 0xcf5ba53f * bytes4(keccak256('getInstanceType()')) == 0x18c2f4cf * bytes4(keccak256('getInstanceRegistry()')) == 0xa5e13904 * bytes4(keccak256('getImplementation()')) == 0xaaf10f42 * * => 0xcf5ba53f ^ 0x18c2f4cf ^ 0xa5e13904 ^ 0xaaf10f42 == 0xd88967b6 */ interface iFactory { event InstanceCreated(address indexed instance, address indexed creator, string initABI, bytes initData); function create(bytes calldata initData) external returns (address instance); function getInitdataABI() external view returns (string memory initABI); function getInstanceRegistry() external view returns (address instanceRegistry); function getTemplate() external view returns (address template); function getInstanceCreator(address instance) external view returns (address creator); function getInstanceType() external view returns (bytes4 instanceType); function getInstanceCount() external view returns (uint256 count); function getInstance(uint256 index) external view returns (address instance); function getInstances() external view returns (address[] memory instances); function getPaginatedInstances(uint256 startIndex, uint256 endIndex) external view returns (address[] memory instances); } contract iNMR { // ERC20 function totalSupply() external returns (uint256); function balanceOf(address _owner) external returns (uint256); function allowance(address _owner, address _spender) external returns (uint256); function transfer(address _to, uint256 _value) external returns (bool ok); function transferFrom(address _from, address _to, uint256 _value) external returns (bool ok); function approve(address _spender, uint256 _value) external returns (bool ok); function changeApproval(address _spender, uint256 _oldValue, uint256 _newValue) external returns (bool ok); // burn function mint(uint256 _value) external returns (bool ok); // burnFrom function numeraiTransfer(address _to, uint256 _value) external returns (bool ok); } contract Factory is Spawner { address[] private _instances; mapping (address => address) private _instanceCreator; /* NOTE: The following items can be hardcoded as constant to save ~200 gas/create */ address private _templateContract; string private _initdataABI; address private _instanceRegistry; bytes4 private _instanceType; event InstanceCreated(address indexed instance, address indexed creator, bytes callData); function _initialize(address instanceRegistry, address templateContract, bytes4 instanceType, string memory initdataABI) internal { // set instance registry _instanceRegistry = instanceRegistry; // set logic contract _templateContract = templateContract; // set initdataABI _initdataABI = initdataABI; // validate correct instance registry require(instanceType == iRegistry(instanceRegistry).getInstanceType(), 'incorrect instance type'); // set instanceType _instanceType = instanceType; } // IFactory methods function _create(bytes memory callData) internal returns (address instance) { // deploy new contract: initialize it & write minimal proxy to runtime. instance = Spawner._spawn(getTemplate(), callData); // add the instance to the array _instances.push(instance); // set instance creator _instanceCreator[instance] = msg.sender; // add the instance to the instance registry iRegistry(getInstanceRegistry()).register(instance, msg.sender, uint64(0)); // emit event emit InstanceCreated(instance, msg.sender, callData); } function getInstanceCreator(address instance) public view returns (address creator) { creator = _instanceCreator[instance]; } function getInstanceType() public view returns (bytes4 instanceType) { instanceType = _instanceType; } function getInitdataABI() public view returns (string memory initdataABI) { initdataABI = _initdataABI; } function getInstanceRegistry() public view returns (address instanceRegistry) { instanceRegistry = _instanceRegistry; } function getTemplate() public view returns (address template) { template = _templateContract; } function getInstanceCount() public view returns (uint256 count) { count = _instances.length; } function getInstance(uint256 index) public view returns (address instance) { require(index < _instances.length, "index out of range"); instance = _instances[index]; } function getInstances() public view returns (address[] memory instances) { instances = _instances; } // Note: startIndex is inclusive, endIndex exclusive function getPaginatedInstances(uint256 startIndex, uint256 endIndex) public view returns (address[] memory instances) { require(startIndex < endIndex, "startIndex must be less than endIndex"); require(endIndex <= _instances.length, "end index out of range"); // initialize fixed size memory array address[] memory range = new address[](endIndex - startIndex); // Populate array with addresses in range for (uint256 i = startIndex; i < endIndex; i++) { range[i - startIndex] = _instances[i]; } // return array of addresses instances = range; } } /* Countdown timer */ contract Countdown is Deadline { using SafeMath for uint256; uint256 private _length; event LengthSet(uint256 length); // state functions function _setLength(uint256 length) internal { _length = length; emit LengthSet(length); } function _start() internal returns (uint256 deadline) { require(_length != 0, "length not set"); deadline = _length.add(now); Deadline._setDeadline(deadline); } // view functions function getLength() public view returns (uint256 length) { length = _length; } // if Deadline._setDeadline or Countdown._setLength is not called, // isOver will yield false function isOver() public view returns (bool status) { // when length or deadline not set, // countdown has not started, hence not isOver if (_length == 0 || Deadline.getDeadline() == 0) { status = false; } else { status = Deadline.isAfterDeadline(); } } // timeRemaining will default to 0 if _setDeadline is not called // if the now exceeds deadline, just return 0 as the timeRemaining function timeRemaining() public view returns (uint256 time) { if (now >= Deadline.getDeadline()) { time = 0; } else { time = Deadline.getDeadline().sub(now); } } } contract Template { address private _factory; // modifiers modifier initializeTemplate() { // set factory _factory = msg.sender; // only allow function to be delegatecalled from within a constructor. uint32 codeSize; assembly { codeSize := extcodesize(address) } require(codeSize == 0, "must be called within contract constructor"); _; } // view functions function getCreator() public view returns (address creator) { // iFactory(...) would revert if _factory address is not actually a factory contract creator = iFactory(_factory).getInstanceCreator(address(this)); } function isCreator(address caller) public view returns (bool ok) { ok = (caller == getCreator()); } } /** * @title NMR token burning helper * @dev Allows for calling NMR burn functions using regular openzeppelin ERC20Burnable interface and revert on failure. */ contract BurnNMR { // address of the token address private _Token; // can be hardcoded on mainnet deployment to reduce cost function _setToken(address token) internal { // set storage _Token = token; } /** * @dev Burns a specific amount of tokens. * @param value The amount of token to be burned. */ function _burn(uint256 value) internal { require(iNMR(_Token).mint(value), "nmr burn failed"); } /** * @dev Burns a specific amount of tokens from the target address and decrements allowance. * @param from address The account whose tokens will be burned. * @param value uint256 The amount of token to be burned. */ function _burnFrom(address from, uint256 value) internal { require(iNMR(_Token).numeraiTransfer(from, value), "nmr burnFrom failed"); } function getToken() public view returns (address token) { token = _Token; } } contract Staking is BurnNMR { using SafeMath for uint256; mapping (address => uint256) private _stake; event TokenSet(address token); event StakeAdded(address staker, address funder, uint256 amount, uint256 newStake); event StakeTaken(address staker, address recipient, uint256 amount, uint256 newStake); event StakeBurned(address staker, uint256 amount, uint256 newStake); modifier tokenMustBeSet() { require(BurnNMR.getToken() != address(0), "token not set yet"); _; } // state functions function _setToken(address token) internal { // set storage BurnNMR._setToken(token); // emit event emit TokenSet(token); } function _addStake(address staker, address funder, uint256 currentStake, uint256 amountToAdd) internal tokenMustBeSet { // require current stake amount matches expected amount require(currentStake == _stake[staker], "current stake incorrect"); // require non-zero stake to add require(amountToAdd > 0, "no stake to add"); // calculate new stake amount uint256 newStake = currentStake.add(amountToAdd); // set new stake to storage _stake[staker] = newStake; // transfer the stake amount require(IERC20(BurnNMR.getToken()).transferFrom(funder, address(this), amountToAdd), "token transfer failed"); // emit event emit StakeAdded(staker, funder, amountToAdd, newStake); } function _takeStake(address staker, address recipient, uint256 currentStake, uint256 amountToTake) internal tokenMustBeSet { // require current stake amount matches expected amount require(currentStake == _stake[staker], "current stake incorrect"); // require non-zero stake to take require(amountToTake > 0, "no stake to take"); // amountToTake has to be less than equal currentStake require(amountToTake <= currentStake, "cannot take more than currentStake"); // calculate new stake amount uint256 newStake = currentStake.sub(amountToTake); // set new stake to storage _stake[staker] = newStake; // transfer the stake amount require(IERC20(BurnNMR.getToken()).transfer(recipient, amountToTake), "token transfer failed"); // emit event emit StakeTaken(staker, recipient, amountToTake, newStake); } function _takeFullStake(address staker, address recipient) internal tokenMustBeSet returns (uint256 stake) { // get stake from storage stake = _stake[staker]; // take full stake _takeStake(staker, recipient, stake, stake); } function _burnStake(address staker, uint256 currentStake, uint256 amountToBurn) tokenMustBeSet internal { // require current stake amount matches expected amount require(currentStake == _stake[staker], "current stake incorrect"); // require non-zero stake to burn require(amountToBurn > 0, "no stake to burn"); // amountToTake has to be less than equal currentStake require(amountToBurn <= currentStake, "cannot burn more than currentStake"); // calculate new stake amount uint256 newStake = currentStake.sub(amountToBurn); // set new stake to storage _stake[staker] = newStake; // burn the stake amount BurnNMR._burn(amountToBurn); // emit event emit StakeBurned(staker, amountToBurn, newStake); } function _burnFullStake(address staker) internal tokenMustBeSet returns (uint256 stake) { // get stake from storage stake = _stake[staker]; // burn full stake _burnStake(staker, stake, stake); } // view functions function getStake(address staker) public view returns (uint256 stake) { stake = _stake[staker]; } } contract Griefing is Staking { enum RatioType { NaN, Inf, Dec } mapping (address => GriefRatio) private _griefRatio; struct GriefRatio { uint256 ratio; RatioType ratioType; } event RatioSet(address staker, uint256 ratio, RatioType ratioType); event Griefed(address punisher, address staker, uint256 punishment, uint256 cost, bytes message); uint256 internal constant e18 = uint256(10) ** uint256(18); // state functions function _setRatio(address staker, uint256 ratio, RatioType ratioType) internal { if (ratioType == RatioType.NaN || ratioType == RatioType.Inf) { require(ratio == 0, "ratio must be 0 when ratioType is NaN or Inf"); } // set data in storage _griefRatio[staker].ratio = ratio; _griefRatio[staker].ratioType = ratioType; // emit event emit RatioSet(staker, ratio, ratioType); } function _grief(address punisher, address staker, uint256 punishment, bytes memory message) internal returns (uint256 cost) { require(BurnNMR.getToken() != address(0), "token not set"); // get grief data from storage uint256 ratio = _griefRatio[staker].ratio; RatioType ratioType = _griefRatio[staker].ratioType; require(ratioType != RatioType.NaN, "no punishment allowed"); // calculate cost // getCost also acts as a guard when _setRatio is not called before cost = getCost(ratio, punishment, ratioType); // burn the cost from the punisher's balance BurnNMR._burnFrom(punisher, cost); // get stake from storage uint256 currentStake = Staking.getStake(staker); // burn the punishment from the target's stake Staking._burnStake(staker, currentStake, punishment); // emit event emit Griefed(punisher, staker, punishment, cost, message); } // view functions function getRatio(address staker) public view returns (uint256 ratio, RatioType ratioType) { // get stake data from storage ratio = _griefRatio[staker].ratio; ratioType = _griefRatio[staker].ratioType; } // pure functions function getCost(uint256 ratio, uint256 punishment, RatioType ratioType) public pure returns(uint256 cost) { /* Dec: Cost multiplied by ratio interpreted as a decimal number with 18 decimals, e.g. 1 -> 1e18 * Inf: Punishment at no cost * NaN: No Punishment */ if (ratioType == RatioType.Dec) { return DecimalMath.mul(SafeMath.mul(punishment, e18), ratio) / e18; } if (ratioType == RatioType.Inf) return 0; if (ratioType == RatioType.NaN) revert("ratioType cannot be RatioType.NaN"); } function getPunishment(uint256 ratio, uint256 cost, RatioType ratioType) public pure returns(uint256 punishment) { /* Dec: Ratio is a decimal number with 18 decimals * Inf: Punishment at no cost * NaN: No Punishment */ if (ratioType == RatioType.Dec) { return DecimalMath.div(SafeMath.mul(cost, e18), ratio) / e18; } if (ratioType == RatioType.Inf) revert("ratioType cannot be RatioType.Inf"); if (ratioType == RatioType.NaN) revert("ratioType cannot be RatioType.NaN"); } } /* Immediately engage with specific buyer * - Stake can be increased at any time. * - Request to end agreement and recover stake requires cooldown period to complete. * - Counterparty can greif the staker at predefined ratio. * * NOTE: * - This top level contract should only perform access control and state transitions * */ contract OneWayGriefing is Countdown, Griefing, Metadata, Operated, Template { using SafeMath for uint256; Data private _data; struct Data { address staker; address counterparty; } function initialize( address token, address operator, address staker, address counterparty, uint256 ratio, Griefing.RatioType ratioType, uint256 countdownLength, bytes memory staticMetadata ) public initializeTemplate() { // set storage values _data.staker = staker; _data.counterparty = counterparty; // set operator if (operator != address(0)) { Operated._setOperator(operator); Operated._activateOperator(); } // set token used for staking Staking._setToken(token); // set griefing ratio Griefing._setRatio(staker, ratio, ratioType); // set countdown length Countdown._setLength(countdownLength); // set static metadata Metadata._setStaticMetadata(staticMetadata); } // state functions function setVariableMetadata(bytes memory variableMetadata) public { // restrict access require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator"); // update metadata Metadata._setVariableMetadata(variableMetadata); } function increaseStake(uint256 currentStake, uint256 amountToAdd) public { // restrict access require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator"); // require agreement is not ended require(!Countdown.isOver(), "agreement ended"); // add stake Staking._addStake(_data.staker, msg.sender, currentStake, amountToAdd); } function reward(uint256 currentStake, uint256 amountToAdd) public { // restrict access require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator"); // require agreement is not ended require(!Countdown.isOver(), "agreement ended"); // add stake Staking._addStake(_data.staker, msg.sender, currentStake, amountToAdd); } function punish(address from, uint256 punishment, bytes memory message) public returns (uint256 cost) { // restrict access require(isCounterparty(msg.sender) || Operated.isActiveOperator(msg.sender), "only counterparty or active operator"); // require agreement is not ended require(!Countdown.isOver(), "agreement ended"); // execute griefing cost = Griefing._grief(from, _data.staker, punishment, message); } function startCountdown() public returns (uint256 deadline) { // restrict access require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator"); // require countdown is not started require(Deadline.getDeadline() == 0, "deadline already set"); // start countdown deadline = Countdown._start(); } function retrieveStake(address recipient) public returns (uint256 amount) { // restrict access require(isStaker(msg.sender) || Operated.isActiveOperator(msg.sender), "only staker or active operator"); // require deadline is passed require(Deadline.isAfterDeadline(),"deadline not passed"); // retrieve stake amount = Staking._takeFullStake(_data.staker, recipient); } function transferOperator(address operator) public { // restrict access require(Operated.isActiveOperator(msg.sender), "only active operator"); // transfer operator Operated._transferOperator(operator); } function renounceOperator() public { // restrict access require(Operated.isActiveOperator(msg.sender), "only active operator"); // transfer operator Operated._renounceOperator(); } // view functions function isStaker(address caller) public view returns (bool validity) { validity = (caller == _data.staker); } function isCounterparty(address caller) public view returns (bool validity) { validity = (caller == _data.counterparty); } } contract OneWayGriefing_Factory is Factory { constructor(address instanceRegistry) public { // deploy template contract address templateContract = address(new OneWayGriefing()); // set instance type bytes4 instanceType = bytes4(keccak256(bytes('Agreement'))); // set initdataABI string memory initdataABI = '(address,address,address,address,uint256,uint8,uint256,bytes)'; // initialize factory params Factory._initialize(instanceRegistry, templateContract, instanceType, initdataABI); } event ExplicitInitData(address indexed staker, address indexed counterparty, address indexed operator, uint256 ratio, Griefing.RatioType ratioType, uint256 countdownLength, bytes staticMetadata); function create(bytes memory callData) public returns (address instance) { // deploy instance instance = Factory._create(callData); } function createEncoded(bytes memory initdata) public returns (address instance) { // decode initdata ( address token, address operator, address staker, address counterparty, uint256 ratio, Griefing.RatioType ratioType, // uint8 uint256 countdownLength, bytes memory staticMetadata ) = abi.decode(initdata, (address,address,address,address,uint256,Griefing.RatioType,uint256,bytes)); // call explicit create instance = createExplicit(token, operator, staker, counterparty, ratio, ratioType, countdownLength, staticMetadata); } function createExplicit( address token, address operator, address staker, address counterparty, uint256 ratio, Griefing.RatioType ratioType, // uint8 uint256 countdownLength, bytes memory staticMetadata ) public returns (address instance) { // declare template in memory OneWayGriefing template; // construct the data payload used when initializing the new contract. bytes memory callData = abi.encodeWithSelector( template.initialize.selector, // selector token, // token operator, // operator staker, // staker counterparty, // counterparty ratio, // ratio ratioType, // ratioType countdownLength, // countdownLength staticMetadata // staticMetadata ); // deploy instance instance = Factory._create(callData); // emit event emit ExplicitInitData(staker, counterparty, operator, ratio, ratioType, countdownLength, staticMetadata); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"getInstanceType","outputs":[{"name":"instanceType","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTemplate","outputs":[{"name":"template","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"operator","type":"address"},{"name":"staker","type":"address"},{"name":"counterparty","type":"address"},{"name":"ratio","type":"uint256"},{"name":"ratioType","type":"uint8"},{"name":"countdownLength","type":"uint256"},{"name":"staticMetadata","type":"bytes"}],"name":"createExplicit","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"instance","type":"address"}],"name":"getInstanceCreator","outputs":[{"name":"creator","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"initdata","type":"bytes"}],"name":"createEncoded","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInstanceRegistry","outputs":[{"name":"instanceRegistry","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitdataABI","outputs":[{"name":"initdataABI","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInstanceCount","outputs":[{"name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"startIndex","type":"uint256"},{"name":"endIndex","type":"uint256"}],"name":"getPaginatedInstances","outputs":[{"name":"instances","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"callData","type":"bytes"}],"name":"create","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInstances","outputs":[{"name":"instances","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"getInstance","outputs":[{"name":"instance","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"instanceRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"staker","type":"address"},{"indexed":true,"name":"counterparty","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"ratio","type":"uint256"},{"indexed":false,"name":"ratioType","type":"uint8"},{"indexed":false,"name":"countdownLength","type":"uint256"},{"indexed":false,"name":"staticMetadata","type":"bytes"}],"name":"ExplicitInitData","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"instance","type":"address"},{"indexed":true,"name":"creator","type":"address"},{"indexed":false,"name":"callData","type":"bytes"}],"name":"InstanceCreated","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160208062005cb4833981018060405260208110156200003357600080fd5b810190808051906020019092919050505060006040516200005490620002ec565b604051809103906000f08015801562000071573d6000803e3d6000fd5b50905060006040518060400160405280600981526020017f41677265656d656e74000000000000000000000000000000000000000000000081525080519060200120905060606040518060600160405280603d815260200162005c77603d91399050620000ec84848484620000f660201b6200164f1760201c565b50505050620003a9565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806003908051906020019062000190929190620002fa565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b158015620001d857600080fd5b505afa158015620001ed573d6000803e3d6000fd5b505050506040513d60208110156200020457600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620002c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b613d5c8062001f1b83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200033d57805160ff19168380011785556200036e565b828001600101855582156200036e579182015b828111156200036d57825182559160200191906001019062000350565b5b5090506200037d919062000381565b5090565b620003a691905b80821115620003a257600081600090555060010162000388565b5090565b90565b611b6280620003b96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063a61352e111610071578063a61352e1146104c5578063ae34325c14610548578063b71f2e7214610566578063cf5ba53f146105f3578063d35fdd79146106ee578063ebd348de1461074d576100b4565b806318c2f4cf146100b9578063321c48f214610115578063461ffcbe1461015f5780636bf71982146102fc5780636f8d11e614610380578063a5e139041461047b575b600080fd5b6100c16107bb565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61011d6107d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ba600480360361010081101561017657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019064010000000081111561023457600080fd5b82018360208201111561024657600080fd5b8035906020019184600183028401116401000000008311171561026857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506107fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61033e6004803603602081101561031257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b0d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104396004803603602081101561039657600080fd5b81019080803590602001906401000000008111156103b357600080fd5b8201836020820111156103c557600080fd5b803590602001918460018302840111640100000000831117156103e757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610483610c62565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104cd610c8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050d5780820151818401526020810190506104f2565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610550610d2e565b6040518082815260200191505060405180910390f35b61059c6004803603604081101561057c57600080fd5b810190808035906020019092919080359060200190929190505050610d3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105df5780820151818401526020810190506105c4565b505050509050019250505060405180910390f35b6106ac6004803603602081101561060957600080fd5b810190808035906020019064010000000081111561062657600080fd5b82018360208201111561063857600080fd5b8035906020019184600183028401116401000000008311171561065a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610eeb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f6610efd565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561073957808201518184015260208101905061071e565b505050509050019250505060405180910390f35b6107796004803603602081101561076357600080fd5b8101908080359060200190929190505050610f8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460149054906101000a900460e01b905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060608173ffffffffffffffffffffffffffffffffffffffff16633121d2e7905060e01b8b8b8b8b8b8b8b8b604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184600281111561090b57fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561095557808201518184015260208101905061093a565b50505050905090810190601f1680156109825780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506109f681611045565b92508973ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fa75a9e87c1a935b115363faab238af03d2784cfa15088fd8b63ca8d8422d824d8a8a8a8a60405180858152602001846002811115610a7857fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ac2578082015181840152602081019050610aa7565b50505050905090810190601f168015610aef5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4505098975050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600080600080606089806020019051610100811015610b9a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051640100000000811115610bf857600080fd5b82810190506020810184811115610c0e57600080fd5b8151856001820283011164010000000082111715610c2b57600080fd5b505092919050505097509750975097509750975097509750610c5388888888888888886107fc565b98505050505050505050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b60008080549050905090565b6060818310610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611b126025913960400191505060405180910390fd5b600080549050821115610e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f656e6420696e646578206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b6060838303604051908082528060200260200182016040528015610e425781602001602082028038833980820191505090505b50905060008490505b83811015610ee05760008181548110610e6057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286830381518110610e9957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610e4b565b508091505092915050565b6000610ef682611045565b9050919050565b60606000805480602002602001604051908101604052809291908181526020018280548015610f8157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f37575b5050505050905090565b600080805490508210611006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e646578206f7574206f662072616e6765000000000000000000000000000081525060200191505060405180910390fd5b6000828154811061101357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110586110526107d2565b836112fe565b905060008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505033600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611146610c62565b73ffffffffffffffffffffffffffffffffffffffff1663bba83f64823360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1669ffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fab60131c1462939275d0fd3738e07ab853e22af6296cf75e71bbdf3a497791a2846040518080602001828103825283818151815260200191508051906020019080838360005b838110156112bf5780820151818401526020810190506112a4565b50505050905090810190601f1680156112ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3919050565b600060606040518060200161131290611642565b6020820181038252601f19601f820116604052508484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561139d578082015181840152602081019050611382565b50505050905090810190601f1680156113ca5780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040526040516020018083805190602001908083835b6020831061141557805182526020820191506020810190506020830392506113f2565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083106114665780518252602082019150602081019050602083039250611443565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290506114a6816114af565b91505092915050565b6000806114bb836114e2565b50905082602001835182818334f59350836114da573d6000803e3d6000fd5b505050919050565b600080600083805190602001209050600080905060005b60011561163a573382604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019250505060405160208183030381529060405280519060200120945060ff60f81b30868560405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9350833b9050600081141561162d5761163a565b81806001019250506114f9565b505050915091565b61022d806118e583390190565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600390805190602001906116e792919061183f565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061188057805160ff19168380011785556118ae565b828001600101855582156118ae579182015b828111156118ad578251825591602001919060010190611892565b5b5090506118bb91906118bf565b5090565b6118e191905b808211156118dd5760008160009055506001016118c5565b5090565b9056fe608060405260405161022d38038061022d8339810180604052604081101561002657600080fd5b8101908080519060200190929190805164010000000081111561004857600080fd5b8281019050602081018481111561005e57600080fd5b815185600182028301116401000000008211171561007b57600080fd5b505092919050505060008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083106100d057805182526020820191506020810190506020830392506100ad565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b5050905080610148573d6000803e3d6000fd5b606069363d3d373d3d3d363d7360b01b846e5af43d82803e903d91602b57fd5bf360881b604051602001808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152600a018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018270ffffffffffffffffffffffffffffffffff191670ffffffffffffffffffffffffffffffffff19168152600f0193505050506040516020818303038152906040529050602d81602001f3fe7374617274496e646578206d757374206265206c657373207468616e20656e64496e646578a165627a7a72305820c300684635d15217d8b29a1e33b25fa6fa4dce6cdb4d59265eb7bff40c12ac4a0029608060405234801561001057600080fd5b50613d3c806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636f1e8533116100f9578063a4fa8d5711610097578063bec10cde11610071578063bec10cde14610ae2578063e3cfef6014610b1a578063e7f43c6814610b38578063efd4606514610b82576101c4565b8063a4fa8d5714610a6a578063b4bd9e2714610aa2578063be1c766b14610ac4576101c4565b80637878f257116100d35780637878f257146108df5780637a5b4f59146109015780637a766460146109f0578063923b176214610a48576101c4565b80636f1e8533146107ba57806373f500af14610816578063754b270714610872576101c4565b80633367cca5116101665780635baeb806116101405780635baeb806146106c95780635e5365c1146107225780635f8d96de146107405780636d70f7ae1461075e576101c4565b80633367cca5146105bc57806341ce287814610618578063465b414e14610670576101c4565b806327305e83116101a257806327305e831461035657806329605e77146104115780632ab6f8db146104555780633121d2e71461045f576101c4565b8063060e468f146101c95780630ee2cb10146102c257806321df0da71461030c575b600080fd5b6102ac600480360360608110156101df57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561022657600080fd5b82018360208201111561023857600080fd5b8035906020019184600183028401116401000000008311171561025a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610bde565b6040518082815260200191505060405180910390f35b6102ca610d03565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610314610de4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61040f6004803603602081101561036c57600080fd5b810190808035906020019064010000000081111561038957600080fd5b82018360208201111561039b57600080fd5b803590602001918460018302840111640100000000831117156103bd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610e0e565b005b6104536004803603602081101561042757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ea5565b005b61045d610f2c565b005b6105ba600480360361010081101561047657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019064010000000081111561053457600080fd5b82018360208201111561054657600080fd5b8035906020019184600183028401116401000000008311171561056857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610fb1565b005b6105fe600480360360208110156105d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611156565b604051808215151515815260200191505060405180910390f35b61065a6004803603602081101561062e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611178565b6040518082815260200191505060405180910390f35b6106b36004803603606081101561068657600080fd5b810190808035906020019092919080359060200190929190803560ff1690602001909291905050506112b5565b6040518082815260200191505060405180910390f35b61070c600480360360608110156106df57600080fd5b810190808035906020019092919080359060200190929190803560ff1690602001909291905050506113a0565b6040518082815260200191505060405180910390f35b61072a6114d3565b6040518082815260200191505060405180910390f35b6107486115ea565b6040518082815260200191505060405180910390f35b6107a06004803603602081101561077457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115f3565b604051808215151515815260200191505060405180910390f35b6107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611632565b604051808215151515815260200191505060405180910390f35b6108586004803603602081101561082c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061168f565b604051808215151515815260200191505060405180910390f35b6108b46004803603602081101561088857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116ec565b604051808381526020018260028111156108ca57fe5b60ff1681526020019250505060405180910390f35b6108e761178b565b604051808215151515815260200191505060405180910390f35b6109096117ac565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561094d578082015181840152602081019050610932565b50505050905090810190601f16801561097a5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156109b3578082015181840152602081019050610998565b50505050905090810190601f1680156109e05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b610a3260048036036020811015610a0657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118ed565b6040518082815260200191505060405180910390f35b610a50611936565b604051808215151515815260200191505060405180910390f35b610aa060048036036040811015610a8057600080fd5b81019080803590602001909291908035906020019092919050505061194d565b005b610aaa611a6b565b604051808215151515815260200191505060405180910390f35b610acc611aa0565b6040518082815260200191505060405180910390f35b610b1860048036036040811015610af857600080fd5b810190808035906020019092919080359060200190929190505050611aaa565b005b610b22611be5565b6040518082815260200191505060405180910390f35b610b40611c1e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610bc460048036036020811015610b9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c48565b604051808215151515815260200191505060405180910390f35b6000610be93361168f565b80610bf95750610bf833611156565b5b610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613c336024913960400191505060405180910390fd5b610c56611a6b565b15610cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f61677265656d656e7420656e646564000000000000000000000000000000000081525060200191505060405180910390fd5b610cfa84600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168585611c87565b90509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636bf71982306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610da457600080fd5b505afa158015610db8573d6000803e3d6000fd5b505050506040513d6020811015610dce57600080fd5b8101908080519060200190929190505050905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e1733611632565b80610e275750610e2633611156565b5b610e99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b610ea281611fa8565b50565b610eae33611156565b610f20576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c7920616374697665206f70657261746f7200000000000000000000000081525060200191505060405180910390fd5b610f298161205e565b50565b610f3533611156565b610fa7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6f6e6c7920616374697665206f70657261746f7200000000000000000000000081525060200191505060405180910390fd5b610faf61212f565b565b33600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000303b905060008163ffffffff1614611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613c9a602a913960400191505060405180910390fd5b86600960000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600960010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146111255761111c88612278565b6111246123f6565b5b61112e89612520565b61113987868661258f565b61114283612759565b61114b8261279a565b505050505050505050565b6000611161826115f3565b80156111715750611170611936565b5b9050919050565b600061118333611632565b80611193575061119233611156565b5b611205576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b61120d61178b565b61127f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f646561646c696e65206e6f74207061737365640000000000000000000000000081525060200191505060405180910390fd5b6112ae600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836128bf565b9050919050565b60006002808111156112c357fe5b8260028111156112cf57fe5b1415611300576012600a0a6112f16112eb856012600a0a6129be565b86612a44565b816112f857fe5b049050611399565b6001600281111561130d57fe5b82600281111561131957fe5b14156113285760009050611399565b6000600281111561133557fe5b82600281111561134157fe5b1415611398576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b5b9392505050565b60006002808111156113ae57fe5b8260028111156113ba57fe5b14156113eb576012600a0a6113dc6113d6856012600a0a6129be565b86612a7c565b816113e357fe5b0490506114cc565b600160028111156113f857fe5b82600281111561140457fe5b141561145b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613bcf6021913960400191505060405180910390fd5b6000600281111561146857fe5b82600281111561147457fe5b14156114cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613cc46021913960400191505060405180910390fd5b5b9392505050565b60006114de33611632565b806114ee57506114ed33611156565b5b611560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b600061156a6115ea565b146115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f646561646c696e6520616c72656164792073657400000000000000000000000081525060200191505060405180910390fd5b6115e5612ab0565b905090565b60008054905090565b60006115fd611c1e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600960010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549150600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050915091565b60008060005414156117a057600090506117a9565b60005442101590505b90565b60608060058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118455780601f1061181a57610100808354040283529160200191611845565b820191906000526020600020905b81548152906001019060200180831161182857829003601f168201915b5050505050915060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118e25780601f106118b7576101008083540402835291602001916118e2565b820191906000526020600020905b8154815290600101906020018083116118c557829003601f168201915b505050505090509091565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600760149054906101000a900460ff16905090565b6119563361168f565b80611966575061196533611156565b5b6119bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613c336024913960400191505060405180910390fd5b6119c3611a6b565b15611a36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f61677265656d656e7420656e646564000000000000000000000000000000000081525060200191505060405180910390fd5b611a67600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338484612b4d565b5050565b6000806001541480611a8457506000611a826115ea565b145b15611a925760009050611a9d565b611a9a61178b565b90505b90565b6000600154905090565b611ab333611632565b80611ac35750611ac233611156565b5b611b35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f6e6c79207374616b6572206f7220616374697665206f70657261746f72000081525060200191505060405180910390fd5b611b3d611a6b565b15611bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f61677265656d656e7420656e646564000000000000000000000000000000000081525060200191505060405180910390fd5b611be1600960000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16338484612b4d565b5050565b6000611bef6115ea565b4210611bfe5760009050611c1b565b611c1842611c0a6115ea565b612f9990919063ffffffff16565b90505b90565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611c52610d03565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16611ca8610de4565b73ffffffffffffffffffffffffffffffffffffffff161415611d32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f746f6b656e206e6f74207365740000000000000000000000000000000000000081525060200191505060405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16905060006002811115611dda57fe5b816002811115611de657fe5b1415611e5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f6e6f2070756e6973686d656e7420616c6c6f776564000000000000000000000081525060200191505060405180910390fd5b611e658286836112b5565b9250611e718784613022565b6000611e7c876118ed565b9050611e8987828861317c565b7fca93c648a4546f2ae486b9140f0082ced75a2664a663c8882b8b3545cddfeeb18888888789604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611f5f578082015181840152602081019050611f44565b50505050905090810190601f168015611f8c5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a1505050949350505050565b8060069080519060200190611fbe929190613b29565b507fec391f097a91107044327f7588bc67ac8b9daf871413fc181f768c437c66cda9816040518080602001828103825283818151815260200191508051906020019080838360005b83811015612021578082015181840152602081019050612006565b50505050905090810190601f16801561204e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612123576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6f70657261746f72206e6f74207365740000000000000000000000000000000081525060200191505060405180910390fd5b61212c81612278565b50565b612137611936565b6121a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6f6e6c79207768656e206f70657261746f72206163746976650000000000000081525060200191505060405180910390fd5b6000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600760146101000a81548160ff0219169083151502179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d600080604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1565b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f63616e6e6f74207365742073616d65206f70657261746f72000000000000000081525060200191505060405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d816123a7611936565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a150565b6123fe611936565b15612471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f6f6e6c79207768656e206f70657261746f72206e6f742061637469766500000081525060200191505060405180910390fd5b6001600760146101000a81548160ff0219169083151502179055507f966c160e1c4dbc7df8d69af4ace01e9297c3cf016397b7914971f2fbfa32672d600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001821515151581526020019250505060405180910390a1565b61252981613486565b7fa07c91c183e42229e705a9795a1c06d76528b673788b849597364528c96eefb781604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000600281111561259c57fe5b8160028111156125a857fe5b14806125ca5750600160028111156125bc57fe5b8160028111156125c857fe5b145b156126295760008214612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613ce5602c913960400191505060405180910390fd5b5b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555080600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff021916908360028111156126ce57fe5b02179055507fc964ed8af672f908dc7ba57f61d45a87a7e179cecf5198e7b7d53c920d898f06838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182600281111561273f57fe5b60ff168152602001935050505060405180910390a1505050565b806001819055507f7caceb1091bbaa84d09ab116a1fd72387eaab8a33d70fc39168b9b75686ee32c816040518082815260200191505060405180910390a150565b6000600580546001816001161561010002031660029004905014612809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613bf06021913960400191505060405180910390fd5b806005908051906020019061281f929190613b29565b507fd2bb68a4c0cbd7fabc3f8e787a6e54384db17d54dedeede61c35819f5f49edca816040518080602001828103825283818151815260200191508051906020019080838360005b83811015612882578082015181840152602081019050612867565b50505050905090810190601f1680156128af5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b60008073ffffffffffffffffffffffffffffffffffffffff166128e0610de4565b73ffffffffffffffffffffffffffffffffffffffff16141561296a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506129b8838383846134ca565b92915050565b6000808314156129d15760009050612a3e565b60008284029050828482816129e257fe5b0414612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c576021913960400191505060405180910390fd5b809150505b92915050565b60006012600a0a612a6c612a5885856129be565b60026012600a0a81612a6657fe5b0461393b565b81612a7357fe5b04905092915050565b600081612aa0612a90856012600a0a6129be565b60028581612a9a57fe5b0461393b565b81612aa757fe5b04905092915050565b6000806001541415612b2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f6c656e677468206e6f742073657400000000000000000000000000000000000081525060200191505060405180910390fd5b612b3f4260015461393b90919063ffffffff16565b9050612b4a816139c3565b90565b600073ffffffffffffffffffffffffffffffffffffffff16612b6d610de4565b73ffffffffffffffffffffffffffffffffffffffff161415612bf7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214612cab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63757272656e74207374616b6520696e636f727265637400000000000000000081525060200191505060405180910390fd5b60008111612d21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6e6f207374616b6520746f20616464000000000000000000000000000000000081525060200191505060405180910390fd5b6000612d36828461393b90919063ffffffff16565b905080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612d84610de4565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd8530856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015612e3e57600080fd5b505af1158015612e52573d6000803e3d6000fd5b505050506040513d6020811015612e6857600080fd5b8101908080519060200190929190505050612eeb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7fef7c8dfef14cbefdf829b8f066b068b677992411137321d64b3ed4538c2b363785858484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b600082821115613011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b600082840390508091505092915050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c8d56b883836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156130cb57600080fd5b505af11580156130df573d6000803e3d6000fd5b505050506040513d60208110156130f557600080fd5b8101908080519060200190929190505050613178576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6e6d72206275726e46726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff1661319c610de4565b73ffffffffffffffffffffffffffffffffffffffff161415613226576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482146132da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63757272656e74207374616b6520696e636f727265637400000000000000000081525060200191505060405180910390fd5b60008111613350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f207374616b6520746f206275726e0000000000000000000000000000000081525060200191505060405180910390fd5b818111156133a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613c786022913960400191505060405180910390fd5b60006133be8284612f9990919063ffffffff16565b905080600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061340d82613a04565b7ff470d7f6c239014b63db190652ebe51433a828b65e06d9972143c34c2e2ca3bc848383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a150505050565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff166134ea610de4565b73ffffffffffffffffffffffffffffffffffffffff161415613574576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6b656e206e6f74207365742079657400000000000000000000000000000081525060200191505060405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548214613628576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f63757272656e74207374616b6520696e636f727265637400000000000000000081525060200191505060405180910390fd5b6000811161369e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f207374616b6520746f2074616b650000000000000000000000000000000081525060200191505060405180910390fd5b818111156136f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613c116022913960400191505060405180910390fd5b600061370c8284612f9990919063ffffffff16565b905080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061375a610de4565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156137e057600080fd5b505af11580156137f4573d6000803e3d6000fd5b505050506040513d602081101561380a57600080fd5b810190808051906020019092919050505061388d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f79cb01d8e263c1d344176f9a596b5a6aa14a7df350a227e2e7df836a087b566185858484604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a15050505050565b6000808284019050838110156139b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b806000819055507f337b880688eb06df8adb77036a6c8def1da2b520bc901c04b3a5a23f9ae13039816040518082815260200191505060405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68826040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015613a7957600080fd5b505af1158015613a8d573d6000803e3d6000fd5b505050506040513d6020811015613aa357600080fd5b8101908080519060200190929190505050613b26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6e6d72206275726e206661696c6564000000000000000000000000000000000081525060200191505060405180910390fd5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b6a57805160ff1916838001178555613b98565b82800160010185558215613b98579182015b82811115613b97578251825591602001919060010190613b7c565b5b509050613ba59190613ba9565b5090565b613bcb91905b80821115613bc7576000816000905550600101613baf565b5090565b9056fe726174696f547970652063616e6e6f7420626520526174696f547970652e496e66737461746963206d657461646174612063616e6e6f74206265206368616e67656463616e6e6f742074616b65206d6f7265207468616e2063757272656e745374616b656f6e6c7920636f756e7465727061727479206f7220616374697665206f70657261746f72536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616e6e6f74206275726e206d6f7265207468616e2063757272656e745374616b656d7573742062652063616c6c65642077697468696e20636f6e747261637420636f6e7374727563746f72726174696f547970652063616e6e6f7420626520526174696f547970652e4e614e726174696f206d7573742062652030207768656e20726174696f54797065206973204e614e206f7220496e66a165627a7a72305820ba4e5a2270ef014a646ddbad947413becbdd7419c61b56679cdcb02a557e86de002928616464726573732c616464726573732c616464726573732c616464726573732c75696e743235362c75696e74382c75696e743235362c627974657329000000000000000000000000a6cf4bf00fef8866e9f3f61c972ba7c687c6edbf
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063a61352e111610071578063a61352e1146104c5578063ae34325c14610548578063b71f2e7214610566578063cf5ba53f146105f3578063d35fdd79146106ee578063ebd348de1461074d576100b4565b806318c2f4cf146100b9578063321c48f214610115578063461ffcbe1461015f5780636bf71982146102fc5780636f8d11e614610380578063a5e139041461047b575b600080fd5b6100c16107bb565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b61011d6107d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102ba600480360361010081101561017657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190803590602001909291908035906020019064010000000081111561023457600080fd5b82018360208201111561024657600080fd5b8035906020019184600183028401116401000000008311171561026857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506107fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61033e6004803603602081101561031257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b0d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104396004803603602081101561039657600080fd5b81019080803590602001906401000000008111156103b357600080fd5b8201836020820111156103c557600080fd5b803590602001918460018302840111640100000000831117156103e757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610b76565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610483610c62565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104cd610c8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561050d5780820151818401526020810190506104f2565b50505050905090810190601f16801561053a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610550610d2e565b6040518082815260200191505060405180910390f35b61059c6004803603604081101561057c57600080fd5b810190808035906020019092919080359060200190929190505050610d3a565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105df5780820151818401526020810190506105c4565b505050509050019250505060405180910390f35b6106ac6004803603602081101561060957600080fd5b810190808035906020019064010000000081111561062657600080fd5b82018360208201111561063857600080fd5b8035906020019184600183028401116401000000008311171561065a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610eeb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106f6610efd565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561073957808201518184015260208101905061071e565b505050509050019250505060405180910390f35b6107796004803603602081101561076357600080fd5b8101908080359060200190929190505050610f8b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600460149054906101000a900460e01b905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060608173ffffffffffffffffffffffffffffffffffffffff16633121d2e7905060e01b8b8b8b8b8b8b8b8b604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184600281111561090b57fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561095557808201518184015260208101905061093a565b50505050905090810190601f1680156109825780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506109f681611045565b92508973ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fa75a9e87c1a935b115363faab238af03d2784cfa15088fd8b63ca8d8422d824d8a8a8a8a60405180858152602001846002811115610a7857fe5b60ff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ac2578082015181840152602081019050610aa7565b50505050905090810190601f168015610aef5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4505098975050505050505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080600080600080606089806020019051610100811015610b9a57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051640100000000811115610bf857600080fd5b82810190506020810184811115610c0e57600080fd5b8151856001820283011164010000000082111715610c2b57600080fd5b505092919050505097509750975097509750975097509750610c5388888888888888886107fc565b98505050505050505050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b60008080549050905090565b6060818310610d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611b126025913960400191505060405180910390fd5b600080549050821115610e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f656e6420696e646578206f7574206f662072616e67650000000000000000000081525060200191505060405180910390fd5b6060838303604051908082528060200260200182016040528015610e425781602001602082028038833980820191505090505b50905060008490505b83811015610ee05760008181548110610e6057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168286830381518110610e9957fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050610e4b565b508091505092915050565b6000610ef682611045565b9050919050565b60606000805480602002602001604051908101604052809291908181526020018280548015610f8157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f37575b5050505050905090565b600080805490508210611006576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f696e646578206f7574206f662072616e6765000000000000000000000000000081525060200191505060405180910390fd5b6000828154811061101357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006110586110526107d2565b836112fe565b905060008190806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505033600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611146610c62565b73ffffffffffffffffffffffffffffffffffffffff1663bba83f64823360006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018267ffffffffffffffff1669ffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fab60131c1462939275d0fd3738e07ab853e22af6296cf75e71bbdf3a497791a2846040518080602001828103825283818151815260200191508051906020019080838360005b838110156112bf5780820151818401526020810190506112a4565b50505050905090810190601f1680156112ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3919050565b600060606040518060200161131290611642565b6020820181038252601f19601f820116604052508484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561139d578082015181840152602081019050611382565b50505050905090810190601f1680156113ca5780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040526040516020018083805190602001908083835b6020831061141557805182526020820191506020810190506020830392506113f2565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b602083106114665780518252602082019150602081019050602083039250611443565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290506114a6816114af565b91505092915050565b6000806114bb836114e2565b50905082602001835182818334f59350836114da573d6000803e3d6000fd5b505050919050565b600080600083805190602001209050600080905060005b60011561163a573382604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018281526020019250505060405160208183030381529060405280519060200120945060ff60f81b30868560405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018381526020018281526020019450505050506040516020818303038152906040528051906020012060001c9350833b9050600081141561162d5761163a565b81806001019250506114f9565b505050915091565b61022d806118e583390190565b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600390805190602001906116e792919061183f565b508373ffffffffffffffffffffffffffffffffffffffff166318c2f4cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561172e57600080fd5b505afa158015611742573d6000803e3d6000fd5b505050506040513d602081101561175857600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461181b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f696e636f727265637420696e7374616e6365207479706500000000000000000081525060200191505060405180910390fd5b81600460146101000a81548163ffffffff021916908360e01c021790555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061188057805160ff19168380011785556118ae565b828001600101855582156118ae579182015b828111156118ad578251825591602001919060010190611892565b5b5090506118bb91906118bf565b5090565b6118e191905b808211156118dd5760008160009055506001016118c5565b5090565b9056fe608060405260405161022d38038061022d8339810180604052604081101561002657600080fd5b8101908080519060200190929190805164010000000081111561004857600080fd5b8281019050602081018481111561005e57600080fd5b815185600182028301116401000000008211171561007b57600080fd5b505092919050505060008273ffffffffffffffffffffffffffffffffffffffff16826040518082805190602001908083835b602083106100d057805182526020820191506020810190506020830392506100ad565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d8060008114610130576040519150601f19603f3d011682016040523d82523d6000602084013e610135565b606091505b5050905080610148573d6000803e3d6000fd5b606069363d3d373d3d3d363d7360b01b846e5af43d82803e903d91602b57fd5bf360881b604051602001808475ffffffffffffffffffffffffffffffffffffffffffff191675ffffffffffffffffffffffffffffffffffffffffffff19168152600a018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018270ffffffffffffffffffffffffffffffffff191670ffffffffffffffffffffffffffffffffff19168152600f0193505050506040516020818303038152906040529050602d81602001f3fe7374617274496e646578206d757374206265206c657373207468616e20656e64496e646578a165627a7a72305820c300684635d15217d8b29a1e33b25fa6fa4dce6cdb4d59265eb7bff40c12ac4a0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a6cf4bf00fef8866e9f3f61c972ba7c687c6edbf
-----Decoded View---------------
Arg [0] : instanceRegistry (address): 0xa6cf4Bf00feF8866e9F3f61C972bA7C687C6eDbF
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a6cf4bf00fef8866e9f3f61c972ba7c687c6edbf
Swarm Source
bzzr://ba4e5a2270ef014a646ddbad947413becbdd7419c61b56679cdcb02a557e86de
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.