Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 88 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Commit Vote | 6829668 | 2272 days ago | IN | 0 ETH | 0.001659 | ||||
Set Respondent D... | 6829574 | 2272 days ago | IN | 0 ETH | 0.00051095 | ||||
Set Respondent D... | 6829527 | 2272 days ago | IN | 0 ETH | 0.00149046 | ||||
Open Case | 6829521 | 2272 days ago | IN | 0 ETH | 0.05703901 | ||||
Commit Vote | 6825496 | 2273 days ago | IN | 0 ETH | 0.00147 | ||||
Set Respondent D... | 6825488 | 2273 days ago | IN | 0 ETH | 0.00046579 | ||||
Commit Vote | 6825475 | 2273 days ago | IN | 0 ETH | 0.001659 | ||||
Commit Vote | 6825467 | 2273 days ago | IN | 0 ETH | 0.00147 | ||||
Set Respondent D... | 6825451 | 2273 days ago | IN | 0 ETH | 0.00128949 | ||||
Open Case | 6825446 | 2273 days ago | IN | 0 ETH | 0.02256664 | ||||
Commit Vote | 6825353 | 2273 days ago | IN | 0 ETH | 0.00101383 | ||||
Set Respondent D... | 6825038 | 2273 days ago | IN | 0 ETH | 0.00035915 | ||||
Set Respondent D... | 6825036 | 2273 days ago | IN | 0 ETH | 0.00035915 | ||||
Set Respondent D... | 6825034 | 2273 days ago | IN | 0 ETH | 0.00099858 | ||||
Open Case | 6825008 | 2273 days ago | IN | 0.0001 ETH | 0.02251384 | ||||
Verdict | 6786736 | 2280 days ago | IN | 0 ETH | 0.00358889 | ||||
Start Revealing ... | 6786229 | 2280 days ago | IN | 0 ETH | 0.00027666 | ||||
Start Voting Cas... | 6780262 | 2281 days ago | IN | 0 ETH | 0.00044306 | ||||
Open Case | 6777202 | 2281 days ago | IN | 0 ETH | 0.01192198 | ||||
Verdict | 6766405 | 2283 days ago | IN | 0 ETH | 0.00516734 | ||||
Start Revealing ... | 6765893 | 2283 days ago | IN | 0 ETH | 0.00027666 | ||||
Start Voting Cas... | 6759758 | 2284 days ago | IN | 0 ETH | 0.00044306 | ||||
Open Case | 6756700 | 2285 days ago | IN | 0 ETH | 0.01000331 | ||||
Verdict | 6713245 | 2292 days ago | IN | 0 ETH | 0.00660179 | ||||
Start Revealing ... | 6712727 | 2292 days ago | IN | 0 ETH | 0.00077464 |
Latest 8 internal transactions
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Board
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-11-16 */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function Ownable() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @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 c; } /** * @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) { uint256 c = a + b; assert(c >= a); return c; } } library Utils { /* Not secured random number generation, but it's enough for the perpose of implementaion particular case*/ function almostRnd(uint min, uint max) internal view returns(uint) { return uint(keccak256(block.timestamp, block.blockhash(block.number))) % (max - min) + min; } } contract EternalStorage { /**** Storage Types *******/ address public owner; mapping(bytes32 => uint256) private uIntStorage; mapping(bytes32 => uint8) private uInt8Storage; mapping(bytes32 => string) private stringStorage; mapping(bytes32 => address) private addressStorage; mapping(bytes32 => bytes) private bytesStorage; mapping(bytes32 => bool) private boolStorage; mapping(bytes32 => int256) private intStorage; mapping(bytes32 => bytes32) private bytes32Storage; /*** Modifiers ************/ /// @dev Only allow access from the latest version of a contract in the Rocket Pool network after deployment modifier onlyLatestContract() { require(addressStorage[keccak256("contract.address", msg.sender)] != 0x0 || msg.sender == owner); _; } /// @dev constructor function EternalStorage() public { owner = msg.sender; addressStorage[keccak256("contract.address", msg.sender)] = msg.sender; } function setOwner() public { require(msg.sender == owner); addressStorage[keccak256("contract.address", owner)] = 0x0; owner = msg.sender; addressStorage[keccak256("contract.address", msg.sender)] = msg.sender; } /**** Get Methods ***********/ /// @param _key The key for the record function getAddress(bytes32 _key) external view returns (address) { return addressStorage[_key]; } /// @param _key The key for the record function getUint(bytes32 _key) external view returns (uint) { return uIntStorage[_key]; } /// @param _key The key for the record function getUint8(bytes32 _key) external view returns (uint8) { return uInt8Storage[_key]; } /// @param _key The key for the record function getString(bytes32 _key) external view returns (string) { return stringStorage[_key]; } /// @param _key The key for the record function getBytes(bytes32 _key) external view returns (bytes) { return bytesStorage[_key]; } /// @param _key The key for the record function getBytes32(bytes32 _key) external view returns (bytes32) { return bytes32Storage[_key]; } /// @param _key The key for the record function getBool(bytes32 _key) external view returns (bool) { return boolStorage[_key]; } /// @param _key The key for the record function getInt(bytes32 _key) external view returns (int) { return intStorage[_key]; } /**** Set Methods ***********/ /// @param _key The key for the record function setAddress(bytes32 _key, address _value) onlyLatestContract external { addressStorage[_key] = _value; } /// @param _key The key for the record function setUint(bytes32 _key, uint _value) onlyLatestContract external { uIntStorage[_key] = _value; } /// @param _key The key for the record function setUint8(bytes32 _key, uint8 _value) onlyLatestContract external { uInt8Storage[_key] = _value; } /// @param _key The key for the record function setString(bytes32 _key, string _value) onlyLatestContract external { stringStorage[_key] = _value; } /// @param _key The key for the record function setBytes(bytes32 _key, bytes _value) onlyLatestContract external { bytesStorage[_key] = _value; } /// @param _key The key for the record function setBytes32(bytes32 _key, bytes32 _value) onlyLatestContract external { bytes32Storage[_key] = _value; } /// @param _key The key for the record function setBool(bytes32 _key, bool _value) onlyLatestContract external { boolStorage[_key] = _value; } /// @param _key The key for the record function setInt(bytes32 _key, int _value) onlyLatestContract external { intStorage[_key] = _value; } /**** Delete Methods ***********/ /// @param _key The key for the record function deleteAddress(bytes32 _key) onlyLatestContract external { delete addressStorage[_key]; } /// @param _key The key for the record function deleteUint(bytes32 _key) onlyLatestContract external { delete uIntStorage[_key]; } /// @param _key The key for the record function deleteUint8(bytes32 _key) onlyLatestContract external { delete uInt8Storage[_key]; } /// @param _key The key for the record function deleteString(bytes32 _key) onlyLatestContract external { delete stringStorage[_key]; } /// @param _key The key for the record function deleteBytes(bytes32 _key) onlyLatestContract external { delete bytesStorage[_key]; } /// @param _key The key for the record function deleteBytes32(bytes32 _key) onlyLatestContract external { delete bytes32Storage[_key]; } /// @param _key The key for the record function deleteBool(bytes32 _key) onlyLatestContract external { delete boolStorage[_key]; } /// @param _key The key for the record function deleteInt(bytes32 _key) onlyLatestContract external { delete intStorage[_key]; } } contract EIP20 { /* This is a slight change to the ERC20 base standard. function totalSupply() constant returns (uint256 supply); is replaced with: uint256 public totalSupply; This automatically creates a getter function for the totalSupply. This is moved to the base contract since public getter functions are not currently recognised as an implementation of the matching abstract function by the compiler. */ /// total amount of tokens uint256 public totalSupply; /// @param _owner The address from which the balance will be retrieved /// @return The balance function balanceOf(address _owner) public view returns (uint256 balance); /// @notice send `_value` token to `_to` from `msg.sender` /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return Whether the transfer was successful or not function transfer(address _to, uint256 _value) public returns (bool success); /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` /// @param _from The address of the sender /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return Whether the transfer was successful or not function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); /// @notice `msg.sender` approves `_spender` to spend `_value` tokens /// @param _spender The address of the account able to transfer the tokens /// @param _value The amount of tokens to be approved for transfer /// @return Whether the approval was successful or not function approve(address _spender, uint256 _value) public returns (bool success); /// @param _owner The address of the account owning tokens /// @param _spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens allowed to spent function allowance(address _owner, address _spender) public view returns (uint256 remaining); // solhint-disable-next-line no-simple-event-func-name event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } contract Token { function balanceOf(address owner) public view returns (uint256 balance); function transfer(address to, uint256 value) public returns (bool success); function transferFrom(address from, address to, uint256 value) public returns (bool success); function approve(address spender, uint256 value) public returns (bool success); function allowance(address owner, address spender) public view returns (uint256 remaining); } contract IBoardConfig is Ownable { uint constant decimals = 10 ** uint(18); uint8 public version; function resetValuesToDefault() external; function setStorageAddress(address storageAddress) external; function getRefereeFee() external view returns (uint); function getRefereeFeeEth() external view returns(uint); function getVoteTokenPrice() external view returns (uint); function setVoteTokenPrice(uint value) external; function getVoteTokenPriceEth() external view returns (uint); function setVoteTokenPriceEth(uint value) external; function getVoteTokensPerRequest() external view returns (uint); function setVoteTokensPerRequest(uint voteTokens) external; function getTimeToStartVotingCase() external view returns (uint); function setTimeToStartVotingCase(uint value) external; function getTimeToRevealVotesCase() external view returns (uint); function setTimeToRevealVotesCase(uint value) external; function getTimeToCloseCase() external view returns (uint); function setTimeToCloseCase(uint value) external; function getRefereeCountPerCase() external view returns(uint); function setRefereeCountPerCase(uint refereeCount) external; function getRefereeNeedCountPerCase() external view returns(uint); function setRefereeNeedCountPerCase(uint refereeCount) external; function getFullConfiguration() external view returns( uint voteTokenPrice, uint voteTokenPriceEth, uint voteTokenPerRequest, uint refereeCountPerCase, uint refereeNeedCountPerCase, uint timeToStartVoting, uint timeToRevealVotes, uint timeToClose ); function getCaseDatesFromNow() public view returns(uint[] dates); } library RefereeCasesLib { function setRefereesToCase(address storageAddress, address[] referees, bytes32 caseId) public { for (uint i = 0; i < referees.length; i++) { setRefereeToCase(storageAddress, referees[i], caseId, i); } setRefereeCountForCase(storageAddress, caseId, referees.length); } function isRefereeVoted(address storageAddress, address referee, bytes32 caseId) public view returns (bool) { return EternalStorage(storageAddress).getBool(keccak256("case.referees.voted", caseId, referee)); } function setRefereeVote(address storageAddress, bytes32 caseId, address referee, bool forApplicant) public { uint index = getRefereeVotesFor(storageAddress, caseId, forApplicant); EternalStorage(storageAddress).setAddress(keccak256("case.referees.vote", caseId, forApplicant, index), referee); setRefereeVotesFor(storageAddress, caseId, forApplicant, index + 1); } function getRefereeVoteForByIndex(address storageAddress, bytes32 caseId, bool forApplicant, uint index) public view returns (address) { return EternalStorage(storageAddress).getAddress(keccak256("case.referees.vote", caseId, forApplicant, index)); } function getRefereeVotesFor(address storageAddress, bytes32 caseId, bool forApplicant) public view returns (uint) { return EternalStorage(storageAddress).getUint(keccak256("case.referees.votes.count", caseId, forApplicant)); } function setRefereeVotesFor(address storageAddress, bytes32 caseId, bool forApplicant, uint votes) public { EternalStorage(storageAddress).setUint(keccak256("case.referees.votes.count", caseId, forApplicant), votes); } function getRefereeCountByCase(address storageAddress, bytes32 caseId) public view returns (uint) { return EternalStorage(storageAddress).getUint(keccak256("case.referees.count", caseId)); } function setRefereeCountForCase(address storageAddress, bytes32 caseId, uint value) public { EternalStorage(storageAddress).setUint(keccak256("case.referees.count", caseId), value); } function getRefereeByCase(address storageAddress, bytes32 caseId, uint index) public view returns (address) { return EternalStorage(storageAddress).getAddress(keccak256("case.referees", caseId, index)); } function isRefereeSetToCase(address storageAddress, address referee, bytes32 caseId) public view returns(bool) { return EternalStorage(storageAddress).getBool(keccak256("case.referees", caseId, referee)); } function setRefereeToCase(address storageAddress, address referee, bytes32 caseId, uint index) public { EternalStorage st = EternalStorage(storageAddress); st.setAddress(keccak256("case.referees", caseId, index), referee); st.setBool(keccak256("case.referees", caseId, referee), true); } function getRefereeVoteHash(address storageAddress, bytes32 caseId, address referee) public view returns (bytes32) { return EternalStorage(storageAddress).getBytes32(keccak256("case.referees.vote.hash", caseId, referee)); } function setRefereeVoteHash(address storageAddress, bytes32 caseId, address referee, bytes32 voteHash) public { uint caseCount = getRefereeVoteHashCount(storageAddress, caseId); EternalStorage(storageAddress).setBool(keccak256("case.referees.voted", caseId, referee), true); EternalStorage(storageAddress).setBytes32(keccak256("case.referees.vote.hash", caseId, referee), voteHash); EternalStorage(storageAddress).setUint(keccak256("case.referees.vote.hash.count", caseId), caseCount + 1); } function getRefereeVoteHashCount(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.referees.vote.hash.count", caseId)); } function getRefereesFor(address storageAddress, bytes32 caseId, bool forApplicant) public view returns(address[]) { uint n = getRefereeVotesFor(storageAddress, caseId, forApplicant); address[] memory referees = new address[](n); for (uint i = 0; i < n; i++) { referees[i] = getRefereeVoteForByIndex(storageAddress, caseId, forApplicant, i); } return referees; } function getRefereesByCase(address storageAddress, bytes32 caseId) public view returns (address[]) { uint n = getRefereeCountByCase(storageAddress, caseId); address[] memory referees = new address[](n); for (uint i = 0; i < n; i++) { referees[i] = getRefereeByCase(storageAddress, caseId, i); } return referees; } } contract Withdrawable is Ownable { function withdrawEth(uint value) external onlyOwner { require(address(this).balance >= value); msg.sender.transfer(value); } function withdrawToken(address token, uint value) external onlyOwner { require(Token(token).balanceOf(address(this)) >= value, "Not enough tokens"); require(Token(token).transfer(msg.sender, value)); } } library CasesLib { enum CaseStatus {OPENED, VOTING, REVEALING, CLOSED, CANCELED} enum CaseCanceledCode { NOT_ENOUGH_VOTES, EQUAL_NUMBER_OF_VOTES } function getCase(address storageAddress, bytes32 caseId) public view returns ( address applicant, address respondent, bytes32 deal, uint amount, uint refereeAward, bytes32 title, uint8 status, uint8 canceledCode, bool won, bytes32 applicantDescriptionHash, bytes32 respondentDescriptionHash, bool isEthRefereeAward) { EternalStorage st = EternalStorage(storageAddress); applicant = st.getAddress(keccak256("case.applicant", caseId)); respondent = st.getAddress(keccak256("case.respondent", caseId)); deal = st.getBytes32(keccak256("case.deal", caseId)); amount = st.getUint(keccak256("case.amount", caseId)); won = st.getBool(keccak256("case.won", caseId)); status = st.getUint8(keccak256("case.status", caseId)); canceledCode = st.getUint8(keccak256("case.canceled.cause.code", caseId)); refereeAward = st.getUint(keccak256("case.referee.award", caseId)); title = st.getBytes32(keccak256("case.title", caseId)); applicantDescriptionHash = st.getBytes32(keccak256("case.applicant.description", caseId)); respondentDescriptionHash = st.getBytes32(keccak256("case.respondent.description", caseId)); isEthRefereeAward = st.getBool(keccak256("case.referee.award.eth", caseId)); } function getCaseDates(address storageAddress, bytes32 caseId) public view returns (uint date, uint votingDate, uint revealingDate, uint closeDate) { EternalStorage st = EternalStorage(storageAddress); date = st.getUint(keccak256("case.date", caseId)); votingDate = st.getUint(keccak256("case.date.voting", caseId)); revealingDate = st.getUint(keccak256("case.date.revealing", caseId)); closeDate = st.getUint(keccak256("case.date.close", caseId)); } function addCase( address storageAddress, address applicant, address respondent, bytes32 deal, uint amount, uint refereeAward, bytes32 title, string applicantDescription, uint[] dates, uint refereeCountNeed, bool isEthRefereeAward ) public returns(bytes32 caseId) { EternalStorage st = EternalStorage(storageAddress); caseId = keccak256(applicant, respondent, deal, dates[0], title, amount); st.setAddress(keccak256("case.applicant", caseId), applicant); st.setAddress(keccak256("case.respondent", caseId), respondent); st.setBytes32(keccak256("case.deal", caseId), deal); st.setUint(keccak256("case.amount", caseId), amount); st.setUint(keccak256("case.date", caseId), dates[0]); st.setUint(keccak256("case.date.voting", caseId), dates[1]); st.setUint(keccak256("case.date.revealing", caseId), dates[2]); st.setUint(keccak256("case.date.close", caseId), dates[3]); st.setUint8(keccak256("case.status", caseId), 0);//OPENED st.setUint(keccak256("case.referee.award", caseId), refereeAward); st.setBytes32(keccak256("case.title", caseId), title); st.setBytes32(keccak256("case.applicant.description", caseId), keccak256(applicantDescription)); st.setBool(keccak256("case.referee.award.eth", caseId), isEthRefereeAward); st.setUint(keccak256("case.referee.count.need", caseId), refereeCountNeed); } function setCaseWon(address storageAddress, bytes32 caseId, bool won) public { EternalStorage st = EternalStorage(storageAddress); st.setBool(keccak256("case.won", caseId), won); } function setCaseStatus(address storageAddress, bytes32 caseId, CaseStatus status) public { uint8 statusCode = uint8(status); require(statusCode >= 0 && statusCode <= uint8(CaseStatus.CANCELED)); EternalStorage(storageAddress).setUint8(keccak256("case.status", caseId), statusCode); } function getCaseStatus(address storageAddress, bytes32 caseId) public view returns(CaseStatus) { return CaseStatus(EternalStorage(storageAddress).getUint8(keccak256("case.status", caseId))); } function setCaseCanceledCode(address storageAddress, bytes32 caseId, CaseCanceledCode cause) public { uint8 causeCode = uint8(cause); require(causeCode >= 0 && causeCode <= uint8(CaseCanceledCode.EQUAL_NUMBER_OF_VOTES)); EternalStorage(storageAddress).setUint8(keccak256("case.canceled.cause.code", caseId), causeCode); } function getCaseDate(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.date", caseId)); } function getRespondentDescription(address storageAddress, bytes32 caseId) public view returns(bytes32) { return EternalStorage(storageAddress).getBytes32(keccak256("case.respondent.description", caseId)); } function setRespondentDescription(address storageAddress, bytes32 caseId, string description) public { EternalStorage(storageAddress).setBytes32(keccak256("case.respondent.description", caseId), keccak256(description)); } function getApplicant(address storageAddress, bytes32 caseId) public view returns(address) { return EternalStorage(storageAddress).getAddress(keccak256("case.applicant", caseId)); } function getRespondent(address storageAddress, bytes32 caseId) public view returns(address) { return EternalStorage(storageAddress).getAddress(keccak256("case.respondent", caseId)); } function getRefereeAward(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.referee.award", caseId)); } function getVotingDate(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.date.voting", caseId)); } function getRevealingDate(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.date.revealing", caseId)); } function getCloseDate(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.date.close", caseId)); } function getRefereeCountNeed(address storageAddress, bytes32 caseId) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("case.referee.count.need", caseId)); } function isEthRefereeAward(address storageAddress, bytes32 caseId) public view returns(bool) { return EternalStorage(storageAddress).getBool(keccak256("case.referee.award.eth", caseId)); } } library VoteTokenLib { function getVotes(address storageAddress, address account) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("vote.token.balance", account)); } function increaseVotes(address storageAddress, address account, uint256 diff) public { setVotes(storageAddress, account, getVotes(storageAddress, account) + diff); } function decreaseVotes(address storageAddress, address account, uint256 diff) public { setVotes(storageAddress, account, getVotes(storageAddress, account) - diff); } function setVotes(address storageAddress, address account, uint256 value) public { EternalStorage(storageAddress).setUint(keccak256("vote.token.balance", account), value); } } contract PaymentHolder is Ownable { modifier onlyAllowed() { require(allowed[msg.sender]); _; } modifier onlyUpdater() { require(msg.sender == updater); _; } mapping(address => bool) public allowed; address public updater; /*-----------------MAINTAIN METHODS------------------*/ function setUpdater(address _updater) external onlyOwner { updater = _updater; } function migrate(address newHolder, address[] tokens, address[] _allowed) external onlyOwner { require(PaymentHolder(newHolder).update.value(address(this).balance)(_allowed)); for (uint256 i = 0; i < tokens.length; i++) { address token = tokens[i]; uint256 balance = Token(token).balanceOf(this); if (balance > 0) { require(Token(token).transfer(newHolder, balance)); } } } function update(address[] _allowed) external payable onlyUpdater returns(bool) { for (uint256 i = 0; i < _allowed.length; i++) { allowed[_allowed[i]] = true; } return true; } /*-----------------OWNER FLOW------------------*/ function allow(address to) external onlyOwner { allowed[to] = true; } function prohibit(address to) external onlyOwner { allowed[to] = false; } /*-----------------ALLOWED FLOW------------------*/ function depositEth() public payable onlyAllowed returns (bool) { //Default function to receive eth return true; } function withdrawEth(address to, uint256 amount) public onlyAllowed returns(bool) { require(address(this).balance >= amount, "Not enough ETH balance"); to.transfer(amount); return true; } function withdrawToken(address to, uint256 amount, address token) public onlyAllowed returns(bool) { require(Token(token).balanceOf(this) >= amount, "Not enough token balance"); require(Token(token).transfer(to, amount)); return true; } } library RefereesLib { struct Referees { address[] addresses; } function addReferee(address storageAddress, address referee) public { uint id = getRefereeCount(storageAddress); setReferee(storageAddress, referee, id, true); setRefereeCount(storageAddress, id + 1); } function getRefereeCount(address storageAddress) public view returns(uint) { return EternalStorage(storageAddress).getUint(keccak256("referee.count")); } function setRefereeCount(address storageAddress, uint value) public { EternalStorage(storageAddress).setUint(keccak256("referee.count"), value); } function setReferee(address storageAddress, address referee, uint id, bool applied) public { EternalStorage st = EternalStorage(storageAddress); st.setBool(keccak256("referee.applied", referee), applied); st.setAddress(keccak256("referee.address", id), referee); } function isRefereeApplied(address storageAddress, address referee) public view returns(bool) { return EternalStorage(storageAddress).getBool(keccak256("referee.applied", referee)); } function setRefereeApplied(address storageAddress, address referee, bool applied) public { EternalStorage(storageAddress).setBool(keccak256("referee.applied", referee), applied); } function getRefereeAddress(address storageAddress, uint id) public view returns(address) { return EternalStorage(storageAddress).getAddress(keccak256("referee.address", id)); } function getRandomRefereesToCase(address storageAddress, address applicant, address respondent, uint256 targetCount) public view returns(address[] foundReferees) { uint refereesCount = getRefereeCount(storageAddress); require(refereesCount >= targetCount); foundReferees = new address[](targetCount); uint id = Utils.almostRnd(0, refereesCount); uint found = 0; for (uint i = 0; i < refereesCount; i++) { address referee = getRefereeAddress(storageAddress, id); id = id + 1; id = id % refereesCount; uint voteBalance = VoteTokenLib.getVotes(storageAddress, referee); if (referee != applicant && referee != respondent && voteBalance > 0) { foundReferees[found] = referee; found++; } if (found == targetCount) { break; } } require(found == targetCount); } } contract BkxToken is EIP20 { function increaseApproval (address _spender, uint _addedValue) public returns (bool success); function decreaseApproval (address _spender, uint _subtractedValue)public returns (bool success); } contract IBoard is Ownable { event CaseOpened(bytes32 caseId, address applicant, address respondent, bytes32 deal, uint amount, uint refereeAward, bytes32 title, string applicantDescription, uint[] dates, uint refereeCountNeed, bool isEthRefereeAward); event CaseCommentedByRespondent(bytes32 caseId, address respondent, string comment); event CaseVoting(bytes32 caseId); event CaseVoteCommitted(bytes32 caseId, address referee, bytes32 voteHash); event CaseRevealingVotes(bytes32 caseId); event CaseVoteRevealed(bytes32 caseId, address referee, uint8 voteOption, bytes32 salt); event CaseClosed(bytes32 caseId, bool won); event CaseCanceled(bytes32 caseId, uint8 causeCode); event RefereesAssignedToCase(bytes32 caseId, address[] referees); event RefereeVoteBalanceChanged(address referee, uint balance); event RefereeAwarded(address referee, bytes32 caseId, uint award); address public lib; uint public version; IBoardConfig public config; BkxToken public bkxToken; address public admin; address public paymentHolder; modifier onlyOwnerOrAdmin() { require(msg.sender == admin || msg.sender == owner); _; } function withdrawEth(uint value) external; function withdrawBkx(uint value) external; function setStorageAddress(address storageAddress) external; function setConfigAddress(address configAddress) external; function setBkxToken(address tokenAddress) external; function setPaymentHolder(address paymentHolder) external; function setAdmin(address admin) external; function applyForReferee() external payable; function addVoteTokens(address referee) external; function openCase(address respondent, bytes32 deal, uint amount, uint refereeAward, bytes32 title, string description) external payable; function setRespondentDescription(bytes32 caseId, string description) external; function startVotingCase(bytes32 caseId) external; function createVoteHash(uint8 voteOption, bytes32 salt) public view returns(bytes32); function commitVote(bytes32 caseId, bytes32 voteHash) external; function verifyVote(bytes32 caseId, address referee, uint8 voteOption, bytes32 salt) public view returns(bool); function startRevealingVotes(bytes32 caseId) external; function revealVote(bytes32 caseId, address referee, uint8 voteOption, bytes32 salt) external; function revealVotes(bytes32 caseId, address[] referees, uint8[] voteOptions, bytes32[] salts) external; function verdict(bytes32 caseId) external; } contract Board is IBoard { using SafeMath for uint; using VoteTokenLib for address; using CasesLib for address; using RefereesLib for address; using RefereeCasesLib for address; modifier onlyRespondent(bytes32 caseId) { require(msg.sender == lib.getRespondent(caseId)); _; } modifier hasStatus(bytes32 caseId, CasesLib.CaseStatus state) { require(state == lib.getCaseStatus(caseId)); _; } modifier before(uint date) { require(now <= date); _; } modifier laterOn(uint date) { require(now >= date); _; } function Board(address storageAddress, address configAddress, address _paymentHolder) public { version = 2; config = IBoardConfig(configAddress); lib = storageAddress; //check real BKX address https://etherscan.io/token/0x45245bc59219eeaAF6cD3f382e078A461FF9De7B bkxToken = BkxToken(0x45245bc59219eeaAF6cD3f382e078A461FF9De7B); admin = 0xE0b6C095D722961C2C11E55b97fCd0C8bd7a1cD2; paymentHolder = _paymentHolder; } function withdrawEth(uint value) external onlyOwner { require(address(this).balance >= value); msg.sender.transfer(value); } function withdrawBkx(uint value) external onlyOwner { require(bkxToken.balanceOf(address(this)) >= value); require(bkxToken.transfer(msg.sender, value)); } /* configuration */ function setStorageAddress(address storageAddress) external onlyOwner { lib = storageAddress; } function setConfigAddress(address configAddress) external onlyOwner { config = IBoardConfig(configAddress); } /* dependency tokens */ function setBkxToken(address tokenAddress) external onlyOwner { bkxToken = BkxToken(tokenAddress); } function setPaymentHolder(address _paymentHolder) external onlyOwner { paymentHolder = _paymentHolder; } function setAdmin(address newAdmin) external onlyOwner { admin = newAdmin; } function applyForReferee() external payable { uint refereeFee = msg.value == 0 ? config.getRefereeFee() : config.getRefereeFeeEth(); withdrawPayment(refereeFee); addVotes(msg.sender); } function addVoteTokens(address referee) external onlyOwnerOrAdmin { addVotes(referee); } function addVotes(address referee) private { uint refereeTokens = config.getVoteTokensPerRequest(); if (!lib.isRefereeApplied(referee)) { lib.addReferee(referee); } uint balance = refereeTokens.add(lib.getVotes(referee)); lib.setVotes(referee, balance); emit RefereeVoteBalanceChanged(referee, balance); } function openCase(address respondent, bytes32 deal, uint amount, uint refereeAward, bytes32 title, string description) external payable { require(msg.sender != respondent); withdrawPayment(refereeAward); uint[] memory dates = config.getCaseDatesFromNow(); uint refereeCountNeed = config.getRefereeNeedCountPerCase(); bytes32 caseId = lib.addCase(msg.sender, respondent, deal, amount, refereeAward, title, description, dates, refereeCountNeed, msg.value != 0); emit CaseOpened(caseId, msg.sender, respondent, deal, amount, refereeAward, title, description, dates, refereeCountNeed, msg.value != 0); assignRefereesToCase(caseId, msg.sender, respondent); } function withdrawPayment(uint256 amount) private { if(msg.value != 0) { require(msg.value == amount, "ETH amount must be equal amount"); require(PaymentHolder(paymentHolder).depositEth.value(msg.value)()); } else { require(bkxToken.allowance(msg.sender, address(this)) >= amount); require(bkxToken.balanceOf(msg.sender) >= amount); require(bkxToken.transferFrom(msg.sender, paymentHolder, amount)); } } function assignRefereesToCase(bytes32 caseId, address applicant, address respondent) private { uint targetCount = config.getRefereeCountPerCase(); address[] memory foundReferees = lib.getRandomRefereesToCase(applicant, respondent, targetCount); for (uint i = 0; i < foundReferees.length; i++) { address referee = foundReferees[i]; uint voteBalance = lib.getVotes(referee); voteBalance -= 1; lib.setVotes(referee, voteBalance); emit RefereeVoteBalanceChanged(referee, voteBalance); } lib.setRefereesToCase(foundReferees, caseId); emit RefereesAssignedToCase(caseId, foundReferees); } function setRespondentDescription(bytes32 caseId, string description) external onlyRespondent(caseId) hasStatus(caseId, CasesLib.CaseStatus.OPENED) before(lib.getVotingDate(caseId)) { require(lib.getRespondentDescription(caseId) == 0); lib.setRespondentDescription(caseId, description); lib.setCaseStatus(caseId, CasesLib.CaseStatus.VOTING); emit CaseCommentedByRespondent(caseId, msg.sender, description); emit CaseVoting(caseId); } function startVotingCase(bytes32 caseId) external hasStatus(caseId, CasesLib.CaseStatus.OPENED) laterOn(lib.getVotingDate(caseId)) { lib.setCaseStatus(caseId, CasesLib.CaseStatus.VOTING); emit CaseVoting(caseId); } function commitVote(bytes32 caseId, bytes32 voteHash) external hasStatus(caseId, CasesLib.CaseStatus.VOTING) before(lib.getRevealingDate(caseId)) { require(lib.isRefereeSetToCase(msg.sender, caseId)); //referee must be set to case require(!lib.isRefereeVoted(msg.sender, caseId)); //referee can not vote twice lib.setRefereeVoteHash(caseId, msg.sender, voteHash); emit CaseVoteCommitted(caseId, msg.sender, voteHash); if (lib.getRefereeVoteHashCount(caseId) == lib.getRefereeCountByCase(caseId)) { lib.setCaseStatus(caseId, CasesLib.CaseStatus.REVEALING); emit CaseRevealingVotes(caseId); } } function startRevealingVotes(bytes32 caseId) external hasStatus(caseId, CasesLib.CaseStatus.VOTING) laterOn(lib.getRevealingDate(caseId)) { lib.setCaseStatus(caseId, CasesLib.CaseStatus.REVEALING); emit CaseRevealingVotes(caseId); } function revealVote(bytes32 caseId, address referee, uint8 voteOption, bytes32 salt) external hasStatus(caseId, CasesLib.CaseStatus.REVEALING) before(lib.getCloseDate(caseId)) { doRevealVote(caseId, referee, voteOption, salt); checkShouldMakeVerdict(caseId); } function revealVotes(bytes32 caseId, address[] referees, uint8[] voteOptions, bytes32[] salts) external hasStatus(caseId, CasesLib.CaseStatus.REVEALING) before(lib.getCloseDate(caseId)) { require((referees.length == voteOptions.length) && (referees.length == salts.length)); for (uint i = 0; i < referees.length; i++) { doRevealVote(caseId, referees[i], voteOptions[i], salts[i]); } checkShouldMakeVerdict(caseId); } function checkShouldMakeVerdict(bytes32 caseId) private { if (lib.getRefereeVotesFor(caseId, true) + lib.getRefereeVotesFor(caseId, false) == lib.getRefereeVoteHashCount(caseId)) { makeVerdict(caseId); } } function doRevealVote(bytes32 caseId, address referee, uint8 voteOption, bytes32 salt) private { require(verifyVote(caseId, referee, voteOption, salt)); lib.setRefereeVote(caseId, referee, voteOption == 0); emit CaseVoteRevealed(caseId, referee, voteOption, salt); } function createVoteHash(uint8 voteOption, bytes32 salt) public view returns(bytes32) { return keccak256(voteOption, salt); } function verifyVote(bytes32 caseId, address referee, uint8 voteOption, bytes32 salt) public view returns(bool){ return lib.getRefereeVoteHash(caseId, referee) == keccak256(voteOption, salt); } function verdict(bytes32 caseId) external hasStatus(caseId, CasesLib.CaseStatus.REVEALING) laterOn(lib.getCloseDate(caseId)) { makeVerdict(caseId); } function makeVerdict(bytes32 caseId) private { uint forApplicant = lib.getRefereeVotesFor(caseId, true); uint forRespondent = lib.getRefereeVotesFor(caseId, false); uint refereeAward = lib.getRefereeAward(caseId); bool isNotEnoughVotes = (forApplicant + forRespondent) < lib.getRefereeCountNeed(caseId); bool isEthRefereeAward = lib.isEthRefereeAward(caseId); if (isNotEnoughVotes || (forApplicant == forRespondent)) { withdrawTo(isEthRefereeAward, lib.getApplicant(caseId), refereeAward); lib.setCaseStatus(caseId, CasesLib.CaseStatus.CANCELED); CasesLib.CaseCanceledCode causeCode = isNotEnoughVotes ? CasesLib.CaseCanceledCode.NOT_ENOUGH_VOTES : CasesLib.CaseCanceledCode.EQUAL_NUMBER_OF_VOTES; lib.setCaseCanceledCode(caseId, causeCode); emit CaseCanceled(caseId, uint8(causeCode)); withdrawAllRefereeVotes(caseId); return; } bool won = false; uint awardPerReferee; if (forApplicant > forRespondent) { won = true; awardPerReferee = refereeAward / forApplicant; } else { awardPerReferee = refereeAward / forRespondent; } lib.setCaseStatus(caseId, CasesLib.CaseStatus.CLOSED); lib.setCaseWon(caseId, won); emit CaseClosed(caseId, won); address[] memory wonReferees = lib.getRefereesFor(caseId, won); for (uint i = 0; i < wonReferees.length; i++) { withdrawTo(isEthRefereeAward, wonReferees[i], awardPerReferee); emit RefereeAwarded(wonReferees[i], caseId, awardPerReferee); } withdrawRefereeVotes(caseId); } function withdrawTo(bool isEth, address to, uint amount) private { if (isEth) { require(PaymentHolder(paymentHolder).withdrawEth(to, amount)); } else { require(PaymentHolder(paymentHolder).withdrawToken(to, amount, address(bkxToken))); } } function withdrawAllRefereeVotes(bytes32 caseId) private { address[] memory referees = lib.getRefereesByCase(caseId); for (uint i = 0; i < referees.length; i++) { withdrawRefereeVote(referees[i]); } } function withdrawRefereeVotes(bytes32 caseId) private { address[] memory referees = lib.getRefereesByCase(caseId); for (uint i = 0; i < referees.length; i++) { if (!lib.isRefereeVoted(referees[i], caseId)) { withdrawRefereeVote(referees[i]); } } } function withdrawRefereeVote(address referee) private { uint voteBalance = lib.getVotes(referee); voteBalance += 1; lib.setVotes(referee, voteBalance); emit RefereeVoteBalanceChanged(referee, voteBalance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"withdrawBkx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"},{"name":"voteHash","type":"bytes32"}],"name":"commitVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"applyForReferee","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"}],"name":"startRevealingVotes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"}],"name":"setStorageAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"setBkxToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paymentHolder","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"}],"name":"verdict","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_paymentHolder","type":"address"}],"name":"setPaymentHolder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"voteOption","type":"uint8"},{"name":"salt","type":"bytes32"}],"name":"createVoteHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"configAddress","type":"address"}],"name":"setConfigAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"},{"name":"referees","type":"address[]"},{"name":"voteOptions","type":"uint8[]"},{"name":"salts","type":"bytes32[]"}],"name":"revealVotes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lib","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"caseId","type":"bytes32"},{"name":"referee","type":"address"},{"name":"voteOption","type":"uint8"},{"name":"salt","type":"bytes32"}],"name":"verifyVote","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"}],"name":"startVotingCase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bkxToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"respondent","type":"address"},{"name":"deal","type":"bytes32"},{"name":"amount","type":"uint256"},{"name":"refereeAward","type":"uint256"},{"name":"title","type":"bytes32"},{"name":"description","type":"string"}],"name":"openCase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"},{"name":"description","type":"string"}],"name":"setRespondentDescription","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"withdrawEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"referee","type":"address"}],"name":"addVoteTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"caseId","type":"bytes32"},{"name":"referee","type":"address"},{"name":"voteOption","type":"uint8"},{"name":"salt","type":"bytes32"}],"name":"revealVote","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":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"storageAddress","type":"address"},{"name":"configAddress","type":"address"},{"name":"_paymentHolder","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"applicant","type":"address"},{"indexed":false,"name":"respondent","type":"address"},{"indexed":false,"name":"deal","type":"bytes32"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"refereeAward","type":"uint256"},{"indexed":false,"name":"title","type":"bytes32"},{"indexed":false,"name":"applicantDescription","type":"string"},{"indexed":false,"name":"dates","type":"uint256[]"},{"indexed":false,"name":"refereeCountNeed","type":"uint256"},{"indexed":false,"name":"isEthRefereeAward","type":"bool"}],"name":"CaseOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"respondent","type":"address"},{"indexed":false,"name":"comment","type":"string"}],"name":"CaseCommentedByRespondent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"}],"name":"CaseVoting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"referee","type":"address"},{"indexed":false,"name":"voteHash","type":"bytes32"}],"name":"CaseVoteCommitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"}],"name":"CaseRevealingVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"referee","type":"address"},{"indexed":false,"name":"voteOption","type":"uint8"},{"indexed":false,"name":"salt","type":"bytes32"}],"name":"CaseVoteRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"won","type":"bool"}],"name":"CaseClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"causeCode","type":"uint8"}],"name":"CaseCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"referees","type":"address[]"}],"name":"RefereesAssignedToCase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"referee","type":"address"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"RefereeVoteBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"referee","type":"address"},{"indexed":false,"name":"caseId","type":"bytes32"},{"indexed":false,"name":"award","type":"uint256"}],"name":"RefereeAwarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405160608061426183398101604090815281516020830151919092015160008054600160a060020a031990811633179091556002805560038054600160a060020a0394851690831617905560018054948416948216949094179093556004805484167345245bc59219eeaaf6cd3f382e078a461ff9de7b17905560058054841673e0b6c095d722961c2c11e55b97fcd0c8bd7a1cd2179055600680549290911691909216179055614199806100c86000396000f3006080604052600436106101455763ffffffff60e060020a60003504166314e291e6811461014a5780633bbd2235146101645780634a0b890f1461017f57806354fd4d50146101875780635983adbd146101ae57806359b910d6146101c6578063653766d5146101e75780636c8d9a8414610208578063704b6c021461023957806379502c551461025a57806379cc6bca1461026f5780637db5c88e1461028757806382d7721a146102a857806383a12de9146102c65780638c2794cb146102e75780638da5cb5b1461032357806392801230146103385780639349a4081461034d578063a075048f1461038e578063a818d0c1146103a6578063ab6d4201146103bb578063b2fb1c52146103eb578063c311d0491461040f578063df2f945914610427578063e703ecb114610448578063f2fde38b14610475578063f851a44014610496575b600080fd5b34801561015657600080fd5b506101626004356104ab565b005b34801561017057600080fd5b5061016260043560243561060a565b610162610be8565b34801561019357600080fd5b5061019c610d08565b60408051918252519081900360200190f35b3480156101ba57600080fd5b50610162600435610d0e565b3480156101d257600080fd5b50610162600160a060020a0360043516610f3d565b3480156101f357600080fd5b50610162600160a060020a0360043516610f83565b34801561021457600080fd5b5061021d610fc9565b60408051600160a060020a039092168252519081900360200190f35b34801561024557600080fd5b50610162600160a060020a0360043516610fd8565b34801561026657600080fd5b5061021d61101e565b34801561027b57600080fd5b5061016260043561102d565b34801561029357600080fd5b50610162600160a060020a03600435166111ab565b3480156102b457600080fd5b5061019c60ff600435166024356111f1565b3480156102d257600080fd5b50610162600160a060020a0360043516611235565b3480156102f357600080fd5b5061016260048035906024803580820192908101359160443580820192908101359160643590810191013561127b565b34801561032f57600080fd5b5061021d61148b565b34801561034457600080fd5b5061021d61149a565b34801561035957600080fd5b5061037a600435600160a060020a036024351660ff604435166064356114a9565b604080519115158252519081900360200190f35b34801561039a57600080fd5b506101626004356115a3565b3480156103b257600080fd5b5061021d6117d5565b61016260048035600160a060020a031690602480359160443591606435916084359160a4359081019101356117e4565b3480156103f757600080fd5b50610162600480359060248035908101910135611c2a565b34801561041b57600080fd5b506101626004356120f0565b34801561043357600080fd5b50610162600160a060020a0360043516612146565b34801561045457600080fd5b50610162600435600160a060020a036024351660ff6044351660643561217d565b34801561048157600080fd5b50610162600160a060020a036004351661230a565b3480156104a257600080fd5b5061021d61239e565b600054600160a060020a031633146104c257600080fd5b60048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523093810193909352518392600160a060020a03909216916370a082319160248083019260209291908290030181600087803b15801561052b57600080fd5b505af115801561053f573d6000803e3d6000fd5b505050506040513d602081101561055557600080fd5b5051101561056257600080fd5b60048054604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233938101939093526024830184905251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b1580156105d057600080fd5b505af11580156105e4573d6000803e3d6000fd5b505050506040513d60208110156105fa57600080fd5b5051151561060757600080fd5b50565b600180546040805160e360020a630922c6c1028152600160a060020a039092166004830152602482018590525184929173ebbb7e95a4d61850fad81b2bff318ed8fd76228791634916360891604480820192602092909190829003018186803b15801561067657600080fd5b505af415801561068a573d6000803e3d6000fd5b505050506040513d60208110156106a057600080fd5b505160048111156106ad57fe5b8160048111156106b957fe5b146106c357600080fd5b600154604080517f95d94285000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018690525173ebbb7e95a4d61850fad81b2bff318ed8fd762287916395d94285916044808301926020929190829003018186803b15801561074057600080fd5b505af4158015610754573d6000803e3d6000fd5b505050506040513d602081101561076a57600080fd5b50514281101561077957600080fd5b600154604080517f6a15a671000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152336024830152604482018790525173728427d1e48daa939aade5a692d54a14e452efaf91636a15a671916064808301926020929190829003018186803b1580156107fc57600080fd5b505af4158015610810573d6000803e3d6000fd5b505050506040513d602081101561082657600080fd5b5051151561083357600080fd5b600154604080517f61548c06000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152336024830152604482018790525173728427d1e48daa939aade5a692d54a14e452efaf916361548c06916064808301926020929190829003018186803b1580156108b657600080fd5b505af41580156108ca573d6000803e3d6000fd5b505050506040513d60208110156108e057600080fd5b5051156108ec57600080fd5b600154604080517fbb333e94000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201879052336044830152606482018690525173728427d1e48daa939aade5a692d54a14e452efaf9163bb333e94916084808301926000929190829003018186803b15801561097657600080fd5b505af415801561098a573d6000803e3d6000fd5b50506040805188815233602082015280820188905290517f25a48c6816dd5a19678a7d2a3c04c071cff7f4fa08dbc4e2ced1f8b7828143c09350908190036060019150a1600154604080517f10c3b71a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018790525173728427d1e48daa939aade5a692d54a14e452efaf916310c3b71a916044808301926020929190829003018186803b158015610a4b57600080fd5b505af4158015610a5f573d6000803e3d6000fd5b505050506040513d6020811015610a7557600080fd5b5051600154604080517f5ef0b8b1000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018890525173728427d1e48daa939aade5a692d54a14e452efaf91635ef0b8b1916044808301926020929190829003018186803b158015610af457600080fd5b505af4158015610b08573d6000803e3d6000fd5b505050506040513d6020811015610b1e57600080fd5b50511415610be1576001546040805160e060020a63d03912b9028152600160a060020a03909216600483015260248201879052600260448301525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b158015610b9457600080fd5b505af4158015610ba8573d6000803e3d6000fd5b50506040805188815290517fd13f92958cb3f9d795be810e016990e9af7a3fe912a8fdf1a0703b603a2fe5f89350908190036020019150a15b5050505050565b60003415610c7457600360009054906101000a9004600160a060020a0316600160a060020a0316636f2ee5de6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610c4357600080fd5b505af1158015610c57573d6000803e3d6000fd5b505050506040513d6020811015610c6d57600080fd5b5051610cf4565b600360009054906101000a9004600160a060020a0316600160a060020a031663dfe5b0446040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b50515b9050610cff816123ad565b6106073361266f565b60025481565b600180546040805160e360020a630922c6c1028152600160a060020a039092166004830152602482018490525183929173ebbb7e95a4d61850fad81b2bff318ed8fd76228791634916360891604480820192602092909190829003018186803b158015610d7a57600080fd5b505af4158015610d8e573d6000803e3d6000fd5b505050506040513d6020811015610da457600080fd5b50516004811115610db157fe5b816004811115610dbd57fe5b14610dc757600080fd5b600154604080517f95d94285000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525173ebbb7e95a4d61850fad81b2bff318ed8fd762287916395d94285916044808301926020929190829003018186803b158015610e4457600080fd5b505af4158015610e58573d6000803e3d6000fd5b505050506040513d6020811015610e6e57600080fd5b505142811115610e7d57600080fd5b6001546040805160e060020a63d03912b9028152600160a060020a03909216600483015260248201869052600260448301525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b158015610eeb57600080fd5b505af4158015610eff573d6000803e3d6000fd5b50506040805187815290517fd13f92958cb3f9d795be810e016990e9af7a3fe912a8fdf1a0703b603a2fe5f89350908190036020019150a150505050565b600054600160a060020a03163314610f5457600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610f9a57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600654600160a060020a031681565b600054600160a060020a03163314610fef57600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600354600160a060020a031681565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820183905251829160029173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b15801561109957600080fd5b505af41580156110ad573d6000803e3d6000fd5b505050506040513d60208110156110c357600080fd5b505160048111156110d057fe5b8160048111156110dc57fe5b146110e657600080fd5b600154604080517f5fda6620000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525173ebbb7e95a4d61850fad81b2bff318ed8fd76228791635fda6620916044808301926020929190829003018186803b15801561116357600080fd5b505af4158015611177573d6000803e3d6000fd5b505050506040513d602081101561118d57600080fd5b50514281111561119c57600080fd5b6111a5846129e2565b50505050565b600054600160a060020a031633146111c257600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080517f010000000000000000000000000000000000000000000000000000000000000060ff851602815260018101839052905190819003602101902092915050565b600054600160a060020a0316331461124c57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820189905251600091899160029173ebbb7e95a4d61850fad81b2bff318ed8fd76228791634916360891604480820192602092909190829003018186803b1580156112eb57600080fd5b505af41580156112ff573d6000803e3d6000fd5b505050506040513d602081101561131557600080fd5b5051600481111561132257fe5b81600481111561132e57fe5b1461133857600080fd5b600154604080517f5fda6620000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173ebbb7e95a4d61850fad81b2bff318ed8fd76228791635fda6620916044808301926020929190829003018186803b1580156113b557600080fd5b505af41580156113c9573d6000803e3d6000fd5b505050506040513d60208110156113df57600080fd5b5051428110156113ee57600080fd5b88871480156113fc57508885145b151561140757600080fd5b600093505b888410156114755761146a8b8b8b8781811061142457fe5b90506020020135600160a060020a03168a8a88818110151561144257fe5b9050602002013560ff16898989818110151561145a57fe5b9050602002013560001916613339565b60019093019261140c565b61147e8b61344f565b5050505050505050505050565b600054600160a060020a031681565b600154600160a060020a031681565b604080517f010000000000000000000000000000000000000000000000000000000000000060ff85160281526001808201849052825191829003602101822090547f0cf84a50000000000000000000000000000000000000000000000000000000008352600160a060020a039081166004840152602483018890528616604483015291516000929173728427d1e48daa939aade5a692d54a14e452efaf91630cf84a5091606480820192602092909190829003018186803b15801561156d57600080fd5b505af4158015611581573d6000803e3d6000fd5b505050506040513d602081101561159757600080fd5b50511495945050505050565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820183905251829160009173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b15801561160f57600080fd5b505af4158015611623573d6000803e3d6000fd5b505050506040513d602081101561163957600080fd5b5051600481111561164657fe5b81600481111561165257fe5b1461165c57600080fd5b600154604080517fd3f0d1cb000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d3f0d1cb916044808301926020929190829003018186803b1580156116d957600080fd5b505af41580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b50514281111561171257600080fd5b600180546040805160e060020a63d03912b9028152600160a060020a039092166004830152602482018790526044820192909252905173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b15801561178357600080fd5b505af4158015611797573d6000803e3d6000fd5b50506040805187815290517f35bcd7e8326284609d6098ff8b26bc5bd69336b3efd3c12e45425fe4681816cf9350908190036020019150a150505050565b600454600160a060020a031681565b606060008033600160a060020a038b1614156117ff57600080fd5b611808876123ad565b600360009054906101000a9004600160a060020a0316600160a060020a031663e07cfabe6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561185b57600080fd5b505af115801561186f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561189857600080fd5b8101908080516401000000008111156118b057600080fd5b820160208101848111156118c357600080fd5b81518560208202830111640100000000821117156118e057600080fd5b5050600354604080517faa29a6650000000000000000000000000000000000000000000000000000000081529051929850600160a060020a03909116945063aa29a665935060048082019350602092918290030181600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b505050506040513d602081101561197057600080fd5b81019080805190602001909291905050509150600160009054906101000a9004600160a060020a0316600160a060020a031673ebbb7e95a4d61850fad81b2bff318ed8fd76228763d15cd3be9091338d8d8d8d8d8d8d8d8d34600014156040518d63ffffffff1660e060020a028152600401808d600160a060020a0316600160a060020a031681526020018c600160a060020a0316600160a060020a031681526020018b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600019166000191681526020018060200180602001858152602001841515151581526020018381038352888882818152602001925080828437909101848103835287518152875160209182019250818901910280838360005b83811015611ab7578181015183820152602001611a9f565b505050509050019e50505050505050505050505050505060206040518083038186803b158015611ae657600080fd5b505af4158015611afa573d6000803e3d6000fd5b505050506040513d6020811015611b1057600080fd5b5051604080518281523360208201819052600160a060020a038e1692820192909252606081018c9052608081018b905260a081018a905260c081018990526101208101859052341515610140820181905261016060e083018181529083018990529394507fd442e1e65d09ce5f7df2526ac5185ea8a60aca4b8ff2d6ec043983f0e551f604938593928f928f928f928f928f928f928f928f928f929061010082016101808301888880828437909101848103835287518152875160209182019250818901910280838360005b83811015611bf4578181015183820152602001611bdc565b505050509050019e50505050505050505050505050505060405180910390a1611c1e81338c61363f565b50505050505050505050565b600154604080517fd94c78ad000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301526024820185905251849173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d94c78ad91604480820192602092909190829003018186803b158015611caa57600080fd5b505af4158015611cbe573d6000803e3d6000fd5b505050506040513d6020811015611cd457600080fd5b5051600160a060020a03163314611cea57600080fd5b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820186905251859160009173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b158015611d5657600080fd5b505af4158015611d6a573d6000803e3d6000fd5b505050506040513d6020811015611d8057600080fd5b50516004811115611d8d57fe5b816004811115611d9957fe5b14611da357600080fd5b600154604080517fd3f0d1cb000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018890525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d3f0d1cb916044808301926020929190829003018186803b158015611e2057600080fd5b505af4158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b505142811015611e5957600080fd5b600154604080517fa6fd718b000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018990525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163a6fd718b916044808301926020929190829003018186803b158015611ed657600080fd5b505af4158015611eea573d6000803e3d6000fd5b505050506040513d6020811015611f0057600080fd5b505115611f0c57600080fd5b6001546040517f188b40d7000000000000000000000000000000000000000000000000000000008152600160a060020a0390911660048201818152602483018a90526060604484019081526064840189905273ebbb7e95a4d61850fad81b2bff318ed8fd7622879363188b40d793928c928c928c92919060840184848082843782019150509550505050505060006040518083038186803b158015611fb057600080fd5b505af4158015611fc4573d6000803e3d6000fd5b5050600180546040805160e060020a63d03912b9028152600160a060020a039092166004830152602482018c90526044820192909252905173ebbb7e95a4d61850fad81b2bff318ed8fd762287935063d03912b992506064808301926000929190829003018186803b15801561203957600080fd5b505af415801561204d573d6000803e3d6000fd5b5050604080518a8152336020820181905260609282018381529282018a90527fbcb086748b4ee9a32661e6fe5e16e69a0bcd7bc07ba81145a707c7313b03c31894508b9350918a918a9160808201848480828437604051920182900397509095505050505050a16040805188815290517f35bcd7e8326284609d6098ff8b26bc5bd69336b3efd3c12e45425fe4681816cf9181900360200190a150505050505050565b600054600160a060020a0316331461210757600080fd5b303181111561211557600080fd5b604051339082156108fc029083906000818181858888f19350505050158015612142573d6000803e3d6000fd5b5050565b600554600160a060020a03163314806121695750600054600160a060020a031633145b151561217457600080fd5b6106078161266f565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820186905251859160029173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b1580156121e957600080fd5b505af41580156121fd573d6000803e3d6000fd5b505050506040513d602081101561221357600080fd5b5051600481111561222057fe5b81600481111561222c57fe5b1461223657600080fd5b600154604080517f5fda6620000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018890525173ebbb7e95a4d61850fad81b2bff318ed8fd76228791635fda6620916044808301926020929190829003018186803b1580156122b357600080fd5b505af41580156122c7573d6000803e3d6000fd5b505050506040513d60208110156122dd57600080fd5b5051428110156122ec57600080fd5b6122f887878787613339565b6123018761344f565b50505050505050565b600054600160a060020a0316331461232157600080fd5b600160a060020a038116151561233657600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554600160a060020a031681565b34156124b15734811461242157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45544820616d6f756e74206d75737420626520657175616c20616d6f756e7400604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a031663439370b1346040518263ffffffff1660e060020a0281526004016020604051808303818588803b15801561247457600080fd5b505af1158015612488573d6000803e3d6000fd5b50505050506040513d602081101561249f57600080fd5b505115156124ac57600080fd5b610607565b60048054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523393810193909352306024840152518392600160a060020a039092169163dd62ed3e9160448083019260209291908290030181600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d602081101561254a57600080fd5b5051101561255757600080fd5b60048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523393810193909352518392600160a060020a03909216916370a082319160248083019260209291908290030181600087803b1580156125c057600080fd5b505af11580156125d4573d6000803e3d6000fd5b505050506040513d60208110156125ea57600080fd5b505110156125f757600080fd5b60048054600654604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523394810194909452600160a060020a03918216602485015260448401859052519116916323b872dd9160648083019260209291908290030181600087803b1580156105d057600080fd5b600080600360009054906101000a9004600160a060020a0316600160a060020a031663b1e730006040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156126c557600080fd5b505af11580156126d9573d6000803e3d6000fd5b505050506040513d60208110156126ef57600080fd5b5051600154604080517f2843c77e000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529186166024830152519193507356781cbb608324eeb418e323e28aaa4c6043a02291632843c77e91604480820192602092909190829003018186803b15801561277357600080fd5b505af4158015612787573d6000803e3d6000fd5b505050506040513d602081101561279d57600080fd5b5051151561283c57600154604080517fce90a2cb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152517356781cbb608324eeb418e323e28aaa4c6043a0229163ce90a2cb916044808301926000929190829003018186803b15801561282357600080fd5b505af4158015612837573d6000803e3d6000fd5b505050505b600154604080517fbb83dc2a000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152516128f8917344bc22e0e33d546eb5e13d5f1e71fdaa0221ae749163bb83dc2a91604480820192602092909190829003018186803b1580156128bf57600080fd5b505af41580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b5051839063ffffffff613b1316565b600154604080517f83264100000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918616602483015260448201839052519192507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae7491638326410091606480820192600092909190829003018186803b15801561298157600080fd5b505af4158015612995573d6000803e3d6000fd5b505060408051600160a060020a03871681526020810185905281517f58ac23a1ec4c8abd25f0e0f9d5c6b826d259c4d878ca97e045de9b51b05e123c9450908190039091019150a1505050565b600180546040805160e160020a6355d5f15f028152600160a060020a03909216600483015260248201849052604482019290925290516000918291829182918291829182918291606091839173728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be916064808301926020929190829003018186803b158015612a6957600080fd5b505af4158015612a7d573d6000803e3d6000fd5b505050506040513d6020811015612a9357600080fd5b50516001546040805160e160020a6355d5f15f028152600160a060020a039092166004830152602482018e90526000604483015251919b5073728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be91606480820192602092909190829003018186803b158015612b0757600080fd5b505af4158015612b1b573d6000803e3d6000fd5b505050506040513d6020811015612b3157600080fd5b5051600154604080517f792922bd000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018e905251919a5073ebbb7e95a4d61850fad81b2bff318ed8fd7622879163792922bd91604480820192602092909190829003018186803b158015612bb457600080fd5b505af4158015612bc8573d6000803e3d6000fd5b505050506040513d6020811015612bde57600080fd5b5051600154604080517f54c7c81a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018e90525191995073ebbb7e95a4d61850fad81b2bff318ed8fd762287916354c7c81a91604480820192602092909190829003018186803b158015612c6157600080fd5b505af4158015612c75573d6000803e3d6000fd5b505050506040513d6020811015612c8b57600080fd5b5051600154604080517ff0c5beff000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018e9052518c8c0192909210985073ebbb7e95a4d61850fad81b2bff318ed8fd7622879163f0c5beff91604480820192602092909190829003018186803b158015612d1457600080fd5b505af4158015612d28573d6000803e3d6000fd5b505050506040513d6020811015612d3e57600080fd5b505195508680612d4d5750888a145b15612ff357600154604080517f34b72eb0000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d905251612e0791889173ebbb7e95a4d61850fad81b2bff318ed8fd762287916334b72eb0916044808301926020929190829003018186803b158015612dd557600080fd5b505af4158015612de9573d6000803e3d6000fd5b505050506040513d6020811015612dff57600080fd5b50518a613b29565b600160009054906101000a9004600160a060020a0316600160a060020a031673ebbb7e95a4d61850fad81b2bff318ed8fd76228763d03912b990918d60046040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018360001916600019168152602001826004811115612e8d57fe5b60ff168152602001935050505060006040518083038186803b158015612eb257600080fd5b505af4158015612ec6573d6000803e3d6000fd5b5050505086612ed6576001612ed9565b60005b9450600160009054906101000a9004600160a060020a0316600160a060020a031673ebbb7e95a4d61850fad81b2bff318ed8fd762287637f7932c390918d886040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018360001916600019168152602001826001811115612f6057fe5b60ff168152602001935050505060006040518083038186803b158015612f8557600080fd5b505af4158015612f99573d6000803e3d6000fd5b505050507f9a0b6093880c657951b6d2b547905b101cedea8589e6ffb4e3d7f89ae4ec5e528b866001811115612fcb57fe5b6040805192835260ff90911660208301528051918290030190a1612fee8b613c92565b61147e565b60009350888a11156130165760019350898881151561300e57fe5b049250613025565b888881151561302157fe5b0492505b6001546040805160e060020a63d03912b9028152600160a060020a039092166004830152602482018d9052600360448301525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b15801561309357600080fd5b505af41580156130a7573d6000803e3d6000fd5b5050600154604080517f16a0f4e0000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018f905287151560448301525173ebbb7e95a4d61850fad81b2bff318ed8fd76228793506316a0f4e092506064808301926000929190829003018186803b15801561313057600080fd5b505af4158015613144573d6000803e3d6000fd5b5050604080518e8152871515602082015281517f9218c14f6671255598a3fbd34b2f1f00cc6e700ee12839e5193b52973d21921e9450908190039091019150a1600154604080517f2755132f000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d905285151560448301525173728427d1e48daa939aade5a692d54a14e452efaf91632755132f916064808301926000929190829003018186803b15801561320957600080fd5b505af415801561321d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561324657600080fd5b81019080805164010000000081111561325e57600080fd5b8201602081018481111561327157600080fd5b815185602082028301116401000000008211171561328e57600080fd5b5090955060009450505050505b8151811015613330576132c68683838151811015156132b657fe5b9060200190602002015185613b29565b7f018a9a757da55a0e88a7e72771d12b08173672b2ebc49b931b7f61365de8bc1382828151811015156132f557fe5b602090810290910181015160408051600160a060020a0390921682529181018e905280820186905290519081900360600190a160010161329b565b61147e8b613dd7565b613345848484846114a9565b151561335057600080fd5b600154604080517f8a84ebeb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101879052918516604483015260ff84161560648301525173728427d1e48daa939aade5a692d54a14e452efaf91638a84ebeb916084808301926000929190829003018186803b1580156133df57600080fd5b505af41580156133f3573d6000803e3d6000fd5b505060408051878152600160a060020a038716602082015260ff8616818301526060810185905290517fc9ad58887596f3e1f1519b58ea560cf4b8c0a11cb9490133062b5e303fe580cb9350908190036080019150a150505050565b600154604080517f5ef0b8b1000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525173728427d1e48daa939aade5a692d54a14e452efaf91635ef0b8b1916044808301926020929190829003018186803b1580156134cc57600080fd5b505af41580156134e0573d6000803e3d6000fd5b505050506040513d60208110156134f657600080fd5b50516001546040805160e160020a6355d5f15f028152600160a060020a03909216600483015260248201849052600060448301525173728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be916064808301926020929190829003018186803b15801561356657600080fd5b505af415801561357a573d6000803e3d6000fd5b505050506040513d602081101561359057600080fd5b5051600180546040805160e160020a6355d5f15f028152600160a060020a039092166004830152602482018690526044820192909252905173728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be916064808301926020929190829003018186803b15801561360357600080fd5b505af4158015613617573d6000803e3d6000fd5b505050506040513d602081101561362d57600080fd5b505101141561060757610607816129e2565b600060606000806000600360009054906101000a9004600160a060020a0316600160a060020a0316632e5e26a06040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561369b57600080fd5b505af11580156136af573d6000803e3d6000fd5b505050506040513d60208110156136c557600080fd5b5051600154604080517fc93fccc5000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201528a83166024820152918916604483015260648201839052519196507356781cbb608324eeb418e323e28aaa4c6043a0229163c93fccc591608480820192600092909190829003018186803b15801561375857600080fd5b505af415801561376c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561379557600080fd5b8101908080516401000000008111156137ad57600080fd5b820160208101848111156137c057600080fd5b81518560208202830111640100000000821117156137dd57600080fd5b5090975060009650505050505b83518310156139ab57838381518110151561380157fe5b6020908102909101810151600154604080517fbb83dc2a000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152519194507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae749263bb83dc2a92604480840193829003018186803b15801561388857600080fd5b505af415801561389c573d6000803e3d6000fd5b505050506040513d60208110156138b257600080fd5b5051600154604080517f83264100000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301526000199092016044820181905291519192507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae7491638326410091606480820192600092909190829003018186803b15801561394457600080fd5b505af4158015613958573d6000803e3d6000fd5b505060408051600160a060020a03861681526020810185905281517f58ac23a1ec4c8abd25f0e0f9d5c6b826d259c4d878ca97e045de9b51b05e123c9450908190039091019150a16001909201916137ea565b6001546040517f3632d699000000000000000000000000000000000000000000000000000000008152600160a060020a0390911660048201818152604483018b905260606024840190815287516064850152875173728427d1e48daa939aade5a692d54a14e452efaf94633632d69994938a938f93919290916084909101906020808701910280838360005b83811015613a4f578181015183820152602001613a37565b5050505090500194505050505060006040518083038186803b158015613a7457600080fd5b505af4158015613a88573d6000803e3d6000fd5b5050604080518b8152602080820183815289519383019390935288517f18a44f502a507e713d9aee63c6d4a46f2ea60098c05b892884ae4e85bbe310a495508d94508993916060840191818601910280838360005b83811015613af5578181015183820152602001613add565b50505050905001935050505060405180910390a15050505050505050565b600082820183811015613b2257fe5b9392505050565b8215613bda57600654604080517f1b9a91a4000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301526024820185905291519190921691631b9a91a49160448083019260209291908290030181600087803b158015613b9e57600080fd5b505af1158015613bb2573d6000803e3d6000fd5b505050506040513d6020811015613bc857600080fd5b50511515613bd557600080fd5b613c8d565b60065460048054604080517f3ccdbb28000000000000000000000000000000000000000000000000000000008152600160a060020a0387811694820194909452602481018690529183166044830152519190921691633ccdbb289160648083019260209291908290030181600087803b158015613c5657600080fd5b505af1158015613c6a573d6000803e3d6000fd5b505050506040513d6020811015613c8057600080fd5b50511515613c8d57600080fd5b505050565b600154604080517ff1c6b116000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160609160009173728427d1e48daa939aade5a692d54a14e452efaf9163f1c6b1169160448083019286929190829003018186803b158015613d1457600080fd5b505af4158015613d28573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613d5157600080fd5b810190808051640100000000811115613d6957600080fd5b82016020810184811115613d7c57600080fd5b8151856020820283011164010000000082111715613d9957600080fd5b5090955060009450505050505b8151811015613c8d57613dcf8282815181101515613dc057fe5b90602001906020020151613fd1565b600101613da6565b600154604080517ff1c6b116000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160609160009173728427d1e48daa939aade5a692d54a14e452efaf9163f1c6b1169160448083019286929190829003018186803b158015613e5957600080fd5b505af4158015613e6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613e9657600080fd5b810190808051640100000000811115613eae57600080fd5b82016020810184811115613ec157600080fd5b8151856020820283011164010000000082111715613ede57600080fd5b5090955060009450505050505b8151811015613c8d57600154825173728427d1e48daa939aade5a692d54a14e452efaf916361548c0691600160a060020a0390911690859085908110613f2d57fe5b60209081029091018101516040805160e060020a63ffffffff8716028152600160a060020a0394851660048201529390911660248401526044830188905251606480840193829003018186803b158015613f8657600080fd5b505af4158015613f9a573d6000803e3d6000fd5b505050506040513d6020811015613fb057600080fd5b50511515613fc957613fc98282815181101515613dc057fe5b600101613eeb565b600154604080517fbb83dc2a000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000917344bc22e0e33d546eb5e13d5f1e71fdaa0221ae749163bb83dc2a91604480820192602092909190829003018186803b15801561405357600080fd5b505af4158015614067573d6000803e3d6000fd5b505050506040513d602081101561407d57600080fd5b505160018054604080517f83264100000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529186166024830152919092016044830181905290519092507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae74916383264100916064808301926000929190829003018186803b15801561410d57600080fd5b505af4158015614121573d6000803e3d6000fd5b505060408051600160a060020a03861681526020810185905281517f58ac23a1ec4c8abd25f0e0f9d5c6b826d259c4d878ca97e045de9b51b05e123c9450908190039091019150a150505600a165627a7a723058200d9d38165819919fb0480ef0af5fee48358e9aad50d40c86bc9e850e50116021002900000000000000000000000024caa9ad2831489823c560c65c9211904ffc13bd0000000000000000000000005e57d82421e40eddf792b2a5681192f4457f791500000000000000000000000064542fd1991949482e51e24973d047e286b4ef50
Deployed Bytecode
0x6080604052600436106101455763ffffffff60e060020a60003504166314e291e6811461014a5780633bbd2235146101645780634a0b890f1461017f57806354fd4d50146101875780635983adbd146101ae57806359b910d6146101c6578063653766d5146101e75780636c8d9a8414610208578063704b6c021461023957806379502c551461025a57806379cc6bca1461026f5780637db5c88e1461028757806382d7721a146102a857806383a12de9146102c65780638c2794cb146102e75780638da5cb5b1461032357806392801230146103385780639349a4081461034d578063a075048f1461038e578063a818d0c1146103a6578063ab6d4201146103bb578063b2fb1c52146103eb578063c311d0491461040f578063df2f945914610427578063e703ecb114610448578063f2fde38b14610475578063f851a44014610496575b600080fd5b34801561015657600080fd5b506101626004356104ab565b005b34801561017057600080fd5b5061016260043560243561060a565b610162610be8565b34801561019357600080fd5b5061019c610d08565b60408051918252519081900360200190f35b3480156101ba57600080fd5b50610162600435610d0e565b3480156101d257600080fd5b50610162600160a060020a0360043516610f3d565b3480156101f357600080fd5b50610162600160a060020a0360043516610f83565b34801561021457600080fd5b5061021d610fc9565b60408051600160a060020a039092168252519081900360200190f35b34801561024557600080fd5b50610162600160a060020a0360043516610fd8565b34801561026657600080fd5b5061021d61101e565b34801561027b57600080fd5b5061016260043561102d565b34801561029357600080fd5b50610162600160a060020a03600435166111ab565b3480156102b457600080fd5b5061019c60ff600435166024356111f1565b3480156102d257600080fd5b50610162600160a060020a0360043516611235565b3480156102f357600080fd5b5061016260048035906024803580820192908101359160443580820192908101359160643590810191013561127b565b34801561032f57600080fd5b5061021d61148b565b34801561034457600080fd5b5061021d61149a565b34801561035957600080fd5b5061037a600435600160a060020a036024351660ff604435166064356114a9565b604080519115158252519081900360200190f35b34801561039a57600080fd5b506101626004356115a3565b3480156103b257600080fd5b5061021d6117d5565b61016260048035600160a060020a031690602480359160443591606435916084359160a4359081019101356117e4565b3480156103f757600080fd5b50610162600480359060248035908101910135611c2a565b34801561041b57600080fd5b506101626004356120f0565b34801561043357600080fd5b50610162600160a060020a0360043516612146565b34801561045457600080fd5b50610162600435600160a060020a036024351660ff6044351660643561217d565b34801561048157600080fd5b50610162600160a060020a036004351661230a565b3480156104a257600080fd5b5061021d61239e565b600054600160a060020a031633146104c257600080fd5b60048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523093810193909352518392600160a060020a03909216916370a082319160248083019260209291908290030181600087803b15801561052b57600080fd5b505af115801561053f573d6000803e3d6000fd5b505050506040513d602081101561055557600080fd5b5051101561056257600080fd5b60048054604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815233938101939093526024830184905251600160a060020a039091169163a9059cbb9160448083019260209291908290030181600087803b1580156105d057600080fd5b505af11580156105e4573d6000803e3d6000fd5b505050506040513d60208110156105fa57600080fd5b5051151561060757600080fd5b50565b600180546040805160e360020a630922c6c1028152600160a060020a039092166004830152602482018590525184929173ebbb7e95a4d61850fad81b2bff318ed8fd76228791634916360891604480820192602092909190829003018186803b15801561067657600080fd5b505af415801561068a573d6000803e3d6000fd5b505050506040513d60208110156106a057600080fd5b505160048111156106ad57fe5b8160048111156106b957fe5b146106c357600080fd5b600154604080517f95d94285000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018690525173ebbb7e95a4d61850fad81b2bff318ed8fd762287916395d94285916044808301926020929190829003018186803b15801561074057600080fd5b505af4158015610754573d6000803e3d6000fd5b505050506040513d602081101561076a57600080fd5b50514281101561077957600080fd5b600154604080517f6a15a671000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152336024830152604482018790525173728427d1e48daa939aade5a692d54a14e452efaf91636a15a671916064808301926020929190829003018186803b1580156107fc57600080fd5b505af4158015610810573d6000803e3d6000fd5b505050506040513d602081101561082657600080fd5b5051151561083357600080fd5b600154604080517f61548c06000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152336024830152604482018790525173728427d1e48daa939aade5a692d54a14e452efaf916361548c06916064808301926020929190829003018186803b1580156108b657600080fd5b505af41580156108ca573d6000803e3d6000fd5b505050506040513d60208110156108e057600080fd5b5051156108ec57600080fd5b600154604080517fbb333e94000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015260248201879052336044830152606482018690525173728427d1e48daa939aade5a692d54a14e452efaf9163bb333e94916084808301926000929190829003018186803b15801561097657600080fd5b505af415801561098a573d6000803e3d6000fd5b50506040805188815233602082015280820188905290517f25a48c6816dd5a19678a7d2a3c04c071cff7f4fa08dbc4e2ced1f8b7828143c09350908190036060019150a1600154604080517f10c3b71a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018790525173728427d1e48daa939aade5a692d54a14e452efaf916310c3b71a916044808301926020929190829003018186803b158015610a4b57600080fd5b505af4158015610a5f573d6000803e3d6000fd5b505050506040513d6020811015610a7557600080fd5b5051600154604080517f5ef0b8b1000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018890525173728427d1e48daa939aade5a692d54a14e452efaf91635ef0b8b1916044808301926020929190829003018186803b158015610af457600080fd5b505af4158015610b08573d6000803e3d6000fd5b505050506040513d6020811015610b1e57600080fd5b50511415610be1576001546040805160e060020a63d03912b9028152600160a060020a03909216600483015260248201879052600260448301525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b158015610b9457600080fd5b505af4158015610ba8573d6000803e3d6000fd5b50506040805188815290517fd13f92958cb3f9d795be810e016990e9af7a3fe912a8fdf1a0703b603a2fe5f89350908190036020019150a15b5050505050565b60003415610c7457600360009054906101000a9004600160a060020a0316600160a060020a0316636f2ee5de6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610c4357600080fd5b505af1158015610c57573d6000803e3d6000fd5b505050506040513d6020811015610c6d57600080fd5b5051610cf4565b600360009054906101000a9004600160a060020a0316600160a060020a031663dfe5b0446040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610cc757600080fd5b505af1158015610cdb573d6000803e3d6000fd5b505050506040513d6020811015610cf157600080fd5b50515b9050610cff816123ad565b6106073361266f565b60025481565b600180546040805160e360020a630922c6c1028152600160a060020a039092166004830152602482018490525183929173ebbb7e95a4d61850fad81b2bff318ed8fd76228791634916360891604480820192602092909190829003018186803b158015610d7a57600080fd5b505af4158015610d8e573d6000803e3d6000fd5b505050506040513d6020811015610da457600080fd5b50516004811115610db157fe5b816004811115610dbd57fe5b14610dc757600080fd5b600154604080517f95d94285000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525173ebbb7e95a4d61850fad81b2bff318ed8fd762287916395d94285916044808301926020929190829003018186803b158015610e4457600080fd5b505af4158015610e58573d6000803e3d6000fd5b505050506040513d6020811015610e6e57600080fd5b505142811115610e7d57600080fd5b6001546040805160e060020a63d03912b9028152600160a060020a03909216600483015260248201869052600260448301525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b158015610eeb57600080fd5b505af4158015610eff573d6000803e3d6000fd5b50506040805187815290517fd13f92958cb3f9d795be810e016990e9af7a3fe912a8fdf1a0703b603a2fe5f89350908190036020019150a150505050565b600054600160a060020a03163314610f5457600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a03163314610f9a57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600654600160a060020a031681565b600054600160a060020a03163314610fef57600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600354600160a060020a031681565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820183905251829160029173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b15801561109957600080fd5b505af41580156110ad573d6000803e3d6000fd5b505050506040513d60208110156110c357600080fd5b505160048111156110d057fe5b8160048111156110dc57fe5b146110e657600080fd5b600154604080517f5fda6620000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525173ebbb7e95a4d61850fad81b2bff318ed8fd76228791635fda6620916044808301926020929190829003018186803b15801561116357600080fd5b505af4158015611177573d6000803e3d6000fd5b505050506040513d602081101561118d57600080fd5b50514281111561119c57600080fd5b6111a5846129e2565b50505050565b600054600160a060020a031633146111c257600080fd5b6006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080517f010000000000000000000000000000000000000000000000000000000000000060ff851602815260018101839052905190819003602101902092915050565b600054600160a060020a0316331461124c57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820189905251600091899160029173ebbb7e95a4d61850fad81b2bff318ed8fd76228791634916360891604480820192602092909190829003018186803b1580156112eb57600080fd5b505af41580156112ff573d6000803e3d6000fd5b505050506040513d602081101561131557600080fd5b5051600481111561132257fe5b81600481111561132e57fe5b1461133857600080fd5b600154604080517f5fda6620000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173ebbb7e95a4d61850fad81b2bff318ed8fd76228791635fda6620916044808301926020929190829003018186803b1580156113b557600080fd5b505af41580156113c9573d6000803e3d6000fd5b505050506040513d60208110156113df57600080fd5b5051428110156113ee57600080fd5b88871480156113fc57508885145b151561140757600080fd5b600093505b888410156114755761146a8b8b8b8781811061142457fe5b90506020020135600160a060020a03168a8a88818110151561144257fe5b9050602002013560ff16898989818110151561145a57fe5b9050602002013560001916613339565b60019093019261140c565b61147e8b61344f565b5050505050505050505050565b600054600160a060020a031681565b600154600160a060020a031681565b604080517f010000000000000000000000000000000000000000000000000000000000000060ff85160281526001808201849052825191829003602101822090547f0cf84a50000000000000000000000000000000000000000000000000000000008352600160a060020a039081166004840152602483018890528616604483015291516000929173728427d1e48daa939aade5a692d54a14e452efaf91630cf84a5091606480820192602092909190829003018186803b15801561156d57600080fd5b505af4158015611581573d6000803e3d6000fd5b505050506040513d602081101561159757600080fd5b50511495945050505050565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820183905251829160009173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b15801561160f57600080fd5b505af4158015611623573d6000803e3d6000fd5b505050506040513d602081101561163957600080fd5b5051600481111561164657fe5b81600481111561165257fe5b1461165c57600080fd5b600154604080517fd3f0d1cb000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018590525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d3f0d1cb916044808301926020929190829003018186803b1580156116d957600080fd5b505af41580156116ed573d6000803e3d6000fd5b505050506040513d602081101561170357600080fd5b50514281111561171257600080fd5b600180546040805160e060020a63d03912b9028152600160a060020a039092166004830152602482018790526044820192909252905173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b15801561178357600080fd5b505af4158015611797573d6000803e3d6000fd5b50506040805187815290517f35bcd7e8326284609d6098ff8b26bc5bd69336b3efd3c12e45425fe4681816cf9350908190036020019150a150505050565b600454600160a060020a031681565b606060008033600160a060020a038b1614156117ff57600080fd5b611808876123ad565b600360009054906101000a9004600160a060020a0316600160a060020a031663e07cfabe6040518163ffffffff1660e060020a028152600401600060405180830381600087803b15801561185b57600080fd5b505af115801561186f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561189857600080fd5b8101908080516401000000008111156118b057600080fd5b820160208101848111156118c357600080fd5b81518560208202830111640100000000821117156118e057600080fd5b5050600354604080517faa29a6650000000000000000000000000000000000000000000000000000000081529051929850600160a060020a03909116945063aa29a665935060048082019350602092918290030181600087803b15801561194657600080fd5b505af115801561195a573d6000803e3d6000fd5b505050506040513d602081101561197057600080fd5b81019080805190602001909291905050509150600160009054906101000a9004600160a060020a0316600160a060020a031673ebbb7e95a4d61850fad81b2bff318ed8fd76228763d15cd3be9091338d8d8d8d8d8d8d8d8d34600014156040518d63ffffffff1660e060020a028152600401808d600160a060020a0316600160a060020a031681526020018c600160a060020a0316600160a060020a031681526020018b600160a060020a0316600160a060020a031681526020018a6000191660001916815260200189815260200188815260200187600019166000191681526020018060200180602001858152602001841515151581526020018381038352888882818152602001925080828437909101848103835287518152875160209182019250818901910280838360005b83811015611ab7578181015183820152602001611a9f565b505050509050019e50505050505050505050505050505060206040518083038186803b158015611ae657600080fd5b505af4158015611afa573d6000803e3d6000fd5b505050506040513d6020811015611b1057600080fd5b5051604080518281523360208201819052600160a060020a038e1692820192909252606081018c9052608081018b905260a081018a905260c081018990526101208101859052341515610140820181905261016060e083018181529083018990529394507fd442e1e65d09ce5f7df2526ac5185ea8a60aca4b8ff2d6ec043983f0e551f604938593928f928f928f928f928f928f928f928f928f929061010082016101808301888880828437909101848103835287518152875160209182019250818901910280838360005b83811015611bf4578181015183820152602001611bdc565b505050509050019e50505050505050505050505050505060405180910390a1611c1e81338c61363f565b50505050505050505050565b600154604080517fd94c78ad000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301526024820185905251849173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d94c78ad91604480820192602092909190829003018186803b158015611caa57600080fd5b505af4158015611cbe573d6000803e3d6000fd5b505050506040513d6020811015611cd457600080fd5b5051600160a060020a03163314611cea57600080fd5b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820186905251859160009173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b158015611d5657600080fd5b505af4158015611d6a573d6000803e3d6000fd5b505050506040513d6020811015611d8057600080fd5b50516004811115611d8d57fe5b816004811115611d9957fe5b14611da357600080fd5b600154604080517fd3f0d1cb000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018890525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d3f0d1cb916044808301926020929190829003018186803b158015611e2057600080fd5b505af4158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b505142811015611e5957600080fd5b600154604080517fa6fd718b000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018990525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163a6fd718b916044808301926020929190829003018186803b158015611ed657600080fd5b505af4158015611eea573d6000803e3d6000fd5b505050506040513d6020811015611f0057600080fd5b505115611f0c57600080fd5b6001546040517f188b40d7000000000000000000000000000000000000000000000000000000008152600160a060020a0390911660048201818152602483018a90526060604484019081526064840189905273ebbb7e95a4d61850fad81b2bff318ed8fd7622879363188b40d793928c928c928c92919060840184848082843782019150509550505050505060006040518083038186803b158015611fb057600080fd5b505af4158015611fc4573d6000803e3d6000fd5b5050600180546040805160e060020a63d03912b9028152600160a060020a039092166004830152602482018c90526044820192909252905173ebbb7e95a4d61850fad81b2bff318ed8fd762287935063d03912b992506064808301926000929190829003018186803b15801561203957600080fd5b505af415801561204d573d6000803e3d6000fd5b5050604080518a8152336020820181905260609282018381529282018a90527fbcb086748b4ee9a32661e6fe5e16e69a0bcd7bc07ba81145a707c7313b03c31894508b9350918a918a9160808201848480828437604051920182900397509095505050505050a16040805188815290517f35bcd7e8326284609d6098ff8b26bc5bd69336b3efd3c12e45425fe4681816cf9181900360200190a150505050505050565b600054600160a060020a0316331461210757600080fd5b303181111561211557600080fd5b604051339082156108fc029083906000818181858888f19350505050158015612142573d6000803e3d6000fd5b5050565b600554600160a060020a03163314806121695750600054600160a060020a031633145b151561217457600080fd5b6106078161266f565b6001546040805160e360020a630922c6c1028152600160a060020a0390921660048301526024820186905251859160029173ebbb7e95a4d61850fad81b2bff318ed8fd762287916349163608916044808301926020929190829003018186803b1580156121e957600080fd5b505af41580156121fd573d6000803e3d6000fd5b505050506040513d602081101561221357600080fd5b5051600481111561222057fe5b81600481111561222c57fe5b1461223657600080fd5b600154604080517f5fda6620000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018890525173ebbb7e95a4d61850fad81b2bff318ed8fd76228791635fda6620916044808301926020929190829003018186803b1580156122b357600080fd5b505af41580156122c7573d6000803e3d6000fd5b505050506040513d60208110156122dd57600080fd5b5051428110156122ec57600080fd5b6122f887878787613339565b6123018761344f565b50505050505050565b600054600160a060020a0316331461232157600080fd5b600160a060020a038116151561233657600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600554600160a060020a031681565b34156124b15734811461242157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45544820616d6f756e74206d75737420626520657175616c20616d6f756e7400604482015290519081900360640190fd5b600660009054906101000a9004600160a060020a0316600160a060020a031663439370b1346040518263ffffffff1660e060020a0281526004016020604051808303818588803b15801561247457600080fd5b505af1158015612488573d6000803e3d6000fd5b50505050506040513d602081101561249f57600080fd5b505115156124ac57600080fd5b610607565b60048054604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523393810193909352306024840152518392600160a060020a039092169163dd62ed3e9160448083019260209291908290030181600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d602081101561254a57600080fd5b5051101561255757600080fd5b60048054604080517f70a082310000000000000000000000000000000000000000000000000000000081523393810193909352518392600160a060020a03909216916370a082319160248083019260209291908290030181600087803b1580156125c057600080fd5b505af11580156125d4573d6000803e3d6000fd5b505050506040513d60208110156125ea57600080fd5b505110156125f757600080fd5b60048054600654604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523394810194909452600160a060020a03918216602485015260448401859052519116916323b872dd9160648083019260209291908290030181600087803b1580156105d057600080fd5b600080600360009054906101000a9004600160a060020a0316600160a060020a031663b1e730006040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156126c557600080fd5b505af11580156126d9573d6000803e3d6000fd5b505050506040513d60208110156126ef57600080fd5b5051600154604080517f2843c77e000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529186166024830152519193507356781cbb608324eeb418e323e28aaa4c6043a02291632843c77e91604480820192602092909190829003018186803b15801561277357600080fd5b505af4158015612787573d6000803e3d6000fd5b505050506040513d602081101561279d57600080fd5b5051151561283c57600154604080517fce90a2cb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152517356781cbb608324eeb418e323e28aaa4c6043a0229163ce90a2cb916044808301926000929190829003018186803b15801561282357600080fd5b505af4158015612837573d6000803e3d6000fd5b505050505b600154604080517fbb83dc2a000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152516128f8917344bc22e0e33d546eb5e13d5f1e71fdaa0221ae749163bb83dc2a91604480820192602092909190829003018186803b1580156128bf57600080fd5b505af41580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b5051839063ffffffff613b1316565b600154604080517f83264100000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918616602483015260448201839052519192507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae7491638326410091606480820192600092909190829003018186803b15801561298157600080fd5b505af4158015612995573d6000803e3d6000fd5b505060408051600160a060020a03871681526020810185905281517f58ac23a1ec4c8abd25f0e0f9d5c6b826d259c4d878ca97e045de9b51b05e123c9450908190039091019150a1505050565b600180546040805160e160020a6355d5f15f028152600160a060020a03909216600483015260248201849052604482019290925290516000918291829182918291829182918291606091839173728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be916064808301926020929190829003018186803b158015612a6957600080fd5b505af4158015612a7d573d6000803e3d6000fd5b505050506040513d6020811015612a9357600080fd5b50516001546040805160e160020a6355d5f15f028152600160a060020a039092166004830152602482018e90526000604483015251919b5073728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be91606480820192602092909190829003018186803b158015612b0757600080fd5b505af4158015612b1b573d6000803e3d6000fd5b505050506040513d6020811015612b3157600080fd5b5051600154604080517f792922bd000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018e905251919a5073ebbb7e95a4d61850fad81b2bff318ed8fd7622879163792922bd91604480820192602092909190829003018186803b158015612bb457600080fd5b505af4158015612bc8573d6000803e3d6000fd5b505050506040513d6020811015612bde57600080fd5b5051600154604080517f54c7c81a000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018e90525191995073ebbb7e95a4d61850fad81b2bff318ed8fd762287916354c7c81a91604480820192602092909190829003018186803b158015612c6157600080fd5b505af4158015612c75573d6000803e3d6000fd5b505050506040513d6020811015612c8b57600080fd5b5051600154604080517ff0c5beff000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018e9052518c8c0192909210985073ebbb7e95a4d61850fad81b2bff318ed8fd7622879163f0c5beff91604480820192602092909190829003018186803b158015612d1457600080fd5b505af4158015612d28573d6000803e3d6000fd5b505050506040513d6020811015612d3e57600080fd5b505195508680612d4d5750888a145b15612ff357600154604080517f34b72eb0000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d905251612e0791889173ebbb7e95a4d61850fad81b2bff318ed8fd762287916334b72eb0916044808301926020929190829003018186803b158015612dd557600080fd5b505af4158015612de9573d6000803e3d6000fd5b505050506040513d6020811015612dff57600080fd5b50518a613b29565b600160009054906101000a9004600160a060020a0316600160a060020a031673ebbb7e95a4d61850fad81b2bff318ed8fd76228763d03912b990918d60046040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018360001916600019168152602001826004811115612e8d57fe5b60ff168152602001935050505060006040518083038186803b158015612eb257600080fd5b505af4158015612ec6573d6000803e3d6000fd5b5050505086612ed6576001612ed9565b60005b9450600160009054906101000a9004600160a060020a0316600160a060020a031673ebbb7e95a4d61850fad81b2bff318ed8fd762287637f7932c390918d886040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a031681526020018360001916600019168152602001826001811115612f6057fe5b60ff168152602001935050505060006040518083038186803b158015612f8557600080fd5b505af4158015612f99573d6000803e3d6000fd5b505050507f9a0b6093880c657951b6d2b547905b101cedea8589e6ffb4e3d7f89ae4ec5e528b866001811115612fcb57fe5b6040805192835260ff90911660208301528051918290030190a1612fee8b613c92565b61147e565b60009350888a11156130165760019350898881151561300e57fe5b049250613025565b888881151561302157fe5b0492505b6001546040805160e060020a63d03912b9028152600160a060020a039092166004830152602482018d9052600360448301525173ebbb7e95a4d61850fad81b2bff318ed8fd7622879163d03912b9916064808301926000929190829003018186803b15801561309357600080fd5b505af41580156130a7573d6000803e3d6000fd5b5050600154604080517f16a0f4e0000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018f905287151560448301525173ebbb7e95a4d61850fad81b2bff318ed8fd76228793506316a0f4e092506064808301926000929190829003018186803b15801561313057600080fd5b505af4158015613144573d6000803e3d6000fd5b5050604080518e8152871515602082015281517f9218c14f6671255598a3fbd34b2f1f00cc6e700ee12839e5193b52973d21921e9450908190039091019150a1600154604080517f2755132f000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d905285151560448301525173728427d1e48daa939aade5a692d54a14e452efaf91632755132f916064808301926000929190829003018186803b15801561320957600080fd5b505af415801561321d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561324657600080fd5b81019080805164010000000081111561325e57600080fd5b8201602081018481111561327157600080fd5b815185602082028301116401000000008211171561328e57600080fd5b5090955060009450505050505b8151811015613330576132c68683838151811015156132b657fe5b9060200190602002015185613b29565b7f018a9a757da55a0e88a7e72771d12b08173672b2ebc49b931b7f61365de8bc1382828151811015156132f557fe5b602090810290910181015160408051600160a060020a0390921682529181018e905280820186905290519081900360600190a160010161329b565b61147e8b613dd7565b613345848484846114a9565b151561335057600080fd5b600154604080517f8a84ebeb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101879052918516604483015260ff84161560648301525173728427d1e48daa939aade5a692d54a14e452efaf91638a84ebeb916084808301926000929190829003018186803b1580156133df57600080fd5b505af41580156133f3573d6000803e3d6000fd5b505060408051878152600160a060020a038716602082015260ff8616818301526060810185905290517fc9ad58887596f3e1f1519b58ea560cf4b8c0a11cb9490133062b5e303fe580cb9350908190036080019150a150505050565b600154604080517f5ef0b8b1000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525173728427d1e48daa939aade5a692d54a14e452efaf91635ef0b8b1916044808301926020929190829003018186803b1580156134cc57600080fd5b505af41580156134e0573d6000803e3d6000fd5b505050506040513d60208110156134f657600080fd5b50516001546040805160e160020a6355d5f15f028152600160a060020a03909216600483015260248201849052600060448301525173728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be916064808301926020929190829003018186803b15801561356657600080fd5b505af415801561357a573d6000803e3d6000fd5b505050506040513d602081101561359057600080fd5b5051600180546040805160e160020a6355d5f15f028152600160a060020a039092166004830152602482018690526044820192909252905173728427d1e48daa939aade5a692d54a14e452efaf9163ababe2be916064808301926020929190829003018186803b15801561360357600080fd5b505af4158015613617573d6000803e3d6000fd5b505050506040513d602081101561362d57600080fd5b505101141561060757610607816129e2565b600060606000806000600360009054906101000a9004600160a060020a0316600160a060020a0316632e5e26a06040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561369b57600080fd5b505af11580156136af573d6000803e3d6000fd5b505050506040513d60208110156136c557600080fd5b5051600154604080517fc93fccc5000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201528a83166024820152918916604483015260648201839052519196507356781cbb608324eeb418e323e28aaa4c6043a0229163c93fccc591608480820192600092909190829003018186803b15801561375857600080fd5b505af415801561376c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561379557600080fd5b8101908080516401000000008111156137ad57600080fd5b820160208101848111156137c057600080fd5b81518560208202830111640100000000821117156137dd57600080fd5b5090975060009650505050505b83518310156139ab57838381518110151561380157fe5b6020908102909101810151600154604080517fbb83dc2a000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152519194507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae749263bb83dc2a92604480840193829003018186803b15801561388857600080fd5b505af415801561389c573d6000803e3d6000fd5b505050506040513d60208110156138b257600080fd5b5051600154604080517f83264100000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301526000199092016044820181905291519192507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae7491638326410091606480820192600092909190829003018186803b15801561394457600080fd5b505af4158015613958573d6000803e3d6000fd5b505060408051600160a060020a03861681526020810185905281517f58ac23a1ec4c8abd25f0e0f9d5c6b826d259c4d878ca97e045de9b51b05e123c9450908190039091019150a16001909201916137ea565b6001546040517f3632d699000000000000000000000000000000000000000000000000000000008152600160a060020a0390911660048201818152604483018b905260606024840190815287516064850152875173728427d1e48daa939aade5a692d54a14e452efaf94633632d69994938a938f93919290916084909101906020808701910280838360005b83811015613a4f578181015183820152602001613a37565b5050505090500194505050505060006040518083038186803b158015613a7457600080fd5b505af4158015613a88573d6000803e3d6000fd5b5050604080518b8152602080820183815289519383019390935288517f18a44f502a507e713d9aee63c6d4a46f2ea60098c05b892884ae4e85bbe310a495508d94508993916060840191818601910280838360005b83811015613af5578181015183820152602001613add565b50505050905001935050505060405180910390a15050505050505050565b600082820183811015613b2257fe5b9392505050565b8215613bda57600654604080517f1b9a91a4000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301526024820185905291519190921691631b9a91a49160448083019260209291908290030181600087803b158015613b9e57600080fd5b505af1158015613bb2573d6000803e3d6000fd5b505050506040513d6020811015613bc857600080fd5b50511515613bd557600080fd5b613c8d565b60065460048054604080517f3ccdbb28000000000000000000000000000000000000000000000000000000008152600160a060020a0387811694820194909452602481018690529183166044830152519190921691633ccdbb289160648083019260209291908290030181600087803b158015613c5657600080fd5b505af1158015613c6a573d6000803e3d6000fd5b505050506040513d6020811015613c8057600080fd5b50511515613c8d57600080fd5b505050565b600154604080517ff1c6b116000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160609160009173728427d1e48daa939aade5a692d54a14e452efaf9163f1c6b1169160448083019286929190829003018186803b158015613d1457600080fd5b505af4158015613d28573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613d5157600080fd5b810190808051640100000000811115613d6957600080fd5b82016020810184811115613d7c57600080fd5b8151856020820283011164010000000082111715613d9957600080fd5b5090955060009450505050505b8151811015613c8d57613dcf8282815181101515613dc057fe5b90602001906020020151613fd1565b600101613da6565b600154604080517ff1c6b116000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160609160009173728427d1e48daa939aade5a692d54a14e452efaf9163f1c6b1169160448083019286929190829003018186803b158015613e5957600080fd5b505af4158015613e6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613e9657600080fd5b810190808051640100000000811115613eae57600080fd5b82016020810184811115613ec157600080fd5b8151856020820283011164010000000082111715613ede57600080fd5b5090955060009450505050505b8151811015613c8d57600154825173728427d1e48daa939aade5a692d54a14e452efaf916361548c0691600160a060020a0390911690859085908110613f2d57fe5b60209081029091018101516040805160e060020a63ffffffff8716028152600160a060020a0394851660048201529390911660248401526044830188905251606480840193829003018186803b158015613f8657600080fd5b505af4158015613f9a573d6000803e3d6000fd5b505050506040513d6020811015613fb057600080fd5b50511515613fc957613fc98282815181101515613dc057fe5b600101613eeb565b600154604080517fbb83dc2a000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000917344bc22e0e33d546eb5e13d5f1e71fdaa0221ae749163bb83dc2a91604480820192602092909190829003018186803b15801561405357600080fd5b505af4158015614067573d6000803e3d6000fd5b505050506040513d602081101561407d57600080fd5b505160018054604080517f83264100000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529186166024830152919092016044830181905290519092507344bc22e0e33d546eb5e13d5f1e71fdaa0221ae74916383264100916064808301926000929190829003018186803b15801561410d57600080fd5b505af4158015614121573d6000803e3d6000fd5b505060408051600160a060020a03861681526020810185905281517f58ac23a1ec4c8abd25f0e0f9d5c6b826d259c4d878ca97e045de9b51b05e123c9450908190039091019150a150505600a165627a7a723058200d9d38165819919fb0480ef0af5fee48358e9aad50d40c86bc9e850e501160210029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000024caa9ad2831489823c560c65c9211904ffc13bd0000000000000000000000005e57d82421e40eddf792b2a5681192f4457f791500000000000000000000000064542fd1991949482e51e24973d047e286b4ef50
-----Decoded View---------------
Arg [0] : storageAddress (address): 0x24caa9AD2831489823C560c65C9211904FFc13bD
Arg [1] : configAddress (address): 0x5E57D82421E40EDdf792B2A5681192F4457f7915
Arg [2] : _paymentHolder (address): 0x64542Fd1991949482E51E24973D047e286b4eF50
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000024caa9ad2831489823c560c65c9211904ffc13bd
Arg [1] : 0000000000000000000000005e57d82421e40eddf792b2a5681192f4457f7915
Arg [2] : 00000000000000000000000064542fd1991949482e51e24973d047e286b4ef50
Libraries Used
CasesLib : 0xebbb7e95a4d61850fad81b2bff318ed8fd762287UnverifiedRefereesLib : 0x56781cbb608324eeb418e323e28aaa4c6043a022UnverifiedRefereeCasesLib : 0x728427d1e48daa939aade5a692d54a14e452efafUnverifiedVoteTokenLib : 0x44bc22e0e33d546eb5e13d5f1e71fdaa0221ae74Unverified
Swarm Source
bzzr://0d9d38165819919fb0480ef0af5fee48358e9aad50d40c86bc9e850e50116021
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.