Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
261,016.66666666665 WE.R.LIVE
Holders
19
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
4,000 WE.R.LIVEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SecurityToken
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-07-31 */ pragma solidity ^0.4.24; /** * @title Math * @dev Assorted math operations */ library Math { function max64(uint64 a, uint64 b) internal pure returns (uint64) { return a >= b ? a : b; } function min64(uint64 a, uint64 b) internal pure returns (uint64) { return a < b ? a : b; } function max256(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } function min256(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval( address indexed owner, address indexed spender, uint256 value ); } contract IERC20 is ERC20 { function decreaseApproval( address _spender, uint _subtractedValue ) public returns (bool); function increaseApproval( address _spender, uint _addedValue ) public returns (bool); } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting '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; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } } /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) balances; uint256 totalSupply_; /** * @dev total number of tokens in existence */ function totalSupply() public view returns (uint256) { return totalSupply_; } /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } } /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * @dev https://github.com/ethereum/EIPs/issues/20 * @dev Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol */ contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom( address _from, address _to, uint256 _value ) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); emit Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance( address _owner, address _spender ) public view returns (uint256) { return allowed[_owner][_spender]; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _addedValue The amount of tokens to increase the allowance by. */ function increaseApproval( address _spender, uint _addedValue ) public returns (bool) { allowed[msg.sender][_spender] = ( allowed[msg.sender][_spender].add(_addedValue)); emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * * approve should be called when allowed[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * @param _spender The address which will spend the funds. * @param _subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseApproval( address _spender, uint _subtractedValue ) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } /** * @title DetailedERC20 token * @dev The decimals are only for visualization purposes. * All the operations are done using the smallest and indivisible token unit, * just as on Ethereum all the operations are done in wei. */ contract DetailedERC20 is ERC20 { string public name; string public symbol; uint8 public decimals; constructor(string _name, string _symbol, uint8 _decimals) public { name = _name; symbol = _symbol; decimals = _decimals; } } /** * @title Interface for the ST20 token standard */ contract IST20 is StandardToken, DetailedERC20 { // off-chain hash string public tokenDetails; //transfer, transferFrom must respect use respect the result of verifyTransfer function verifyTransfer(address _from, address _to, uint256 _amount) public returns (bool success); /** * @notice mints new tokens and assigns them to the target _investor. * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet) */ function mint(address _investor, uint256 _amount) public returns (bool success); /** * @notice Burn function used to burn the securityToken * @param _value No. of token that get burned */ function burn(uint256 _value) public; event Minted(address indexed to, uint256 amount); event Burnt(address indexed _burner, uint256 _value); } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } /** * @title Interface for all security tokens */ contract ISecurityToken is IST20, Ownable { uint8 public constant PERMISSIONMANAGER_KEY = 1; uint8 public constant TRANSFERMANAGER_KEY = 2; uint8 public constant STO_KEY = 3; uint8 public constant CHECKPOINT_KEY = 4; uint256 public granularity; // Value of current checkpoint uint256 public currentCheckpointId; // Total number of non-zero token holders uint256 public investorCount; // List of token holders address[] public investors; // Permissions this to a Permission module, which has a key of 1 // If no Permission return false - note that IModule withPerm will allow ST owner all permissions anyway // this allows individual modules to override this logic if needed (to not allow ST owner all permissions) function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool); /** * @notice returns module list for a module type * @param _moduleType is which type of module we are trying to remove * @param _moduleIndex is the index of the module within the chosen type */ function getModule(uint8 _moduleType, uint _moduleIndex) public view returns (bytes32, address); /** * @notice returns module list for a module name - will return first match * @param _moduleType is which type of module we are trying to remove * @param _name is the name of the module within the chosen type */ function getModuleByName(uint8 _moduleType, bytes32 _name) public view returns (bytes32, address); /** * @notice Queries totalSupply as of a defined checkpoint * @param _checkpointId Checkpoint ID to query as of */ function totalSupplyAt(uint256 _checkpointId) public view returns(uint256); /** * @notice Queries balances as of a defined checkpoint * @param _investor Investor to query balance for * @param _checkpointId Checkpoint ID to query as of */ function balanceOfAt(address _investor, uint256 _checkpointId) public view returns(uint256); /** * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy */ function createCheckpoint() public returns(uint256); /** * @notice gets length of investors array * NB - this length may differ from investorCount if list has not been pruned of zero balance investors * @return length */ function getInvestorsLength() public view returns(uint256); } /** * @title Interface that any module factory contract should implement */ contract IModuleFactory is Ownable { ERC20 public polyToken; uint256 public setupCost; uint256 public usageCost; uint256 public monthlySubscriptionCost; event LogChangeFactorySetupFee(uint256 _oldSetupcost, uint256 _newSetupCost, address _moduleFactory); event LogChangeFactoryUsageFee(uint256 _oldUsageCost, uint256 _newUsageCost, address _moduleFactory); event LogChangeFactorySubscriptionFee(uint256 _oldSubscriptionCost, uint256 _newMonthlySubscriptionCost, address _moduleFactory); event LogGenerateModuleFromFactory(address _module, bytes32 indexed _moduleName, address indexed _moduleFactory, address _creator, uint256 _timestamp); /** * @notice Constructor * @param _polyAddress Address of the polytoken */ constructor (address _polyAddress, uint256 _setupCost, uint256 _usageCost, uint256 _subscriptionCost) public { polyToken = ERC20(_polyAddress); setupCost = _setupCost; usageCost = _usageCost; monthlySubscriptionCost = _subscriptionCost; } //Should create an instance of the Module, or throw function deploy(bytes _data) external returns(address); /** * @notice Type of the Module factory */ function getType() public view returns(uint8); /** * @notice Get the name of the Module */ function getName() public view returns(bytes32); /** * @notice Get the description of the Module */ function getDescription() public view returns(string); /** * @notice Get the title of the Module */ function getTitle() public view returns(string); /** * @notice Get the Instructions that helped to used the module */ function getInstructions() public view returns (string); /** * @notice Get the tags related to the module factory */ function getTags() public view returns (bytes32[]); //Pull function sig from _data function getSig(bytes _data) internal pure returns (bytes4 sig) { uint len = _data.length < 4 ? _data.length : 4; for (uint i = 0; i < len; i++) { sig = bytes4(uint(sig) + uint(_data[i]) * (2 ** (8 * (len - 1 - i)))); } } /** * @notice used to change the fee of the setup cost * @param _newSetupCost new setup cost */ function changeFactorySetupFee(uint256 _newSetupCost) public onlyOwner { emit LogChangeFactorySetupFee(setupCost, _newSetupCost, address(this)); setupCost = _newSetupCost; } /** * @notice used to change the fee of the usage cost * @param _newUsageCost new usage cost */ function changeFactoryUsageFee(uint256 _newUsageCost) public onlyOwner { emit LogChangeFactoryUsageFee(usageCost, _newUsageCost, address(this)); usageCost = _newUsageCost; } /** * @notice used to change the fee of the subscription cost * @param _newSubscriptionCost new subscription cost */ function changeFactorySubscriptionFee(uint256 _newSubscriptionCost) public onlyOwner { emit LogChangeFactorySubscriptionFee(monthlySubscriptionCost, _newSubscriptionCost, address(this)); monthlySubscriptionCost = _newSubscriptionCost; } } /** * @title Interface that any module contract should implement */ contract IModule { address public factory; address public securityToken; bytes32 public constant FEE_ADMIN = "FEE_ADMIN"; ERC20 public polyToken; /** * @notice Constructor * @param _securityToken Address of the security token * @param _polyAddress Address of the polytoken */ constructor (address _securityToken, address _polyAddress) public { securityToken = _securityToken; factory = msg.sender; polyToken = ERC20(_polyAddress); } /** * @notice This function returns the signature of configure function */ function getInitFunction() public pure returns (bytes4); //Allows owner, factory or permissioned delegate modifier withPerm(bytes32 _perm) { bool isOwner = msg.sender == ISecurityToken(securityToken).owner(); bool isFactory = msg.sender == factory; require(isOwner||isFactory||ISecurityToken(securityToken).checkPermission(msg.sender, address(this), _perm), "Permission check failed"); _; } modifier onlyOwner { require(msg.sender == ISecurityToken(securityToken).owner(), "Sender is not owner"); _; } modifier onlyFactory { require(msg.sender == factory, "Sender is not factory"); _; } modifier onlyFactoryOwner { require(msg.sender == IModuleFactory(factory).owner(), "Sender is not factory owner"); _; } /** * @notice Return the permissions flag that are associated with Module */ function getPermissions() public view returns(bytes32[]); /** * @notice used to withdraw the fee by the factory owner */ function takeFee(uint256 _amount) public withPerm(FEE_ADMIN) returns(bool) { require(polyToken.transferFrom(address(this), IModuleFactory(factory).owner(), _amount), "Unable to take fee"); return true; } } /** * @title Interface for the polymath module registry contract */ contract IModuleRegistry { /** * @notice Called by a security token to notify the registry it is using a module * @param _moduleFactory is the address of the relevant module factory */ function useModule(address _moduleFactory) external; /** * @notice Called by moduleFactory owner to register new modules for SecurityToken to use * @param _moduleFactory is the address of the module factory to be registered */ function registerModule(address _moduleFactory) external returns(bool); /** * @notice Use to get all the tags releated to the functionality of the Module Factory. * @param _moduleType Type of module */ function getTagByModuleType(uint8 _moduleType) public view returns(bytes32[]); } /** * @title Utility contract to allow pausing and unpausing of certain functions */ contract Pausable { event Pause(uint256 _timestammp); event Unpause(uint256 _timestamp); bool public paused = false; /** * @notice Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @notice Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @notice called by the owner to pause, triggers stopped state */ function _pause() internal { require(!paused); paused = true; emit Pause(now); } /** * @notice called by the owner to unpause, returns to normal state */ function _unpause() internal { require(paused); paused = false; emit Unpause(now); } } /** * @title Interface to be implemented by all Transfer Manager modules */ contract ITransferManager is IModule, Pausable { //If verifyTransfer returns: // FORCE_VALID, the transaction will always be valid, regardless of other TM results // INVALID, then the transfer should not be allowed regardless of other TM results // VALID, then the transfer is valid for this TM // NA, then the result from this TM is ignored enum Result {INVALID, NA, VALID, FORCE_VALID} function verifyTransfer(address _from, address _to, uint256 _amount, bool _isTransfer) public returns(Result); function unpause() onlyOwner public { super._unpause(); } function pause() onlyOwner public { super._pause(); } } /** * @title Interface to be implemented by all permission manager modules */ contract IPermissionManager is IModule { function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool); function changePermission(address _delegate, address _module, bytes32 _perm, bool _valid) public returns(bool); function getDelegateDetails(address _delegate) public view returns(bytes32); } /** * @title Interface for the token burner contract */ interface ITokenBurner { function burn(address _burner, uint256 _value ) external returns(bool); } /** * @title Utility contract to allow owner to retreive any ERC20 sent to the contract */ contract ReclaimTokens is Ownable { /** * @notice Reclaim all ERC20Basic compatible tokens * @param _tokenContract The address of the token contract */ function reclaimERC20(address _tokenContract) external onlyOwner { require(_tokenContract != address(0)); ERC20Basic token = ERC20Basic(_tokenContract); uint256 balance = token.balanceOf(address(this)); require(token.transfer(owner, balance)); } } /** * @title Core functionality for registry upgradability */ contract PolymathRegistry is ReclaimTokens { mapping (bytes32 => address) public storedAddresses; event LogChangeAddress(string _nameKey, address indexed _oldAddress, address indexed _newAddress); /** * @notice Get the contract address * @param _nameKey is the key for the contract address mapping * @return address */ function getAddress(string _nameKey) view public returns(address) { bytes32 key = keccak256(bytes(_nameKey)); require(storedAddresses[key] != address(0), "Invalid address key"); return storedAddresses[key]; } /** * @notice change the contract address * @param _nameKey is the key for the contract address mapping * @param _newAddress is the new contract address */ function changeAddress(string _nameKey, address _newAddress) public onlyOwner { bytes32 key = keccak256(bytes(_nameKey)); emit LogChangeAddress(_nameKey, storedAddresses[key], _newAddress); storedAddresses[key] = _newAddress; } } contract RegistryUpdater is Ownable { address public polymathRegistry; address public moduleRegistry; address public securityTokenRegistry; address public tickerRegistry; address public polyToken; constructor (address _polymathRegistry) public { require(_polymathRegistry != address(0)); polymathRegistry = _polymathRegistry; } function updateFromRegistry() onlyOwner public { moduleRegistry = PolymathRegistry(polymathRegistry).getAddress("ModuleRegistry"); securityTokenRegistry = PolymathRegistry(polymathRegistry).getAddress("SecurityTokenRegistry"); tickerRegistry = PolymathRegistry(polymathRegistry).getAddress("TickerRegistry"); polyToken = PolymathRegistry(polymathRegistry).getAddress("PolyToken"); } } /** * @title Helps contracts guard agains reentrancy attacks. * @author Remco Bloemen <remco@2π.com> * @notice If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /** * @dev We use a single lock for the whole contract. */ bool private reentrancyLock = false; /** * @dev Prevents a contract from calling itself, directly or indirectly. * @notice If you mark a function `nonReentrant`, you should also * mark it `external`. Calling one nonReentrant function from * another is not supported. Instead, you can implement a * `private` function doing the actual work, and a `external` * wrapper marked as `nonReentrant`. */ modifier nonReentrant() { require(!reentrancyLock); reentrancyLock = true; _; reentrancyLock = false; } } /** * @title Security Token contract * @notice SecurityToken is an ERC20 token with added capabilities: * @notice - Implements the ST-20 Interface * @notice - Transfers are restricted * @notice - Modules can be attached to it to control its behaviour * @notice - ST should not be deployed directly, but rather the SecurityTokenRegistry should be used */ contract SecurityToken is ISecurityToken, ReentrancyGuard, RegistryUpdater { using SafeMath for uint256; bytes32 public constant securityTokenVersion = "0.0.1"; // Reference to token burner contract ITokenBurner public tokenBurner; // Use to halt all the transactions bool public freeze = false; struct ModuleData { bytes32 name; address moduleAddress; } // Structures to maintain checkpoints of balances for governance / dividends struct Checkpoint { uint256 checkpointId; uint256 value; } mapping (address => Checkpoint[]) public checkpointBalances; Checkpoint[] public checkpointTotalSupply; bool public finishedIssuerMinting = false; bool public finishedSTOMinting = false; mapping (bytes4 => bool) transferFunctions; // Module list should be order agnostic! mapping (uint8 => ModuleData[]) public modules; uint8 public constant MAX_MODULES = 20; mapping (address => bool) public investorListed; // Emit at the time when module get added event LogModuleAdded( uint8 indexed _type, bytes32 _name, address _moduleFactory, address _module, uint256 _moduleCost, uint256 _budget, uint256 _timestamp ); // Emit when the token details get updated event LogUpdateTokenDetails(string _oldDetails, string _newDetails); // Emit when the granularity get changed event LogGranularityChanged(uint256 _oldGranularity, uint256 _newGranularity); // Emit when Module get removed from the securityToken event LogModuleRemoved(uint8 indexed _type, address _module, uint256 _timestamp); // Emit when the budget allocated to a module is changed event LogModuleBudgetChanged(uint8 indexed _moduleType, address _module, uint256 _budget); // Emit when all the transfers get freeze event LogFreezeTransfers(bool _freeze, uint256 _timestamp); // Emit when new checkpoint created event LogCheckpointCreated(uint256 indexed _checkpointId, uint256 _timestamp); // Emit when the minting get finished for the Issuer event LogFinishMintingIssuer(uint256 _timestamp); // Emit when the minting get finished for the STOs event LogFinishMintingSTO(uint256 _timestamp); // Change the STR address in the event of a upgrade event LogChangeSTRAddress(address indexed _oldAddress, address indexed _newAddress); // If _fallback is true, then for STO module type we only allow the module if it is set, if it is not set we only allow the owner // for other _moduleType we allow both issuer and module. modifier onlyModule(uint8 _moduleType, bool _fallback) { //Loop over all modules of type _moduleType bool isModuleType = false; for (uint8 i = 0; i < modules[_moduleType].length; i++) { isModuleType = isModuleType || (modules[_moduleType][i].moduleAddress == msg.sender); } if (_fallback && !isModuleType) { if (_moduleType == STO_KEY) require(modules[_moduleType].length == 0 && msg.sender == owner, "Sender is not owner or STO module is attached"); else require(msg.sender == owner, "Sender is not owner"); } else { require(isModuleType, "Sender is not correct module type"); } _; } modifier checkGranularity(uint256 _amount) { require(_amount % granularity == 0, "Unable to modify token balances at this granularity"); _; } // Checks whether the minting is allowed or not, check for the owner if owner is no the msg.sender then check // for the finishedSTOMinting flag because only STOs and owner are allowed for minting modifier isMintingAllowed() { if (msg.sender == owner) { require(!finishedIssuerMinting, "Minting is finished for Issuer"); } else { require(!finishedSTOMinting, "Minting is finished for STOs"); } _; } /** * @notice Constructor * @param _name Name of the SecurityToken * @param _symbol Symbol of the Token * @param _decimals Decimals for the securityToken * @param _granularity granular level of the token * @param _tokenDetails Details of the token that are stored off-chain (IPFS hash) * @param _polymathRegistry Contract address of the polymath registry */ constructor ( string _name, string _symbol, uint8 _decimals, uint256 _granularity, string _tokenDetails, address _polymathRegistry ) public DetailedERC20(_name, _symbol, _decimals) RegistryUpdater(_polymathRegistry) { //When it is created, the owner is the STR updateFromRegistry(); tokenDetails = _tokenDetails; granularity = _granularity; transferFunctions[bytes4(keccak256("transfer(address,uint256)"))] = true; transferFunctions[bytes4(keccak256("transferFrom(address,address,uint256)"))] = true; transferFunctions[bytes4(keccak256("mint(address,uint256)"))] = true; transferFunctions[bytes4(keccak256("burn(uint256)"))] = true; } /** * @notice Function used to attach the module in security token * @param _moduleFactory Contract address of the module factory that needs to be attached * @param _data Data used for the intialization of the module factory variables * @param _maxCost Maximum cost of the Module factory * @param _budget Budget of the Module factory */ function addModule( address _moduleFactory, bytes _data, uint256 _maxCost, uint256 _budget ) external onlyOwner nonReentrant { _addModule(_moduleFactory, _data, _maxCost, _budget); } /** * @notice _addModule handles the attachment (or replacement) of modules for the ST * @dev E.G.: On deployment (through the STR) ST gets a TransferManager module attached to it * @dev to control restrictions on transfers. * @dev You are allowed to add a new moduleType if: * @dev - there is no existing module of that type yet added * @dev - the last member of the module list is replacable * @param _moduleFactory is the address of the module factory to be added * @param _data is data packed into bytes used to further configure the module (See STO usage) * @param _maxCost max amount of POLY willing to pay to module. (WIP) */ function _addModule(address _moduleFactory, bytes _data, uint256 _maxCost, uint256 _budget) internal { //Check that module exists in registry - will throw otherwise IModuleRegistry(moduleRegistry).useModule(_moduleFactory); IModuleFactory moduleFactory = IModuleFactory(_moduleFactory); uint8 moduleType = moduleFactory.getType(); require(modules[moduleType].length < MAX_MODULES, "Limit of MAX MODULES is reached"); uint256 moduleCost = moduleFactory.setupCost(); require(moduleCost <= _maxCost, "Max Cost is always be greater than module cost"); //Approve fee for module require(ERC20(polyToken).approve(_moduleFactory, moduleCost), "Not able to approve the module cost"); //Creates instance of module from factory address module = moduleFactory.deploy(_data); //Approve ongoing budget require(ERC20(polyToken).approve(module, _budget), "Not able to approve the budget"); //Add to SecurityToken module map bytes32 moduleName = moduleFactory.getName(); modules[moduleType].push(ModuleData(moduleName, module)); //Emit log event emit LogModuleAdded(moduleType, moduleName, _moduleFactory, module, moduleCost, _budget, now); } /** * @notice Removes a module attached to the SecurityToken * @param _moduleType is which type of module we are trying to remove * @param _moduleIndex is the index of the module within the chosen type */ function removeModule(uint8 _moduleType, uint8 _moduleIndex) external onlyOwner { require(_moduleIndex < modules[_moduleType].length, "Module index doesn't exist as per the choosen module type"); require(modules[_moduleType][_moduleIndex].moduleAddress != address(0), "Module contract address should not be 0x"); //Take the last member of the list, and replace _moduleIndex with this, then shorten the list by one emit LogModuleRemoved(_moduleType, modules[_moduleType][_moduleIndex].moduleAddress, now); modules[_moduleType][_moduleIndex] = modules[_moduleType][modules[_moduleType].length - 1]; modules[_moduleType].length = modules[_moduleType].length - 1; } /** * @notice Returns module list for a module type * @param _moduleType is which type of module we are trying to get * @param _moduleIndex is the index of the module within the chosen type * @return bytes32 * @return address */ function getModule(uint8 _moduleType, uint _moduleIndex) public view returns (bytes32, address) { if (modules[_moduleType].length > 0) { return ( modules[_moduleType][_moduleIndex].name, modules[_moduleType][_moduleIndex].moduleAddress ); } else { return ("", address(0)); } } /** * @notice returns module list for a module name - will return first match * @param _moduleType is which type of module we are trying to get * @param _name is the name of the module within the chosen type * @return bytes32 * @return address */ function getModuleByName(uint8 _moduleType, bytes32 _name) public view returns (bytes32, address) { if (modules[_moduleType].length > 0) { for (uint256 i = 0; i < modules[_moduleType].length; i++) { if (modules[_moduleType][i].name == _name) { return ( modules[_moduleType][i].name, modules[_moduleType][i].moduleAddress ); } } return ("", address(0)); } else { return ("", address(0)); } } /** * @notice allows the owner to withdraw unspent POLY stored by them on the ST. * @dev Owner can transfer POLY to the ST which will be used to pay for modules that require a POLY fee. * @param _amount amount of POLY to withdraw */ function withdrawPoly(uint256 _amount) public onlyOwner { require(ERC20(polyToken).transfer(owner, _amount), "In-sufficient balance"); } /** * @notice allows owner to approve more POLY to one of the modules * @param _moduleType module type * @param _moduleIndex module index * @param _budget new budget */ function changeModuleBudget(uint8 _moduleType, uint8 _moduleIndex, uint256 _budget) public onlyOwner { require(_moduleType != 0, "Module type cannot be zero"); require(_moduleIndex < modules[_moduleType].length, "Incorrrect module index"); uint256 _currentAllowance = IERC20(polyToken).allowance(address(this), modules[_moduleType][_moduleIndex].moduleAddress); if (_budget < _currentAllowance) { require(IERC20(polyToken).decreaseApproval(modules[_moduleType][_moduleIndex].moduleAddress, _currentAllowance.sub(_budget)), "Insufficient balance to decreaseApproval"); } else { require(IERC20(polyToken).increaseApproval(modules[_moduleType][_moduleIndex].moduleAddress, _budget.sub(_currentAllowance)), "Insufficient balance to increaseApproval"); } emit LogModuleBudgetChanged(_moduleType, modules[_moduleType][_moduleIndex].moduleAddress, _budget); } /** * @notice change the tokenDetails * @param _newTokenDetails New token details */ function updateTokenDetails(string _newTokenDetails) public onlyOwner { emit LogUpdateTokenDetails(tokenDetails, _newTokenDetails); tokenDetails = _newTokenDetails; } /** * @notice allows owner to change token granularity * @param _granularity granularity level of the token */ function changeGranularity(uint256 _granularity) public onlyOwner { require(_granularity != 0, "Granularity can not be 0"); emit LogGranularityChanged(granularity, _granularity); granularity = _granularity; } /** * @notice keeps track of the number of non-zero token holders * @param _from sender of transfer * @param _to receiver of transfer * @param _value value of transfer */ function adjustInvestorCount(address _from, address _to, uint256 _value) internal { if ((_value == 0) || (_from == _to)) { return; } // Check whether receiver is a new token holder if ((balanceOf(_to) == 0) && (_to != address(0))) { investorCount = investorCount.add(1); } // Check whether sender is moving all of their tokens if (_value == balanceOf(_from)) { investorCount = investorCount.sub(1); } //Also adjust investor list if (!investorListed[_to] && (_to != address(0))) { investors.push(_to); investorListed[_to] = true; } } /** * @notice removes addresses with zero balances from the investors list * @param _start Index in investor list at which to start removing zero balances * @param _iters Max number of iterations of the for loop * NB - pruning this list will mean you may not be able to iterate over investors on-chain as of a historical checkpoint */ function pruneInvestors(uint256 _start, uint256 _iters) public onlyOwner { for (uint256 i = _start; i < Math.min256(_start.add(_iters), investors.length); i++) { if ((i < investors.length) && (balanceOf(investors[i]) == 0)) { investorListed[investors[i]] = false; investors[i] = investors[investors.length - 1]; investors.length--; } } } /** * @notice gets length of investors array * NB - this length may differ from investorCount if list has not been pruned of zero balance investors * @return length */ function getInvestorsLength() public view returns(uint256) { return investors.length; } /** * @notice freeze all the transfers */ function freezeTransfers() public onlyOwner { require(!freeze); freeze = true; emit LogFreezeTransfers(freeze, now); } /** * @notice un-freeze all the transfers */ function unfreezeTransfers() public onlyOwner { require(freeze); freeze = false; emit LogFreezeTransfers(freeze, now); } /** * @notice adjust totalsupply at checkpoint after minting or burning tokens */ function adjustTotalSupplyCheckpoints() internal { adjustCheckpoints(checkpointTotalSupply, totalSupply()); } /** * @notice adjust token holder balance at checkpoint after a token transfer * @param _investor address of the token holder affected */ function adjustBalanceCheckpoints(address _investor) internal { adjustCheckpoints(checkpointBalances[_investor], balanceOf(_investor)); } /** * @notice store the changes to the checkpoint objects * @param _checkpoints the affected checkpoint object array * @param _newValue the new value that needs to be stored */ function adjustCheckpoints(Checkpoint[] storage _checkpoints, uint256 _newValue) internal { //No checkpoints set yet if (currentCheckpointId == 0) { return; } //No previous checkpoint data - add current balance against checkpoint if (_checkpoints.length == 0) { _checkpoints.push( Checkpoint({ checkpointId: currentCheckpointId, value: _newValue }) ); return; } //No new checkpoints since last update if (_checkpoints[_checkpoints.length - 1].checkpointId == currentCheckpointId) { return; } //New checkpoint, so record balance _checkpoints.push( Checkpoint({ checkpointId: currentCheckpointId, value: _newValue }) ); } /** * @notice Overloaded version of the transfer function * @param _to receiver of transfer * @param _value value of transfer * @return bool success */ function transfer(address _to, uint256 _value) public returns (bool success) { adjustInvestorCount(msg.sender, _to, _value); require(verifyTransfer(msg.sender, _to, _value), "Transfer is not valid"); adjustBalanceCheckpoints(msg.sender); adjustBalanceCheckpoints(_to); require(super.transfer(_to, _value)); return true; } /** * @notice Overloaded version of the transferFrom function * @param _from sender of transfer * @param _to receiver of transfer * @param _value value of transfer * @return bool success */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { adjustInvestorCount(_from, _to, _value); require(verifyTransfer(_from, _to, _value), "Transfer is not valid"); adjustBalanceCheckpoints(_from); adjustBalanceCheckpoints(_to); require(super.transferFrom(_from, _to, _value)); return true; } /** * @notice validate transfer with TransferManager module if it exists * @dev TransferManager module has a key of 2 * @param _from sender of transfer * @param _to receiver of transfer * @param _amount value of transfer * @return bool */ function verifyTransfer(address _from, address _to, uint256 _amount) public checkGranularity(_amount) returns (bool) { if (!freeze) { bool isTransfer = false; if (transferFunctions[getSig(msg.data)]) { isTransfer = true; } if (modules[TRANSFERMANAGER_KEY].length == 0) { return true; } bool isInvalid = false; bool isValid = false; bool isForceValid = false; for (uint8 i = 0; i < modules[TRANSFERMANAGER_KEY].length; i++) { ITransferManager.Result valid = ITransferManager(modules[TRANSFERMANAGER_KEY][i].moduleAddress).verifyTransfer(_from, _to, _amount, isTransfer); if (valid == ITransferManager.Result.INVALID) { isInvalid = true; } if (valid == ITransferManager.Result.VALID) { isValid = true; } if (valid == ITransferManager.Result.FORCE_VALID) { isForceValid = true; } } return isForceValid ? true : (isInvalid ? false : isValid); } return false; } /** * @notice End token minting period permanently for Issuer */ function finishMintingIssuer() public onlyOwner { finishedIssuerMinting = true; emit LogFinishMintingIssuer(now); } /** * @notice End token minting period permanently for STOs */ function finishMintingSTO() public onlyOwner { finishedSTOMinting = true; emit LogFinishMintingSTO(now); } /** * @notice mints new tokens and assigns them to the target _investor. * @dev Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet) * @param _investor Address to whom the minted tokens will be dilivered * @param _amount Number of tokens get minted * @return success */ function mint(address _investor, uint256 _amount) public onlyModule(STO_KEY, true) checkGranularity(_amount) isMintingAllowed() returns (bool success) { require(_investor != address(0), "Investor address should not be 0x"); adjustInvestorCount(address(0), _investor, _amount); require(verifyTransfer(address(0), _investor, _amount), "Transfer is not valid"); adjustBalanceCheckpoints(_investor); adjustTotalSupplyCheckpoints(); totalSupply_ = totalSupply_.add(_amount); balances[_investor] = balances[_investor].add(_amount); emit Minted(_investor, _amount); emit Transfer(address(0), _investor, _amount); return true; } /** * @notice mints new tokens and assigns them to the target _investor. * Can only be called by the STO attached to the token (Or by the ST owner if there's no STO attached yet) * @param _investors A list of addresses to whom the minted tokens will be dilivered * @param _amounts A list of number of tokens get minted and transfer to corresponding address of the investor from _investor[] list * @return success */ function mintMulti(address[] _investors, uint256[] _amounts) public onlyModule(STO_KEY, true) returns (bool success) { require(_investors.length == _amounts.length, "Mis-match in the length of the arrays"); for (uint256 i = 0; i < _investors.length; i++) { mint(_investors[i], _amounts[i]); } return true; } /** * @notice Validate permissions with PermissionManager if it exists, If no Permission return false * @dev Note that IModule withPerm will allow ST owner all permissions anyway * @dev this allows individual modules to override this logic if needed (to not allow ST owner all permissions) * @param _delegate address of delegate * @param _module address of PermissionManager module * @param _perm the permissions * @return success */ function checkPermission(address _delegate, address _module, bytes32 _perm) public view returns(bool) { if (modules[PERMISSIONMANAGER_KEY].length == 0) { return false; } for (uint8 i = 0; i < modules[PERMISSIONMANAGER_KEY].length; i++) { if (IPermissionManager(modules[PERMISSIONMANAGER_KEY][i].moduleAddress).checkPermission(_delegate, _module, _perm)) { return true; } } } /** * @notice used to set the token Burner address. It only be called by the owner * @param _tokenBurner Address of the token burner contract */ function setTokenBurner(address _tokenBurner) public onlyOwner { tokenBurner = ITokenBurner(_tokenBurner); } /** * @notice Burn function used to burn the securityToken * @param _value No. of token that get burned */ function burn(uint256 _value) checkGranularity(_value) public { adjustInvestorCount(msg.sender, address(0), _value); require(tokenBurner != address(0), "Token Burner contract address is not set yet"); require(verifyTransfer(msg.sender, address(0), _value), "Transfer is not valid"); require(_value <= balances[msg.sender], "Value should no be greater than the balance of msg.sender"); adjustBalanceCheckpoints(msg.sender); adjustTotalSupplyCheckpoints(); // no need to require value <= totalSupply, since that would imply the // sender's balance is greater than the totalSupply, which *should* be an assertion failure balances[msg.sender] = balances[msg.sender].sub(_value); require(tokenBurner.burn(msg.sender, _value), "Token burner process is not validated"); totalSupply_ = totalSupply_.sub(_value); emit Burnt(msg.sender, _value); emit Transfer(msg.sender, address(0), _value); } /** * @notice Get function signature from _data * @param _data passed data * @return bytes4 sig */ function getSig(bytes _data) internal pure returns (bytes4 sig) { uint len = _data.length < 4 ? _data.length : 4; for (uint i = 0; i < len; i++) { sig = bytes4(uint(sig) + uint(_data[i]) * (2 ** (8 * (len - 1 - i)))); } } /** * @notice Creates a checkpoint that can be used to query historical balances / totalSuppy * @return uint256 */ function createCheckpoint() public onlyModule(CHECKPOINT_KEY, true) returns(uint256) { require(currentCheckpointId < 2**256 - 1); currentCheckpointId = currentCheckpointId + 1; emit LogCheckpointCreated(currentCheckpointId, now); return currentCheckpointId; } /** * @notice Queries totalSupply as of a defined checkpoint * @param _checkpointId Checkpoint ID to query * @return uint256 */ function totalSupplyAt(uint256 _checkpointId) public view returns(uint256) { return getValueAt(checkpointTotalSupply, _checkpointId, totalSupply()); } /** * @notice Queries value at a defined checkpoint * @param checkpoints is array of Checkpoint objects * @param _checkpointId Checkpoint ID to query * @param _currentValue Current value of checkpoint * @return uint256 */ function getValueAt(Checkpoint[] storage checkpoints, uint256 _checkpointId, uint256 _currentValue) internal view returns(uint256) { require(_checkpointId <= currentCheckpointId); //Checkpoint id 0 is when the token is first created - everyone has a zero balance if (_checkpointId == 0) { return 0; } if (checkpoints.length == 0) { return _currentValue; } if (checkpoints[0].checkpointId >= _checkpointId) { return checkpoints[0].value; } if (checkpoints[checkpoints.length - 1].checkpointId < _checkpointId) { return _currentValue; } if (checkpoints[checkpoints.length - 1].checkpointId == _checkpointId) { return checkpoints[checkpoints.length - 1].value; } uint256 min = 0; uint256 max = checkpoints.length - 1; while (max > min) { uint256 mid = (max + min) / 2; if (checkpoints[mid].checkpointId == _checkpointId) { max = mid; break; } if (checkpoints[mid].checkpointId < _checkpointId) { min = mid + 1; } else { max = mid; } } return checkpoints[max].value; } /** * @notice Queries balances as of a defined checkpoint * @param _investor Investor to query balance for * @param _checkpointId Checkpoint ID to query as of */ function balanceOfAt(address _investor, uint256 _checkpointId) public view returns(uint256) { return getValueAt(checkpointBalances[_investor], _checkpointId, balanceOf(_investor)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[],"name":"freezeTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"investorListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint8"}],"name":"removeModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMintingSTO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_granularity","type":"uint256"}],"name":"changeGranularity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finishedSTOMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenBurner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tickerRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unfreezeTransfers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"securityTokenVersion","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"investors","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investor","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint256"}],"name":"getModule","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_investors","type":"address[]"},{"name":"_amounts","type":"uint256[]"}],"name":"mintMulti","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_investor","type":"address"},{"name":"_checkpointId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentCheckpointId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"granularity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_MODULES","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_moduleIndex","type":"uint8"},{"name":"_budget","type":"uint256"}],"name":"changeModuleBudget","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"freeze","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STO_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"polyToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"},{"name":"","type":"uint256"}],"name":"modules","outputs":[{"name":"name","type":"bytes32"},{"name":"moduleAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newTokenDetails","type":"string"}],"name":"updateTokenDetails","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"polymathRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"checkpointTotalSupply","outputs":[{"name":"checkpointId","type":"uint256"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_delegate","type":"address"},{"name":"_module","type":"address"},{"name":"_perm","type":"bytes32"}],"name":"checkPermission","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TRANSFERMANAGER_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_checkpointId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"verifyTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finishedIssuerMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_moduleType","type":"uint8"},{"name":"_name","type":"bytes32"}],"name":"getModuleByName","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finishMintingIssuer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PERMISSIONMANAGER_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenBurner","type":"address"}],"name":"setTokenBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"moduleRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CHECKPOINT_KEY","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"},{"name":"_iters","type":"uint256"}],"name":"pruneInvestors","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"securityTokenRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenDetails","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"investorCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInvestorsLength","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"updateFromRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_moduleFactory","type":"address"},{"name":"_data","type":"bytes"},{"name":"_maxCost","type":"uint256"},{"name":"_budget","type":"uint256"}],"name":"addModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withdrawPoly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"checkpointBalances","outputs":[{"name":"checkpointId","type":"uint256"},{"name":"value","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"createCheckpoint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"_granularity","type":"uint256"},{"name":"_tokenDetails","type":"string"},{"name":"_polymathRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_type","type":"uint8"},{"indexed":false,"name":"_name","type":"bytes32"},{"indexed":false,"name":"_moduleFactory","type":"address"},{"indexed":false,"name":"_module","type":"address"},{"indexed":false,"name":"_moduleCost","type":"uint256"},{"indexed":false,"name":"_budget","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogModuleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldDetails","type":"string"},{"indexed":false,"name":"_newDetails","type":"string"}],"name":"LogUpdateTokenDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_oldGranularity","type":"uint256"},{"indexed":false,"name":"_newGranularity","type":"uint256"}],"name":"LogGranularityChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_type","type":"uint8"},{"indexed":false,"name":"_module","type":"address"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogModuleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_moduleType","type":"uint8"},{"indexed":false,"name":"_module","type":"address"},{"indexed":false,"name":"_budget","type":"uint256"}],"name":"LogModuleBudgetChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_freeze","type":"bool"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogFreezeTransfers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_checkpointId","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogCheckpointCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogFinishMintingIssuer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"LogFinishMintingSTO","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldAddress","type":"address"},{"indexed":true,"name":"_newAddress","type":"address"}],"name":"LogChangeSTRAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_burner","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Burnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]
Contract Creation Code
6080604052600c805460ff191690556011805460a060020a60ff02191690556014805461ffff191690553480156200003657600080fd5b5060405162004ee538038062004ee58339810160409081528151602080840151928401516060850151608086015160a08701519487018051909796870196939592949190930192829188918891889162000097916003919086019062000635565b508151620000ad90600490602085019062000635565b506005805460ff90921660ff19909216919091179055505060078054600160a060020a03191633179055600160a060020a0381161515620000ed57600080fd5b600c8054600160a060020a039092166101000261010060a860020a031990921691909117905562000126640100000000620002a6810204565b81516200013b90600690602085019062000635565b5050506008555050604080517f7472616e7366657228616464726573732c75696e743235362900000000000000815281519081900360190181207fffffffff00000000000000000000000000000000000000000000000000000000908116600090815260156020818152858320805460ff1990811660019081179092557f7472616e7366657246726f6d28616464726573732c616464726573732c75696e87527f74323536290000000000000000000000000000000000000000000000000000008388015287519687900360250187208616855283835287852080548216831790557f6d696e7428616464726573732c75696e743235362900000000000000000000008752875196879003840187208616855283835287852080548216831790557f6275726e2875696e7432353629000000000000000000000000000000000000008752875196879003600d01909620909416835252929092208054909116909117905550620006da565b600754600160a060020a03163314620002be57600080fd5b600c54604080517fbf40fac1000000000000000000000000000000000000000000000000000000008152602060048201819052600e60248301527f4d6f64756c65526567697374727900000000000000000000000000000000000060448301529151610100909304600160a060020a03169263bf40fac1926064808401939192918290030181600087803b1580156200035657600080fd5b505af11580156200036b573d6000803e3d6000fd5b505050506040513d60208110156200038257600080fd5b5051600d8054600160a060020a031916600160a060020a03928316179055600c54604080517fbf40fac1000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f5365637572697479546f6b656e52656769737472790000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b1580156200043057600080fd5b505af115801562000445573d6000803e3d6000fd5b505050506040513d60208110156200045c57600080fd5b5051600e8054600160a060020a031916600160a060020a03928316178155600c54604080517fbf40fac100000000000000000000000000000000000000000000000000000000815260206004820181905260248201949094527f5469636b65725265676973747279000000000000000000000000000000000000604482015290516101009092049093169263bf40fac19260648083019391928290030181600087803b1580156200050c57600080fd5b505af115801562000521573d6000803e3d6000fd5b505050506040513d60208110156200053857600080fd5b5051600f8054600160a060020a031916600160a060020a03928316179055600c54604080517fbf40fac1000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f506f6c79546f6b656e0000000000000000000000000000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b158015620005e657600080fd5b505af1158015620005fb573d6000803e3d6000fd5b505050506040513d60208110156200061257600080fd5b505160108054600160a060020a031916600160a060020a03909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200067857805160ff1916838001178555620006a8565b82800160010185558215620006a8579182015b82811115620006a85782518255916020019190600101906200068b565b50620006b6929150620006ba565b5090565b620006d791905b80821115620006b65760008155600101620006c1565b90565b6147fb80620006ea6000396000f3006080604052600436106102c65763ffffffff60e060020a6000350416630150246081146102cb57806306fdde03146102e2578063095ea7b31461036c5780630c72a835146103a457806318160ddd146103c55780631b2ae899146103ec5780631bc125f31461040d578063210a8d0e14610422578063219371921461043a57806323b872dd1461044f5780632996f972146104795780632a858126146104aa578063313ce567146104bf57806331c420d4146104ea5780633876e6d3146104ff5780633feb5f2b1461051457806340c10f191461052c57806342966c681461055057806346b65ffd1461056857806346e4959d146105a75780634ee2cd7e146106355780635488cc8014610659578063556f0dc71461066e5780635f1e8c1b146106835780635fcc62771461069857806362a5af3b146106bc5780636604ca6b146106d157806366188463146106e65780636faa22a51461070a57806370a082311461071f578063715018a614610740578063729d20e21461075557806373826a931461077357806377282b70146107cc5780637e8937d9146107e15780638658b8b9146108125780638da5cb5b1461083c57806391415ce91461085157806395d89b4114610866578063981b24d01461087b5780639a4b1d5c146108935780639c3fe721146108bd5780639f45b45c146108d2578063a3f7e26d146108f0578063a8ef4b6614610905578063a9059cbb1461091a578063b0af768b1461093e578063b95459e41461095f578063bcddd64e14610974578063c5bac42114610989578063ce4dbdff146109a4578063d6abe110146109b9578063d73dd623146109ce578063d7e64c00146109f2578063dd62ed3e14610a07578063e3cc65e214610a2e578063f2fde38b14610a43578063f433262f14610a64578063f5efbd2d14610a79578063f8a4cc3314610aac578063fbaa401914610ac4578063ff0b9c9014610ae8575b600080fd5b3480156102d757600080fd5b506102e0610afd565b005b3480156102ee57600080fd5b506102f7610b97565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610331578181015183820152602001610319565b50505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037857600080fd5b50610390600160a060020a0360043516602435610c25565b604080519115158252519081900360200190f35b3480156103b057600080fd5b50610390600160a060020a0360043516610c8b565b3480156103d157600080fd5b506103da610ca0565b60408051918252519081900360200190f35b3480156103f857600080fd5b506102e060ff60043581169060243516610ca7565b34801561041957600080fd5b506102e0610f47565b34801561042e57600080fd5b506102e0600435610fa2565b34801561044657600080fd5b50610390611052565b34801561045b57600080fd5b50610390600160a060020a0360043581169060243516604435611060565b34801561048557600080fd5b5061048e6110ee565b60408051600160a060020a039092168252519081900360200190f35b3480156104b657600080fd5b5061048e6110fd565b3480156104cb57600080fd5b506104d461110c565b6040805160ff9092168252519081900360200190f35b3480156104f657600080fd5b506102e0611115565b34801561050b57600080fd5b506103da6111ab565b34801561052057600080fd5b5061048e6004356111cf565b34801561053857600080fd5b50610390600160a060020a03600435166024356111f7565b34801561055c57600080fd5b506102e0600435611736565b34801561057457600080fd5b5061058660ff60043516602435611afc565b60408051928352600160a060020a0390911660208301528051918290030190f35b3480156105b357600080fd5b506040805160206004803580820135838102808601850190965280855261039095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611b9a9650505050505050565b34801561064157600080fd5b506103da600160a060020a0360043516602435611e9d565b34801561066557600080fd5b506103da611ecf565b34801561067a57600080fd5b506103da611ed5565b34801561068f57600080fd5b506104d4611edb565b3480156106a457600080fd5b506102e060ff60043581169060243516604435611ee0565b3480156106c857600080fd5b506103906123d2565b3480156106dd57600080fd5b506104d46123e2565b3480156106f257600080fd5b50610390600160a060020a03600435166024356123e7565b34801561071657600080fd5b5061048e6124d7565b34801561072b57600080fd5b506103da600160a060020a03600435166124e6565b34801561074c57600080fd5b506102e0612501565b34801561076157600080fd5b5061058660ff60043516602435612562565b34801561077f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102e09436949293602493928401919081908401838280828437509497506125a69650505050505050565b3480156107d857600080fd5b5061048e6126e9565b3480156107ed57600080fd5b506107f96004356126fd565b6040805192835260208301919091528051918290030190f35b34801561081e57600080fd5b50610390600160a060020a0360043581169060243516604435612729565b34801561084857600080fd5b5061048e6128b0565b34801561085d57600080fd5b506104d46128bf565b34801561087257600080fd5b506102f76128c4565b34801561088757600080fd5b506103da60043561291f565b34801561089f57600080fd5b50610390600160a060020a0360043581169060243516604435612935565b3480156108c957600080fd5b50610390612c81565b3480156108de57600080fd5b5061058660ff60043516602435612c8a565b3480156108fc57600080fd5b506102e0612d8a565b34801561091157600080fd5b506104d4612de3565b34801561092657600080fd5b50610390600160a060020a0360043516602435612de8565b34801561094a57600080fd5b506102e0600160a060020a0360043516612e74565b34801561096b57600080fd5b5061048e612ead565b34801561098057600080fd5b506104d4612ebc565b34801561099557600080fd5b506102e0600435602435612ec1565b3480156109b057600080fd5b5061048e613006565b3480156109c557600080fd5b506102f7613015565b3480156109da57600080fd5b50610390600160a060020a0360043516602435613070565b3480156109fe57600080fd5b506103da613109565b348015610a1357600080fd5b506103da600160a060020a036004358116906024351661310f565b348015610a3a57600080fd5b506103da61313a565b348015610a4f57600080fd5b506102e0600160a060020a0360043516613140565b348015610a7057600080fd5b506102e0613163565b348015610a8557600080fd5b506102e060048035600160a060020a0316906024803590810191013560443560643561348d565b348015610ab857600080fd5b506102e0600435613510565b348015610ad057600080fd5b506107f9600160a060020a036004351660243561361b565b348015610af457600080fd5b506103da613656565b600754600160a060020a03163314610b1457600080fd5b60115460a060020a900460ff1615610b2b57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a90811791829055604080519190920460ff161515815242602082015281517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b3929181900390910190a1565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b820191906000526020600020905b815481529060010190602001808311610c0057829003601f168201915b505050505081565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60176020526000908152604090205460ff1681565b6001545b90565b600754600160a060020a03163314610cbe57600080fd5b60ff80831660009081526016602052604090205490821610610d50576040805160e560020a62461bcd02815260206004820152603960248201527f4d6f64756c6520696e64657820646f65736e277420657869737420617320706560448201527f72207468652063686f6f73656e206d6f64756c65207479706500000000000000606482015290519081900360840190fd5b60ff8083166000908152601660205260408120805491929091908416908110610d7557fe5b6000918252602090912060016002909202010154600160a060020a03161415610e0e576040805160e560020a62461bcd02815260206004820152602860248201527f4d6f64756c6520636f6e747261637420616464726573732073686f756c64206e60448201527f6f74206265203078000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8083166000818152601660205260409020805491927fe69a96f148bcf365cf82241853ecbeb32c5b01500d98bf3d93ee870cd951162c92908516908110610e5357fe5b60009182526020918290206001600290920201015460408051600160a060020a039092168252429282019290925281519081900390910190a260ff8216600090815260166020526040902080546000198101908110610eae57fe5b9060005260206000209060020201601660008460ff1660ff1681526020019081526020016000208260ff16815481101515610ee557fe5b600091825260208083208454600290930201918255600193840154939091018054600160a060020a031916600160a060020a039094169390931790925560ff8416815260169091526040902080546000190190610f42908261467b565b505050565b600754600160a060020a03163314610f5e57600080fd5b6014805461ff0019166101001790556040805142815290517fc3f76bdabdaf2a3983623e5efddd4deb49a4acdca62642d61969164d2a4441259181900360200190a1565b600754600160a060020a03163314610fb957600080fd5b801515611010576040805160e560020a62461bcd02815260206004820152601860248201527f4772616e756c61726974792063616e206e6f7420626520300000000000000000604482015290519081900360640190fd5b600854604080519182526020820183905280517fd13c95c3e8cd875fc20a3da70637bcd9e053e0414035532577769470649507dc9281900390910190a1600855565b601454610100900460ff1681565b600061106d8484846138d3565b611078848484612935565b15156110bc576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b6110c5846139fd565b6110ce836139fd565b6110d9848484613a27565b15156110e457600080fd5b5060019392505050565b601154600160a060020a031681565b600f54600160a060020a031681565b60055460ff1681565b600754600160a060020a0316331461112c57600080fd5b60115460a060020a900460ff16151561114457600080fd5b6011805474ff00000000000000000000000000000000000000001916908190556040805160a060020a90920460ff161515825242602083015280517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b39281900390910190a1565b7f302e302e3100000000000000000000000000000000000000000000000000000081565b600b8054829081106111dd57fe5b600091825260209091200154600160a060020a0316905081565b60006003600182805b60ff808516600090815260166020526040902054908216101561126f578180611265575060ff808516600090815260166020526040902080543392841690811061124657fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611200565b82801561127a575081155b1561139d5760ff8416600314156113365760ff84166000908152601660205260409020541580156112b55750600754600160a060020a031633145b1515611331576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611398565b600754600160a060020a03163314611398576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b61141a565b81151561141a576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b856008548181151561142857fe5b06156114a4576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a03163314156115175760145460ff1615611512576040805160e560020a62461bcd02815260206004820152601e60248201527f4d696e74696e672069732066696e697368656420666f72204973737565720000604482015290519081900360640190fd5b611577565b601454610100900460ff1615611577576040805160e560020a62461bcd02815260206004820152601c60248201527f4d696e74696e672069732066696e697368656420666f722053544f7300000000604482015290519081900360640190fd5b600160a060020a03881615156115fd576040805160e560020a62461bcd02815260206004820152602160248201527f496e766573746f7220616464726573732073686f756c64206e6f74206265203060448201527f7800000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611609600089896138d3565b61161560008989612935565b1515611659576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b611662886139fd565b61166a613b8c565b60015461167d908863ffffffff613b9b16565b600155600160a060020a0388166000908152602081905260409020546116a9908863ffffffff613b9b16565b600160a060020a038916600081815260208181526040918290209390935580518a8152905191927f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe92918290030190a2604080518881529051600160a060020a038a16916000916000805160206147b08339815191529181900360200190a3506001979650505050505050565b806008548181151561174457fe5b06156117c0576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b6117cc336000846138d3565b601154600160a060020a03161515611854576040805160e560020a62461bcd02815260206004820152602c60248201527f546f6b656e204275726e657220636f6e7472616374206164647265737320697360448201527f206e6f7420736574207965740000000000000000000000000000000000000000606482015290519081900360840190fd5b61186033600084612935565b15156118a4576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b33600090815260208190526040902054821115611931576040805160e560020a62461bcd02815260206004820152603960248201527f56616c75652073686f756c64206e6f2062652067726561746572207468616e2060448201527f7468652062616c616e6365206f66206d73672e73656e64657200000000000000606482015290519081900360840190fd5b61193a336139fd565b611942613b8c565b33600090815260208190526040902054611962908363ffffffff613ba816565b336000818152602081815260408083209490945560115484517f9dc29fac0000000000000000000000000000000000000000000000000000000081526004810194909452602484018790529351600160a060020a0390941693639dc29fac93604480820194918390030190829087803b1580156119de57600080fd5b505af11580156119f2573d6000803e3d6000fd5b505050506040513d6020811015611a0857600080fd5b50511515611a86576040805160e560020a62461bcd02815260206004820152602560248201527f546f6b656e206275726e65722070726f63657373206973206e6f742076616c6960448201527f6461746564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600154611a99908363ffffffff613ba816565b60015560408051838152905133917f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b1919081900360200190a260408051838152905160009133916000805160206147b08339815191529181900360200190a35050565b60ff82166000908152601660205260408120548190811015611b8c5760ff84166000908152601660205260409020805484908110611b3657fe5b6000918252602080832060029092029091015460ff8716835260169091526040909120805485908110611b6557fe5b6000918252602090912060016002909202010154909250600160a060020a03169050611b93565b5060009050805b9250929050565b6000806003600182805b60ff8085166000908152601660205260409020549082161015611c13578180611c09575060ff8085166000908152601660205260409020805433928416908110611bea57fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611ba4565b828015611c1e575081155b15611d415760ff841660031415611cda5760ff8416600090815260166020526040902054158015611c595750600754600160a060020a031633145b1515611cd5576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611d3c565b600754600160a060020a03163314611d3c576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b611dbe565b811515611dbe576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8651885114611e3d576040805160e560020a62461bcd02815260206004820152602560248201527f4d69732d6d6174636820696e20746865206c656e677468206f6620746865206160448201527f7272617973000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600094505b8751851015611e8f57611e838886815181101515611e5c57fe5b906020019060200201518887815181101515611e7457fe5b906020019060200201516111f7565b50600190940193611e42565b506001979650505050505050565b600160a060020a0382166000908152601260205260408120611ec89083611ec3866124e6565b613bba565b9392505050565b60095481565b60085481565b601481565b600754600090600160a060020a03163314611efa57600080fd5b60ff84161515611f54576040805160e560020a62461bcd02815260206004820152601a60248201527f4d6f64756c6520747970652063616e6e6f74206265207a65726f000000000000604482015290519081900360640190fd5b60ff80851660009081526016602052604090205490841610611fc0576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f727272656374206d6f64756c6520696e646578000000000000000000604482015290519081900360640190fd5b60105460ff80861660009081526016602052604090208054600160a060020a039093169263dd62ed3e92309291908816908110611ff957fe5b60009182526020808320600160029093020191909101546040805160e060020a63ffffffff8816028152600160a060020a03958616600482015294909116602485015251604480850194929391928390030190829087803b15801561205d57600080fd5b505af1158015612071573d6000803e3d6000fd5b505050506040513d602081101561208757600080fd5b50519050808210156121f45760105460ff80861660009081526016602052604090208054600160a060020a039093169263661884639287169081106120c857fe5b6000918252602090912060016002909202010154600160a060020a03166120f5848663ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561214757600080fd5b505af115801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b505115156121ef576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20646563726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612350565b60105460ff80861660009081526016602052604090208054600160a060020a039093169263d73dd62392871690811061222957fe5b6000918252602090912060016002909202010154600160a060020a0316612256858563ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156122a857600080fd5b505af11580156122bc573d6000803e3d6000fd5b505050506040513d60208110156122d257600080fd5b50511515612350576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20696e63726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8085166000818152601660205260409020805491927f56e65530d356ea53a7cecc9a37666884b4fe9f05a65df888abd3898548bc15f49290871690811061239557fe5b60009182526020918290206001600290920201015460408051600160a060020a03909216825291810186905281519081900390910190a250505050565b60115460a060020a900460ff1681565b600381565b336000908152600260209081526040808320600160a060020a03861684529091528120548083111561243c57336000908152600260209081526040808320600160a060020a0388168452909152812055612471565b61244c818463ffffffff613ba816565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b601054600160a060020a031681565b600160a060020a031660009081526020819052604090205490565b600754600160a060020a0316331461251857600080fd5b600754604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260078054600160a060020a0319169055565b60166020528160005260406000208181548110151561257d57fe5b600091825260209091206002909102018054600190910154909250600160a060020a0316905082565b600754600160a060020a031633146125bd57600080fd5b6040805181815260068054600260001961010060018416150201909116049282018390527fcef6c04f6d4bada4c1a1fcbb22cadbe4d4fb609cea3788e920628a6186e587659290918491819060208201906060830190869080156126625780601f1061263757610100808354040283529160200191612662565b820191906000526020600020905b81548152906001019060200180831161264557829003601f168201915b5050838103825284518152845160209182019186019080838360005b8381101561269657818101518382015260200161267e565b50505050905090810190601f1680156126c35780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a180516126e59060069060208401906146a7565b5050565b600c546101009004600160a060020a031681565b601380548290811061270b57fe5b60009182526020909120600290910201805460019091015490915082565b6001600090815260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49548190151561276857600091506128a8565b5060005b600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460ff821610156128a857600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49805460ff83169081106127dc57fe5b6000918252602080832060016002909302019190910154604080517f8658b8b9000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015289811660248301526044820189905291519190921693638658b8b993606480850194919392918390030190829087803b15801561286657600080fd5b505af115801561287a573d6000803e3d6000fd5b505050506040513d602081101561289057600080fd5b5051156128a057600191506128a8565b60010161276c565b509392505050565b600754600160a060020a031681565b600281565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b600061292f601383611ec3610ca0565b92915050565b6000806000806000806000876008548181151561294e57fe5b06156129ca576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b60115460a060020a900460ff161515612c6e576000965060156000612a1f6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843750613d65945050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016815260208101919091526040016000205460ff1615612a5f57600196505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648541515612a9a5760019750612c73565b600095506000945060009350600092505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff84161015612c4c57600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648805460ff8516908110612b1b57fe5b906000526020600020906002020160010160009054906101000a9004600160a060020a0316600160a060020a0316637915c9e08c8c8c8b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200182151515158152602001945050505050602060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b505191506000826003811115612c0457fe5b1415612c0f57600195505b6002826003811115612c1d57fe5b1415612c2857600194505b6003826003811115612c3657fe5b1415612c4157600193505b600190920191612aab565b83612c645785612c5c5784612c5f565b60005b612c67565b60015b9750612c73565b600097505b505050505050509392505050565b60145460ff1681565b60ff821660009081526016602052604081205481908190811015612d7a575060005b60ff8516600090815260166020526040902054811015612d7a5760ff85166000908152601660205260409020805485919083908110612ce757fe5b60009182526020909120600290910201541415612d725760ff85166000908152601660205260409020805482908110612d1c57fe5b6000918252602080832060029092029091015460ff8816835260169091526040909120805483908110612d4b57fe5b6000918252602090912060016002909202010154909350600160a060020a03169150612d82565b600101612cac565b600092508291505b509250929050565b600754600160a060020a03163314612da157600080fd5b6014805460ff191660011790556040805142815290517f10216e36c4b6dff3d74179d50b938f0f96afc610f073894ca04b4239299165679181900360200190a1565b600181565b6000612df53384846138d3565b612e00338484612935565b1515612e44576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b612e4d336139fd565b612e56836139fd565b612e608383613de6565b1515612e6b57600080fd5b50600192915050565b600754600160a060020a03163314612e8b57600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600d54600160a060020a031681565b600481565b600754600090600160a060020a03163314612edb57600080fd5b50815b612ef9612ef1848463ffffffff613b9b16565b600b54613eb5565b811015610f4257600b5481108015612f3a5750612f38600b82815481101515612f1e57fe5b600091825260209091200154600160a060020a03166124e6565b155b15612ffe57600060176000600b84815481101515612f5457fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff1916911515919091179055600b80546000198101908110612f9a57fe5b600091825260209091200154600b8054600160a060020a039092169183908110612fc057fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600b805490612ffc906000198301614725565b505b600101612ede565b600e54600160a060020a031681565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b336000908152600260209081526040808320600160a060020a03861684529091528120546130a4908363ffffffff613b9b16565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600a5481565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600b5490565b600754600160a060020a0316331461315757600080fd5b61316081613ecb565b50565b600754600160a060020a0316331461317a57600080fd5b600c546040805160e060020a63bf40fac1028152602060048201819052600e60248301527f4d6f64756c65526567697374727900000000000000000000000000000000000060448301529151610100909304600160a060020a03169263bf40fac1926064808401939192918290030181600087803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051600d8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052601560248301527f5365637572697479546f6b656e52656769737472790000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b1580156132bc57600080fd5b505af11580156132d0573d6000803e3d6000fd5b505050506040513d60208110156132e657600080fd5b5051600e8054600160a060020a031916600160a060020a03928316178155600c546040805160e060020a63bf40fac102815260206004820181905260248201949094527f5469636b65725265676973747279000000000000000000000000000000000000604482015290516101009092049093169263bf40fac19260648083019391928290030181600087803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b5051600f8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052600960248301527f506f6c79546f6b656e0000000000000000000000000000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b15801561344057600080fd5b505af1158015613454573d6000803e3d6000fd5b505050506040513d602081101561346a57600080fd5b505160108054600160a060020a031916600160a060020a03909216919091179055565b600754600160a060020a031633146134a457600080fd5b600c5460ff16156134b457600080fd5b600c805460ff19166001179055604080516020601f86018190048102820181019092528481526134ff9187919087908790819084018382808284378201915050505050508484613f3c565b5050600c805460ff19169055505050565b600754600160a060020a0316331461352757600080fd5b601054600754604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561359957600080fd5b505af11580156135ad573d6000803e3d6000fd5b505050506040513d60208110156135c357600080fd5b50511515613160576040805160e560020a62461bcd02815260206004820152601560248201527f496e2d73756666696369656e742062616c616e63650000000000000000000000604482015290519081900360640190fd5b60126020528160005260406000208181548110151561363657fe5b600091825260209091206002909102018054600190910154909250905082565b60006004600182805b60ff80851660009081526016602052604090205490821610156136ce5781806136c4575060ff80851660009081526016602052604090208054339284169081106136a557fe5b6000918252602090912060016002909202010154600160a060020a0316145b915060010161365f565b8280156136d9575081155b156137fc5760ff8416600314156137955760ff84166000908152601660205260409020541580156137145750600754600160a060020a031633145b1515613790576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b6137f7565b600754600160a060020a031633146137f7576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b613879565b811515613879576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6009546000191161388957600080fd5b60098054600101908190556040805142815290517feb3befa36ea6638fc3379fe62edc59509b81aeca57cfbb0f444b1e72b8ac93fe9181900360200190a260095494505050505090565b8015806138f1575081600160a060020a031683600160a060020a0316145b156138fb57610f42565b613904826124e6565b1580156139195750600160a060020a03821615155b1561393657600a5461393290600163ffffffff613b9b16565b600a555b61393f836124e6565b81141561395e57600a5461395a90600163ffffffff613ba816565b600a555b600160a060020a03821660009081526017602052604090205460ff1615801561398f5750600160a060020a03821615155b15610f4257600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018054600160a060020a038516600160a060020a031990911681179091556000908152601760205260409020805460ff19169091179055505050565b600160a060020a038116600090815260126020526040902061316090613a22836124e6565b6145b7565b6000600160a060020a0383161515613a3e57600080fd5b600160a060020a038416600090815260208190526040902054821115613a6357600080fd5b600160a060020a0384166000908152600260209081526040808320338452909152902054821115613a9357600080fd5b600160a060020a038416600090815260208190526040902054613abc908363ffffffff613ba816565b600160a060020a038086166000908152602081905260408082209390935590851681522054613af1908363ffffffff613b9b16565b600160a060020a03808516600090815260208181526040808320949094559187168152600282528281203382529091522054613b33908363ffffffff613ba816565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391926000805160206147b0833981519152929181900390910190a35060019392505050565b613b996013613a22610ca0565b565b8181018281101561292f57fe5b600082821115613bb457fe5b50900390565b6000806000806009548611151515613bd157600080fd5b851515613be15760009350613d5b565b86541515613bf157849350613d5b565b85876000815481101515613c0157fe5b600091825260209091206002909102015410613c3f57866000815481101515613c2657fe5b9060005260206000209060020201600101549350613d5b565b8654869088906000198101908110613c5357fe5b9060005260206000209060020201600001541015613c7357849350613d5b565b8654869088906000198101908110613c8757fe5b9060005260206000209060020201600001541415613cb157865487906000198101908110613c2657fe5b8654600093506000190191505b82821115613d38576002828401049050858782815481101515613cdd57fe5b9060005260206000209060020201600001541415613cfd57809150613d38565b858782815481101515613d0c57fe5b9060005260206000209060020201600001541015613d2f57806001019250613d33565b8091505b613cbe565b8682815481101515613d4657fe5b90600052602060002090600202016001015493505b5050509392505050565b60008060006004845110613d7a576004613d7d565b83515b9150600090505b81811015613ddf5780600183030360080260020a8482815181101515613da657fe5b90602001015160f860020a900460f860020a0260f860020a9004028360e060020a90040160e060020a0292508080600101915050613d84565b5050919050565b6000600160a060020a0383161515613dfd57600080fd5b33600090815260208190526040902054821115613e1957600080fd5b33600090815260208190526040902054613e39908363ffffffff613ba816565b3360009081526020819052604080822092909255600160a060020a03851681522054613e6b908363ffffffff613b9b16565b600160a060020a038416600081815260208181526040918290209390935580518581529051919233926000805160206147b08339815191529281900390910190a350600192915050565b6000818310613ec45781611ec8565b5090919050565b600160a060020a0381161515613ee057600080fd5b600754604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360078054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517fdc659907000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015291516000938493849384938493929092169163dc65990791602480820192869290919082900301818387803b158015613fae57600080fd5b505af1158015613fc2573d6000803e3d6000fd5b5050505088945084600160a060020a03166315dae03e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561400757600080fd5b505af115801561401b573d6000803e3d6000fd5b505050506040513d602081101561403157600080fd5b505160ff81166000908152601660205260409020549094506014116140a0576040805160e560020a62461bcd02815260206004820152601f60248201527f4c696d6974206f66204d4158204d4f44554c4553206973207265616368656400604482015290519081900360640190fd5b84600160a060020a0316637e363ffa6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156140de57600080fd5b505af11580156140f2573d6000803e3d6000fd5b505050506040513d602081101561410857600080fd5b505192508683111561418a576040805160e560020a62461bcd02815260206004820152602e60248201527f4d617820436f737420697320616c77617973206265206772656174657220746860448201527f616e206d6f64756c6520636f7374000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163095ea7b39160448083019260209291908290030181600087803b1580156141f957600080fd5b505af115801561420d573d6000803e3d6000fd5b505050506040513d602081101561422357600080fd5b505115156142a1576040805160e560020a62461bcd02815260206004820152602360248201527f4e6f742061626c6520746f20617070726f766520746865206d6f64756c65206360448201527f6f73740000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6040517e7743600000000000000000000000000000000000000000000000000000000081526020600482018181528a5160248401528a51600160a060020a0389169362774360938d939283926044019185019080838360005b838110156143125781810151838201526020016142fa565b50505050905090810190601f16801561433f5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d602081101561438857600080fd5b5051601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038085166004830152602482018b9052915193955091169163095ea7b3916044808201926020929091908290030181600087803b1580156143fb57600080fd5b505af115801561440f573d6000803e3d6000fd5b505050506040513d602081101561442557600080fd5b5051151561447d576040805160e560020a62461bcd02815260206004820152601e60248201527f4e6f742061626c6520746f20617070726f766520746865206275646765740000604482015290519081900360640190fd5b84600160a060020a03166317d7de7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156144bb57600080fd5b505af11580156144cf573d6000803e3d6000fd5b505050506040513d60208110156144e557600080fd5b505160ff8516600081815260166020908152604080832081518083018352868152600160a060020a0389811682860181815284546001808201875595895297879020935160029098029093019687559151959092018054600160a060020a031916958316959095179094558151868152908f16928101929092528181019290925260608101879052608081018a90524260a0820152905192935090917fc6c63fb8912a7f464252e66132ad69604864e7520f1bcf0dd77c8d51d810a6519160c0908290030190a2505050505050505050565b60095415156145c5576126e5565b8154151561460c57604080518082019091526009548152602080820183815284546001818101875560008781529390932093516002909102909301928355519101556126e5565b60095482548390600019810190811061462157fe5b906000526020600020906002020160000154141561463e576126e5565b6040805180820190915260095481526020808201928352835460018082018655600095865291909420915160029094029091019283559051910155565b815481835581811115610f4257600202816002028360005260206000209182019101610f429190614749565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146e857805160ff1916838001178555614715565b82800160010185558215614715579182015b828111156147155782518255916020019190600101906146fa565b50614721929150614775565b5090565b815481835581811115610f4257600083815260209020610f42918101908301614775565b610ca491905b808211156147215760008155600181018054600160a060020a031916905560020161474f565b610ca491905b80821115614721576000815560010161477b56005472616e73666572206973206e6f742076616c69640000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820d194fbde9329028efd78e81aaa560fc5fa644ba09ac0fcec999dd63d4617267d002900000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000014000000000000000000000000006595656b93ce14834f0d22b7bbda4382d5ab5100000000000000000000000000000000000000000000000000000000000000013506f6c796d617468205465737420546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957452e522e4c495645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102c65763ffffffff60e060020a6000350416630150246081146102cb57806306fdde03146102e2578063095ea7b31461036c5780630c72a835146103a457806318160ddd146103c55780631b2ae899146103ec5780631bc125f31461040d578063210a8d0e14610422578063219371921461043a57806323b872dd1461044f5780632996f972146104795780632a858126146104aa578063313ce567146104bf57806331c420d4146104ea5780633876e6d3146104ff5780633feb5f2b1461051457806340c10f191461052c57806342966c681461055057806346b65ffd1461056857806346e4959d146105a75780634ee2cd7e146106355780635488cc8014610659578063556f0dc71461066e5780635f1e8c1b146106835780635fcc62771461069857806362a5af3b146106bc5780636604ca6b146106d157806366188463146106e65780636faa22a51461070a57806370a082311461071f578063715018a614610740578063729d20e21461075557806373826a931461077357806377282b70146107cc5780637e8937d9146107e15780638658b8b9146108125780638da5cb5b1461083c57806391415ce91461085157806395d89b4114610866578063981b24d01461087b5780639a4b1d5c146108935780639c3fe721146108bd5780639f45b45c146108d2578063a3f7e26d146108f0578063a8ef4b6614610905578063a9059cbb1461091a578063b0af768b1461093e578063b95459e41461095f578063bcddd64e14610974578063c5bac42114610989578063ce4dbdff146109a4578063d6abe110146109b9578063d73dd623146109ce578063d7e64c00146109f2578063dd62ed3e14610a07578063e3cc65e214610a2e578063f2fde38b14610a43578063f433262f14610a64578063f5efbd2d14610a79578063f8a4cc3314610aac578063fbaa401914610ac4578063ff0b9c9014610ae8575b600080fd5b3480156102d757600080fd5b506102e0610afd565b005b3480156102ee57600080fd5b506102f7610b97565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610331578181015183820152602001610319565b50505050905090810190601f16801561035e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037857600080fd5b50610390600160a060020a0360043516602435610c25565b604080519115158252519081900360200190f35b3480156103b057600080fd5b50610390600160a060020a0360043516610c8b565b3480156103d157600080fd5b506103da610ca0565b60408051918252519081900360200190f35b3480156103f857600080fd5b506102e060ff60043581169060243516610ca7565b34801561041957600080fd5b506102e0610f47565b34801561042e57600080fd5b506102e0600435610fa2565b34801561044657600080fd5b50610390611052565b34801561045b57600080fd5b50610390600160a060020a0360043581169060243516604435611060565b34801561048557600080fd5b5061048e6110ee565b60408051600160a060020a039092168252519081900360200190f35b3480156104b657600080fd5b5061048e6110fd565b3480156104cb57600080fd5b506104d461110c565b6040805160ff9092168252519081900360200190f35b3480156104f657600080fd5b506102e0611115565b34801561050b57600080fd5b506103da6111ab565b34801561052057600080fd5b5061048e6004356111cf565b34801561053857600080fd5b50610390600160a060020a03600435166024356111f7565b34801561055c57600080fd5b506102e0600435611736565b34801561057457600080fd5b5061058660ff60043516602435611afc565b60408051928352600160a060020a0390911660208301528051918290030190f35b3480156105b357600080fd5b506040805160206004803580820135838102808601850190965280855261039095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750611b9a9650505050505050565b34801561064157600080fd5b506103da600160a060020a0360043516602435611e9d565b34801561066557600080fd5b506103da611ecf565b34801561067a57600080fd5b506103da611ed5565b34801561068f57600080fd5b506104d4611edb565b3480156106a457600080fd5b506102e060ff60043581169060243516604435611ee0565b3480156106c857600080fd5b506103906123d2565b3480156106dd57600080fd5b506104d46123e2565b3480156106f257600080fd5b50610390600160a060020a03600435166024356123e7565b34801561071657600080fd5b5061048e6124d7565b34801561072b57600080fd5b506103da600160a060020a03600435166124e6565b34801561074c57600080fd5b506102e0612501565b34801561076157600080fd5b5061058660ff60043516602435612562565b34801561077f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102e09436949293602493928401919081908401838280828437509497506125a69650505050505050565b3480156107d857600080fd5b5061048e6126e9565b3480156107ed57600080fd5b506107f96004356126fd565b6040805192835260208301919091528051918290030190f35b34801561081e57600080fd5b50610390600160a060020a0360043581169060243516604435612729565b34801561084857600080fd5b5061048e6128b0565b34801561085d57600080fd5b506104d46128bf565b34801561087257600080fd5b506102f76128c4565b34801561088757600080fd5b506103da60043561291f565b34801561089f57600080fd5b50610390600160a060020a0360043581169060243516604435612935565b3480156108c957600080fd5b50610390612c81565b3480156108de57600080fd5b5061058660ff60043516602435612c8a565b3480156108fc57600080fd5b506102e0612d8a565b34801561091157600080fd5b506104d4612de3565b34801561092657600080fd5b50610390600160a060020a0360043516602435612de8565b34801561094a57600080fd5b506102e0600160a060020a0360043516612e74565b34801561096b57600080fd5b5061048e612ead565b34801561098057600080fd5b506104d4612ebc565b34801561099557600080fd5b506102e0600435602435612ec1565b3480156109b057600080fd5b5061048e613006565b3480156109c557600080fd5b506102f7613015565b3480156109da57600080fd5b50610390600160a060020a0360043516602435613070565b3480156109fe57600080fd5b506103da613109565b348015610a1357600080fd5b506103da600160a060020a036004358116906024351661310f565b348015610a3a57600080fd5b506103da61313a565b348015610a4f57600080fd5b506102e0600160a060020a0360043516613140565b348015610a7057600080fd5b506102e0613163565b348015610a8557600080fd5b506102e060048035600160a060020a0316906024803590810191013560443560643561348d565b348015610ab857600080fd5b506102e0600435613510565b348015610ad057600080fd5b506107f9600160a060020a036004351660243561361b565b348015610af457600080fd5b506103da613656565b600754600160a060020a03163314610b1457600080fd5b60115460a060020a900460ff1615610b2b57600080fd5b6011805474ff0000000000000000000000000000000000000000191660a060020a90811791829055604080519190920460ff161515815242602082015281517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b3929181900390910190a1565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b820191906000526020600020905b815481529060010190602001808311610c0057829003601f168201915b505050505081565b336000818152600260209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60176020526000908152604090205460ff1681565b6001545b90565b600754600160a060020a03163314610cbe57600080fd5b60ff80831660009081526016602052604090205490821610610d50576040805160e560020a62461bcd02815260206004820152603960248201527f4d6f64756c6520696e64657820646f65736e277420657869737420617320706560448201527f72207468652063686f6f73656e206d6f64756c65207479706500000000000000606482015290519081900360840190fd5b60ff8083166000908152601660205260408120805491929091908416908110610d7557fe5b6000918252602090912060016002909202010154600160a060020a03161415610e0e576040805160e560020a62461bcd02815260206004820152602860248201527f4d6f64756c6520636f6e747261637420616464726573732073686f756c64206e60448201527f6f74206265203078000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8083166000818152601660205260409020805491927fe69a96f148bcf365cf82241853ecbeb32c5b01500d98bf3d93ee870cd951162c92908516908110610e5357fe5b60009182526020918290206001600290920201015460408051600160a060020a039092168252429282019290925281519081900390910190a260ff8216600090815260166020526040902080546000198101908110610eae57fe5b9060005260206000209060020201601660008460ff1660ff1681526020019081526020016000208260ff16815481101515610ee557fe5b600091825260208083208454600290930201918255600193840154939091018054600160a060020a031916600160a060020a039094169390931790925560ff8416815260169091526040902080546000190190610f42908261467b565b505050565b600754600160a060020a03163314610f5e57600080fd5b6014805461ff0019166101001790556040805142815290517fc3f76bdabdaf2a3983623e5efddd4deb49a4acdca62642d61969164d2a4441259181900360200190a1565b600754600160a060020a03163314610fb957600080fd5b801515611010576040805160e560020a62461bcd02815260206004820152601860248201527f4772616e756c61726974792063616e206e6f7420626520300000000000000000604482015290519081900360640190fd5b600854604080519182526020820183905280517fd13c95c3e8cd875fc20a3da70637bcd9e053e0414035532577769470649507dc9281900390910190a1600855565b601454610100900460ff1681565b600061106d8484846138d3565b611078848484612935565b15156110bc576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b6110c5846139fd565b6110ce836139fd565b6110d9848484613a27565b15156110e457600080fd5b5060019392505050565b601154600160a060020a031681565b600f54600160a060020a031681565b60055460ff1681565b600754600160a060020a0316331461112c57600080fd5b60115460a060020a900460ff16151561114457600080fd5b6011805474ff00000000000000000000000000000000000000001916908190556040805160a060020a90920460ff161515825242602083015280517fd057913b88ba41d6281d1ee94831a8a6166afd6b478ea9babb2c02b413f172b39281900390910190a1565b7f302e302e3100000000000000000000000000000000000000000000000000000081565b600b8054829081106111dd57fe5b600091825260209091200154600160a060020a0316905081565b60006003600182805b60ff808516600090815260166020526040902054908216101561126f578180611265575060ff808516600090815260166020526040902080543392841690811061124657fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611200565b82801561127a575081155b1561139d5760ff8416600314156113365760ff84166000908152601660205260409020541580156112b55750600754600160a060020a031633145b1515611331576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611398565b600754600160a060020a03163314611398576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b61141a565b81151561141a576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b856008548181151561142857fe5b06156114a4576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b600754600160a060020a03163314156115175760145460ff1615611512576040805160e560020a62461bcd02815260206004820152601e60248201527f4d696e74696e672069732066696e697368656420666f72204973737565720000604482015290519081900360640190fd5b611577565b601454610100900460ff1615611577576040805160e560020a62461bcd02815260206004820152601c60248201527f4d696e74696e672069732066696e697368656420666f722053544f7300000000604482015290519081900360640190fd5b600160a060020a03881615156115fd576040805160e560020a62461bcd02815260206004820152602160248201527f496e766573746f7220616464726573732073686f756c64206e6f74206265203060448201527f7800000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611609600089896138d3565b61161560008989612935565b1515611659576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b611662886139fd565b61166a613b8c565b60015461167d908863ffffffff613b9b16565b600155600160a060020a0388166000908152602081905260409020546116a9908863ffffffff613b9b16565b600160a060020a038916600081815260208181526040918290209390935580518a8152905191927f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe92918290030190a2604080518881529051600160a060020a038a16916000916000805160206147b08339815191529181900360200190a3506001979650505050505050565b806008548181151561174457fe5b06156117c0576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b6117cc336000846138d3565b601154600160a060020a03161515611854576040805160e560020a62461bcd02815260206004820152602c60248201527f546f6b656e204275726e657220636f6e7472616374206164647265737320697360448201527f206e6f7420736574207965740000000000000000000000000000000000000000606482015290519081900360840190fd5b61186033600084612935565b15156118a4576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b33600090815260208190526040902054821115611931576040805160e560020a62461bcd02815260206004820152603960248201527f56616c75652073686f756c64206e6f2062652067726561746572207468616e2060448201527f7468652062616c616e6365206f66206d73672e73656e64657200000000000000606482015290519081900360840190fd5b61193a336139fd565b611942613b8c565b33600090815260208190526040902054611962908363ffffffff613ba816565b336000818152602081815260408083209490945560115484517f9dc29fac0000000000000000000000000000000000000000000000000000000081526004810194909452602484018790529351600160a060020a0390941693639dc29fac93604480820194918390030190829087803b1580156119de57600080fd5b505af11580156119f2573d6000803e3d6000fd5b505050506040513d6020811015611a0857600080fd5b50511515611a86576040805160e560020a62461bcd02815260206004820152602560248201527f546f6b656e206275726e65722070726f63657373206973206e6f742076616c6960448201527f6461746564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600154611a99908363ffffffff613ba816565b60015560408051838152905133917f919f7e2092ffcc9d09f599be18d8152860b0c054df788a33bc549cdd9d0f15b1919081900360200190a260408051838152905160009133916000805160206147b08339815191529181900360200190a35050565b60ff82166000908152601660205260408120548190811015611b8c5760ff84166000908152601660205260409020805484908110611b3657fe5b6000918252602080832060029092029091015460ff8716835260169091526040909120805485908110611b6557fe5b6000918252602090912060016002909202010154909250600160a060020a03169050611b93565b5060009050805b9250929050565b6000806003600182805b60ff8085166000908152601660205260409020549082161015611c13578180611c09575060ff8085166000908152601660205260409020805433928416908110611bea57fe5b6000918252602090912060016002909202010154600160a060020a0316145b9150600101611ba4565b828015611c1e575081155b15611d415760ff841660031415611cda5760ff8416600090815260166020526040902054158015611c595750600754600160a060020a031633145b1515611cd5576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b611d3c565b600754600160a060020a03163314611d3c576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b611dbe565b811515611dbe576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b8651885114611e3d576040805160e560020a62461bcd02815260206004820152602560248201527f4d69732d6d6174636820696e20746865206c656e677468206f6620746865206160448201527f7272617973000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600094505b8751851015611e8f57611e838886815181101515611e5c57fe5b906020019060200201518887815181101515611e7457fe5b906020019060200201516111f7565b50600190940193611e42565b506001979650505050505050565b600160a060020a0382166000908152601260205260408120611ec89083611ec3866124e6565b613bba565b9392505050565b60095481565b60085481565b601481565b600754600090600160a060020a03163314611efa57600080fd5b60ff84161515611f54576040805160e560020a62461bcd02815260206004820152601a60248201527f4d6f64756c6520747970652063616e6e6f74206265207a65726f000000000000604482015290519081900360640190fd5b60ff80851660009081526016602052604090205490841610611fc0576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f727272656374206d6f64756c6520696e646578000000000000000000604482015290519081900360640190fd5b60105460ff80861660009081526016602052604090208054600160a060020a039093169263dd62ed3e92309291908816908110611ff957fe5b60009182526020808320600160029093020191909101546040805160e060020a63ffffffff8816028152600160a060020a03958616600482015294909116602485015251604480850194929391928390030190829087803b15801561205d57600080fd5b505af1158015612071573d6000803e3d6000fd5b505050506040513d602081101561208757600080fd5b50519050808210156121f45760105460ff80861660009081526016602052604090208054600160a060020a039093169263661884639287169081106120c857fe5b6000918252602090912060016002909202010154600160a060020a03166120f5848663ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561214757600080fd5b505af115801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b505115156121ef576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20646563726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612350565b60105460ff80861660009081526016602052604090208054600160a060020a039093169263d73dd62392871690811061222957fe5b6000918252602090912060016002909202010154600160a060020a0316612256858563ffffffff613ba816565b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156122a857600080fd5b505af11580156122bc573d6000803e3d6000fd5b505050506040513d60208110156122d257600080fd5b50511515612350576040805160e560020a62461bcd02815260206004820152602860248201527f496e73756666696369656e742062616c616e636520746f20696e63726561736560448201527f417070726f76616c000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60ff8085166000818152601660205260409020805491927f56e65530d356ea53a7cecc9a37666884b4fe9f05a65df888abd3898548bc15f49290871690811061239557fe5b60009182526020918290206001600290920201015460408051600160a060020a03909216825291810186905281519081900390910190a250505050565b60115460a060020a900460ff1681565b600381565b336000908152600260209081526040808320600160a060020a03861684529091528120548083111561243c57336000908152600260209081526040808320600160a060020a0388168452909152812055612471565b61244c818463ffffffff613ba816565b336000908152600260209081526040808320600160a060020a03891684529091529020555b336000818152600260209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b601054600160a060020a031681565b600160a060020a031660009081526020819052604090205490565b600754600160a060020a0316331461251857600080fd5b600754604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260078054600160a060020a0319169055565b60166020528160005260406000208181548110151561257d57fe5b600091825260209091206002909102018054600190910154909250600160a060020a0316905082565b600754600160a060020a031633146125bd57600080fd5b6040805181815260068054600260001961010060018416150201909116049282018390527fcef6c04f6d4bada4c1a1fcbb22cadbe4d4fb609cea3788e920628a6186e587659290918491819060208201906060830190869080156126625780601f1061263757610100808354040283529160200191612662565b820191906000526020600020905b81548152906001019060200180831161264557829003601f168201915b5050838103825284518152845160209182019186019080838360005b8381101561269657818101518382015260200161267e565b50505050905090810190601f1680156126c35780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a180516126e59060069060208401906146a7565b5050565b600c546101009004600160a060020a031681565b601380548290811061270b57fe5b60009182526020909120600290910201805460019091015490915082565b6001600090815260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49548190151561276857600091506128a8565b5060005b600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf495460ff821610156128a857600160005260166020527f4c4dc693d7db52f85fe052106f4b4b920e78e8ef37dee82878a60ab8585faf49805460ff83169081106127dc57fe5b6000918252602080832060016002909302019190910154604080517f8658b8b9000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015289811660248301526044820189905291519190921693638658b8b993606480850194919392918390030190829087803b15801561286657600080fd5b505af115801561287a573d6000803e3d6000fd5b505050506040513d602081101561289057600080fd5b5051156128a057600191506128a8565b60010161276c565b509392505050565b600754600160a060020a031681565b600281565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b600061292f601383611ec3610ca0565b92915050565b6000806000806000806000876008548181151561294e57fe5b06156129ca576040805160e560020a62461bcd02815260206004820152603360248201527f556e61626c6520746f206d6f6469667920746f6b656e2062616c616e6365732060448201527f61742074686973206772616e756c617269747900000000000000000000000000606482015290519081900360840190fd5b60115460a060020a900460ff161515612c6e576000965060156000612a1f6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843750613d65945050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016815260208101919091526040016000205460ff1615612a5f57600196505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648541515612a9a5760019750612c73565b600095506000945060009350600092505b600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab28856485460ff84161015612c4c57600260005260166020527fcaff291fe014adc6b72a172705750b4cabe8f8667664d2924a166caab2885648805460ff8516908110612b1b57fe5b906000526020600020906002020160010160009054906101000a9004600160a060020a0316600160a060020a0316637915c9e08c8c8c8b6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200182151515158152602001945050505050602060405180830381600087803b158015612bc857600080fd5b505af1158015612bdc573d6000803e3d6000fd5b505050506040513d6020811015612bf257600080fd5b505191506000826003811115612c0457fe5b1415612c0f57600195505b6002826003811115612c1d57fe5b1415612c2857600194505b6003826003811115612c3657fe5b1415612c4157600193505b600190920191612aab565b83612c645785612c5c5784612c5f565b60005b612c67565b60015b9750612c73565b600097505b505050505050509392505050565b60145460ff1681565b60ff821660009081526016602052604081205481908190811015612d7a575060005b60ff8516600090815260166020526040902054811015612d7a5760ff85166000908152601660205260409020805485919083908110612ce757fe5b60009182526020909120600290910201541415612d725760ff85166000908152601660205260409020805482908110612d1c57fe5b6000918252602080832060029092029091015460ff8816835260169091526040909120805483908110612d4b57fe5b6000918252602090912060016002909202010154909350600160a060020a03169150612d82565b600101612cac565b600092508291505b509250929050565b600754600160a060020a03163314612da157600080fd5b6014805460ff191660011790556040805142815290517f10216e36c4b6dff3d74179d50b938f0f96afc610f073894ca04b4239299165679181900360200190a1565b600181565b6000612df53384846138d3565b612e00338484612935565b1515612e44576040805160e560020a62461bcd0281526020600482015260156024820152600080516020614790833981519152604482015290519081900360640190fd5b612e4d336139fd565b612e56836139fd565b612e608383613de6565b1515612e6b57600080fd5b50600192915050565b600754600160a060020a03163314612e8b57600080fd5b60118054600160a060020a031916600160a060020a0392909216919091179055565b600d54600160a060020a031681565b600481565b600754600090600160a060020a03163314612edb57600080fd5b50815b612ef9612ef1848463ffffffff613b9b16565b600b54613eb5565b811015610f4257600b5481108015612f3a5750612f38600b82815481101515612f1e57fe5b600091825260209091200154600160a060020a03166124e6565b155b15612ffe57600060176000600b84815481101515612f5457fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff1916911515919091179055600b80546000198101908110612f9a57fe5b600091825260209091200154600b8054600160a060020a039092169183908110612fc057fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600b805490612ffc906000198301614725565b505b600101612ede565b600e54600160a060020a031681565b6006805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c1d5780601f10610bf257610100808354040283529160200191610c1d565b336000908152600260209081526040808320600160a060020a03861684529091528120546130a4908363ffffffff613b9b16565b336000818152600260209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600a5481565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600b5490565b600754600160a060020a0316331461315757600080fd5b61316081613ecb565b50565b600754600160a060020a0316331461317a57600080fd5b600c546040805160e060020a63bf40fac1028152602060048201819052600e60248301527f4d6f64756c65526567697374727900000000000000000000000000000000000060448301529151610100909304600160a060020a03169263bf40fac1926064808401939192918290030181600087803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b5051600d8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052601560248301527f5365637572697479546f6b656e52656769737472790000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b1580156132bc57600080fd5b505af11580156132d0573d6000803e3d6000fd5b505050506040513d60208110156132e657600080fd5b5051600e8054600160a060020a031916600160a060020a03928316178155600c546040805160e060020a63bf40fac102815260206004820181905260248201949094527f5469636b65725265676973747279000000000000000000000000000000000000604482015290516101009092049093169263bf40fac19260648083019391928290030181600087803b15801561337f57600080fd5b505af1158015613393573d6000803e3d6000fd5b505050506040513d60208110156133a957600080fd5b5051600f8054600160a060020a031916600160a060020a03928316179055600c546040805160e060020a63bf40fac1028152602060048201819052600960248301527f506f6c79546f6b656e0000000000000000000000000000000000000000000000604483015291516101009093049093169263bf40fac192606480830193928290030181600087803b15801561344057600080fd5b505af1158015613454573d6000803e3d6000fd5b505050506040513d602081101561346a57600080fd5b505160108054600160a060020a031916600160a060020a03909216919091179055565b600754600160a060020a031633146134a457600080fd5b600c5460ff16156134b457600080fd5b600c805460ff19166001179055604080516020601f86018190048102820181019092528481526134ff9187919087908790819084018382808284378201915050505050508484613f3c565b5050600c805460ff19169055505050565b600754600160a060020a0316331461352757600080fd5b601054600754604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018590529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561359957600080fd5b505af11580156135ad573d6000803e3d6000fd5b505050506040513d60208110156135c357600080fd5b50511515613160576040805160e560020a62461bcd02815260206004820152601560248201527f496e2d73756666696369656e742062616c616e63650000000000000000000000604482015290519081900360640190fd5b60126020528160005260406000208181548110151561363657fe5b600091825260209091206002909102018054600190910154909250905082565b60006004600182805b60ff80851660009081526016602052604090205490821610156136ce5781806136c4575060ff80851660009081526016602052604090208054339284169081106136a557fe5b6000918252602090912060016002909202010154600160a060020a0316145b915060010161365f565b8280156136d9575081155b156137fc5760ff8416600314156137955760ff84166000908152601660205260409020541580156137145750600754600160a060020a031633145b1515613790576040805160e560020a62461bcd02815260206004820152602d60248201527f53656e646572206973206e6f74206f776e6572206f722053544f206d6f64756c60448201527f6520697320617474616368656400000000000000000000000000000000000000606482015290519081900360840190fd5b6137f7565b600754600160a060020a031633146137f7576040805160e560020a62461bcd02815260206004820152601360248201527f53656e646572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b613879565b811515613879576040805160e560020a62461bcd02815260206004820152602160248201527f53656e646572206973206e6f7420636f7272656374206d6f64756c652074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6009546000191161388957600080fd5b60098054600101908190556040805142815290517feb3befa36ea6638fc3379fe62edc59509b81aeca57cfbb0f444b1e72b8ac93fe9181900360200190a260095494505050505090565b8015806138f1575081600160a060020a031683600160a060020a0316145b156138fb57610f42565b613904826124e6565b1580156139195750600160a060020a03821615155b1561393657600a5461393290600163ffffffff613b9b16565b600a555b61393f836124e6565b81141561395e57600a5461395a90600163ffffffff613ba816565b600a555b600160a060020a03821660009081526017602052604090205460ff1615801561398f5750600160a060020a03821615155b15610f4257600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9018054600160a060020a038516600160a060020a031990911681179091556000908152601760205260409020805460ff19169091179055505050565b600160a060020a038116600090815260126020526040902061316090613a22836124e6565b6145b7565b6000600160a060020a0383161515613a3e57600080fd5b600160a060020a038416600090815260208190526040902054821115613a6357600080fd5b600160a060020a0384166000908152600260209081526040808320338452909152902054821115613a9357600080fd5b600160a060020a038416600090815260208190526040902054613abc908363ffffffff613ba816565b600160a060020a038086166000908152602081905260408082209390935590851681522054613af1908363ffffffff613b9b16565b600160a060020a03808516600090815260208181526040808320949094559187168152600282528281203382529091522054613b33908363ffffffff613ba816565b600160a060020a03808616600081815260026020908152604080832033845282529182902094909455805186815290519287169391926000805160206147b0833981519152929181900390910190a35060019392505050565b613b996013613a22610ca0565b565b8181018281101561292f57fe5b600082821115613bb457fe5b50900390565b6000806000806009548611151515613bd157600080fd5b851515613be15760009350613d5b565b86541515613bf157849350613d5b565b85876000815481101515613c0157fe5b600091825260209091206002909102015410613c3f57866000815481101515613c2657fe5b9060005260206000209060020201600101549350613d5b565b8654869088906000198101908110613c5357fe5b9060005260206000209060020201600001541015613c7357849350613d5b565b8654869088906000198101908110613c8757fe5b9060005260206000209060020201600001541415613cb157865487906000198101908110613c2657fe5b8654600093506000190191505b82821115613d38576002828401049050858782815481101515613cdd57fe5b9060005260206000209060020201600001541415613cfd57809150613d38565b858782815481101515613d0c57fe5b9060005260206000209060020201600001541015613d2f57806001019250613d33565b8091505b613cbe565b8682815481101515613d4657fe5b90600052602060002090600202016001015493505b5050509392505050565b60008060006004845110613d7a576004613d7d565b83515b9150600090505b81811015613ddf5780600183030360080260020a8482815181101515613da657fe5b90602001015160f860020a900460f860020a0260f860020a9004028360e060020a90040160e060020a0292508080600101915050613d84565b5050919050565b6000600160a060020a0383161515613dfd57600080fd5b33600090815260208190526040902054821115613e1957600080fd5b33600090815260208190526040902054613e39908363ffffffff613ba816565b3360009081526020819052604080822092909255600160a060020a03851681522054613e6b908363ffffffff613b9b16565b600160a060020a038416600081815260208181526040918290209390935580518581529051919233926000805160206147b08339815191529281900390910190a350600192915050565b6000818310613ec45781611ec8565b5090919050565b600160a060020a0381161515613ee057600080fd5b600754604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360078054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517fdc659907000000000000000000000000000000000000000000000000000000008152600160a060020a03878116600483015291516000938493849384938493929092169163dc65990791602480820192869290919082900301818387803b158015613fae57600080fd5b505af1158015613fc2573d6000803e3d6000fd5b5050505088945084600160a060020a03166315dae03e6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561400757600080fd5b505af115801561401b573d6000803e3d6000fd5b505050506040513d602081101561403157600080fd5b505160ff81166000908152601660205260409020549094506014116140a0576040805160e560020a62461bcd02815260206004820152601f60248201527f4c696d6974206f66204d4158204d4f44554c4553206973207265616368656400604482015290519081900360640190fd5b84600160a060020a0316637e363ffa6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156140de57600080fd5b505af11580156140f2573d6000803e3d6000fd5b505050506040513d602081101561410857600080fd5b505192508683111561418a576040805160e560020a62461bcd02815260206004820152602e60248201527f4d617820436f737420697320616c77617973206265206772656174657220746860448201527f616e206d6f64756c6520636f7374000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163095ea7b39160448083019260209291908290030181600087803b1580156141f957600080fd5b505af115801561420d573d6000803e3d6000fd5b505050506040513d602081101561422357600080fd5b505115156142a1576040805160e560020a62461bcd02815260206004820152602360248201527f4e6f742061626c6520746f20617070726f766520746865206d6f64756c65206360448201527f6f73740000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6040517e7743600000000000000000000000000000000000000000000000000000000081526020600482018181528a5160248401528a51600160a060020a0389169362774360938d939283926044019185019080838360005b838110156143125781810151838201526020016142fa565b50505050905090810190601f16801561433f5780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050506040513d602081101561438857600080fd5b5051601054604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038085166004830152602482018b9052915193955091169163095ea7b3916044808201926020929091908290030181600087803b1580156143fb57600080fd5b505af115801561440f573d6000803e3d6000fd5b505050506040513d602081101561442557600080fd5b5051151561447d576040805160e560020a62461bcd02815260206004820152601e60248201527f4e6f742061626c6520746f20617070726f766520746865206275646765740000604482015290519081900360640190fd5b84600160a060020a03166317d7de7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156144bb57600080fd5b505af11580156144cf573d6000803e3d6000fd5b505050506040513d60208110156144e557600080fd5b505160ff8516600081815260166020908152604080832081518083018352868152600160a060020a0389811682860181815284546001808201875595895297879020935160029098029093019687559151959092018054600160a060020a031916958316959095179094558151868152908f16928101929092528181019290925260608101879052608081018a90524260a0820152905192935090917fc6c63fb8912a7f464252e66132ad69604864e7520f1bcf0dd77c8d51d810a6519160c0908290030190a2505050505050505050565b60095415156145c5576126e5565b8154151561460c57604080518082019091526009548152602080820183815284546001818101875560008781529390932093516002909102909301928355519101556126e5565b60095482548390600019810190811061462157fe5b906000526020600020906002020160000154141561463e576126e5565b6040805180820190915260095481526020808201928352835460018082018655600095865291909420915160029094029091019283559051910155565b815481835581811115610f4257600202816002028360005260206000209182019101610f429190614749565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106146e857805160ff1916838001178555614715565b82800160010185558215614715579182015b828111156147155782518255916020019190600101906146fa565b50614721929150614775565b5090565b815481835581811115610f4257600083815260209020610f42918101908301614775565b610ca491905b808211156147215760008155600181018054600160a060020a031916905560020161474f565b610ca491905b80821115614721576000815560010161477b56005472616e73666572206973206e6f742076616c69640000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820d194fbde9329028efd78e81aaa560fc5fa644ba09ac0fcec999dd63d4617267d0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000014000000000000000000000000006595656b93ce14834f0d22b7bbda4382d5ab5100000000000000000000000000000000000000000000000000000000000000013506f6c796d617468205465737420546f6b656e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000957452e522e4c495645000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043078303000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Polymath Test Token
Arg [1] : _symbol (string): WE.R.LIVE
Arg [2] : _decimals (uint8): 18
Arg [3] : _granularity (uint256): 1
Arg [4] : _tokenDetails (string): 0x00
Arg [5] : _polymathRegistry (address): 0x06595656b93ce14834f0d22b7bbDA4382d5ab510
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : 00000000000000000000000006595656b93ce14834f0d22b7bbda4382d5ab510
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [7] : 506f6c796d617468205465737420546f6b656e00000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [9] : 57452e522e4c4956450000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [11] : 3078303000000000000000000000000000000000000000000000000000000000
Swarm Source
bzzr://d194fbde9329028efd78e81aaa560fc5fa644ba09ac0fcec999dd63d4617267d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.