Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 6307439 | 2261 days ago | IN | 0 ETH | 0.17131524 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract contains unverified libraries: CstLibrary
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
CardstackToken
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-09-10 */ pragma solidity ^0.4.13; 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; } } contract Initializable { /** * @dev Indicates if the contract has been initialized. */ bool public initialized; /** * @dev Modifier to use in the initialization function of a contract. */ modifier isInitializer() { require(!initialized, "Contract instance has already been initialized"); _; initialized = true; } } contract Administratable { using SafeMath for uint256; // zOS requires that the variables are never removed nor order changed // Since this is a parent contract, no new variables can be added here address internal constant primaryInitializer = 0x0AEaF8c2Fe778797CD5464E7EB8351d28da2E823; address internal constant stagingInitializer = 0x1E65F71b024937b988fdba09814d60049e0Fc59d; address public owner; bool public adminsInitialized; address[] public adminsForIndex; address[] public superAdminsForIndex; mapping (address => bool) public admins; mapping (address => bool) public superAdmins; mapping (address => bool) private processedAdmin; mapping (address => bool) private processedSuperAdmin; event AddAdmin(address indexed admin); event RemoveAdmin(address indexed admin); event AddSuperAdmin(address indexed admin); event RemoveSuperAdmin(address indexed admin); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); modifier onlyInitializers() { require(msg.sender == primaryInitializer || msg.sender == stagingInitializer); _; } modifier onlyOwner() { require(msg.sender == owner); _; } modifier onlyAdmins { if (msg.sender != owner && !superAdmins[msg.sender] && !admins[msg.sender]) revert(); _; } modifier onlySuperAdmins { if (msg.sender != owner && !superAdmins[msg.sender]) revert(); _; } constructor() public { owner = msg.sender; } function addSuperAdmin(address admin) public onlySuperAdmins { _addSuperAdmin(admin); emit AddSuperAdmin(admin); } function removeSuperAdmin(address admin) public onlySuperAdmins { require(admin != address(0)); superAdmins[admin] = false; emit RemoveSuperAdmin(admin); } function addAdmin(address admin) public onlySuperAdmins { require(admin != address(0)); admins[admin] = true; if (!processedAdmin[admin]) { adminsForIndex.push(admin); processedAdmin[admin] = true; } emit AddAdmin(admin); } function removeAdmin(address admin) public onlySuperAdmins { require(admin != address(0)); admins[admin] = false; emit RemoveAdmin(admin); } function transferOwnership(address _newOwner) public onlyOwner { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } function totalSuperAdminsMapping() public view returns (uint256) { return superAdminsForIndex.length; } function totalAdminsMapping() public view returns (uint256) { return adminsForIndex.length; } // Accepting a function param to set initial owner/admins // is a potential security vulnerability when using initialize // pattern (which is just a public function). So we hard-code // our initial admin addresses and use zOS to manage this list. function initializeAdmins() internal { require(!adminsInitialized, "Contract instance has already initialized the admins"); owner = primaryInitializer; _addSuperAdmin(stagingInitializer); adminsInitialized = true; } function _addSuperAdmin(address admin) internal { require(admin != address(0)); superAdmins[admin] = true; if (!processedSuperAdmin[admin]) { superAdminsForIndex.push(admin); processedSuperAdmin[admin] = true; } } } contract Configurable { function configureFromStorage() public returns (bool); } library CstLibrary { using SafeMath for uint256; function getTokenName(address _storage) public view returns(bytes32) { return ExternalStorage(_storage).getBytes32Value("cstTokenName"); } function setTokenName(address _storage, bytes32 tokenName) public { ExternalStorage(_storage).setBytes32Value("cstTokenName", tokenName); } function getTokenSymbol(address _storage) public view returns(bytes32) { return ExternalStorage(_storage).getBytes32Value("cstTokenSymbol"); } function setTokenSymbol(address _storage, bytes32 tokenName) public { ExternalStorage(_storage).setBytes32Value("cstTokenSymbol", tokenName); } function getBuyPrice(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getUIntValue("cstBuyPrice"); } function setBuyPrice(address _storage, uint256 value) public { ExternalStorage(_storage).setUIntValue("cstBuyPrice", value); } function getCirculationCap(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getUIntValue("cstCirculationCap"); } function setCirculationCap(address _storage, uint256 value) public { ExternalStorage(_storage).setUIntValue("cstCirculationCap", value); } function getBalanceLimit(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getUIntValue("cstBalanceLimit"); } function setBalanceLimit(address _storage, uint256 value) public { ExternalStorage(_storage).setUIntValue("cstBalanceLimit", value); } function getFoundation(address _storage) public view returns(address) { return ExternalStorage(_storage).getAddressValue("cstFoundation"); } function setFoundation(address _storage, address value) public { ExternalStorage(_storage).setAddressValue("cstFoundation", value); } function getAllowance(address _storage, address account, address spender) public view returns (uint256) { return ExternalStorage(_storage).getMultiLedgerValue("cstAllowance", account, spender); } function setAllowance(address _storage, address account, address spender, uint256 allowance) public { ExternalStorage(_storage).setMultiLedgerValue("cstAllowance", account, spender, allowance); } function getCustomBuyerLimit(address _storage, address buyer) public view returns (uint256) { return ExternalStorage(_storage).getLedgerValue("cstCustomBuyerLimit", buyer); } function setCustomBuyerLimit(address _storage, address buyer, uint256 value) public { ExternalStorage(_storage).setLedgerValue("cstCustomBuyerLimit", buyer, value); } function getCustomBuyerForIndex(address _storage, uint256 index) public view returns (address) { return ExternalStorage(_storage).ledgerEntryForIndex(keccak256("cstCustomBuyerLimit"), index); } function getCustomBuyerMappingCount(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getLedgerCount("cstCustomBuyerLimit"); } function getApprovedBuyer(address _storage, address buyer) public view returns (bool) { return ExternalStorage(_storage).getBooleanMapValue("cstApprovedBuyer", buyer); } function setApprovedBuyer(address _storage, address buyer, bool value) public { ExternalStorage(_storage).setBooleanMapValue("cstApprovedBuyer", buyer, value); } function getApprovedBuyerForIndex(address _storage, uint256 index) public view returns (address) { return ExternalStorage(_storage).booleanMapEntryForIndex(keccak256("cstApprovedBuyer"), index); } function getApprovedBuyerMappingCount(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getBooleanMapCount("cstApprovedBuyer"); } function getTotalUnvestedAndUnreleasedTokens(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getUIntValue("cstUnvestedAndUnreleasedTokens"); } function setTotalUnvestedAndUnreleasedTokens(address _storage, uint256 value) public { ExternalStorage(_storage).setUIntValue("cstUnvestedAndUnreleasedTokens", value); } function vestingMappingSize(address _storage) public view returns(uint256) { return ExternalStorage(_storage).getLedgerCount("cstFullyVestedAmount"); } function vestingBeneficiaryForIndex(address _storage, uint256 index) public view returns(address) { return ExternalStorage(_storage).ledgerEntryForIndex(keccak256("cstFullyVestedAmount"), index); } function releasableAmount(address _storage, address beneficiary) public view returns (uint256) { uint256 releasedAmount = getVestingReleasedAmount(_storage, beneficiary); return vestedAvailableAmount(_storage, beneficiary).sub(releasedAmount); } function vestedAvailableAmount(address _storage, address beneficiary) public view returns (uint256) { uint256 start = getVestingStart(_storage, beneficiary); uint256 fullyVestedAmount = getFullyVestedAmount(_storage, beneficiary); if (start == 0 || fullyVestedAmount == 0) { return 0; } uint256 duration = getVestingDuration(_storage, beneficiary); if (duration == 0) { return 0; } uint256 cliff = getVestingCliff(_storage, beneficiary); uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary); if (now < cliff || (revokeDate > 0 && revokeDate < cliff)) { return 0; } else if (revokeDate > 0 && revokeDate > cliff) { return fullyVestedAmount.mul(revokeDate.sub(start)).div(duration); } else if (now >= start.add(duration)) { return fullyVestedAmount; } else { return fullyVestedAmount.mul(now.sub(start)).div(duration); } } function vestedAmount(address _storage, address beneficiary) public view returns (uint256) { uint256 start = getVestingStart(_storage, beneficiary); uint256 fullyVestedAmount = getFullyVestedAmount(_storage, beneficiary); if (start == 0 || fullyVestedAmount == 0) { return 0; } uint256 duration = getVestingDuration(_storage, beneficiary); if (duration == 0) { return 0; } uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary); if (now <= start) { return 0; } else if (revokeDate > 0) { return fullyVestedAmount.mul(revokeDate.sub(start)).div(duration); } else if (now >= start.add(duration)) { return fullyVestedAmount; } else { return fullyVestedAmount.mul(now.sub(start)).div(duration); } } function canGrantVestedTokens(address _storage, address beneficiary) public view returns (bool) { uint256 existingFullyVestedAmount = getFullyVestedAmount(_storage, beneficiary); if (existingFullyVestedAmount == 0) { return true; } uint256 existingVestedAmount = vestedAvailableAmount(_storage, beneficiary); uint256 existingReleasedAmount = getVestingReleasedAmount(_storage, beneficiary); uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary); if (revokeDate > 0 || (existingVestedAmount == existingFullyVestedAmount && existingReleasedAmount == existingFullyVestedAmount)) { return true; } return false; } function canRevokeVesting(address _storage, address beneficiary) public view returns (bool) { bool isRevocable = getVestingRevocable(_storage, beneficiary); uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary); uint256 start = getVestingStart(_storage, beneficiary); uint256 duration = getVestingDuration(_storage, beneficiary); return start > 0 && isRevocable && revokeDate == 0 && now < start.add(duration); } function revokeVesting(address _storage, address beneficiary) public { require(canRevokeVesting(_storage, beneficiary)); uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage); uint256 unvestedAmount = getFullyVestedAmount(_storage, beneficiary).sub(vestedAvailableAmount(_storage, beneficiary)); setVestingRevokeDate(_storage, beneficiary, now); setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.sub(unvestedAmount)); } function getVestingSchedule(address _storage, address _beneficiary) public view returns (uint256 startDate, uint256 cliffDate, uint256 durationSec, uint256 fullyVestedAmount, uint256 releasedAmount, uint256 revokeDate, bool isRevocable) { startDate = getVestingStart(_storage, _beneficiary); cliffDate = getVestingCliff(_storage, _beneficiary); durationSec = getVestingDuration(_storage, _beneficiary); fullyVestedAmount = getFullyVestedAmount(_storage, _beneficiary); releasedAmount = getVestingReleasedAmount(_storage, _beneficiary); revokeDate = getVestingRevokeDate(_storage, _beneficiary); isRevocable = getVestingRevocable(_storage, _beneficiary); } function setVestingSchedule(address _storage, address beneficiary, uint256 fullyVestedAmount, uint256 startDate, uint256 cliffDate, uint256 duration, bool isRevocable) public { require(canGrantVestedTokens(_storage, beneficiary)); uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage); setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.add(fullyVestedAmount)); ExternalStorage(_storage).setLedgerValue("cstVestingStart", beneficiary, startDate); ExternalStorage(_storage).setLedgerValue("cstVestingCliff", beneficiary, cliffDate); ExternalStorage(_storage).setLedgerValue("cstVestingDuration", beneficiary, duration); ExternalStorage(_storage).setLedgerValue("cstFullyVestedAmount", beneficiary, fullyVestedAmount); ExternalStorage(_storage).setBooleanMapValue("cstVestingRevocable", beneficiary, isRevocable); setVestingRevokeDate(_storage, beneficiary, 0); setVestingReleasedAmount(_storage, beneficiary, 0); } function releaseVestedTokens(address _storage, address beneficiary) public { uint256 unreleased = releasableAmount(_storage, beneficiary); uint256 releasedAmount = getVestingReleasedAmount(_storage, beneficiary); uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage); releasedAmount = releasedAmount.add(unreleased); setVestingReleasedAmount(_storage, beneficiary, releasedAmount); setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.sub(unreleased)); } function getVestingStart(address _storage, address beneficiary) public view returns(uint256) { return ExternalStorage(_storage).getLedgerValue("cstVestingStart", beneficiary); } function getVestingCliff(address _storage, address beneficiary) public view returns(uint256) { return ExternalStorage(_storage).getLedgerValue("cstVestingCliff", beneficiary); } function getVestingDuration(address _storage, address beneficiary) public view returns(uint256) { return ExternalStorage(_storage).getLedgerValue("cstVestingDuration", beneficiary); } function getFullyVestedAmount(address _storage, address beneficiary) public view returns(uint256) { return ExternalStorage(_storage).getLedgerValue("cstFullyVestedAmount", beneficiary); } function getVestingRevocable(address _storage, address beneficiary) public view returns(bool) { return ExternalStorage(_storage).getBooleanMapValue("cstVestingRevocable", beneficiary); } function setVestingReleasedAmount(address _storage, address beneficiary, uint256 value) public { ExternalStorage(_storage).setLedgerValue("cstVestingReleasedAmount", beneficiary, value); } function getVestingReleasedAmount(address _storage, address beneficiary) public view returns(uint256) { return ExternalStorage(_storage).getLedgerValue("cstVestingReleasedAmount", beneficiary); } function setVestingRevokeDate(address _storage, address beneficiary, uint256 value) public { ExternalStorage(_storage).setLedgerValue("cstVestingRevokeDate", beneficiary, value); } function getVestingRevokeDate(address _storage, address beneficiary) public view returns(uint256) { return ExternalStorage(_storage).getLedgerValue("cstVestingRevokeDate", beneficiary); } function getRewardsContractHash(address _storage) public view returns (bytes32) { return ExternalStorage(_storage).getBytes32Value("cstRewardsContractHash"); } function setRewardsContractHash(address _storage, bytes32 rewardsContractHash) public { ExternalStorage(_storage).setBytes32Value("cstRewardsContractHash", rewardsContractHash); } } contract Displayable { function bytes32ToString(bytes32 x) public pure returns (string) { bytes memory bytesString = new bytes(32); uint256 charCount = 0; for (uint256 j = 0; j < 32; j++) { if (x[j] != 0) { bytesString[charCount] = x[j]; charCount++; } } bytes memory bytesStringTrimmed = new bytes(charCount); for (j = 0; j < charCount; j++) { bytesStringTrimmed[j] = bytesString[j]; } return string(bytesStringTrimmed); } } contract ERC20 { 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); function totalSupply() public view returns (uint256); function balanceOf(address account) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } contract ExternalStorage is Administratable { using SafeMath for uint256; mapping(bytes32 => address[]) public primaryLedgerEntryForIndex; mapping(bytes32 => mapping(address => address[])) public secondaryLedgerEntryForIndex; mapping(bytes32 => address[]) public ledgerEntryForIndex; mapping(bytes32 => address[]) public booleanMapEntryForIndex; mapping(bytes32 => mapping(address => mapping(address => uint256))) private MultiLedgerStorage; mapping(bytes32 => mapping(address => bool)) private ledgerPrimaryEntries; mapping(bytes32 => mapping(address => mapping(address => bool))) private ledgerSecondaryEntries; mapping(bytes32 => mapping(address => uint256)) private LedgerStorage; mapping(bytes32 => mapping(address => bool)) private ledgerAccounts; mapping(bytes32 => mapping(address => bool)) private BooleanMapStorage; mapping(bytes32 => mapping(address => bool)) private booleanMapAccounts; mapping(bytes32 => uint256) private UIntStorage; mapping(bytes32 => bytes32) private Bytes32Storage; mapping(bytes32 => address) private AddressStorage; mapping(bytes32 => bytes) private BytesStorage; mapping(bytes32 => bool) private BooleanStorage; mapping(bytes32 => int256) private IntStorage; function getMultiLedgerValue(string record, address primaryAddress, address secondaryAddress) external view returns (uint256) { return MultiLedgerStorage[keccak256(abi.encodePacked(record))][primaryAddress][secondaryAddress]; } function primaryLedgerCount(string record) external view returns (uint256) { return primaryLedgerEntryForIndex[keccak256(abi.encodePacked(record))].length; } function secondaryLedgerCount(string record, address primaryAddress) external view returns (uint256) { return secondaryLedgerEntryForIndex[keccak256(abi.encodePacked(record))][primaryAddress].length; } function setMultiLedgerValue(string record, address primaryAddress, address secondaryAddress, uint256 value) external onlyAdmins { bytes32 hash = keccak256(abi.encodePacked(record)); if (!ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress]) { secondaryLedgerEntryForIndex[hash][primaryAddress].push(secondaryAddress); ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress] = true; if (!ledgerPrimaryEntries[hash][primaryAddress]) { primaryLedgerEntryForIndex[hash].push(primaryAddress); ledgerPrimaryEntries[hash][primaryAddress] = true; } } MultiLedgerStorage[hash][primaryAddress][secondaryAddress] = value; } function getLedgerValue(string record, address _address) external view returns (uint256) { return LedgerStorage[keccak256(abi.encodePacked(record))][_address]; } function getLedgerCount(string record) external view returns (uint256) { return ledgerEntryForIndex[keccak256(abi.encodePacked(record))].length; } function setLedgerValue(string record, address _address, uint256 value) external onlyAdmins { bytes32 hash = keccak256(abi.encodePacked(record)); if (!ledgerAccounts[hash][_address]) { ledgerEntryForIndex[hash].push(_address); ledgerAccounts[hash][_address] = true; } LedgerStorage[hash][_address] = value; } function getBooleanMapValue(string record, address _address) external view returns (bool) { return BooleanMapStorage[keccak256(abi.encodePacked(record))][_address]; } function getBooleanMapCount(string record) external view returns (uint256) { return booleanMapEntryForIndex[keccak256(abi.encodePacked(record))].length; } function setBooleanMapValue(string record, address _address, bool value) external onlyAdmins { bytes32 hash = keccak256(abi.encodePacked(record)); if (!booleanMapAccounts[hash][_address]) { booleanMapEntryForIndex[hash].push(_address); booleanMapAccounts[hash][_address] = true; } BooleanMapStorage[hash][_address] = value; } function getUIntValue(string record) external view returns (uint256) { return UIntStorage[keccak256(abi.encodePacked(record))]; } function setUIntValue(string record, uint256 value) external onlyAdmins { UIntStorage[keccak256(abi.encodePacked(record))] = value; } function getBytes32Value(string record) external view returns (bytes32) { return Bytes32Storage[keccak256(abi.encodePacked(record))]; } function setBytes32Value(string record, bytes32 value) external onlyAdmins { Bytes32Storage[keccak256(abi.encodePacked(record))] = value; } function getAddressValue(string record) external view returns (address) { return AddressStorage[keccak256(abi.encodePacked(record))]; } function setAddressValue(string record, address value) external onlyAdmins { AddressStorage[keccak256(abi.encodePacked(record))] = value; } function getBytesValue(string record) external view returns (bytes) { return BytesStorage[keccak256(abi.encodePacked(record))]; } function setBytesValue(string record, bytes value) external onlyAdmins { BytesStorage[keccak256(abi.encodePacked(record))] = value; } function getBooleanValue(string record) external view returns (bool) { return BooleanStorage[keccak256(abi.encodePacked(record))]; } function setBooleanValue(string record, bool value) external onlyAdmins { BooleanStorage[keccak256(abi.encodePacked(record))] = value; } function getIntValue(string record) external view returns (int256) { return IntStorage[keccak256(abi.encodePacked(record))]; } function setIntValue(string record, int256 value) external onlyAdmins { IntStorage[keccak256(abi.encodePacked(record))] = value; } } contract Freezable is Administratable { using SafeMath for uint256; // zOS requires that the variables are never removed nor order changed // Since this is a parent contract, no new variables can be added here bool public frozenToken; // TODO move this into external storage address[] public frozenAccountForIndex; mapping (address => bool) public frozenAccount; mapping (address => bool) private processedAccount; event FrozenFunds(address indexed target, bool frozen); event FrozenToken(bool frozen); modifier unlessFrozen { require(!frozenToken); require(!frozenAccount[msg.sender]); _; } function freezeAccount(address target, bool freeze) public onlySuperAdmins { frozenAccount[target] = freeze; if (!processedAccount[target]) { frozenAccountForIndex.push(target); processedAccount[target] = true; } emit FrozenFunds(target, freeze); } function freezeToken(bool freeze) public onlySuperAdmins { frozenToken = freeze; emit FrozenToken(frozenToken); } function totalFrozenAccountsMapping() public view returns(uint256) { return frozenAccountForIndex.length; } } contract IStorable { function getLedgerNameHash() external view returns (bytes32); function getStorageNameHash() external view returns (bytes32); } contract CardstackToken is ERC20, Initializable, Freezable, Displayable, Configurable, IStorable { using SafeMath for uint256; using CstLibrary for address; /* zOS requires that the variables are never removed nor order changed /* BEGIN VARIABLES */ uint8 public constant decimals = 18; string public constant version = "3"; uint256 public constant tokenMaxCap = 6000000000000000000000000000; // 6 billion * 10^18 ITokenLedger public tokenLedger; string public storageName; string public ledgerName; address public externalStorage; address public registry; bool public haltPurchase; uint256 public contributionMinimum; /* END VARIABLES */ event Mint(uint256 amountMinted); event Approval(address indexed _owner, address indexed _spender, uint256 _value); event Transfer(address indexed _from, address indexed _to, uint256 _value); event WhiteList(address indexed buyer, uint256 holdCap); event RemoveWhitelistedBuyer(address indexed buyer); event ConfigChanged(uint256 buyPrice, uint256 circulationCap, uint256 balanceLimit); event VestedTokenGrant(address indexed beneficiary, uint256 startDate, uint256 cliffDate, uint256 durationSec, uint256 fullyVestedAmount, bool isRevocable); event VestedTokenRevocation(address indexed beneficiary); event VestedTokenRelease(address indexed beneficiary, uint256 amount); event StorageUpdated(address storageAddress, address ledgerAddress); event FoundationDeposit(uint256 amount); event FoundationWithdraw(uint256 amount); event PurchaseHalted(); event PurchaseResumed(); modifier onlyFoundation { address foundation = externalStorage.getFoundation(); require(foundation != address(0)); if (msg.sender != owner && msg.sender != foundation) revert(); _; } modifier initStorage { address ledgerAddress = Registry(registry).getStorage(ledgerName); address storageAddress = Registry(registry).getStorage(storageName); tokenLedger = ITokenLedger(ledgerAddress); externalStorage = storageAddress; _; } function buy() external payable unlessFrozen returns (uint256) { require(!haltPurchase); require(externalStorage.getApprovedBuyer(msg.sender)); uint256 _buyPriceTokensPerWei = externalStorage.getBuyPrice(); uint256 _circulationCap = externalStorage.getCirculationCap(); require(msg.value > 0); require(_buyPriceTokensPerWei > 0); require(_circulationCap > 0); uint256 amount = msg.value.mul(_buyPriceTokensPerWei); require(totalInCirculation().add(amount) <= _circulationCap); require(amount <= tokensAvailable()); uint256 balanceLimit; uint256 buyerBalance = tokenLedger.balanceOf(msg.sender); uint256 customLimit = externalStorage.getCustomBuyerLimit(msg.sender); require(contributionMinimum == 0 || buyerBalance.add(amount) >= contributionMinimum); if (customLimit > 0) { balanceLimit = customLimit; } else { balanceLimit = externalStorage.getBalanceLimit(); } require(balanceLimit > 0 && balanceLimit >= buyerBalance.add(amount)); tokenLedger.debitAccount(msg.sender, amount); emit Transfer(this, msg.sender, amount); return amount; } function getLedgerNameHash() external view returns (bytes32) { return keccak256(abi.encodePacked(ledgerName)); } function getStorageNameHash() external view returns (bytes32) { return keccak256(abi.encodePacked(storageName)); } function initialize(address _registry, string _storageName, string _ledgerName) public onlyInitializers { initializeAdmins(); _initialize(_registry, _storageName, _ledgerName); } function configure(bytes32 _tokenName, bytes32 _tokenSymbol, uint256 _buyPrice, uint256 _circulationCap, uint256 _balanceLimit, address _foundation) public onlySuperAdmins initStorage returns (bool) { uint256 __buyPrice = externalStorage.getBuyPrice(); if (__buyPrice > 0 && __buyPrice != _buyPrice) { require(frozenToken); } externalStorage.setTokenName(_tokenName); externalStorage.setTokenSymbol(_tokenSymbol); externalStorage.setBuyPrice(_buyPrice); externalStorage.setCirculationCap(_circulationCap); externalStorage.setFoundation(_foundation); externalStorage.setBalanceLimit(_balanceLimit); emit ConfigChanged(_buyPrice, _circulationCap, _balanceLimit); return true; } function configureFromStorage() public onlySuperAdmins initStorage returns (bool) { freezeToken(true); return true; } function updateStorage(string newStorageName, string newLedgerName) public onlySuperAdmins returns (bool) { require(frozenToken); storageName = newStorageName; ledgerName = newLedgerName; configureFromStorage(); address ledgerAddress = Registry(registry).getStorage(ledgerName); address storageAddress = Registry(registry).getStorage(storageName); emit StorageUpdated(storageAddress, ledgerAddress); return true; } function transfer(address recipient, uint256 amount) public unlessFrozen returns (bool) { require(!frozenAccount[recipient]); tokenLedger.transfer(msg.sender, recipient, amount); emit Transfer(msg.sender, recipient, amount); return true; } function mintTokens(uint256 mintedAmount) public onlySuperAdmins returns (bool) { require(mintedAmount.add(totalSupply()) <= tokenMaxCap); require(mintedAmount > 0); tokenLedger.mintTokens(mintedAmount); emit Mint(mintedAmount); emit Transfer(address(0), this, mintedAmount); return true; } function grantTokens(address recipient, uint256 amount) public onlySuperAdmins returns (bool) { require(haltPurchase); require(!frozenAccount[recipient]); uint256 _circulationCap = externalStorage.getCirculationCap(); require(totalInCirculation().add(amount) <= _circulationCap); require(amount <= tokensAvailable()); // assert the granted tokens doesnt exceed the totalSupply minus the fully vested amount of vesting tokens tokenLedger.debitAccount(recipient, amount); emit Transfer(this, recipient, amount); return true; } function setHaltPurchase(bool _haltPurchase) public onlySuperAdmins returns (bool) { haltPurchase = _haltPurchase; if (_haltPurchase) { emit PurchaseHalted(); } else { emit PurchaseResumed(); } return true; } // intentionally allowing this to work when token is frozen as foundation is a form of a super admin function foundationWithdraw(uint256 amount) public onlyFoundation returns (bool) { /* UNTRUSTED */ msg.sender.transfer(amount); emit FoundationWithdraw(amount); return true; } function foundationDeposit() public payable unlessFrozen returns (bool) { emit FoundationDeposit(msg.value); return true; } function transferFrom(address from, address to, uint256 value) public unlessFrozen returns (bool) { require(!frozenAccount[from]); require(!frozenAccount[to]); require(from != msg.sender); uint256 allowanceValue = allowance(from, msg.sender); require(allowanceValue >= value); tokenLedger.transfer(from, to, value); externalStorage.setAllowance(from, msg.sender, allowanceValue.sub(value)); emit Transfer(from, to, value); return true; } /* 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 * * Please use `increaseApproval` or `decreaseApproval` instead. */ function approve(address spender, uint256 value) public unlessFrozen returns (bool) { require(value == 0 || allowance(msg.sender, spender) == 0); return _approve(spender, value); } function increaseApproval(address spender, uint256 addedValue) public unlessFrozen returns (bool) { return _approve(spender, externalStorage.getAllowance(msg.sender, spender).add(addedValue)); } function decreaseApproval(address spender, uint256 subtractedValue) public unlessFrozen returns (bool) { uint256 oldValue = externalStorage.getAllowance(msg.sender, spender); if (subtractedValue > oldValue) { return _approve(spender, 0); } else { return _approve(spender, oldValue.sub(subtractedValue)); } } function grantVestedTokens(address beneficiary, uint256 fullyVestedAmount, uint256 startDate, // 0 indicates start "now" uint256 cliffSec, uint256 durationSec, bool isRevocable) public onlySuperAdmins returns(bool) { uint256 _circulationCap = externalStorage.getCirculationCap(); require(beneficiary != address(0)); require(!frozenAccount[beneficiary]); require(durationSec >= cliffSec); require(totalInCirculation().add(fullyVestedAmount) <= _circulationCap); require(fullyVestedAmount <= tokensAvailable()); uint256 _startDate = startDate; if (_startDate == 0) { _startDate = now; } uint256 cliffDate = _startDate.add(cliffSec); externalStorage.setVestingSchedule(beneficiary, fullyVestedAmount, _startDate, cliffDate, durationSec, isRevocable); emit VestedTokenGrant(beneficiary, _startDate, cliffDate, durationSec, fullyVestedAmount, isRevocable); return true; } function revokeVesting(address beneficiary) public onlySuperAdmins returns (bool) { require(beneficiary != address(0)); externalStorage.revokeVesting(beneficiary); releaseVestedTokensForBeneficiary(beneficiary); emit VestedTokenRevocation(beneficiary); return true; } function releaseVestedTokens() public unlessFrozen returns (bool) { return releaseVestedTokensForBeneficiary(msg.sender); } function releaseVestedTokensForBeneficiary(address beneficiary) public unlessFrozen returns (bool) { require(beneficiary != address(0)); require(!frozenAccount[beneficiary]); uint256 unreleased = releasableAmount(beneficiary); if (unreleased == 0) { return true; } externalStorage.releaseVestedTokens(beneficiary); tokenLedger.debitAccount(beneficiary, unreleased); emit Transfer(this, beneficiary, unreleased); emit VestedTokenRelease(beneficiary, unreleased); return true; } function setCustomBuyer(address buyer, uint256 balanceLimit) public onlySuperAdmins returns (bool) { require(buyer != address(0)); externalStorage.setCustomBuyerLimit(buyer, balanceLimit); addBuyer(buyer); return true; } function setContributionMinimum(uint256 _contributionMinimum) public onlySuperAdmins returns (bool) { contributionMinimum = _contributionMinimum; return true; } function addBuyer(address buyer) public onlySuperAdmins returns (bool) { require(buyer != address(0)); externalStorage.setApprovedBuyer(buyer, true); uint256 balanceLimit = externalStorage.getCustomBuyerLimit(buyer); if (balanceLimit == 0) { balanceLimit = externalStorage.getBalanceLimit(); } emit WhiteList(buyer, balanceLimit); return true; } function removeBuyer(address buyer) public onlySuperAdmins returns (bool) { require(buyer != address(0)); externalStorage.setApprovedBuyer(buyer, false); emit RemoveWhitelistedBuyer(buyer); return true; } function name() public view returns(string) { return bytes32ToString(externalStorage.getTokenName()); } function symbol() public view returns(string) { return bytes32ToString(externalStorage.getTokenSymbol()); } function totalInCirculation() public view returns(uint256) { return tokenLedger.totalInCirculation().add(totalUnvestedAndUnreleasedTokens()); } function cstBalanceLimit() public view returns(uint256) { return externalStorage.getBalanceLimit(); } function buyPrice() public view returns(uint256) { return externalStorage.getBuyPrice(); } function circulationCap() public view returns(uint256) { return externalStorage.getCirculationCap(); } // intentionally allowing this to be visible if upgraded so foundation can // withdraw funds from contract that has a successor function foundation() public view returns(address) { return externalStorage.getFoundation(); } function totalSupply() public view returns(uint256) { return tokenLedger.totalTokens(); } function tokensAvailable() public view returns(uint256) { return totalSupply().sub(totalInCirculation()); } function balanceOf(address account) public view returns (uint256) { address thisAddress = this; if (thisAddress == account) { return tokensAvailable(); } else { return tokenLedger.balanceOf(account); } } function allowance(address _owner, address _spender) public view returns (uint256) { return externalStorage.getAllowance(_owner, _spender); } function releasableAmount(address beneficiary) public view returns (uint256) { return externalStorage.releasableAmount(beneficiary); } function totalUnvestedAndUnreleasedTokens() public view returns (uint256) { return externalStorage.getTotalUnvestedAndUnreleasedTokens(); } function vestingMappingSize() public view returns (uint256) { return externalStorage.vestingMappingSize(); } function vestingBeneficiaryForIndex(uint256 index) public view returns (address) { return externalStorage.vestingBeneficiaryForIndex(index); } function vestingSchedule(address _beneficiary) public view returns (uint256 startDate, uint256 cliffDate, uint256 durationSec, uint256 fullyVestedAmount, uint256 vestedAmount, uint256 vestedAvailableAmount, uint256 releasedAmount, uint256 revokeDate, bool isRevocable) { ( startDate, cliffDate, durationSec, fullyVestedAmount, releasedAmount, revokeDate, isRevocable ) = externalStorage.getVestingSchedule(_beneficiary); vestedAmount = externalStorage.vestedAmount(_beneficiary); vestedAvailableAmount = externalStorage.vestedAvailableAmount(_beneficiary); } function totalCustomBuyersMapping() public view returns (uint256) { return externalStorage.getCustomBuyerMappingCount(); } function customBuyerLimit(address buyer) public view returns (uint256) { return externalStorage.getCustomBuyerLimit(buyer); } function customBuyerForIndex(uint256 index) public view returns (address) { return externalStorage.getCustomBuyerForIndex(index); } function totalBuyersMapping() public view returns (uint256) { return externalStorage.getApprovedBuyerMappingCount(); } function approvedBuyer(address buyer) public view returns (bool) { return externalStorage.getApprovedBuyer(buyer); } function approvedBuyerForIndex(uint256 index) public view returns (address) { return externalStorage.getApprovedBuyerForIndex(index); } function _initialize(address _registry, string _storageName, string _ledgerName) internal isInitializer { require(_registry != address(0)); storageName = _storageName; ledgerName = _ledgerName; registry = _registry; addSuperAdmin(registry); emit Transfer(address(0), this, 0); // create ERC-20 signature for etherscan.io } function _approve(address spender, uint256 value) internal unlessFrozen returns(bool) { require(spender != address(0)); require(!frozenAccount[spender]); require(msg.sender != spender); externalStorage.setAllowance(msg.sender, spender, value); emit Approval(msg.sender, spender, value); return true; } } interface ITokenLedger { function mintTokens(uint256 amount) external; function transfer(address sender, address reciever, uint256 amount) external; function creditAccount(address account, uint256 amount) external; function debitAccount(address account, uint256 amount) external; function addAdmin(address admin) external; function removeAdmin(address admin) external; function totalTokens() external view returns (uint256); function totalInCirculation() external view returns (uint256); function balanceOf(address account) external view returns (uint256); } contract CstLedger is ITokenLedger, Initializable, Administratable { using SafeMath for uint256; /* zOS requires that the variables are never removed nor order changed /* BEGIN VARIABLES */ string public constant version = "2"; uint256 private _totalInCirculation; // warning this does not take into account unvested nor vested-unreleased tokens into consideration uint256 private _totalTokens; mapping (address => uint256) private _balanceOf; mapping (address => bool) private accounts; /* END VARIABLES */ function transfer(address sender, address recipient, uint256 amount) external onlyAdmins { require(sender != address(0)); require(recipient != address(0)); require(_balanceOf[sender] >= amount); _balanceOf[sender] = _balanceOf[sender].sub(amount); _balanceOf[recipient] = _balanceOf[recipient].add(amount); } function creditAccount(address account, uint256 amount) external onlyAdmins { // remove tokens require(account != address(0)); require(_balanceOf[account] >= amount); _totalInCirculation = _totalInCirculation.sub(amount); _balanceOf[account] = _balanceOf[account].sub(amount); } function debitAccount(address account, uint256 amount) external onlyAdmins { // add tokens require(account != address(0)); _totalInCirculation = _totalInCirculation.add(amount); _balanceOf[account] = _balanceOf[account].add(amount); } function totalTokens() external view returns (uint256) { return _totalTokens; } function totalInCirculation() external view returns (uint256) { return _totalInCirculation; } function balanceOf(address account) external view returns (uint256) { return _balanceOf[account]; } function mintTokens(uint256 amount) external onlyAdmins { _totalTokens = _totalTokens.add(amount); } function initialize() public onlyInitializers isInitializer { initializeAdmins(); } } contract Registry is Initializable, Administratable { using SafeMath for uint256; /* zOS requires that the variables are never removed nor order changed /* BEGIN VARIABLES */ string public constant version = "2"; bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; bytes4 private constant ADDR_INTERFACE_ID = 0x3b3b57de; bytes32 private constant BARE_DOMAIN_NAMEHASH = 0x794941fae74d6435d1b29ee1c08cc39941ba78470872e6afd0693c7eeb63025c; // namehash for "cardstack.eth" mapping(bytes32 => address) public storageForHash; mapping(bytes32 => address) public contractForHash; mapping(bytes32 => bytes32) public hashForNamehash; mapping(bytes32 => bytes32) public namehashForHash; string[] public contractNameForIndex; /* END VARIABLES */ event ContractRegistered(address indexed _contract, string _name, bytes32 namehash); event StorageAdded(address indexed storageAddress, string name); event StorageRemoved(address indexed storageAddress, string name); event AddrChanged(bytes32 indexed node, address a); function() public { revert(); } function setNamehash(string contractName, bytes32 namehash) external onlySuperAdmins returns (bool) { require(namehash != 0x0); bytes32 hash = keccak256(abi.encodePacked(contractName)); address contractAddress = contractForHash[hash]; require(contractAddress != 0x0); require(hashForNamehash[namehash] == 0x0); hashForNamehash[namehash] = hash; namehashForHash[hash] = namehash; emit AddrChanged(namehash, contractAddress); } function register(string name, address contractAddress, bytes32 namehash) external onlySuperAdmins returns (bool) { bytes32 hash = keccak256(abi.encodePacked(name)); require(bytes(name).length > 0); require(contractAddress != 0x0); require(contractForHash[hash] == 0x0); require(hashForNamehash[namehash] == 0x0); contractNameForIndex.push(name); contractForHash[hash] = contractAddress; if (namehash != 0x0) { hashForNamehash[namehash] = hash; namehashForHash[hash] = namehash; } address storageAddress = storageForHash[IStorable(contractAddress).getStorageNameHash()]; address ledgerAddress = storageForHash[IStorable(contractAddress).getLedgerNameHash()]; if (storageAddress != 0x0) { ExternalStorage(storageAddress).addAdmin(contractAddress); } if (ledgerAddress != 0x0) { CstLedger(ledgerAddress).addAdmin(contractAddress); } Configurable(contractAddress).configureFromStorage(); emit ContractRegistered(contractAddress, name, namehash); if (namehash != 0x0) { emit AddrChanged(namehash, contractAddress); } return true; } function addStorage(string name, address storageAddress) external onlySuperAdmins { require(storageAddress != address(0)); bytes32 hash = keccak256(abi.encodePacked(name)); storageForHash[hash] = storageAddress; emit StorageAdded(storageAddress, name); } function initialize() public onlyInitializers isInitializer { initializeAdmins(); } function removeStorage(string name) public onlySuperAdmins { address storageAddress = storageForHash[keccak256(abi.encodePacked(name))]; delete storageForHash[keccak256(abi.encodePacked(name))]; emit StorageRemoved(storageAddress, name); } function getStorage(string name) public view returns (address) { return storageForHash[keccak256(abi.encodePacked(name))]; } function addr(bytes32 node) public view returns (address) { return contractForHash[hashForNamehash[node]]; } function numContracts() public view returns(uint256) { return contractNameForIndex.length; } function getContractHash(string name) public pure returns (bytes32) { return keccak256(abi.encodePacked(name)); } function supportsInterface(bytes4 interfaceId) public pure returns (bool) { return interfaceId == ADDR_INTERFACE_ID || interfaceId == INTERFACE_META_ID; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"totalAdminsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"buyer","type":"address"}],"name":"customBuyerLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newStorageName","type":"string"},{"name":"newLedgerName","type":"string"}],"name":"updateStorage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"beneficiary","type":"address"}],"name":"releasableAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"configureFromStorage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vestingMappingSize","outputs":[{"name":"","type":"uint256"}],"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":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozenAccountsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"adminsForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenLedger","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"revokeVesting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"foundation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"vestingBeneficiaryForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"removeSuperAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contributionMinimum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"releaseVestedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"circulationCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalInCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenName","type":"bytes32"},{"name":"_tokenSymbol","type":"bytes32"},{"name":"_buyPrice","type":"uint256"},{"name":"_circulationCap","type":"uint256"},{"name":"_balanceLimit","type":"uint256"},{"name":"_foundation","type":"address"}],"name":"configure","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensAvailable","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[{"name":"_haltPurchase","type":"bool"}],"name":"setHaltPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"frozenToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"removeBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"freeze","type":"bool"}],"name":"freezeToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"frozenAccountForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cstBalanceLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"externalStorage","outputs":[{"name":"","type":"address"}],"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":"totalUnvestedAndUnreleasedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLedgerNameHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"},{"name":"_storageName","type":"string"},{"name":"_ledgerName","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"bytes32"}],"name":"bytes32ToString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"mintedAmount","type":"uint256"}],"name":"mintTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStorageNameHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"releaseVestedTokensForBeneficiary","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"foundationDeposit","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalBuyersMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSuperAdminsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"superAdmins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"addSuperAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"frozenAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"customBuyerForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"addBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"buyer","type":"address"}],"name":"approvedBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"superAdminsForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"grantTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_contributionMinimum","type":"uint256"}],"name":"setContributionMinimum","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"foundationWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ledgerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"haltPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"storageName","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":false,"inputs":[{"name":"buyer","type":"address"},{"name":"balanceLimit","type":"uint256"}],"name":"setCustomBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"tokenMaxCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminsInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCustomBuyersMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"target","type":"address"},{"name":"freeze","type":"bool"}],"name":"freezeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"approvedBuyerForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"fullyVestedAmount","type":"uint256"},{"name":"startDate","type":"uint256"},{"name":"cliffSec","type":"uint256"},{"name":"durationSec","type":"uint256"},{"name":"isRevocable","type":"bool"}],"name":"grantVestedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"vestingSchedule","outputs":[{"name":"startDate","type":"uint256"},{"name":"cliffDate","type":"uint256"},{"name":"durationSec","type":"uint256"},{"name":"fullyVestedAmount","type":"uint256"},{"name":"vestedAmount","type":"uint256"},{"name":"vestedAvailableAmount","type":"uint256"},{"name":"releasedAmount","type":"uint256"},{"name":"revokeDate","type":"uint256"},{"name":"isRevocable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amountMinted","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":false,"name":"holdCap","type":"uint256"}],"name":"WhiteList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"}],"name":"RemoveWhitelistedBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyPrice","type":"uint256"},{"indexed":false,"name":"circulationCap","type":"uint256"},{"indexed":false,"name":"balanceLimit","type":"uint256"}],"name":"ConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"startDate","type":"uint256"},{"indexed":false,"name":"cliffDate","type":"uint256"},{"indexed":false,"name":"durationSec","type":"uint256"},{"indexed":false,"name":"fullyVestedAmount","type":"uint256"},{"indexed":false,"name":"isRevocable","type":"bool"}],"name":"VestedTokenGrant","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"}],"name":"VestedTokenRevocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"VestedTokenRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"storageAddress","type":"address"},{"indexed":false,"name":"ledgerAddress","type":"address"}],"name":"StorageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FoundationDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FoundationWithdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseHalted","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"target","type":"address"},{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"AddAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"RemoveAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"AddSuperAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"RemoveSuperAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405260008054610100330261010060a860020a03199091161790556154458061002c6000396000f3006080604052600436106103765763ffffffff60e060020a6000350416630489882e811461037b57806306fdde03146103a2578063095ea7b31461042c578063115f2be21461046457806313bac8f214610485578063158ef93e1461051c5780631726cbc8146105315780631785f53c1461055257806318160ddd146105755780631a841b1b1461058a578063222101d11461059f57806323b872dd146105b45780632b28d2d0146105de578063313ce567146105f3578063313f2a211461061e5780633886c957146106525780633b0da2601461066757806341fbb05014610688578063429b62e51461069d5780634610a448146106be5780634902e4aa146106d65780634f2d7ab5146106f757806354dd1da41461070c57806354fd4d501461072157806356597e65146107365780635cb0c16f1461074b5780635da01a5b1461076057806360659a921461079057806366188463146107a55780636a420bbc146107c95780636df006f3146107e35780636f75b00c146107f8578063704802751461081957806370a082311461083a578063771eee161461085b5780637b103999146108755780637db6cc1b1461088a578063820e79ed146108a25780638620410b146108b757806388d7cd97146108cc5780638da5cb5b146108e15780638df388c1146108f65780638f1d5f7e1461090b57806390657147146109205780639201de55146109c557806395d89b41146109dd57806397304ced146109f25780639860811114610a0a57806399817b4714610a1f5780639ae066b014610a40578063a4453a9614610a48578063a6f2ae3a14610a5d578063a9059cbb14610a65578063abf7b06314610a89578063ad25cb4214610a9e578063b3292ff014610abf578063b414d4b614610ae0578063b9447f7e14610b01578063bbf8980314610b19578063c3437e0614610b3a578063c389439814610b5b578063c94e643c14610b73578063cb0b7b0314610b97578063cedcd77014610baf578063cf1f3dd714610bc7578063d28dcdea14610bdc578063d73c277c14610bf1578063d73dd62314610c06578063da14c72314610c2a578063dd62ed3e14610c4e578063ddad3ca114610c75578063deca6e7614610c8a578063e01bc60b14610c9f578063e724529c14610cb4578063f2fde38b14610cda578063f69f8a5c14610cfb578063fc13566d14610d13578063ffff6b0414610d45575b600080fd5b34801561038757600080fd5b50610390610daf565b60408051918252519081900360200190f35b3480156103ae57600080fd5b506103b7610db6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b50610450600160a060020a0360043516602435610e69565b604080519115158252519081900360200190f35b34801561047057600080fd5b50610390600160a060020a0360043516610ecb565b34801561049157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261045094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f7f9650505050505050565b34801561052857600080fd5b50610450611238565b34801561053d57600080fd5b50610390600160a060020a0360043516611241565b34801561055e57600080fd5b50610573600160a060020a03600435166112c3565b005b34801561058157600080fd5b5061039061135b565b34801561059657600080fd5b506104506113eb565b3480156105ab57600080fd5b50610390611662565b3480156105c057600080fd5b50610450600160a060020a03600435811690602435166044356116f0565b3480156105ea57600080fd5b50610390611915565b3480156105ff57600080fd5b5061060861191b565b6040805160ff9092168252519081900360200190f35b34801561062a57600080fd5b50610636600435611920565b60408051600160a060020a039092168252519081900360200190f35b34801561065e57600080fd5b50610636611948565b34801561067357600080fd5b50610450600160a060020a0360043516611957565b34801561069457600080fd5b50610636611a83565b3480156106a957600080fd5b50610450600160a060020a0360043516611afd565b3480156106ca57600080fd5b50610636600435611b12565b3480156106e257600080fd5b50610573600160a060020a0360043516611b93565b34801561070357600080fd5b50610390611c2b565b34801561071857600080fd5b50610450611c31565b34801561072d57600080fd5b506103b7611c6a565b34801561074257600080fd5b50610390611ca1565b34801561075757600080fd5b50610390611d05565b34801561076c57600080fd5b50610450600435602435604435606435608435600160a060020a0360a43516611d9d565b34801561079c57600080fd5b50610390612496565b3480156107b157600080fd5b50610450600160a060020a03600435166024356124b7565b3480156107d557600080fd5b5061045060043515156125d5565b3480156107ef57600080fd5b506104506126b4565b34801561080457600080fd5b50610450600160a060020a03600435166126bd565b34801561082557600080fd5b50610573600160a060020a03600435166127e6565b34801561084657600080fd5b50610390600160a060020a0360043516612911565b34801561086757600080fd5b5061057360043515156129d1565b34801561088157600080fd5b50610636612a57565b34801561089657600080fd5b50610636600435612a66565b3480156108ae57600080fd5b50610390612a74565b3480156108c357600080fd5b50610390612aee565b3480156108d857600080fd5b50610636612b68565b3480156108ed57600080fd5b50610636612b77565b34801561090257600080fd5b50610390612b8b565b34801561091757600080fd5b50610390612c05565b34801561092c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610573958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612cdc9650505050505050565b3480156109d157600080fd5b506103b7600435612d34565b3480156109e957600080fd5b506103b7612ec9565b3480156109fe57600080fd5b50610450600435612f46565b348015610a1657600080fd5b5061039061309e565b348015610a2b57600080fd5b50610450600160a060020a03600435166130de565b6104506132f8565b348015610a5457600080fd5b50610390613361565b6103906133db565b348015610a7157600080fd5b50610450600160a060020a0360043516602435613997565b348015610a9557600080fd5b50610390613ab0565b348015610aaa57600080fd5b50610450600160a060020a0360043516613ab6565b348015610acb57600080fd5b50610573600160a060020a0360043516613acb565b348015610aec57600080fd5b50610450600160a060020a0360043516613b45565b348015610b0d57600080fd5b50610636600435613b5a565b348015610b2557600080fd5b50610450600160a060020a0360043516613bdb565b348015610b4657600080fd5b50610450600160a060020a0360043516613e6a565b348015610b6757600080fd5b50610636600435613eec565b348015610b7f57600080fd5b50610450600160a060020a0360043516602435613efa565b348015610ba357600080fd5b506104506004356140fe565b348015610bbb57600080fd5b50610450600435614142565b348015610bd357600080fd5b506103b761429d565b348015610be857600080fd5b5061045061432b565b348015610bfd57600080fd5b506103b761434c565b348015610c1257600080fd5b50610450600160a060020a03600435166024356143a7565b348015610c3657600080fd5b50610450600160a060020a036004351660243561447b565b348015610c5a57600080fd5b50610390600160a060020a036004358116906024351661457b565b348015610c8157600080fd5b50610390614638565b348015610c9657600080fd5b50610450614648565b348015610cab57600080fd5b5061039061466a565b348015610cc057600080fd5b50610573600160a060020a036004351660243515156146e4565b348015610ce657600080fd5b50610573600160a060020a036004351661480c565b348015610d0757600080fd5b506106366004356148b0565b348015610d1f57600080fd5b50610450600160a060020a036004351660243560443560643560843560a4351515614931565b348015610d5157600080fd5b50610d66600160a060020a0360043516614bbb565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6001545b90565b600e54604080517f6f0fccab000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b826191636f0fccab916024808301926020929190829003018186803b158015610e3357600080fd5b505af4158015610e47573d6000803e3d6000fd5b505050506040513d6020811015610e5d57600080fd5b5051612d34565b905090565b60075460009060ff1615610e7c57600080fd5b3360009081526009602052604090205460ff1615610e9957600080fd5b811580610ead5750610eab338461457b565b155b1515610eb857600080fd5b610ec28383614e6a565b90505b92915050565b600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b158015610f4d57600080fd5b505af4158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b505192915050565b60008054819081906101009004600160a060020a03163314801590610fb457503360009081526004602052604090205460ff16155b15610fbe57600080fd5b60075460ff161515610fcf57600080fd5b8451610fe290600c906020880190615361565b508351610ff690600d906020870190615361565b50610fff6113eb565b50600f5460405160e160020a6328cf2aed028152602060048201908152600d80546002600019600183161561010002019091160460248401819052600160a060020a039094169363519e55da939192918291604490910190849080156110a65780601f1061107b576101008083540402835291602001916110a6565b820191906000526020600020905b81548152906001019060200180831161108957829003601f168201915b505092505050602060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505092505050602060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506040513d60208110156111e357600080fd5b505160408051600160a060020a0380841682528516602082015281519293507f8e2c71dfeb156b7c7d03fa7cba1af111d058c575816f578cb3c2d8c6be99e0ca929081900390910190a1506001949350505050565b60005460ff1681565b600e54604080517f7243cfbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191637243cfbb91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a031633148015906112f357503360009081526004602052604090205460ff16155b156112fd57600080fd5b600160a060020a038116151561131257600080fd5b600160a060020a038116600081815260036020526040808220805460ff19169055517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9190a250565b600b54604080517f7e1c0c090000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691637e1c0c0991600480830192602092919082900301818787803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b5051905090565b600080546101009004600160a060020a0316331480159061141c57503360009081526004602052604090205460ff16155b1561142657600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da939290918291604490910190849080156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b505092505050602060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505092505050602060405180830381600087803b1580156115e457600080fd5b505af11580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805492841692909116919091179055905061165960016129d1565b60019250505090565b600e54604080517f0b96406a000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191630b96406a91602480820192602092909190829003018186803b1580156116dc57600080fd5b505af41580156113ce573d6000803e3d6000fd5b600754600090819060ff161561170557600080fd5b3360009081526009602052604090205460ff161561172257600080fd5b600160a060020a03851660009081526009602052604090205460ff161561174857600080fd5b600160a060020a03841660009081526009602052604090205460ff161561176e57600080fd5b600160a060020a03851633141561178457600080fd5b61178e853361457b565b90508281101561179d57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163beabacc891606480830192600092919082900301818387803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050600e5473c0cc10d764f38245ca6b43aa1fe84c85002b8261925063a70703739150600160a060020a03168733611865868963ffffffff614fd716565b6040805160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482019290925290516084808301926000929190829003018186803b1580156118c257600080fd5b505af41580156118d6573d6000803e3d6000fd5b5050604080518681529051600160a060020a038089169450891692506000805160206153fa8339815191529181900360200190a3506001949350505050565b60085490565b601281565b600180548290811061192e57fe5b600091825260209091200154600160a060020a0316905081565b600b54600160a060020a031681565b600080546101009004600160a060020a0316331480159061198857503360009081526004602052604090205460ff16155b1561199257600080fd5b600160a060020a03821615156119a757600080fd5b600e54604080517f3613b781000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291841660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191633613b781916044808301926000929190829003018186803b158015611a2557600080fd5b505af4158015611a39573d6000803e3d6000fd5b50505050611a46826130de565b50604051600160a060020a038316907fe8a24516e1d3bae0c4742f4e5ded148733d2193d648d57d54bbec9c20e4b444990600090a2506001919050565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191639646824991602480820192602092909190829003018186803b1580156116dc57600080fd5b60036020526000908152604090205460ff1681565b600e54604080517f52bafbfa000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916352bafbfa91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a03163314801590611bc357503360009081526004602052604090205460ff16155b15611bcd57600080fd5b600160a060020a0381161515611be257600080fd5b600160a060020a038116600081815260046020526040808220805460ff19169055517f1aaaaf7609619e631f47eb3546f9fdd8c61b1af2175988a0ddb9a06680c3b9ed9190a250565b60105481565b60075460009060ff1615611c4457600080fd5b3360009081526009602052604090205460ff1615611c6157600080fd5b610e64336130de565b60408051808201909152600181527f3300000000000000000000000000000000000000000000000000000000000000602082015281565b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000610e64611d12612b8b565b600b60009054906101000a9004600160a060020a0316600160a060020a0316635cb0c16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b505050506040513d6020811015611d8f57600080fd5b50519063ffffffff614fe916565b6000805481906101009004600160a060020a03163314801590611dd057503360009081526004602052604090205460ff16155b15611dda57600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da93929091829160449091019084908015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b505092505050602060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d6020811015611ecf57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da9392829160449091019084908015611f785780601f10611f4d57610100808354040283529160200191611f78565b820191906000526020600020905b815481529060010190602001808311611f5b57829003601f168201915b505092505050602060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b505050506040513d6020811015611fc257600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805483851692169190911790819055604080517fcedc7277000000000000000000000000000000000000000000000000000000008152919092166004820152905191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b15801561207257600080fd5b505af4158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b505192506000831180156120b05750878314155b156120c65760075460ff1615156120c657600080fd5b600e54604080517f9c473bb2000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b826191639c473bb2916044808301926000929190829003018186803b15801561214357600080fd5b505af4158015612157573d6000803e3d6000fd5b5050600e54604080517fe6e623d5000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063e6e623d592506044808301926000929190829003018186803b1580156121d857600080fd5b505af41580156121ec573d6000803e3d6000fd5b5050600e54604080517f1112b124000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b82619350631112b12492506044808301926000929190829003018186803b15801561226d57600080fd5b505af4158015612281573d6000803e3d6000fd5b5050600e54604080517fcd54c54e000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018b90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063cd54c54e92506044808301926000929190829003018186803b15801561230257600080fd5b505af4158015612316573d6000803e3d6000fd5b5050600e54604080517f05bf779f000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291891660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826193506305bf779f92506044808301926000929190829003018186803b15801561239857600080fd5b505af41580156123ac573d6000803e3d6000fd5b5050600e54604080517fdbafdbb6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018a90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063dbafdbb692506044808301926000929190829003018186803b15801561242d57600080fd5b505af4158015612441573d6000803e3d6000fd5b5050604080518b8152602081018b90528082018a905290517f9d1a3ea811a60a1b2c08f8e30a09832514a3ec19ba354d73d8fe12ad66591cec9350908190036060019150a15060019998505050505050505050565b6000610e646124a3611d05565b6124ab61135b565b9063ffffffff614fd716565b600754600090819060ff16156124cc57600080fd5b3360009081526009602052604090205460ff16156124e957600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015233602482015291861660448301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50519050808311156125b5576125ae846000614e6a565b91506125ce565b6125ae846125c9838663ffffffff614fd716565b614e6a565b5092915050565b600080546101009004600160a060020a0316331480159061260657503360009081526004602052604090205460ff16155b1561261057600080fd5b600f805483158015740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001990921691909117909155612682576040517ff5eced797ccd723743102a9d898a1372f6bd7a0206c4facf99081b9471f5727290600090a16126ac565b6040517fd20fe4b54e307993c74930d195aa389bf91e188918e31ad1da29aad5a748a4d390600090a15b506001919050565b60075460ff1681565b600080546101009004600160a060020a031633148015906126ee57503360009081526004602052604090205460ff16155b156126f857600080fd5b600160a060020a038216151561270d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529184166024830152600060448301819052905173c0cc10d764f38245ca6b43aa1fe84c85002b826192636ace6dc8926064808301939192829003018186803b15801561279257600080fd5b505af41580156127a6573d6000803e3d6000fd5b5050604051600160a060020a03851692507f434d4944e12211f9f671e6e354248816735c0452bc160d31e737245b3dcb45c39150600090a2506001919050565b6000546101009004600160a060020a0316331480159061281657503360009081526004602052604090205460ff16155b1561282057600080fd5b600160a060020a038116151561283557600080fd5b600160a060020a0381166000908152600360209081526040808320805460ff19166001179055600590915290205460ff1615156128da576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600560205260409020805460ff191690911790555b604051600160a060020a038216907fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba90600090a250565b600030600160a060020a0383168114156129345761292d612496565b91506129cb565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b505191505b50919050565b6000546101009004600160a060020a03163314801590612a0157503360009081526004602052604090205460ff16155b15612a0b57600080fd5b6007805460ff191682151517908190556040805160ff90921615158252517f1623ff1a4138a65cb1f44d1a94c034f7dd8c1e826fefb1f27f0898580601e68d916020908290030190a150565b600f54600160a060020a031681565b600880548290811061192e57fe5b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d91602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54600160a060020a031681565b6000546101009004600160a060020a031681565b600e54604080517feec5d076000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163eec5d07691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000600d6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b820191906000526020600020905b815481529060010190602001808311612c53575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310612caa5780518252601f199092019160209182019101612c8b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b33730aeaf8c2fe778797cd5464e7eb8351d28da2e8231480612d11575033731e65f71b024937b988fdba09814d60049e0fc59d145b1515612d1c57600080fd5b612d24614ff6565b612d2f838383615132565b505050565b6040805160208082528183019092526060918291600091829184918082016104008038833901905050935060009250600091505b6020821015612e1857858260208110612d7d57fe5b1a60f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600060f860020a02141515612e0d57858260208110612dc157fe5b1a60f860020a028484815181101515612dd657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b600190910190612d68565b826040519080825280601f01601f191660200182016040528015612e46578160200160208202803883390190505b509050600091505b82821015612ec0578382815181101515612e6457fe5b90602001015160f860020a900460f860020a028183815181101515612e8557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190612e4e565b95945050505050565b600e54604080517f81a73ad5000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b8261916381a73ad5916024808301926020929190829003018186803b158015610e3357600080fd5b600080546101009004600160a060020a03163314801590612f7757503360009081526004602052604090205460ff16155b15612f8157600080fd5b6b1363156bbee3016d70000000612fa6612f9961135b565b849063ffffffff614fe916565b1115612fb157600080fd5b60008211612fbe57600080fd5b600b54604080517f97304ced000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916397304ced9160248082019260009290919082900301818387803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b50506040805185815290517f07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a846659350908190036020019150a160408051838152905130916000916000805160206153fa8339815191529181900360200190a3506001919050565b6000600c6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b600754600090819060ff16156130f357600080fd5b3360009081526009602052604090205460ff161561311057600080fd5b600160a060020a038316151561312557600080fd5b600160a060020a03831660009081526009602052604090205460ff161561314b57600080fd5b61315483611241565b905080151561316657600191506129cb565b600e54604080517f4698da9d000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634698da9d916044808301926000929190829003018186803b1580156131e457600080fd5b505af41580156131f8573d6000803e3d6000fd5b5050600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152602482018790529151919092169350634cfe3e7f9250604480830192600092919082900301818387803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b5050604080518481529051600160a060020a03871693503092506000805160206153fa8339815191529181900360200190a3604080518281529051600160a060020a038516917f39dfd9c15a87979822cf6b236d0974075578d5b822244050f3c876a6cd1d2055919081900360200190a250600192915050565b60075460009060ff161561330b57600080fd5b3360009081526009602052604090205460ff161561332857600080fd5b6040805134815290517fdfcc97ccd559bb2bb289cefc32e1a1212d9bf091c06ffb121083134325afa3f89181900360200190a150600190565b600e54604080517f576f7e31000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163576f7e3191602480820192602092909190829003018186803b1580156116dc57600080fd5b60075460009081908190819081908190819060ff16156133fa57600080fd5b3360009081526009602052604090205460ff161561341757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161561343f57600080fd5b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c3916044808301926020929190829003018186803b1580156134bb57600080fd5b505af41580156134cf573d6000803e3d6000fd5b505050506040513d60208110156134e557600080fd5b505115156134f257600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc7277916024808301926020929190829003018186803b15801561356857600080fd5b505af415801561357c573d6000803e3d6000fd5b505050506040513d602081101561359257600080fd5b5051600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525191975073c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156135f857600080fd5b505af415801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b505194506000341161363357600080fd5b6000861161364057600080fd5b6000851161364d57600080fd5b61365d348763ffffffff61527816565b9350846136788561366c611d05565b9063ffffffff614fe916565b111561368357600080fd5b61368b612496565b84111561369757600080fd5b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d602081101561372757600080fd5b5051600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525191935073c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b1580156137a957600080fd5b505af41580156137bd573d6000803e3d6000fd5b505050506040513d60208110156137d357600080fd5b505160105490915015806137f857506010546137f5838663ffffffff614fe916565b10155b151561380357600080fd5b6000811115613814578092506138b9565b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b15801561388a57600080fd5b505af415801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b505192505b6000831180156138d857506138d4828563ffffffff614fe916565b8310155b15156138e357600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691634cfe3e7f9160448082019260009290919082900301818387803b15801561394f57600080fd5b505af1158015613963573d6000803e3d6000fd5b50506040805187815290513393503092506000805160206153fa8339815191529181900360200190a3509195945050505050565b60075460009060ff16156139aa57600080fd5b3360009081526009602052604090205460ff16156139c757600080fd5b600160a060020a03831660009081526009602052604090205460ff16156139ed57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038681166024830152604482018690529151919092169163beabacc891606480830192600092919082900301818387803b158015613a6157600080fd5b505af1158015613a75573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392506000805160206153fa8339815191529181900360200190a350600192915050565b60025490565b60046020526000908152604090205460ff1681565b6000546101009004600160a060020a03163314801590613afb57503360009081526004602052604090205460ff16155b15613b0557600080fd5b613b0e816152a1565b604051600160a060020a038216907ffba24c034afca607a35e1f221b154b3f8e1f88c7924c8a0a06755b70708c44d890600090a250565b60096020526000908152604090205460ff1681565b600e54604080517f58c6bce8000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916358c6bce891604480820192602092909190829003018186803b158015610f4d57600080fd5b6000805481906101009004600160a060020a03163314801590613c0e57503360009081526004602052604090205460ff16155b15613c1857600080fd5b600160a060020a0383161515613c2d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152600160448301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191636ace6dc8916064808301926000929190829003018186803b158015613cb257600080fd5b505af4158015613cc6573d6000803e3d6000fd5b5050600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291871660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063ddf9d61392506044808301926020929190829003018186803b158015613d4857600080fd5b505af4158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b50519050801515613e2257600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b158015613df357600080fd5b505af4158015613e07573d6000803e3d6000fd5b505050506040513d6020811015613e1d57600080fd5b505190505b604080518281529051600160a060020a038516917fcb3de9106aa8cc3efea54defa4b3ec342e8ae23607fd0255b1dcee4813f9f4bc919081900360200190a250600192915050565b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c391604480820192602092909190829003018186803b158015610f4d57600080fd5b600280548290811061192e57fe5b6000805481906101009004600160a060020a03163314801590613f2d57503360009081526004602052604090205460ff16155b15613f3757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161515613f6057600080fd5b600160a060020a03841660009081526009602052604090205460ff1615613f8657600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b158015613fe657600080fd5b505af4158015613ffa573d6000803e3d6000fd5b505050506040513d602081101561401057600080fd5b50519050806140218461366c611d05565b111561402c57600080fd5b614034612496565b83111561404057600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820187905291519190921691634cfe3e7f91604480830192600092919082900301818387803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b5050604080518681529051600160a060020a03881693503092506000805160206153fa8339815191529181900360200190a35060019392505050565b600080546101009004600160a060020a0316331480159061412f57503360009081526004602052604090205460ff16155b1561413957600080fd5b50601055600190565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251600091829173c0cc10d764f38245ca6b43aa1fe84c85002b8261916396468249916024808301926020929190829003018186803b1580156141bd57600080fd5b505af41580156141d1573d6000803e3d6000fd5b505050506040513d60208110156141e757600080fd5b50519050600160a060020a038116151561420057600080fd5b6000546101009004600160a060020a03163314801590614229575033600160a060020a03821614155b1561423357600080fd5b604051339084156108fc029085906000818181858888f19350505050158015614260573d6000803e3d6000fd5b506040805184815290517f4938436c771c2d50d08d91b156ca4b3ab759fa99c83c50d541e72166d46f85e09181900360200190a150600192915050565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b505050505081565b600f5474010000000000000000000000000000000000000000900460ff1681565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b60075460009060ff16156143ba57600080fd5b3360009081526009602052604090205460ff16156143d757600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152336024820152918516604483015251610ec29185916125c991869173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561446757600080fd5b505af4158015611d79573d6000803e3d6000fd5b600080546101009004600160a060020a031633148015906144ac57503360009081526004602052604090205460ff16155b156144b657600080fd5b600160a060020a03831615156144cb57600080fd5b600e54604080517f4989b0b6000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152604482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634989b0b6916064808301926000929190829003018186803b15801561455057600080fd5b505af4158015614564573d6000803e3d6000fd5b5050505061457183613bdb565b5060019392505050565b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015291831660448301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b4191606480820192602092909190829003018186803b15801561460557600080fd5b505af4158015614619573d6000803e3d6000fd5b505050506040513d602081101561462f57600080fd5b50519392505050565b6b1363156bbee3016d7000000081565b6000547501000000000000000000000000000000000000000000900460ff1681565b600e54604080517f27132be6000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916327132be691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000546101009004600160a060020a0316331480159061471457503360009081526004602052604090205460ff16155b1561471e57600080fd5b600160a060020a0382166000908152600960209081526040808320805460ff1916851515179055600a90915290205460ff1615156147c7576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600a60205260409020805460ff191690911790555b6040805182151581529051600160a060020a038416917f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5919081900360200190a25050565b6000546101009004600160a060020a0316331461482857600080fd5b600160a060020a038116151561483d57600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600e54604080517fd97e38d6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163d97e38d691604480820192602092909190829003018186803b158015610f4d57600080fd5b600080548190819081906101009004600160a060020a0316331480159061496857503360009081526004602052604090205460ff16155b1561497257600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b1580156149d257600080fd5b505af41580156149e6573d6000803e3d6000fd5b505050506040513d60208110156149fc57600080fd5b50519250600160a060020a038a161515614a1557600080fd5b600160a060020a038a1660009081526009602052604090205460ff1615614a3b57600080fd5b86861015614a4857600080fd5b82614a558a61366c611d05565b1115614a6057600080fd5b614a68612496565b891115614a7457600080fd5b879150811515614a82574291505b614a92828863ffffffff614fe916565b600e54604080517fc4b9223f000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d166024830152604482018c9052606482018590526084820183905260a4820189905287151560c48301525191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163c4b9223f9160e480820192600092909190829003018186803b158015614b3857600080fd5b505af4158015614b4c573d6000803e3d6000fd5b505060408051858152602081018590528082018a9052606081018d905288151560808201529051600160a060020a038e1693507f9c30dc484837afde1ded2722ef11ba4a8f599b3cf3205def0b668e9f5e33c79f92509081900360a00190a25060019998505050505050505050565b600e54604080517fe16dd936000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000918291829182918291829182918291829173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e16dd9369160448082019260e092909190829003018186803b158015614c4d57600080fd5b505af4158015614c61573d6000803e3d6000fd5b505050506040513d60e0811015614c7757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809750819850829950839c50849d50859e50869f5050505050505050600e60009054906101000a9004600160a060020a0316600160a060020a031673c0cc10d764f38245ca6b43aa1fe84c85002b826163aa77f26c90918c6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b158015614d7e57600080fd5b505af4158015614d92573d6000803e3d6000fd5b505050506040513d6020811015614da857600080fd5b5051600e54604080517fbca9adef000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d1660248301525191965073c0cc10d764f38245ca6b43aa1fe84c85002b82619163bca9adef91604480820192602092909190829003018186803b158015614e2c57600080fd5b505af4158015614e40573d6000803e3d6000fd5b505050506040513d6020811015614e5657600080fd5b5051989a9799509597949693959193909250565b60075460009060ff1615614e7d57600080fd5b3360009081526009602052604090205460ff1615614e9a57600080fd5b600160a060020a0383161515614eaf57600080fd5b600160a060020a03831660009081526009602052604090205460ff1615614ed557600080fd5b33600160a060020a0384161415614eeb57600080fd5b600e54604080517fa7070373000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201523360248201529185166044830152606482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163a7070373916084808301926000929190829003018186803b158015614f7657600080fd5b505af4158015614f8a573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600082821115614fe357fe5b50900390565b81810182811015610ec557fe5b6000547501000000000000000000000000000000000000000000900460ff16156150a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f436f6e747261637420696e7374616e63652068617320616c726561647920696e60448201527f697469616c697a6564207468652061646d696e73000000000000000000000000606482015290519081900360840190fd5b6000805474ffffffffffffffffffffffffffffffffffffffff001916740aeaf8c2fe778797cd5464e7eb8351d28da2e823001790556150f9731e65f71b024937b988fdba09814d60049e0fc59d6152a1565b6000805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60005460ff16156151ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a6564000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831615156151df57600080fd5b81516151f290600c906020850190615361565b50805161520690600d906020840190615361565b50600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03858116919091179182905561523f9116613acb565b60408051600080825291513092916000805160206153fa833981519152919081900360200190a350506000805460ff1916600117905550565b600082151561528957506000610ec5565b5081810281838281151561529957fe5b0414610ec557fe5b600160a060020a03811615156152b657600080fd5b600160a060020a0381166000908152600460209081526040808320805460ff19166001179055600690915290205460ff16151561535e576002805460018082019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600660205260409020805460ff191690911790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a257805160ff19168380011785556153cf565b828001600101855582156153cf579182015b828111156153cf5782518255916020019190600101906153b4565b506153db9291506153df565b5090565b610db391905b808211156153db57600081556001016153e55600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582070319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a70029
Deployed Bytecode
0x6080604052600436106103765763ffffffff60e060020a6000350416630489882e811461037b57806306fdde03146103a2578063095ea7b31461042c578063115f2be21461046457806313bac8f214610485578063158ef93e1461051c5780631726cbc8146105315780631785f53c1461055257806318160ddd146105755780631a841b1b1461058a578063222101d11461059f57806323b872dd146105b45780632b28d2d0146105de578063313ce567146105f3578063313f2a211461061e5780633886c957146106525780633b0da2601461066757806341fbb05014610688578063429b62e51461069d5780634610a448146106be5780634902e4aa146106d65780634f2d7ab5146106f757806354dd1da41461070c57806354fd4d501461072157806356597e65146107365780635cb0c16f1461074b5780635da01a5b1461076057806360659a921461079057806366188463146107a55780636a420bbc146107c95780636df006f3146107e35780636f75b00c146107f8578063704802751461081957806370a082311461083a578063771eee161461085b5780637b103999146108755780637db6cc1b1461088a578063820e79ed146108a25780638620410b146108b757806388d7cd97146108cc5780638da5cb5b146108e15780638df388c1146108f65780638f1d5f7e1461090b57806390657147146109205780639201de55146109c557806395d89b41146109dd57806397304ced146109f25780639860811114610a0a57806399817b4714610a1f5780639ae066b014610a40578063a4453a9614610a48578063a6f2ae3a14610a5d578063a9059cbb14610a65578063abf7b06314610a89578063ad25cb4214610a9e578063b3292ff014610abf578063b414d4b614610ae0578063b9447f7e14610b01578063bbf8980314610b19578063c3437e0614610b3a578063c389439814610b5b578063c94e643c14610b73578063cb0b7b0314610b97578063cedcd77014610baf578063cf1f3dd714610bc7578063d28dcdea14610bdc578063d73c277c14610bf1578063d73dd62314610c06578063da14c72314610c2a578063dd62ed3e14610c4e578063ddad3ca114610c75578063deca6e7614610c8a578063e01bc60b14610c9f578063e724529c14610cb4578063f2fde38b14610cda578063f69f8a5c14610cfb578063fc13566d14610d13578063ffff6b0414610d45575b600080fd5b34801561038757600080fd5b50610390610daf565b60408051918252519081900360200190f35b3480156103ae57600080fd5b506103b7610db6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b50610450600160a060020a0360043516602435610e69565b604080519115158252519081900360200190f35b34801561047057600080fd5b50610390600160a060020a0360043516610ecb565b34801561049157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261045094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f7f9650505050505050565b34801561052857600080fd5b50610450611238565b34801561053d57600080fd5b50610390600160a060020a0360043516611241565b34801561055e57600080fd5b50610573600160a060020a03600435166112c3565b005b34801561058157600080fd5b5061039061135b565b34801561059657600080fd5b506104506113eb565b3480156105ab57600080fd5b50610390611662565b3480156105c057600080fd5b50610450600160a060020a03600435811690602435166044356116f0565b3480156105ea57600080fd5b50610390611915565b3480156105ff57600080fd5b5061060861191b565b6040805160ff9092168252519081900360200190f35b34801561062a57600080fd5b50610636600435611920565b60408051600160a060020a039092168252519081900360200190f35b34801561065e57600080fd5b50610636611948565b34801561067357600080fd5b50610450600160a060020a0360043516611957565b34801561069457600080fd5b50610636611a83565b3480156106a957600080fd5b50610450600160a060020a0360043516611afd565b3480156106ca57600080fd5b50610636600435611b12565b3480156106e257600080fd5b50610573600160a060020a0360043516611b93565b34801561070357600080fd5b50610390611c2b565b34801561071857600080fd5b50610450611c31565b34801561072d57600080fd5b506103b7611c6a565b34801561074257600080fd5b50610390611ca1565b34801561075757600080fd5b50610390611d05565b34801561076c57600080fd5b50610450600435602435604435606435608435600160a060020a0360a43516611d9d565b34801561079c57600080fd5b50610390612496565b3480156107b157600080fd5b50610450600160a060020a03600435166024356124b7565b3480156107d557600080fd5b5061045060043515156125d5565b3480156107ef57600080fd5b506104506126b4565b34801561080457600080fd5b50610450600160a060020a03600435166126bd565b34801561082557600080fd5b50610573600160a060020a03600435166127e6565b34801561084657600080fd5b50610390600160a060020a0360043516612911565b34801561086757600080fd5b5061057360043515156129d1565b34801561088157600080fd5b50610636612a57565b34801561089657600080fd5b50610636600435612a66565b3480156108ae57600080fd5b50610390612a74565b3480156108c357600080fd5b50610390612aee565b3480156108d857600080fd5b50610636612b68565b3480156108ed57600080fd5b50610636612b77565b34801561090257600080fd5b50610390612b8b565b34801561091757600080fd5b50610390612c05565b34801561092c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610573958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612cdc9650505050505050565b3480156109d157600080fd5b506103b7600435612d34565b3480156109e957600080fd5b506103b7612ec9565b3480156109fe57600080fd5b50610450600435612f46565b348015610a1657600080fd5b5061039061309e565b348015610a2b57600080fd5b50610450600160a060020a03600435166130de565b6104506132f8565b348015610a5457600080fd5b50610390613361565b6103906133db565b348015610a7157600080fd5b50610450600160a060020a0360043516602435613997565b348015610a9557600080fd5b50610390613ab0565b348015610aaa57600080fd5b50610450600160a060020a0360043516613ab6565b348015610acb57600080fd5b50610573600160a060020a0360043516613acb565b348015610aec57600080fd5b50610450600160a060020a0360043516613b45565b348015610b0d57600080fd5b50610636600435613b5a565b348015610b2557600080fd5b50610450600160a060020a0360043516613bdb565b348015610b4657600080fd5b50610450600160a060020a0360043516613e6a565b348015610b6757600080fd5b50610636600435613eec565b348015610b7f57600080fd5b50610450600160a060020a0360043516602435613efa565b348015610ba357600080fd5b506104506004356140fe565b348015610bbb57600080fd5b50610450600435614142565b348015610bd357600080fd5b506103b761429d565b348015610be857600080fd5b5061045061432b565b348015610bfd57600080fd5b506103b761434c565b348015610c1257600080fd5b50610450600160a060020a03600435166024356143a7565b348015610c3657600080fd5b50610450600160a060020a036004351660243561447b565b348015610c5a57600080fd5b50610390600160a060020a036004358116906024351661457b565b348015610c8157600080fd5b50610390614638565b348015610c9657600080fd5b50610450614648565b348015610cab57600080fd5b5061039061466a565b348015610cc057600080fd5b50610573600160a060020a036004351660243515156146e4565b348015610ce657600080fd5b50610573600160a060020a036004351661480c565b348015610d0757600080fd5b506106366004356148b0565b348015610d1f57600080fd5b50610450600160a060020a036004351660243560443560643560843560a4351515614931565b348015610d5157600080fd5b50610d66600160a060020a0360043516614bbb565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6001545b90565b600e54604080517f6f0fccab000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b826191636f0fccab916024808301926020929190829003018186803b158015610e3357600080fd5b505af4158015610e47573d6000803e3d6000fd5b505050506040513d6020811015610e5d57600080fd5b5051612d34565b905090565b60075460009060ff1615610e7c57600080fd5b3360009081526009602052604090205460ff1615610e9957600080fd5b811580610ead5750610eab338461457b565b155b1515610eb857600080fd5b610ec28383614e6a565b90505b92915050565b600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b158015610f4d57600080fd5b505af4158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b505192915050565b60008054819081906101009004600160a060020a03163314801590610fb457503360009081526004602052604090205460ff16155b15610fbe57600080fd5b60075460ff161515610fcf57600080fd5b8451610fe290600c906020880190615361565b508351610ff690600d906020870190615361565b50610fff6113eb565b50600f5460405160e160020a6328cf2aed028152602060048201908152600d80546002600019600183161561010002019091160460248401819052600160a060020a039094169363519e55da939192918291604490910190849080156110a65780601f1061107b576101008083540402835291602001916110a6565b820191906000526020600020905b81548152906001019060200180831161108957829003601f168201915b505092505050602060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505092505050602060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506040513d60208110156111e357600080fd5b505160408051600160a060020a0380841682528516602082015281519293507f8e2c71dfeb156b7c7d03fa7cba1af111d058c575816f578cb3c2d8c6be99e0ca929081900390910190a1506001949350505050565b60005460ff1681565b600e54604080517f7243cfbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191637243cfbb91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a031633148015906112f357503360009081526004602052604090205460ff16155b156112fd57600080fd5b600160a060020a038116151561131257600080fd5b600160a060020a038116600081815260036020526040808220805460ff19169055517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9190a250565b600b54604080517f7e1c0c090000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691637e1c0c0991600480830192602092919082900301818787803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b5051905090565b600080546101009004600160a060020a0316331480159061141c57503360009081526004602052604090205460ff16155b1561142657600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da939290918291604490910190849080156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b505092505050602060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505092505050602060405180830381600087803b1580156115e457600080fd5b505af11580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805492841692909116919091179055905061165960016129d1565b60019250505090565b600e54604080517f0b96406a000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191630b96406a91602480820192602092909190829003018186803b1580156116dc57600080fd5b505af41580156113ce573d6000803e3d6000fd5b600754600090819060ff161561170557600080fd5b3360009081526009602052604090205460ff161561172257600080fd5b600160a060020a03851660009081526009602052604090205460ff161561174857600080fd5b600160a060020a03841660009081526009602052604090205460ff161561176e57600080fd5b600160a060020a03851633141561178457600080fd5b61178e853361457b565b90508281101561179d57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163beabacc891606480830192600092919082900301818387803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050600e5473c0cc10d764f38245ca6b43aa1fe84c85002b8261925063a70703739150600160a060020a03168733611865868963ffffffff614fd716565b6040805160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482019290925290516084808301926000929190829003018186803b1580156118c257600080fd5b505af41580156118d6573d6000803e3d6000fd5b5050604080518681529051600160a060020a038089169450891692506000805160206153fa8339815191529181900360200190a3506001949350505050565b60085490565b601281565b600180548290811061192e57fe5b600091825260209091200154600160a060020a0316905081565b600b54600160a060020a031681565b600080546101009004600160a060020a0316331480159061198857503360009081526004602052604090205460ff16155b1561199257600080fd5b600160a060020a03821615156119a757600080fd5b600e54604080517f3613b781000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291841660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191633613b781916044808301926000929190829003018186803b158015611a2557600080fd5b505af4158015611a39573d6000803e3d6000fd5b50505050611a46826130de565b50604051600160a060020a038316907fe8a24516e1d3bae0c4742f4e5ded148733d2193d648d57d54bbec9c20e4b444990600090a2506001919050565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191639646824991602480820192602092909190829003018186803b1580156116dc57600080fd5b60036020526000908152604090205460ff1681565b600e54604080517f52bafbfa000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916352bafbfa91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a03163314801590611bc357503360009081526004602052604090205460ff16155b15611bcd57600080fd5b600160a060020a0381161515611be257600080fd5b600160a060020a038116600081815260046020526040808220805460ff19169055517f1aaaaf7609619e631f47eb3546f9fdd8c61b1af2175988a0ddb9a06680c3b9ed9190a250565b60105481565b60075460009060ff1615611c4457600080fd5b3360009081526009602052604090205460ff1615611c6157600080fd5b610e64336130de565b60408051808201909152600181527f3300000000000000000000000000000000000000000000000000000000000000602082015281565b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000610e64611d12612b8b565b600b60009054906101000a9004600160a060020a0316600160a060020a0316635cb0c16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b505050506040513d6020811015611d8f57600080fd5b50519063ffffffff614fe916565b6000805481906101009004600160a060020a03163314801590611dd057503360009081526004602052604090205460ff16155b15611dda57600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da93929091829160449091019084908015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b505092505050602060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d6020811015611ecf57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da9392829160449091019084908015611f785780601f10611f4d57610100808354040283529160200191611f78565b820191906000526020600020905b815481529060010190602001808311611f5b57829003601f168201915b505092505050602060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b505050506040513d6020811015611fc257600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805483851692169190911790819055604080517fcedc7277000000000000000000000000000000000000000000000000000000008152919092166004820152905191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b15801561207257600080fd5b505af4158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b505192506000831180156120b05750878314155b156120c65760075460ff1615156120c657600080fd5b600e54604080517f9c473bb2000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b826191639c473bb2916044808301926000929190829003018186803b15801561214357600080fd5b505af4158015612157573d6000803e3d6000fd5b5050600e54604080517fe6e623d5000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063e6e623d592506044808301926000929190829003018186803b1580156121d857600080fd5b505af41580156121ec573d6000803e3d6000fd5b5050600e54604080517f1112b124000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b82619350631112b12492506044808301926000929190829003018186803b15801561226d57600080fd5b505af4158015612281573d6000803e3d6000fd5b5050600e54604080517fcd54c54e000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018b90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063cd54c54e92506044808301926000929190829003018186803b15801561230257600080fd5b505af4158015612316573d6000803e3d6000fd5b5050600e54604080517f05bf779f000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291891660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826193506305bf779f92506044808301926000929190829003018186803b15801561239857600080fd5b505af41580156123ac573d6000803e3d6000fd5b5050600e54604080517fdbafdbb6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018a90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063dbafdbb692506044808301926000929190829003018186803b15801561242d57600080fd5b505af4158015612441573d6000803e3d6000fd5b5050604080518b8152602081018b90528082018a905290517f9d1a3ea811a60a1b2c08f8e30a09832514a3ec19ba354d73d8fe12ad66591cec9350908190036060019150a15060019998505050505050505050565b6000610e646124a3611d05565b6124ab61135b565b9063ffffffff614fd716565b600754600090819060ff16156124cc57600080fd5b3360009081526009602052604090205460ff16156124e957600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015233602482015291861660448301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50519050808311156125b5576125ae846000614e6a565b91506125ce565b6125ae846125c9838663ffffffff614fd716565b614e6a565b5092915050565b600080546101009004600160a060020a0316331480159061260657503360009081526004602052604090205460ff16155b1561261057600080fd5b600f805483158015740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001990921691909117909155612682576040517ff5eced797ccd723743102a9d898a1372f6bd7a0206c4facf99081b9471f5727290600090a16126ac565b6040517fd20fe4b54e307993c74930d195aa389bf91e188918e31ad1da29aad5a748a4d390600090a15b506001919050565b60075460ff1681565b600080546101009004600160a060020a031633148015906126ee57503360009081526004602052604090205460ff16155b156126f857600080fd5b600160a060020a038216151561270d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529184166024830152600060448301819052905173c0cc10d764f38245ca6b43aa1fe84c85002b826192636ace6dc8926064808301939192829003018186803b15801561279257600080fd5b505af41580156127a6573d6000803e3d6000fd5b5050604051600160a060020a03851692507f434d4944e12211f9f671e6e354248816735c0452bc160d31e737245b3dcb45c39150600090a2506001919050565b6000546101009004600160a060020a0316331480159061281657503360009081526004602052604090205460ff16155b1561282057600080fd5b600160a060020a038116151561283557600080fd5b600160a060020a0381166000908152600360209081526040808320805460ff19166001179055600590915290205460ff1615156128da576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600560205260409020805460ff191690911790555b604051600160a060020a038216907fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba90600090a250565b600030600160a060020a0383168114156129345761292d612496565b91506129cb565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b505191505b50919050565b6000546101009004600160a060020a03163314801590612a0157503360009081526004602052604090205460ff16155b15612a0b57600080fd5b6007805460ff191682151517908190556040805160ff90921615158252517f1623ff1a4138a65cb1f44d1a94c034f7dd8c1e826fefb1f27f0898580601e68d916020908290030190a150565b600f54600160a060020a031681565b600880548290811061192e57fe5b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d91602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54600160a060020a031681565b6000546101009004600160a060020a031681565b600e54604080517feec5d076000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163eec5d07691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000600d6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b820191906000526020600020905b815481529060010190602001808311612c53575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310612caa5780518252601f199092019160209182019101612c8b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b33730aeaf8c2fe778797cd5464e7eb8351d28da2e8231480612d11575033731e65f71b024937b988fdba09814d60049e0fc59d145b1515612d1c57600080fd5b612d24614ff6565b612d2f838383615132565b505050565b6040805160208082528183019092526060918291600091829184918082016104008038833901905050935060009250600091505b6020821015612e1857858260208110612d7d57fe5b1a60f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600060f860020a02141515612e0d57858260208110612dc157fe5b1a60f860020a028484815181101515612dd657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b600190910190612d68565b826040519080825280601f01601f191660200182016040528015612e46578160200160208202803883390190505b509050600091505b82821015612ec0578382815181101515612e6457fe5b90602001015160f860020a900460f860020a028183815181101515612e8557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190612e4e565b95945050505050565b600e54604080517f81a73ad5000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b8261916381a73ad5916024808301926020929190829003018186803b158015610e3357600080fd5b600080546101009004600160a060020a03163314801590612f7757503360009081526004602052604090205460ff16155b15612f8157600080fd5b6b1363156bbee3016d70000000612fa6612f9961135b565b849063ffffffff614fe916565b1115612fb157600080fd5b60008211612fbe57600080fd5b600b54604080517f97304ced000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916397304ced9160248082019260009290919082900301818387803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b50506040805185815290517f07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a846659350908190036020019150a160408051838152905130916000916000805160206153fa8339815191529181900360200190a3506001919050565b6000600c6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b600754600090819060ff16156130f357600080fd5b3360009081526009602052604090205460ff161561311057600080fd5b600160a060020a038316151561312557600080fd5b600160a060020a03831660009081526009602052604090205460ff161561314b57600080fd5b61315483611241565b905080151561316657600191506129cb565b600e54604080517f4698da9d000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634698da9d916044808301926000929190829003018186803b1580156131e457600080fd5b505af41580156131f8573d6000803e3d6000fd5b5050600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152602482018790529151919092169350634cfe3e7f9250604480830192600092919082900301818387803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b5050604080518481529051600160a060020a03871693503092506000805160206153fa8339815191529181900360200190a3604080518281529051600160a060020a038516917f39dfd9c15a87979822cf6b236d0974075578d5b822244050f3c876a6cd1d2055919081900360200190a250600192915050565b60075460009060ff161561330b57600080fd5b3360009081526009602052604090205460ff161561332857600080fd5b6040805134815290517fdfcc97ccd559bb2bb289cefc32e1a1212d9bf091c06ffb121083134325afa3f89181900360200190a150600190565b600e54604080517f576f7e31000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163576f7e3191602480820192602092909190829003018186803b1580156116dc57600080fd5b60075460009081908190819081908190819060ff16156133fa57600080fd5b3360009081526009602052604090205460ff161561341757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161561343f57600080fd5b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c3916044808301926020929190829003018186803b1580156134bb57600080fd5b505af41580156134cf573d6000803e3d6000fd5b505050506040513d60208110156134e557600080fd5b505115156134f257600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc7277916024808301926020929190829003018186803b15801561356857600080fd5b505af415801561357c573d6000803e3d6000fd5b505050506040513d602081101561359257600080fd5b5051600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525191975073c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156135f857600080fd5b505af415801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b505194506000341161363357600080fd5b6000861161364057600080fd5b6000851161364d57600080fd5b61365d348763ffffffff61527816565b9350846136788561366c611d05565b9063ffffffff614fe916565b111561368357600080fd5b61368b612496565b84111561369757600080fd5b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d602081101561372757600080fd5b5051600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525191935073c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b1580156137a957600080fd5b505af41580156137bd573d6000803e3d6000fd5b505050506040513d60208110156137d357600080fd5b505160105490915015806137f857506010546137f5838663ffffffff614fe916565b10155b151561380357600080fd5b6000811115613814578092506138b9565b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b15801561388a57600080fd5b505af415801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b505192505b6000831180156138d857506138d4828563ffffffff614fe916565b8310155b15156138e357600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691634cfe3e7f9160448082019260009290919082900301818387803b15801561394f57600080fd5b505af1158015613963573d6000803e3d6000fd5b50506040805187815290513393503092506000805160206153fa8339815191529181900360200190a3509195945050505050565b60075460009060ff16156139aa57600080fd5b3360009081526009602052604090205460ff16156139c757600080fd5b600160a060020a03831660009081526009602052604090205460ff16156139ed57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038681166024830152604482018690529151919092169163beabacc891606480830192600092919082900301818387803b158015613a6157600080fd5b505af1158015613a75573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392506000805160206153fa8339815191529181900360200190a350600192915050565b60025490565b60046020526000908152604090205460ff1681565b6000546101009004600160a060020a03163314801590613afb57503360009081526004602052604090205460ff16155b15613b0557600080fd5b613b0e816152a1565b604051600160a060020a038216907ffba24c034afca607a35e1f221b154b3f8e1f88c7924c8a0a06755b70708c44d890600090a250565b60096020526000908152604090205460ff1681565b600e54604080517f58c6bce8000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916358c6bce891604480820192602092909190829003018186803b158015610f4d57600080fd5b6000805481906101009004600160a060020a03163314801590613c0e57503360009081526004602052604090205460ff16155b15613c1857600080fd5b600160a060020a0383161515613c2d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152600160448301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191636ace6dc8916064808301926000929190829003018186803b158015613cb257600080fd5b505af4158015613cc6573d6000803e3d6000fd5b5050600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291871660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063ddf9d61392506044808301926020929190829003018186803b158015613d4857600080fd5b505af4158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b50519050801515613e2257600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b158015613df357600080fd5b505af4158015613e07573d6000803e3d6000fd5b505050506040513d6020811015613e1d57600080fd5b505190505b604080518281529051600160a060020a038516917fcb3de9106aa8cc3efea54defa4b3ec342e8ae23607fd0255b1dcee4813f9f4bc919081900360200190a250600192915050565b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c391604480820192602092909190829003018186803b158015610f4d57600080fd5b600280548290811061192e57fe5b6000805481906101009004600160a060020a03163314801590613f2d57503360009081526004602052604090205460ff16155b15613f3757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161515613f6057600080fd5b600160a060020a03841660009081526009602052604090205460ff1615613f8657600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b158015613fe657600080fd5b505af4158015613ffa573d6000803e3d6000fd5b505050506040513d602081101561401057600080fd5b50519050806140218461366c611d05565b111561402c57600080fd5b614034612496565b83111561404057600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820187905291519190921691634cfe3e7f91604480830192600092919082900301818387803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b5050604080518681529051600160a060020a03881693503092506000805160206153fa8339815191529181900360200190a35060019392505050565b600080546101009004600160a060020a0316331480159061412f57503360009081526004602052604090205460ff16155b1561413957600080fd5b50601055600190565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251600091829173c0cc10d764f38245ca6b43aa1fe84c85002b8261916396468249916024808301926020929190829003018186803b1580156141bd57600080fd5b505af41580156141d1573d6000803e3d6000fd5b505050506040513d60208110156141e757600080fd5b50519050600160a060020a038116151561420057600080fd5b6000546101009004600160a060020a03163314801590614229575033600160a060020a03821614155b1561423357600080fd5b604051339084156108fc029085906000818181858888f19350505050158015614260573d6000803e3d6000fd5b506040805184815290517f4938436c771c2d50d08d91b156ca4b3ab759fa99c83c50d541e72166d46f85e09181900360200190a150600192915050565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b505050505081565b600f5474010000000000000000000000000000000000000000900460ff1681565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b60075460009060ff16156143ba57600080fd5b3360009081526009602052604090205460ff16156143d757600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152336024820152918516604483015251610ec29185916125c991869173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561446757600080fd5b505af4158015611d79573d6000803e3d6000fd5b600080546101009004600160a060020a031633148015906144ac57503360009081526004602052604090205460ff16155b156144b657600080fd5b600160a060020a03831615156144cb57600080fd5b600e54604080517f4989b0b6000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152604482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634989b0b6916064808301926000929190829003018186803b15801561455057600080fd5b505af4158015614564573d6000803e3d6000fd5b5050505061457183613bdb565b5060019392505050565b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015291831660448301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b4191606480820192602092909190829003018186803b15801561460557600080fd5b505af4158015614619573d6000803e3d6000fd5b505050506040513d602081101561462f57600080fd5b50519392505050565b6b1363156bbee3016d7000000081565b6000547501000000000000000000000000000000000000000000900460ff1681565b600e54604080517f27132be6000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916327132be691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000546101009004600160a060020a0316331480159061471457503360009081526004602052604090205460ff16155b1561471e57600080fd5b600160a060020a0382166000908152600960209081526040808320805460ff1916851515179055600a90915290205460ff1615156147c7576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600a60205260409020805460ff191690911790555b6040805182151581529051600160a060020a038416917f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5919081900360200190a25050565b6000546101009004600160a060020a0316331461482857600080fd5b600160a060020a038116151561483d57600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600e54604080517fd97e38d6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163d97e38d691604480820192602092909190829003018186803b158015610f4d57600080fd5b600080548190819081906101009004600160a060020a0316331480159061496857503360009081526004602052604090205460ff16155b1561497257600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b1580156149d257600080fd5b505af41580156149e6573d6000803e3d6000fd5b505050506040513d60208110156149fc57600080fd5b50519250600160a060020a038a161515614a1557600080fd5b600160a060020a038a1660009081526009602052604090205460ff1615614a3b57600080fd5b86861015614a4857600080fd5b82614a558a61366c611d05565b1115614a6057600080fd5b614a68612496565b891115614a7457600080fd5b879150811515614a82574291505b614a92828863ffffffff614fe916565b600e54604080517fc4b9223f000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d166024830152604482018c9052606482018590526084820183905260a4820189905287151560c48301525191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163c4b9223f9160e480820192600092909190829003018186803b158015614b3857600080fd5b505af4158015614b4c573d6000803e3d6000fd5b505060408051858152602081018590528082018a9052606081018d905288151560808201529051600160a060020a038e1693507f9c30dc484837afde1ded2722ef11ba4a8f599b3cf3205def0b668e9f5e33c79f92509081900360a00190a25060019998505050505050505050565b600e54604080517fe16dd936000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000918291829182918291829182918291829173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e16dd9369160448082019260e092909190829003018186803b158015614c4d57600080fd5b505af4158015614c61573d6000803e3d6000fd5b505050506040513d60e0811015614c7757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809750819850829950839c50849d50859e50869f5050505050505050600e60009054906101000a9004600160a060020a0316600160a060020a031673c0cc10d764f38245ca6b43aa1fe84c85002b826163aa77f26c90918c6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b158015614d7e57600080fd5b505af4158015614d92573d6000803e3d6000fd5b505050506040513d6020811015614da857600080fd5b5051600e54604080517fbca9adef000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d1660248301525191965073c0cc10d764f38245ca6b43aa1fe84c85002b82619163bca9adef91604480820192602092909190829003018186803b158015614e2c57600080fd5b505af4158015614e40573d6000803e3d6000fd5b505050506040513d6020811015614e5657600080fd5b5051989a9799509597949693959193909250565b60075460009060ff1615614e7d57600080fd5b3360009081526009602052604090205460ff1615614e9a57600080fd5b600160a060020a0383161515614eaf57600080fd5b600160a060020a03831660009081526009602052604090205460ff1615614ed557600080fd5b33600160a060020a0384161415614eeb57600080fd5b600e54604080517fa7070373000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201523360248201529185166044830152606482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163a7070373916084808301926000929190829003018186803b158015614f7657600080fd5b505af4158015614f8a573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600082821115614fe357fe5b50900390565b81810182811015610ec557fe5b6000547501000000000000000000000000000000000000000000900460ff16156150a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f436f6e747261637420696e7374616e63652068617320616c726561647920696e60448201527f697469616c697a6564207468652061646d696e73000000000000000000000000606482015290519081900360840190fd5b6000805474ffffffffffffffffffffffffffffffffffffffff001916740aeaf8c2fe778797cd5464e7eb8351d28da2e823001790556150f9731e65f71b024937b988fdba09814d60049e0fc59d6152a1565b6000805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60005460ff16156151ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a6564000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831615156151df57600080fd5b81516151f290600c906020850190615361565b50805161520690600d906020840190615361565b50600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03858116919091179182905561523f9116613acb565b60408051600080825291513092916000805160206153fa833981519152919081900360200190a350506000805460ff1916600117905550565b600082151561528957506000610ec5565b5081810281838281151561529957fe5b0414610ec557fe5b600160a060020a03811615156152b657600080fd5b600160a060020a0381166000908152600460209081526040808320805460ff19166001179055600690915290205460ff16151561535e576002805460018082019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600660205260409020805460ff191690911790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a257805160ff19168380011785556153cf565b828001600101855582156153cf579182015b828111156153cf5782518255916020019190600101906153b4565b506153db9291506153df565b5090565b610db391905b808211156153db57600081556001016153e55600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582070319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a70029
Swarm Source
bzzr://70319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.