Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
24707669 | 5 days ago | 0 S |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x09012a21...1120a6299 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Governance
Compiler Version
v0.5.17+commit.d19bba13
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.5.0; import "../../libraries/external/SafeMath.sol"; import "../../abstract/LegacyMasterAware.sol"; import "../../interfaces/IGovernance.sol"; import "../../interfaces/IMemberRoles.sol"; import "../../interfaces/IProposalCategory.sol"; import "../../interfaces/ITokenController.sol"; contract Governance is IGovernance, LegacyMasterAware { using SafeMath for uint; enum ProposalStatus { Draft, AwaitingSolution, VotingStarted, Accepted, Rejected, Majority_Not_Reached_But_Accepted, Denied } struct ProposalData { uint propStatus; uint finalVerdict; uint category; uint commonIncentive; uint dateUpd; address owner; } struct ProposalVote { address voter; uint proposalId; uint dateAdd; } struct VoteTally { mapping(uint => uint) memberVoteValue; mapping(uint => uint) abVoteValue; uint voters; } ProposalVote[] internal allVotes; DelegateVote[] public allDelegation; mapping(uint => ProposalData) internal allProposalData; mapping(uint => bytes[]) internal allProposalSolutions; mapping(address => uint[]) internal allVotesByMember; mapping(uint => mapping(address => bool)) public rewardClaimed; mapping(address => mapping(uint => uint)) public memberProposalVote; mapping(address => uint) public followerDelegation; mapping(address => uint) internal followerCount; mapping(address => uint[]) internal leaderDelegation; mapping(uint => VoteTally) public proposalVoteTally; mapping(address => bool) public isOpenForDelegation; mapping(address => uint) public lastRewardClaimed; bool internal constructorCheck; uint public tokenHoldingTime; uint internal roleIdAllowedToCatgorize; uint internal maxVoteWeigthPer; uint internal specialResolutionMajPerc; uint internal maxFollowers; uint internal totalProposals; uint internal maxDraftTime; IMemberRoles internal memberRole; IProposalCategory internal proposalCategory; ITokenController internal tokenInstance; mapping(uint => uint) public proposalActionStatus; mapping(uint => uint) internal proposalExecutionTime; mapping(uint => mapping(address => bool)) public proposalRejectedByAB; mapping(uint => uint) internal actionRejectedCount; bool internal actionParamsInitialised; uint internal actionWaitingTime; uint constant internal AB_MAJ_TO_REJECT_ACTION = 3; enum ActionStatus { Pending, Accepted, Rejected, Executed, NoAction } /** * @dev Called whenever an action execution is failed. */ event ActionFailed ( uint256 proposalId ); /** * @dev Called whenever an AB member rejects the action execution. */ event ActionRejected ( uint256 indexed proposalId, address rejectedBy ); /** * @dev Checks if msg.sender is proposal owner */ modifier onlyProposalOwner(uint _proposalId) { require(msg.sender == allProposalData[_proposalId].owner, "Not allowed"); _; } /** * @dev Checks if proposal is opened for voting */ modifier voteNotStarted(uint _proposalId) { require(allProposalData[_proposalId].propStatus < uint(ProposalStatus.VotingStarted)); _; } /** * @dev Checks if msg.sender is allowed to create proposal under given category */ modifier isAllowed(uint _categoryId) { require(allowedToCreateProposal(_categoryId), "Not allowed"); _; } /** * @dev Checks if msg.sender is allowed categorize proposal under given category */ modifier isAllowedToCategorize() { require(memberRole.checkRole(msg.sender, roleIdAllowedToCatgorize), "Not allowed"); _; } /** * @dev Checks if msg.sender had any pending rewards to be claimed */ modifier checkPendingRewards { require(getPendingReward(msg.sender) == 0, "Claim reward"); _; } /** * @dev Event emitted whenever a proposal is categorized */ event ProposalCategorized( uint indexed proposalId, address indexed categorizedBy, uint categoryId ); /** * @dev Creates a new proposal * @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal * @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective */ function createProposal( string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash, uint _categoryId ) external isAllowed(_categoryId) { require(ms.isMember(msg.sender), "Not Member"); _createProposal(_proposalTitle, _proposalSD, _proposalDescHash, _categoryId); } /** * @dev Edits the details of an existing proposal * @param _proposalId Proposal id that details needs to be updated * @param _proposalDescHash Proposal description hash having long and short description of proposal. */ function updateProposal( uint _proposalId, string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash ) external onlyProposalOwner(_proposalId) { require( allProposalSolutions[_proposalId].length < 2, "Not allowed" ); allProposalData[_proposalId].propStatus = uint(ProposalStatus.Draft); allProposalData[_proposalId].category = 0; allProposalData[_proposalId].commonIncentive = 0; emit Proposal( allProposalData[_proposalId].owner, _proposalId, now, _proposalTitle, _proposalSD, _proposalDescHash ); } /** * @dev Categorizes proposal to proceed further. Categories shows the proposal objective. */ function categorizeProposal( uint _proposalId, uint _categoryId, uint _incentive ) external voteNotStarted(_proposalId) isAllowedToCategorize { _categorizeProposal(_proposalId, _categoryId, _incentive); } /** * @dev Submit proposal with solution * @param _proposalId Proposal id * @param _solutionHash Solution hash contains parameters, values and description needed according to proposal */ function submitProposalWithSolution( uint _proposalId, string calldata _solutionHash, bytes calldata _action ) external onlyProposalOwner(_proposalId) { require(allProposalData[_proposalId].propStatus == uint(ProposalStatus.AwaitingSolution)); _proposalSubmission(_proposalId, _solutionHash, _action); } /** * @dev Creates a new proposal with solution * @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal * @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective * @param _solutionHash Solution hash contains parameters, values and description needed according to proposal */ function createProposalwithSolution( string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash, uint _categoryId, string calldata _solutionHash, bytes calldata _action ) external isAllowed(_categoryId) { uint proposalId = totalProposals; _createProposal(_proposalTitle, _proposalSD, _proposalDescHash, _categoryId); require(_categoryId > 0); _proposalSubmission( proposalId, _solutionHash, _action ); } /// Submit a vote on the proposal. /// Includes delegated nxm from the user's managed staking pools in vote power. /// /// @param _proposalId The id of the proposal that the user votes upon. /// @param _solutionChosen True if the vote is in favor of the proposal or false otherwise. function submitVote(uint _proposalId, uint _solutionChosen) external { _submitVote(_proposalId, _solutionChosen, true); } /// Submit a vote on the proposal. /// Does NOT include delegated nxm from the user's managed staking pools in vote power. /// /// @param _proposalId The id of the proposal that the user votes upon. /// @param _solutionChosen True if the vote is in favor of the proposal or false otherwise. function submitVoteWithoutDelegations(uint _proposalId, uint _solutionChosen) external { _submitVote(_proposalId, _solutionChosen, false); } /** * @dev Closes the proposal. * @param _proposalId of proposal to be closed. */ function closeProposal(uint _proposalId) external { uint category = allProposalData[_proposalId].category; uint _memberRole; if (allProposalData[_proposalId].dateUpd.add(maxDraftTime) <= now && allProposalData[_proposalId].propStatus < uint(ProposalStatus.VotingStarted)) { _updateProposalStatus(_proposalId, uint(ProposalStatus.Denied)); } else { require(canCloseProposal(_proposalId) == 1); (, _memberRole,,,,,) = proposalCategory.category(allProposalData[_proposalId].category); if (_memberRole == uint(IMemberRoles.Role.AdvisoryBoard)) { _closeAdvisoryBoardVote(_proposalId, category); } else { _closeMemberVote(_proposalId, category); } } } /** * @dev Claims reward for member. * @param _memberAddress to claim reward of. * @param _maxRecords maximum number of records to claim reward for. _proposals list of proposals of which reward will be claimed. * @return amount of pending reward. */ function claimReward(address _memberAddress, uint _maxRecords) external returns (uint pendingDAppReward) { uint voteId; address leader; uint lastUpd; require(msg.sender == ms.getLatestAddress("TC")); uint delegationId = followerDelegation[_memberAddress]; DelegateVote memory delegationData = allDelegation[delegationId]; if (delegationId > 0 && delegationData.leader != address(0)) { leader = delegationData.leader; lastUpd = delegationData.lastUpd; } else leader = _memberAddress; uint proposalId; uint totalVotes = allVotesByMember[leader].length; uint lastClaimed = totalVotes; uint j; uint i; for (i = lastRewardClaimed[_memberAddress]; i < totalVotes && j < _maxRecords; i++) { voteId = allVotesByMember[leader][i]; proposalId = allVotes[voteId].proposalId; if (proposalVoteTally[proposalId].voters > 0 && (allVotes[voteId].dateAdd > ( lastUpd.add(tokenHoldingTime)) || leader == _memberAddress)) { if (allProposalData[proposalId].propStatus > uint(ProposalStatus.VotingStarted)) { if (!rewardClaimed[voteId][_memberAddress]) { pendingDAppReward = pendingDAppReward.add( allProposalData[proposalId].commonIncentive.div( proposalVoteTally[proposalId].voters ) ); rewardClaimed[voteId][_memberAddress] = true; j++; } } else { if (lastClaimed == totalVotes) { lastClaimed = i; } } } } if (lastClaimed == totalVotes) { lastRewardClaimed[_memberAddress] = i; } else { lastRewardClaimed[_memberAddress] = lastClaimed; } if (j > 0) { emit RewardClaimed( _memberAddress, pendingDAppReward ); } } /** * @dev Undelegates the sender */ function unDelegate() external isMemberAndcheckPause checkPendingRewards { _unDelegate(msg.sender); } /** * @dev Triggers action of accepted proposal after waiting time is finished */ function triggerAction(uint _proposalId) external { require(proposalActionStatus[_proposalId] == uint(ActionStatus.Accepted) && proposalExecutionTime[_proposalId] <= now, "Cannot trigger"); _triggerAction(_proposalId, allProposalData[_proposalId].category); } /** * @dev Provides option to Advisory board member to reject proposal action execution within actionWaitingTime, if found suspicious */ function rejectAction(uint _proposalId) external { require(memberRole.checkRole(msg.sender, uint(IMemberRoles.Role.AdvisoryBoard))); require(proposalActionStatus[_proposalId] == uint(ActionStatus.Accepted)); require(!proposalRejectedByAB[_proposalId][msg.sender]); require( keccak256(proposalCategory.categoryActionHashes(allProposalData[_proposalId].category)) != keccak256(abi.encodeWithSignature("swapABMember(address,address)")) ); proposalRejectedByAB[_proposalId][msg.sender] = true; actionRejectedCount[_proposalId]++; emit ActionRejected(_proposalId, msg.sender); if (actionRejectedCount[_proposalId] == AB_MAJ_TO_REJECT_ACTION) { proposalActionStatus[_proposalId] = uint(ActionStatus.Rejected); } } /** * @dev Gets Uint Parameters of a code * @param code whose details we want * @return string value of the code * @return associated amount (time or perc or value) to the code */ function getUintParameters(bytes8 code) external view returns (bytes8 codeVal, uint val) { codeVal = code; if (code == "GOVHOLD") { val = tokenHoldingTime; } else if (code == "MAXFOL") { val = maxFollowers; } else if (code == "MAXDRFT") { val = maxDraftTime; } else if (code == "ACWT") { val = actionWaitingTime; } else if (code == "CATROLE") { val = roleIdAllowedToCatgorize; } else if (code == "MAXVTW") { val = maxVoteWeigthPer; } else if (code == "SPRESM") { val = specialResolutionMajPerc; } } /** * @dev Gets all details of a propsal * @param _proposalId whose details we want * @return proposalId * @return category * @return status * @return finalVerdict * @return totalReward */ function proposal(uint _proposalId) external view returns ( uint proposalId, uint category, uint status, uint finalVerdict, uint totalReward ) { return ( _proposalId, allProposalData[_proposalId].category, allProposalData[_proposalId].propStatus, allProposalData[_proposalId].finalVerdict, allProposalData[_proposalId].commonIncentive ); } /** * @dev Gets some details of a propsal * @param _proposalId whose details we want * @return proposalId * @return number of all proposal solutions * @return amount of votes */ function proposalDetails(uint _proposalId) external view returns (uint, uint, uint) { return ( _proposalId, allProposalSolutions[_proposalId].length, proposalVoteTally[_proposalId].voters ); } /** * @dev Gets solution action on a proposal * @param _proposalId whose details we want * @param _solution whose details we want * @return action of a solution on a proposal */ function getSolutionAction(uint _proposalId, uint _solution) external view returns (uint, bytes memory) { return ( _solution, allProposalSolutions[_proposalId][_solution] ); } /** * @dev Gets length of propsal * @return length of propsal */ function getProposalLength() external view returns (uint) { return totalProposals; } /** * @dev Get followers of an address * @return get followers of an address */ function getFollowers(address _add) external view returns (uint[] memory) { return leaderDelegation[_add]; } /** * @dev Gets pending rewards of a member * @param _memberAddress in concern * @return amount of pending reward */ function getPendingReward(address _memberAddress) public view returns (uint pendingDAppReward) { uint delegationId = followerDelegation[_memberAddress]; address leader; uint lastUpd; DelegateVote memory delegationData = allDelegation[delegationId]; if (delegationId > 0 && delegationData.leader != address(0)) { leader = delegationData.leader; lastUpd = delegationData.lastUpd; } else leader = _memberAddress; uint proposalId; for (uint i = lastRewardClaimed[_memberAddress]; i < allVotesByMember[leader].length; i++) { if (allVotes[allVotesByMember[leader][i]].dateAdd > ( lastUpd.add(tokenHoldingTime)) || leader == _memberAddress) { if (!rewardClaimed[allVotesByMember[leader][i]][_memberAddress]) { proposalId = allVotes[allVotesByMember[leader][i]].proposalId; if (proposalVoteTally[proposalId].voters > 0 && allProposalData[proposalId].propStatus > uint(ProposalStatus.VotingStarted)) { pendingDAppReward = pendingDAppReward.add( allProposalData[proposalId].commonIncentive.div( proposalVoteTally[proposalId].voters ) ); } } } } } /** * @dev Updates Uint Parameters of a code * @param code whose details we want to update * @param val value to set */ function updateUintParameters(bytes8 code, uint val) public { require(ms.checkIsAuthToGoverned(msg.sender)); if (code == "GOVHOLD") { tokenHoldingTime = val; } else if (code == "MAXFOL") { maxFollowers = val; } else if (code == "MAXDRFT") { maxDraftTime = val; } else if (code == "ACWT") { actionWaitingTime = val; } else if (code == "CATROLE") { roleIdAllowedToCatgorize = val; } else if (code == "MAXVTW") { maxVoteWeigthPer = val; } else if (code == "SPRESM") { specialResolutionMajPerc = val; } else { revert("Invalid code"); } } /** * @dev Updates all dependency addresses to latest ones from Master */ function changeDependentContractAddress() public { tokenInstance = ITokenController(ms.getLatestAddress("TC")); memberRole = IMemberRoles(ms.getLatestAddress("MR")); proposalCategory = IProposalCategory(ms.getLatestAddress("PC")); } /** * @dev Checks if msg.sender is allowed to create a proposal under given category */ function allowedToCreateProposal(uint category) public view returns (bool check) { if (category == 0) return true; uint[] memory mrAllowed; (,,,, mrAllowed,,) = proposalCategory.category(category); for (uint i = 0; i < mrAllowed.length; i++) { if (mrAllowed[i] == 0 || memberRole.checkRole(msg.sender, mrAllowed[i])) return true; } } /** * @dev Checks If the proposal voting time is up and it's ready to close * i.e. Closevalue is 1 if proposal is ready to be closed, 2 if already closed, 0 otherwise! * @param _proposalId Proposal id to which closing value is being checked */ function canCloseProposal(uint _proposalId) public view returns (uint) { uint dateUpdate; uint pStatus; uint _closingTime; uint _roleId; uint majority; pStatus = allProposalData[_proposalId].propStatus; dateUpdate = allProposalData[_proposalId].dateUpd; (, _roleId, majority, , , _closingTime,) = proposalCategory.category(allProposalData[_proposalId].category); if ( pStatus == uint(ProposalStatus.VotingStarted) ) { uint numberOfMembers = memberRole.numberOfMembers(_roleId); if (_roleId == uint(IMemberRoles.Role.AdvisoryBoard)) { if (proposalVoteTally[_proposalId].abVoteValue[1].mul(100).div(numberOfMembers) >= majority || proposalVoteTally[_proposalId].abVoteValue[1].add(proposalVoteTally[_proposalId].abVoteValue[0]) == numberOfMembers || dateUpdate.add(_closingTime) <= now) { return 1; } } else { if (numberOfMembers == proposalVoteTally[_proposalId].voters || dateUpdate.add(_closingTime) <= now) return 1; } } else if (pStatus > uint(ProposalStatus.VotingStarted)) { return 2; } else { return 0; } } /** * @dev Gets Id of member role allowed to categorize the proposal * @return roleId allowed to categorize the proposal */ function allowedToCatgorize() public view returns (uint roleId) { return roleIdAllowedToCatgorize; } /** * @dev Gets vote tally data * @param _proposalId in concern * @param _solution of a proposal id * @return member vote value * @return advisory board vote value * @return amount of votes */ function voteTallyData(uint _proposalId, uint _solution) public view returns (uint, uint, uint) { return (proposalVoteTally[_proposalId].memberVoteValue[_solution], proposalVoteTally[_proposalId].abVoteValue[_solution], proposalVoteTally[_proposalId].voters); } /** * @dev Internal call to create proposal * @param _proposalTitle of proposal * @param _proposalSD is short description of proposal * @param _proposalDescHash IPFS hash value of propsal * @param _categoryId of proposal */ function _createProposal( string memory _proposalTitle, string memory _proposalSD, string memory _proposalDescHash, uint _categoryId ) internal { require(proposalCategory.categoryABReq(_categoryId) == 0 || _categoryId == 0); uint _proposalId = totalProposals; allProposalData[_proposalId].owner = msg.sender; allProposalData[_proposalId].dateUpd = now; allProposalSolutions[_proposalId].push(""); totalProposals++; emit Proposal( msg.sender, _proposalId, now, _proposalTitle, _proposalSD, _proposalDescHash ); if (_categoryId > 0) _categorizeProposal(_proposalId, _categoryId, 0); } /** * @dev Internal call to categorize a proposal * @param _proposalId of proposal * @param _categoryId of proposal * @param _incentive is commonIncentive */ function _categorizeProposal( uint _proposalId, uint _categoryId, uint _incentive ) internal { require( _categoryId > 0 && _categoryId < proposalCategory.totalCategories(), "Invalid category" ); allProposalData[_proposalId].category = _categoryId; allProposalData[_proposalId].commonIncentive = _incentive; allProposalData[_proposalId].propStatus = uint(ProposalStatus.AwaitingSolution); emit ProposalCategorized(_proposalId, msg.sender, _categoryId); } /** * @dev Internal call to add solution to a proposal * @param _proposalId in concern * @param _action on that solution * @param _solutionHash string value */ function _addSolution(uint _proposalId, bytes memory _action, string memory _solutionHash) internal { allProposalSolutions[_proposalId].push(_action); emit Solution(_proposalId, msg.sender, allProposalSolutions[_proposalId].length - 1, _solutionHash, now); } /** * @dev Internal call to add solution and open proposal for voting */ function _proposalSubmission( uint _proposalId, string memory _solutionHash, bytes memory _action ) internal { uint _categoryId = allProposalData[_proposalId].category; if (proposalCategory.categoryActionHashes(_categoryId).length == 0) { require(keccak256(_action) == keccak256("")); proposalActionStatus[_proposalId] = uint(ActionStatus.NoAction); } _addSolution( _proposalId, _action, _solutionHash ); _updateProposalStatus(_proposalId, uint(ProposalStatus.VotingStarted)); (, , , , , uint closingTime,) = proposalCategory.category(_categoryId); emit CloseProposalOnTime(_proposalId, closingTime.add(now)); } /// @dev Internal call to submit vote /// /// @param _proposalId The id of the proposal that the user votes upon. /// @param _solution True if the vote is in favor of the proposal or false otherwise. /// @param includeManagedStakingPools Whether to include or not the staked nxm of the managed staking pools. function _submitVote( uint _proposalId, uint _solution, bool includeManagedStakingPools ) internal { require(allProposalData[_proposalId].propStatus == uint(Governance.ProposalStatus.VotingStarted), "Not allowed"); require(_solution < allProposalSolutions[_proposalId].length); uint delegationId = followerDelegation[msg.sender]; uint mrSequence; uint majority; uint closingTime; (, mrSequence, majority, , , closingTime,) = proposalCategory.category(allProposalData[_proposalId].category); require(allProposalData[_proposalId].dateUpd.add(closingTime) > now, "Closed"); require(memberProposalVote[msg.sender][_proposalId] == 0, "Not allowed"); require((delegationId == 0) || (delegationId > 0 && allDelegation[delegationId].leader == address(0) && _checkLastUpd(allDelegation[delegationId].lastUpd))); require(memberRole.checkRole(msg.sender, mrSequence), "Not Authorized"); uint totalVotes = allVotes.length; allVotesByMember[msg.sender].push(totalVotes); memberProposalVote[msg.sender][_proposalId] = totalVotes; allVotes.push(ProposalVote(msg.sender, _proposalId, now)); emit Vote(msg.sender, _proposalId, totalVotes, now, _solution); if (mrSequence == uint(IMemberRoles.Role.Owner)) { if (_solution == 1) _callIfMajReached(_proposalId, uint(ProposalStatus.Accepted), allProposalData[_proposalId].category, 1, IMemberRoles.Role.Owner); else _updateProposalStatus(_proposalId, uint(ProposalStatus.Rejected)); } else { uint numberOfMembers = memberRole.numberOfMembers(mrSequence); _setVoteTally(_proposalId, _solution, mrSequence, includeManagedStakingPools); if (mrSequence == uint(IMemberRoles.Role.AdvisoryBoard)) { if (proposalVoteTally[_proposalId].abVoteValue[1].mul(100).div(numberOfMembers) >= majority || (proposalVoteTally[_proposalId].abVoteValue[1].add(proposalVoteTally[_proposalId].abVoteValue[0])) == numberOfMembers) { emit VoteCast(_proposalId); } } else { if (numberOfMembers == proposalVoteTally[_proposalId].voters) emit VoteCast(_proposalId); } } } /** * @dev Internal call to set vote tally of a proposal * @param _proposalId of proposal in concern * @param _solution of proposal in concern * @param mrSequence number of members for a role */ function _setVoteTally( uint _proposalId, uint _solution, uint mrSequence, bool includeManagedStakingPools ) internal { uint categoryABReq; uint isSpecialResolution; (, categoryABReq, isSpecialResolution) = proposalCategory.categoryExtendedData(allProposalData[_proposalId].category); if (memberRole.checkRole(msg.sender, uint(IMemberRoles.Role.AdvisoryBoard)) && (categoryABReq > 0) || mrSequence == uint(IMemberRoles.Role.AdvisoryBoard)) { proposalVoteTally[_proposalId].abVoteValue[_solution]++; } tokenInstance.lockForMemberVote(msg.sender, tokenHoldingTime); if (mrSequence != uint(IMemberRoles.Role.AdvisoryBoard)) { uint tokenBalance = includeManagedStakingPools ? tokenInstance.totalBalanceOf(msg.sender) : tokenInstance.totalBalanceOfWithoutDelegations(msg.sender); uint totalSupply = tokenInstance.totalSupply(); uint voteWeight = tokenBalance.add(10 ** 18); // If it's not a special resolution, the vote weight is bounded by a percentage out of the total supply // which is defined by maxVoteWeigthPer. if (isSpecialResolution == 0) { uint boundedVoteWeight = _minOf(voteWeight, maxVoteWeigthPer.mul(totalSupply).div(100)); voteWeight = boundedVoteWeight; } proposalVoteTally[_proposalId].memberVoteValue[_solution] = proposalVoteTally[_proposalId].memberVoteValue[_solution].add(voteWeight); proposalVoteTally[_proposalId].voters += 1; } } /** * @dev Gets minimum of two numbers * @param a one of the two numbers * @param b one of the two numbers * @return minimum number out of the two */ function _minOf(uint a, uint b) internal pure returns (uint res) { res = a; if (res > b) res = b; } /** * @dev Check the time since last update has exceeded token holding time or not * @param _lastUpd is last update time * @return the bool which tells if the time since last update has exceeded token holding time or not */ function _checkLastUpd(uint _lastUpd) internal view returns (bool) { return (now - _lastUpd) > tokenHoldingTime; } /** * @dev Checks if the vote count against any solution passes the threshold value or not. */ function _checkForThreshold(uint _proposalId, uint _category) internal view returns (bool check) { uint categoryQuorumPerc; uint roleAuthorized; (, roleAuthorized, , categoryQuorumPerc, , ,) = proposalCategory.category(_category); check = ((proposalVoteTally[_proposalId].memberVoteValue[0] .add(proposalVoteTally[_proposalId].memberVoteValue[1])) .mul(100)) .div( tokenInstance.totalSupply().add( memberRole.numberOfMembers(roleAuthorized).mul(10 ** 18) ) ) >= categoryQuorumPerc; } /** * @dev Called when vote majority is reached * @param _proposalId of proposal in concern * @param _status of proposal in concern * @param category of proposal in concern * @param max vote value of proposal in concern */ function _callIfMajReached(uint _proposalId, uint _status, uint category, uint max, IMemberRoles.Role role) internal { allProposalData[_proposalId].finalVerdict = max; _updateProposalStatus(_proposalId, _status); emit ProposalAccepted(_proposalId); if (proposalActionStatus[_proposalId] != uint(ActionStatus.NoAction)) { if (role == IMemberRoles.Role.AdvisoryBoard) { _triggerAction(_proposalId, category); } else { proposalActionStatus[_proposalId] = uint(ActionStatus.Accepted); proposalExecutionTime[_proposalId] = actionWaitingTime.add(now); } } } /** * @dev Internal function to trigger action of accepted proposal */ function _triggerAction(uint _proposalId, uint _categoryId) internal { proposalActionStatus[_proposalId] = uint(ActionStatus.Executed); bytes2 contractName; address actionAddress; bytes memory _functionHash; (, actionAddress, contractName, , _functionHash) = proposalCategory.categoryActionDetails(_categoryId); if (contractName == "MS") { actionAddress = address(ms); } else if (contractName != "EX") { actionAddress = ms.getLatestAddress(contractName); } // solhint-disable-next-line avoid-low-level-calls (bool actionStatus, bytes memory result) = actionAddress.call( abi.encodePacked(_functionHash, allProposalSolutions[_proposalId][1]) ); if (!actionStatus) { uint length = result.length; // 0 length returned from empty revert() / require(false) require(length != 0, 'Action failed without revert reason'); assembly { revert(add(result, 0x20), length) } } emit ActionSuccess(_proposalId); } /** * @dev Internal call to update proposal status * @param _proposalId of proposal in concern * @param _status of proposal to set */ function _updateProposalStatus(uint _proposalId, uint _status) internal { if (_status == uint(ProposalStatus.Rejected) || _status == uint(ProposalStatus.Denied)) { proposalActionStatus[_proposalId] = uint(ActionStatus.NoAction); } allProposalData[_proposalId].dateUpd = now; allProposalData[_proposalId].propStatus = _status; } /** * @dev Internal call to undelegate a follower * @param _follower is address of follower to undelegate */ function _unDelegate(address _follower) internal { uint delegationId = followerDelegation[_follower]; DelegateVote memory delegation = allDelegation[delegationId]; if (delegation.leader != address(0)) { uint currentFollowerCount = followerCount[delegation.leader]; if (currentFollowerCount > 0) { followerCount[delegation.leader] = currentFollowerCount.sub(1); } allDelegation[delegationId].leader = address(0); allDelegation[delegationId].lastUpd = now; lastRewardClaimed[_follower] = allVotesByMember[_follower].length; } } /** * @dev Internal call to close member voting * @param _proposalId of proposal in concern * @param category of proposal in concern */ function _closeMemberVote(uint _proposalId, uint category) internal { uint isSpecialResolution; uint abMaj; (, abMaj, isSpecialResolution) = proposalCategory.categoryExtendedData(category); if (isSpecialResolution == 1) { uint acceptedVotePerc = proposalVoteTally[_proposalId].memberVoteValue[1].mul(100) .div( tokenInstance.totalSupply().add( memberRole.numberOfMembers(uint(IMemberRoles.Role.Member)).mul(10 ** 18) )); if (acceptedVotePerc >= specialResolutionMajPerc) { _callIfMajReached(_proposalId, uint(ProposalStatus.Accepted), category, 1, IMemberRoles.Role.Member); } else { _updateProposalStatus(_proposalId, uint(ProposalStatus.Denied)); } } else { if (_checkForThreshold(_proposalId, category)) { uint majorityVote; (,, majorityVote,,,,) = proposalCategory.category(category); if ( ((proposalVoteTally[_proposalId].memberVoteValue[1].mul(100)) .div(proposalVoteTally[_proposalId].memberVoteValue[0] .add(proposalVoteTally[_proposalId].memberVoteValue[1]) )) >= majorityVote ) { _callIfMajReached(_proposalId, uint(ProposalStatus.Accepted), category, 1, IMemberRoles.Role.Member); } else { _updateProposalStatus(_proposalId, uint(ProposalStatus.Rejected)); } } else { if (abMaj > 0 && proposalVoteTally[_proposalId].abVoteValue[1].mul(100) .div(memberRole.numberOfMembers(uint(IMemberRoles.Role.AdvisoryBoard))) >= abMaj) { _callIfMajReached(_proposalId, uint(ProposalStatus.Accepted), category, 1, IMemberRoles.Role.Member); } else { _updateProposalStatus(_proposalId, uint(ProposalStatus.Denied)); } } } if (proposalVoteTally[_proposalId].voters > 0) { tokenInstance.mint(ms.getLatestAddress("TC"), allProposalData[_proposalId].commonIncentive); } } /** * @dev Internal call to close advisory board voting * @param _proposalId of proposal in concern * @param category of proposal in concern */ function _closeAdvisoryBoardVote(uint _proposalId, uint category) internal { uint _majorityVote; IMemberRoles.Role _roleId = IMemberRoles.Role.AdvisoryBoard; (,, _majorityVote,,,,) = proposalCategory.category(category); if (proposalVoteTally[_proposalId].abVoteValue[1].mul(100) .div(memberRole.numberOfMembers(uint(_roleId))) >= _majorityVote) { _callIfMajReached(_proposalId, uint(ProposalStatus.Accepted), category, 1, _roleId); } else { _updateProposalStatus(_proposalId, uint(ProposalStatus.Denied)); } } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "../interfaces/ISAFURAMaster.sol"; contract LegacyMasterAware { ISAFURAMaster public ms; address public nxMasterAddress; modifier onlyInternal { require(ms.isInternal(msg.sender)); _; } modifier onlyGovernance { require(msg.sender == ms.getLatestAddress("GV")); _; } modifier isMemberAndcheckPause { require(ms.isPause() == false && ms.isMember(msg.sender) == true); _; } modifier checkPause { require(ms.isPause() == false); _; } /** * @dev change master address * @param _masterAddress is the new address */ function changeMasterAddress(address _masterAddress) public { if (address(ms) != address(0)) { require(address(ms) == msg.sender, "Not master"); } ms = ISAFURAMaster(_masterAddress); nxMasterAddress = _masterAddress; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IGovernance { event Proposal( address indexed proposalOwner, uint256 indexed proposalId, uint256 dateAdd, string proposalTitle, string proposalSD, string proposalDescHash ); event Solution( uint256 indexed proposalId, address indexed solutionOwner, uint256 indexed solutionId, string solutionDescHash, uint256 dateAdd ); event Vote( address indexed from, uint256 indexed proposalId, uint256 indexed voteId, uint256 dateAdd, uint256 solutionChosen ); event RewardClaimed( address indexed member, uint gbtReward ); /// @dev VoteCast event is called whenever a vote is cast that can potentially close the proposal. event VoteCast (uint256 proposalId); /// @dev ProposalAccepted event is called when a proposal is accepted so that a server can listen that can /// call any offchain actions event ProposalAccepted (uint256 proposalId); /// @dev CloseProposalOnTime event is called whenever a proposal is created or updated to close it on time. event CloseProposalOnTime ( uint256 indexed proposalId, uint256 time ); /// @dev ActionSuccess event is called whenever an onchain action is executed. event ActionSuccess ( uint256 proposalId ); struct DelegateVote { address follower; address leader; uint lastUpd; } /// @dev Creates a new proposal /// @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal /// @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective function createProposal( string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash, uint _categoryId ) external; /// @dev Edits the details of an existing proposal and creates new version /// @param _proposalId Proposal id that details needs to be updated /// @param _proposalDescHash Proposal description hash having long and short description of proposal. function updateProposal( uint _proposalId, string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash ) external; /// @dev Categorizes proposal to proceed further. Categories shows the proposal objective. function categorizeProposal( uint _proposalId, uint _categoryId, uint _incentives ) external; /// @dev Submit proposal with solution /// @param _proposalId Proposal id /// @param _solutionHash Solution hash contains parameters, values and description needed according to proposal function submitProposalWithSolution( uint _proposalId, string calldata _solutionHash, bytes calldata _action ) external; /// @dev Creates a new proposal with solution and votes for the solution /// @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal /// @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective /// @param _solutionHash Solution hash contains parameters, values and description needed according to proposal function createProposalwithSolution( string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash, uint _categoryId, string calldata _solutionHash, bytes calldata _action ) external; /// @dev Casts vote using total balance including delegated tokens via managed staking pools /// @param _proposalId Proposal id /// @param _solutionChosen solution chosen while voting function submitVote(uint _proposalId, uint _solutionChosen) external; /// @dev Casts vote using total balance without delegated tokens via managed staking pools /// @param _proposalId Proposal id /// @param _solutionChosen solution chosen while voting function submitVoteWithoutDelegations(uint _proposalId, uint _solutionChosen) external; function closeProposal(uint _proposalId) external; function tokenHoldingTime() external returns (uint); function claimReward(address _memberAddress, uint _maxRecords) external returns (uint pendingDAppReward); function proposal(uint _proposalId) external view returns ( uint proposalId, uint category, uint status, uint finalVerdict, uint totalReward ); function canCloseProposal(uint _proposalId) external view returns (uint closeValue); function allowedToCatgorize() external view returns (uint roleId); function getPendingReward(address _memberAddress) external view returns (uint pendingDAppReward); function getFollowers(address _add) external view returns (uint[] memory); function followerDelegation(address _add) external view returns (uint delegationId); function allDelegation(uint _delegationId) external view returns (address follower, address leader, uint lastUpd); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IMemberRoles { enum Role {Unassigned, AdvisoryBoard, Member, Owner, Auditor} function join(address _userAddress, uint nonce, bytes calldata signature) external payable; function switchMembership(address _newAddress) external; function switchMembershipAndAssets( address newAddress, uint[] calldata coverIds, uint[] calldata stakingTokenIds ) external; function switchMembershipOf(address member, address _newAddress) external; function totalRoles() external view returns (uint256); function changeAuthorized(uint _roleId, address _newAuthorized) external; function setKycAuthAddress(address _add) external; function members(uint _memberRoleId) external view returns (uint, address[] memory memberArray); function numberOfMembers(uint _memberRoleId) external view returns (uint); function authorized(uint _memberRoleId) external view returns (address); function roles(address _memberAddress) external view returns (uint[] memory); function checkRole(address _memberAddress, uint _roleId) external view returns (bool); function getMemberLengthForAllRoles() external view returns (uint[] memory totalMembers); function memberAtIndex(uint _memberRoleId, uint index) external view returns (address, bool); function membersLength(uint _memberRoleId) external view returns (uint); event MemberRole(uint256 indexed roleId, bytes32 roleName, string roleDescription); event MemberJoined(address indexed newMember, uint indexed nonce); event switchedMembership(address indexed previousMember, address indexed newMember, uint timeStamp); event MembershipWithdrawn(address indexed member, uint timestamp); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IProposalCategory { event Category( uint indexed categoryId, string categoryName, string actionHash ); function categoryABReq(uint) external view returns (uint); function isSpecialResolution(uint) external view returns (uint); function categoryActionHashes(uint) external view returns (bytes memory); function categoryExtendedData(uint _categoryId) external view returns (uint, uint, uint); /// @dev Adds new category /// @param _name Category name /// @param _memberRoleToVote Voting Layer sequence in which the voting has to be performed. /// @param _allowedToCreateProposal Member roles allowed to create the proposal /// @param _majorityVotePerc Majority Vote threshold for Each voting layer /// @param _quorumPerc minimum threshold percentage required in voting to calculate result /// @param _closingTime Vote closing time for Each voting layer /// @param _actionHash hash of details containing the action that has to be performed after proposal is accepted /// @param _contractAddress address of contract to call after proposal is accepted /// @param _contractName name of contract to be called after proposal is accepted /// @param _incentives rewards to distributed after proposal is accepted function addCategory( string calldata _name, uint _memberRoleToVote, uint _majorityVotePerc, uint _quorumPerc, uint[] calldata _allowedToCreateProposal, uint _closingTime, string calldata _actionHash, address _contractAddress, bytes2 _contractName, uint[] calldata _incentives ) external; /// @dev gets category details function category(uint _categoryId) external view returns ( uint categoryId, uint memberRoleToVote, uint majorityVotePerc, uint quorumPerc, uint[] memory allowedToCreateProposal, uint closingTime, uint minStake ); ///@dev gets category action details function categoryAction(uint _categoryId) external view returns ( uint categoryId, address contractAddress, bytes2 contractName, uint defaultIncentive ); function categoryActionDetails(uint _categoryId) external view returns (uint, address, bytes2, uint, bytes memory); /// @dev Gets Total number of categories added till now function totalCategories() external view returns (uint numberOfCategories); /// @dev Updates category details /// @param _categoryId Category id that needs to be updated /// @param _name Category name /// @param _memberRoleToVote Voting Layer sequence in which the voting has to be performed. /// @param _allowedToCreateProposal Member roles allowed to create the proposal /// @param _majorityVotePerc Majority Vote threshold for Each voting layer /// @param _quorumPerc minimum threshold percentage required in voting to calculate result /// @param _closingTime Vote closing time for Each voting layer /// @param _actionHash hash of details containing the action that has to be performed after proposal is accepted /// @param _contractAddress address of contract to call after proposal is accepted /// @param _contractName name of contract to be called after proposal is accepted /// @param _incentives rewards to distributed after proposal is accepted function updateCategory( uint _categoryId, string calldata _name, uint _memberRoleToVote, uint _majorityVotePerc, uint _quorumPerc, uint[] calldata _allowedToCreateProposal, uint _closingTime, string calldata _actionHash, address _contractAddress, bytes2 _contractName, uint[] calldata _incentives ) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface ISAFURAMaster { function tokenAddress() external view returns (address); function owner() external view returns (address); function emergencyAdmin() external view returns (address); function masterInitialized() external view returns (bool); function isInternal(address _add) external view returns (bool); function isPause() external view returns (bool check); function isMember(address _add) external view returns (bool); function checkIsAuthToGoverned(address _add) external view returns (bool); function getLatestAddress(bytes2 _contractName) external view returns (address payable contractAddress); function contractAddresses(bytes2 code) external view returns (address payable); function upgradeMultipleContracts( bytes2[] calldata _contractCodes, address payable[] calldata newAddresses ) external; function removeContracts(bytes2[] calldata contractCodesToRemove) external; function addNewInternalContracts( bytes2[] calldata _contractCodes, address payable[] calldata newAddresses, uint[] calldata _types ) external; function updateOwnerParameters(bytes8 code, address payable val) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface ISAFURAToken { function burn(uint256 amount) external returns (bool); function burnFrom(address from, uint256 value) external returns (bool); function operatorTransfer(address from, uint256 value) external returns (bool); function mint(address account, uint256 amount) external; function isLockedForMV(address member) external view returns (uint); function whiteListed(address member) external view returns (bool); function addToWhiteList(address _member) external returns (bool); function removeFromWhiteList(address _member) external returns (bool); function changeOperator(address _newOperator) external returns (bool); function lockForMemberVote(address _of, uint _days) external; /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "./ISAFURAToken.sol"; interface ITokenController { struct StakingPoolNXMBalances { uint128 rewards; uint128 deposits; } struct CoverInfo { uint16 claimCount; bool hasOpenClaim; bool hasAcceptedClaim; uint96 requestedPayoutAmount; // note: still 128 bits available here, can be used later } struct StakingPoolOwnershipOffer { address proposedManager; uint96 deadline; } function coverInfo(uint id) external view returns ( uint16 claimCount, bool hasOpenClaim, bool hasAcceptedClaim, uint96 requestedPayoutAmount ); function withdrawCoverNote( address _of, uint[] calldata _coverIds, uint[] calldata _indexes ) external; function changeOperator(address _newOperator) external; function operatorTransfer(address _from, address _to, uint _value) external returns (bool); function burnFrom(address _of, uint amount) external returns (bool); function addToWhitelist(address _member) external; function removeFromWhitelist(address _member) external; function mint(address _member, uint _amount) external; function lockForMemberVote(address _of, uint _days) external; function withdrawClaimAssessmentTokens(address[] calldata users) external; function getLockReasons(address _of) external view returns (bytes32[] memory reasons); function totalSupply() external view returns (uint); function totalBalanceOf(address _of) external view returns (uint amount); function totalBalanceOfWithoutDelegations(address _of) external view returns (uint amount); function getTokenPrice() external view returns (uint tokenPrice); function token() external view returns (ISAFURAToken); function getStakingPoolManager(uint poolId) external view returns (address manager); function getManagerStakingPools(address manager) external view returns (uint[] memory poolIds); function isStakingPoolManager(address member) external view returns (bool); function getStakingPoolOwnershipOffer(uint poolId) external view returns (address proposedManager, uint deadline); function transferStakingPoolsOwnership(address from, address to) external; function assignStakingPoolManager(uint poolId, address manager) external; function createStakingPoolOwnershipOffer(uint poolId, address proposedManager, uint deadline) external; function acceptStakingPoolOwnershipOffer(uint poolId) external; function cancelStakingPoolOwnershipOffer(uint poolId) external; function mintStakingPoolNXMRewards(uint amount, uint poolId) external; function burnStakingPoolNXMRewards(uint amount, uint poolId) external; function depositStakedNXM(address from, uint amount, uint poolId) external; function withdrawNXMStakeAndRewards(address to, uint stakeToWithdraw, uint rewardsToWithdraw, uint poolId) external; function burnStakedNXM(uint amount, uint poolId) external; function stakingPoolNXMBalances(uint poolId) external view returns(uint128 rewards, uint128 deposits); function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount); function getWithdrawableCoverNotes( address coverOwner ) external view returns ( uint[] memory coverIds, bytes32[] memory lockReasons, uint withdrawableAmount ); function getPendingRewards(address member) external view returns (uint); }
pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ActionFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"rejectedBy","type":"address"}],"name":"ActionRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ActionSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"CloseProposalOnTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proposalOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dateAdd","type":"uint256"},{"indexed":false,"internalType":"string","name":"proposalTitle","type":"string"},{"indexed":false,"internalType":"string","name":"proposalSD","type":"string"},{"indexed":false,"internalType":"string","name":"proposalDescHash","type":"string"}],"name":"Proposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"categorizedBy","type":"address"},{"indexed":false,"internalType":"uint256","name":"categoryId","type":"uint256"}],"name":"ProposalCategorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"member","type":"address"},{"indexed":false,"internalType":"uint256","name":"gbtReward","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"solutionOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"solutionId","type":"uint256"},{"indexed":false,"internalType":"string","name":"solutionDescHash","type":"string"},{"indexed":false,"internalType":"uint256","name":"dateAdd","type":"uint256"}],"name":"Solution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"voteId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dateAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"solutionChosen","type":"uint256"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"VoteCast","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allDelegation","outputs":[{"internalType":"address","name":"follower","type":"address"},{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"lastUpd","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"allowedToCatgorize","outputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"category","type":"uint256"}],"name":"allowedToCreateProposal","outputs":[{"internalType":"bool","name":"check","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"canCloseProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_categoryId","type":"uint256"},{"internalType":"uint256","name":"_incentive","type":"uint256"}],"name":"categorizeProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"changeDependentContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_masterAddress","type":"address"}],"name":"changeMasterAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_memberAddress","type":"address"},{"internalType":"uint256","name":"_maxRecords","type":"uint256"}],"name":"claimReward","outputs":[{"internalType":"uint256","name":"pendingDAppReward","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"closeProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_proposalTitle","type":"string"},{"internalType":"string","name":"_proposalSD","type":"string"},{"internalType":"string","name":"_proposalDescHash","type":"string"},{"internalType":"uint256","name":"_categoryId","type":"uint256"}],"name":"createProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_proposalTitle","type":"string"},{"internalType":"string","name":"_proposalSD","type":"string"},{"internalType":"string","name":"_proposalDescHash","type":"string"},{"internalType":"uint256","name":"_categoryId","type":"uint256"},{"internalType":"string","name":"_solutionHash","type":"string"},{"internalType":"bytes","name":"_action","type":"bytes"}],"name":"createProposalwithSolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"followerDelegation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"getFollowers","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_memberAddress","type":"address"}],"name":"getPendingReward","outputs":[{"internalType":"uint256","name":"pendingDAppReward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getProposalLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_solution","type":"uint256"}],"name":"getSolutionAction","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes8","name":"code","type":"bytes8"}],"name":"getUintParameters","outputs":[{"internalType":"bytes8","name":"codeVal","type":"bytes8"},{"internalType":"uint256","name":"val","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOpenForDelegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastRewardClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"memberProposalVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ms","outputs":[{"internalType":"contract ISAFURAMaster","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nxMasterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"proposal","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint256","name":"category","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"finalVerdict","type":"uint256"},{"internalType":"uint256","name":"totalReward","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalActionStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"proposalDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"proposalRejectedByAB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalVoteTally","outputs":[{"internalType":"uint256","name":"voters","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"rejectAction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"rewardClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"string","name":"_solutionHash","type":"string"},{"internalType":"bytes","name":"_action","type":"bytes"}],"name":"submitProposalWithSolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_solutionChosen","type":"uint256"}],"name":"submitVote","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_solutionChosen","type":"uint256"}],"name":"submitVoteWithoutDelegations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenHoldingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"}],"name":"triggerAction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unDelegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"string","name":"_proposalTitle","type":"string"},{"internalType":"string","name":"_proposalSD","type":"string"},{"internalType":"string","name":"_proposalDescHash","type":"string"}],"name":"updateProposal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes8","name":"code","type":"bytes8"},{"internalType":"uint256","name":"val","type":"uint256"}],"name":"updateUintParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_proposalId","type":"uint256"},{"internalType":"uint256","name":"_solution","type":"uint256"}],"name":"voteTallyData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c80636f93bfb711610130578063bcc81c0c116100b8578063d98db80d1161007c578063d98db80d14610aef578063e0429d0914610b12578063e3b34c8814610b38578063eeff918814610c4d578063f17a3bec14610c6a57610232565b8063bcc81c0c146109f3578063c2fe202214610a10578063c5d2eade14610a86578063d46655f414610aa3578063d5950ad114610ac957610232565b80639dd86e0f116100ff5780639dd86e0f146109365780639ed1c7db14610963578063a0b2d57f14610980578063aaf86c30146109a4578063bb73c562146109ac57610232565b80636f93bfb7146108205780637287078614610843578063787112a6146109085780638263a9381461092e57610232565b80631eef225c116101be5780634c15676b116101825780634c15676b1461064c5780634df9d6ba1461075a57806353fb6c5c146107805780636122f840146107ac5780636edde0bd146107f757610232565b80631eef225c146105355780632b4b16b11461053d5780632f54243a1461055a57806330326c17146105fc57806339bb96071461064457610232565b80630fec1dec116102055780630fec1dec146102dc57806316e9eaec1461031d57806316fdc34e1461033a578063174e31c4146104ec5780631d35ab491461051857610232565b80630386a01614610237578063060225f6146102565780630852a6e3146102945780630ea9c984146102d4575b600080fd5b6102546004803603602081101561024d57600080fd5b5035610c72565b005b6102826004803603604081101561026c57600080fd5b506001600160a01b038135169060200135610e57565b60408051918252519081900360200190f35b6102c0600480360360408110156102aa57600080fd5b50803590602001356001600160a01b0316610e74565b604080519115158252519081900360200190f35b610254610e94565b6102ff600480360360408110156102f257600080fd5b508035906020013561104e565b60408051938452602084019290925282820152519081900360600190f35b6102ff6004803603602081101561033357600080fd5b5035611082565b610254600480360360c081101561035057600080fd5b810190602081018135600160201b81111561036a57600080fd5b82018360208201111561037c57600080fd5b803590602001918460018302840111600160201b8311171561039d57600080fd5b919390929091602081019035600160201b8111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460018302840111600160201b831117156103ed57600080fd5b919390929091602081019035600160201b81111561040a57600080fd5b82018360208201111561041c57600080fd5b803590602001918460018302840111600160201b8311171561043d57600080fd5b91939092823592604081019060200135600160201b81111561045e57600080fd5b82018360208201111561047057600080fd5b803590602001918460018302840111600160201b8311171561049157600080fd5b919390929091602081019035600160201b8111156104ae57600080fd5b8201836020820111156104c057600080fd5b803590602001918460018302840111600160201b831117156104e157600080fd5b5090925090506110a7565b6102826004803603604081101561050257600080fd5b506001600160a01b03813516906020013561124c565b6102826004803603602081101561052e57600080fd5b503561164a565b61025461165c565b6102546004803603602081101561055357600080fd5b50356117b8565b61057d6004803603604081101561057057600080fd5b5080359060200135611a9a565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105c05781810151838201526020016105a8565b50505050905090810190601f1680156105ed5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6106196004803603602081101561061257600080fd5b5035611b5d565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610282611b86565b6102546004803603608081101561066257600080fd5b810190602081018135600160201b81111561067c57600080fd5b82018360208201111561068e57600080fd5b803590602001918460018302840111600160201b831117156106af57600080fd5b919390929091602081019035600160201b8111156106cc57600080fd5b8201836020820111156106de57600080fd5b803590602001918460018302840111600160201b831117156106ff57600080fd5b919390929091602081019035600160201b81111561071c57600080fd5b82018360208201111561072e57600080fd5b803590602001918460018302840111600160201b8311171561074f57600080fd5b919350915035611b8c565b6102826004803603602081101561077057600080fd5b50356001600160a01b0316611d3d565b6102c06004803603604081101561079657600080fd5b50803590602001356001600160a01b0316611fed565b6107d3600480360360208110156107c257600080fd5b50356001600160c01b03191661200d565b604080516001600160c01b0319909316835260208301919091528051918290030190f35b6102546004803603606081101561080d57600080fd5b508035906020810135906040013561210e565b6102546004803603604081101561083657600080fd5b50803590602001356121fb565b6102546004803603606081101561085957600080fd5b81359190810190604081016020820135600160201b81111561087a57600080fd5b82018360208201111561088c57600080fd5b803590602001918460018302840111600160201b831117156108ad57600080fd5b919390929091602081019035600160201b8111156108ca57600080fd5b8201836020820111156108dc57600080fd5b803590602001918460018302840111600160201b831117156108fd57600080fd5b50909250905061220b565b6102826004803603602081101561091e57600080fd5b50356001600160a01b0316612300565b610282612312565b6102546004803603604081101561094c57600080fd5b506001600160c01b03198135169060200135612319565b6102c06004803603602081101561097957600080fd5b50356124d9565b610988612710565b604080516001600160a01b039092168252519081900360200190f35b61028261271f565b6109c9600480360360208110156109c257600080fd5b5035612725565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b61028260048036036020811015610a0957600080fd5b5035612762565b610a3660048036036020811015610a2657600080fd5b50356001600160a01b0316612a7d565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a72578181015183820152602001610a5a565b505050509050019250505060405180910390f35b61025460048036036020811015610a9c57600080fd5b5035612ae9565b61025460048036036020811015610ab957600080fd5b50356001600160a01b0316612b74565b6102c060048036036020811015610adf57600080fd5b50356001600160a01b0316612bfd565b61025460048036036040811015610b0557600080fd5b5080359060200135612c12565b61028260048036036020811015610b2857600080fd5b50356001600160a01b0316612c1e565b61025460048036036080811015610b4e57600080fd5b81359190810190604081016020820135600160201b811115610b6f57600080fd5b820183602082011115610b8157600080fd5b803590602001918460018302840111600160201b83111715610ba257600080fd5b919390929091602081019035600160201b811115610bbf57600080fd5b820183602082011115610bd157600080fd5b803590602001918460018302840111600160201b83111715610bf257600080fd5b919390929091602081019035600160201b811115610c0f57600080fd5b820183602082011115610c2157600080fd5b803590602001918460018302840111600160201b83111715610c4257600080fd5b509092509050612c30565b61028260048036036020811015610c6357600080fd5b5035612de3565b610988612df8565b60008181526004602081905260408220600281015460165491909201549192914291610ca4919063ffffffff612e0716565b11158015610cc057506002600084815260046020526040902054105b15610cd657610cd18360065b612e6a565b610e52565b610cdf83612762565b600114610ceb57600080fd5b601854600084815260046020819052604080832060020154815163253eca1f60e01b815292830152516001600160a01b039093169263253eca1f92602480840193919291829003018186803b158015610d4357600080fd5b505afa158015610d57573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015610d8057600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115610dba57600080fd5b908301906020820185811115610dcf57600080fd5b82518660208202830111600160201b82111715610deb57600080fd5b82525081516020918201928201910280838360005b83811015610e18578181015183820152602001610e00565b50505050919091016040525095975060019650610e3795505050505050565b811415610e4857610cd18383612ead565b610e5283836130c3565b505050565b600860209081526000928352604080842090915290825290205481565b601c60209081526000928352604080842090915290825290205460ff1681565b600054604080516227050b60e31b815261544360f01b600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b158015610ee357600080fd5b505afa158015610ef7573d6000803e3d6000fd5b505050506040513d6020811015610f0d57600080fd5b5051601980546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526126a960f11b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610f7257600080fd5b505afa158015610f86573d6000803e3d6000fd5b505050506040513d6020811015610f9c57600080fd5b5051601780546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261504360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561100157600080fd5b505afa158015611015573d6000803e3d6000fd5b505050506040513d602081101561102b57600080fd5b5051601880546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600c60208181526040808420948452848252808420546001860183529084205495909352526002909101549092565b600081815260056020908152604080832054600c909252909120600201549192909190565b846110b1816124d9565b6110f0576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b601554604080516020601f8f018190048102820181019092528d81526111bc918f908f9081908401838280828437600081840152601f19601f820116905080830192505050505050508c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506135f2915050565b600087116111c957600080fd5b61123d8187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525061387a92505050565b50505050505050505050505050565b60008054604080516227050b60e31b815261544360f01b600482015290518392839283926001600160a01b0390921691630138285891602480820192602092909190829003018186803b1580156112a257600080fd5b505afa1580156112b6573d6000803e3d6000fd5b505050506040513d60208110156112cc57600080fd5b50516001600160a01b031633146112e257600080fd5b6001600160a01b038616600090815260096020526040902054611303615319565b6003828154811061131057fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b039081168452600182015416938301939093526002909201549181019190915290508115801590611373575060208101516001600160a01b031615155b1561138b57806020015193508060400151925061138f565b8793505b6001600160a01b03808516600090815260066020908152604080832054938c168352600e909152812054909190819083905b83811080156113cf57508b82105b156115b0576001600160a01b03891660009081526006602052604090208054829081106113f857fe5b9060005260206000200154995060028a8154811061141257fe5b90600052602060002090600302016001015494506000600c600087815260200190815260200160002060020154118015611497575060105461145b90899063ffffffff612e0716565b60028b8154811061146857fe5b906000526020600020906003020160020154118061149757508c6001600160a01b0316896001600160a01b0316145b156115a8576002600086815260046020526040902054111561159c57600760008b815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff16611597576000858152600c602090815260408083206002015460049092529091206003015461153d91611530919063ffffffff613bad16565b8c9063ffffffff612e0716565b9a506001600760008c815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555081806001019250505b6115a8565b838314156115a8578092505b6001016113c1565b838314156115d8576001600160a01b038d166000908152600e602052604090208190556115f4565b6001600160a01b038d166000908152600e602052604090208390555b811561163a57604080518c815290516001600160a01b038f16917f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241919081900360200190a25b5050505050505050505092915050565b601a6020526000908152604090205481565b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156116a957600080fd5b505afa1580156116bd573d6000803e3d6000fd5b505050506040513d60208110156116d357600080fd5b505115801561175a57506000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b15801561172857600080fd5b505afa15801561173c573d6000803e3d6000fd5b505050506040513d602081101561175257600080fd5b505115156001145b61176357600080fd5b61176c33611d3d565b156117ad576040805162461bcd60e51b815260206004820152600c60248201526b10db185a5b481c995dd85c9960a21b604482015290519081900360640190fd5b6117b633613bef565b565b6017546040805163505ef22f60e01b81523360048201526001602482015290516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b15801561180a57600080fd5b505afa15801561181e573d6000803e3d6000fd5b505050506040513d602081101561183457600080fd5b505161183f57600080fd5b60016000828152601a60205260409020541461185a57600080fd5b6000818152601c6020908152604080832033845290915290205460ff161561188157600080fd5b60408051600480825260248083018452602080840180516001600160e01b0316630c578f2360e41b17815293519093206018546000878152948490528585206002015486516357c7bec160e01b815294850152945190946001600160a01b0316936357c7bec1938084019391929190829003018186803b15801561190457600080fd5b505afa158015611918573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561194157600080fd5b8101908080516040519392919084600160201b82111561196057600080fd5b90830190602082018581111561197557600080fd5b8251600160201b81118282018810171561198e57600080fd5b82525081516020918201929091019080838360005b838110156119bb5781810151838201526020016119a3565b50505050905090810190601f1680156119e85780820380516001836020036101000a031916815260200191505b50604052505050805190602001201415611a0157600080fd5b6000818152601c6020908152604080832033808552908352818420805460ff19166001908117909155858552601d845293829020805490940190935580519283525183927f56bdda336a8bb949a57770a7cde5b62bd8913d11d9dde767735db889a609692f92908290030190a26000818152601d602052604090205460031415611a975760026000828152601a60205260409020555b50565b60008281526005602052604081208054606091849182908110611ab957fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529192839190830182828015611b4b5780601f10611b2057610100808354040283529160200191611b4b565b820191906000526020600020905b815481529060010190602001808311611b2e57829003601f168201915b50505050509050915091509250929050565b600081815260046020526040902060028101548154600183015460039093015493949193909291565b60105481565b80611b96816124d9565b611bd5576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b158015611c2057600080fd5b505afa158015611c34573d6000803e3d6000fd5b505050506040513d6020811015611c4a57600080fd5b5051611c8a576040805162461bcd60e51b815260206004820152600a6024820152692737ba1026b2b6b132b960b11b604482015290519081900360640190fd5b611d3388888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152508892506135f2915050565b5050505050505050565b6001600160a01b0381166000908152600960205260408120548180611d60615319565b60038481548110611d6d57fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b039081168452600182015416938301939093526002909201549181019190915290508315801590611dd0575060208101516001600160a01b031615155b15611de8578060200151925080604001519150611dec565b8592505b6001600160a01b0386166000908152600e60205260408120545b6001600160a01b038516600090815260066020526040902054811015611fe257601054611e3a90859063ffffffff612e0716565b6001600160a01b038616600090815260066020526040902080546002919084908110611e6257fe5b906000526020600020015481548110611e7757fe5b9060005260206000209060030201600201541180611ea65750876001600160a01b0316856001600160a01b0316145b15611fda576001600160a01b03851660009081526006602052604081208054600792919084908110611ed457fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b038c16825290925290205460ff16611fda576001600160a01b038516600090815260066020526040902080546002919083908110611f3357fe5b906000526020600020015481548110611f4857fe5b90600052602060002090600302016001015491506000600c600084815260200190815260200160002060020154118015611f9057506002600083815260046020526040902054115b15611fda576000828152600c6020908152604080832060020154600490925290912060030154611fd791611fca919063ffffffff613bad16565b889063ffffffff612e0716565b96505b600101611e06565b505050505050919050565b600760209081526000928352604080842090915290825290205460ff1681565b8060006611d3d59213d31160ca1b6001600160c01b0319831614156120355750601054612109565b651350561193d360d21b6001600160c01b0319841614156120595750601454612109565b661350561114919560ca1b6001600160c01b03198416141561207e5750601654612109565b631050d5d560e21b6001600160c01b0319841614156120a05750601f54612109565b66434154524f4c4560c81b6001600160c01b0319841614156120c55750601154612109565b654d415856545760d01b6001600160c01b0319841614156120e95750601254612109565b6553505245534d60d01b6001600160c01b03198416141561210957506013545b915091565b8260026000828152600460205260409020541061212a57600080fd5b6017546011546040805163505ef22f60e01b81523360048201526024810192909252516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b15801561217f57600080fd5b505afa158015612193573d6000803e3d6000fd5b505050506040513d60208110156121a957600080fd5b50516121ea576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6121f5848484613d48565b50505050565b61220782826001613e71565b5050565b60008581526004602052604090206005015485906001600160a01b03163314612269576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b60016000878152600460205260409020541461228457600080fd5b6122f88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a01819004810282018101909252888152925088915087908190840183828082843760009201919091525061387a92505050565b505050505050565b60096020526000908152604090205481565b6015545b90565b60005460408051632c1a733d60e11b815233600482015290516001600160a01b0390921691635834e67a91602480820192602092909190829003018186803b15801561236457600080fd5b505afa158015612378573d6000803e3d6000fd5b505050506040513d602081101561238e57600080fd5b505161239957600080fd5b6611d3d59213d31160ca1b6001600160c01b0319831614156123bf576010819055612207565b651350561193d360d21b6001600160c01b0319831614156123e4576014819055612207565b661350561114919560ca1b6001600160c01b03198316141561240a576016819055612207565b631050d5d560e21b6001600160c01b03198316141561242d57601f819055612207565b66434154524f4c4560c81b6001600160c01b031983161415612453576011819055612207565b654d415856545760d01b6001600160c01b031983161415612478576012819055612207565b6553505245534d60d01b6001600160c01b03198316141561249d576013819055612207565b6040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b6000816124e85750600161270b565b6018546040805163253eca1f60e01b81526004810185905290516060926001600160a01b03169163253eca1f916024808301926000929190829003018186803b15801561253457600080fd5b505afa158015612548573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561257157600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156125ab57600080fd5b9083019060208201858111156125c057600080fd5b82518660208202830111600160201b821117156125dc57600080fd5b82525081516020918201928201910280838360005b838110156126095781810151838201526020016125f1565b505050509190910160405250929750600096505050505050505b81518110156127085781818151811061263857fe5b6020026020010151600014806126f0575060175482516001600160a01b039091169063505ef22f90339085908590811061266e57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156126c357600080fd5b505afa1580156126d7573d6000803e3d6000fd5b505050506040513d60208110156126ed57600080fd5b50515b156127005760019250505061270b565b600101612623565b50505b919050565b6000546001600160a01b031681565b60115490565b6003818154811061273257fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935091169083565b6000818152600460208190526040808320805481840154601854600290930154845163253eca1f60e01b8152958601529251929390928592839283926001600160a01b039092169163253eca1f916024808201928692909190829003018186803b1580156127cf57600080fd5b505afa1580156127e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561280c57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b82111561284657600080fd5b90830190602082018581111561285b57600080fd5b82518660208202830111600160201b8211171561287757600080fd5b82525081516020918201928201910280838360005b838110156128a457818101518382015260200161288c565b505050509190910160405250602001519950949750929550600294506128ca9350505050565b841415612a4e5760175460408051630dc6f84760e01b81526004810185905290516000926001600160a01b031691630dc6f847916024808301926020929190829003018186803b15801561291d57600080fd5b505afa158015612931573d6000803e3d6000fd5b505050506040513d602081101561294757600080fd5b505190506001831415612a06576000888152600c60209081526040808320600180855201909152902054829061299690839061298a90606463ffffffff61457416565b9063ffffffff613bad16565b1015806129d357506000888152600c602090815260408083208380526001908101909252808320549183529091205482916129d19190612e07565b145b806129ed5750426129ea878663ffffffff612e0716565b11155b15612a01576001965050505050505061270b565b612a48565b6000888152600c6020526040902060020154811480612a34575042612a31878663ffffffff612e0716565b11155b15612a48576001965050505050505061270b565b50612a73565b6002841115612a655760029550505050505061270b565b60009550505050505061270b565b5050505050919050565b6001600160a01b0381166000908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015612add57602002820191906000526020600020905b815481526020019060010190808311612ac9575b50505050509050919050565b60016000828152601a6020526040902054148015612b1557506000818152601b60205260409020544210155b612b57576040805162461bcd60e51b815260206004820152600e60248201526d21b0b73737ba103a3934b3b3b2b960911b604482015290519081900360640190fd5b600081815260046020526040902060020154611a979082906145cd565b6000546001600160a01b031615612bd1576000546001600160a01b03163314612bd1576040805162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015290519081900360640190fd5b600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b600d6020526000908152604090205460ff1681565b61220782826000613e71565b600e6020526000908152604090205481565b60008781526004602052604090206005015487906001600160a01b03163314612c8e576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b600088815260056020526040902054600211612cdf576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b600088815260046020908152604080832083815560028101849055600381019390935560059092015482514280825260809382018481529382018b90528c946001600160a01b03909316937f470106408ef1beec24fa0f364830357ef2a70d11457aa4eb9b30b1bbc0172abe9391928d928d928d928d928d928d929182016060830160a084018a8a80828437600083820152601f01601f191690910185810384528881526020019050888880828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039c50909a5050505050505050505050a35050505050505050565b600c6020526000908152604090206002015481565b6001546001600160a01b031681565b600082820183811015612e61576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6004811480612e795750600681145b15612e905760046000838152601a60205260409020555b600091825260046020819052604090922042928101929092559055565b6018546040805163253eca1f60e01b81526004810184905290516000926001926001600160a01b039091169163253eca1f916024808201928792909190829003018186803b158015612efe57600080fd5b505afa158015612f12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015612f3b57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115612f7557600080fd5b908301906020820185811115612f8a57600080fd5b82518660208202830111600160201b82111715612fa657600080fd5b82525081516020918201928201910280838360005b83811015612fd3578181015183820152602001612fbb565b5050505091909101604052505060175494985088965061309f9550506001600160a01b039093169250630dc6f8479150859050600481111561301157fe5b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561304557600080fd5b505afa158015613059573d6000803e3d6000fd5b505050506040513d602081101561306f57600080fd5b50516000878152600c6020908152604080832060018085520190915290205461298a90606463ffffffff61457416565b106130b8576130b384600385600185614a19565b6121f5565b6121f5846006610ccc565b601854604080516307149ba360e01b815260048101849052905160009283926001600160a01b03909116916307149ba391602480820192606092909190829003018186803b15801561311457600080fd5b505afa158015613128573d6000803e3d6000fd5b505050506040513d606081101561313e57600080fd5b5060208101516040909101519250905060018214156132d3576017546000906132a190613275906131ef90670de0b6b3a7640000906001600160a01b0316630dc6f84760026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156131b757600080fd5b505afa1580156131cb573d6000803e3d6000fd5b505050506040513d60208110156131e157600080fd5b50519063ffffffff61457416565b601960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561323d57600080fd5b505afa158015613251573d6000803e3d6000fd5b505050506040513d602081101561326757600080fd5b50519063ffffffff612e0716565b6000878152600c602090815260408083206001845290915290205461298a90606463ffffffff61457416565b905060135481106132c2576132bd8560035b8660016002614a19565b6132cd565b6132cd856006610ccc565b506134e4565b6132dd8484614add565b15613493576018546040805163253eca1f60e01b81526004810186905290516000926001600160a01b03169163253eca1f9160248083019286929190829003018186803b15801561332d57600080fd5b505afa158015613341573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561336a57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156133a457600080fd5b9083019060208201858111156133b957600080fd5b82518660208202830111600160201b821117156133d557600080fd5b82525081516020918201928201910280838360005b838110156134025781810151838201526020016133ea565b5050505091909101604090815260008f8152600c60209081528282206001835290528181205481805291902054979a508a9950613478985061344c979650945050612e0792505050565b6000888152600c602090815260408083206001845290915290205461298a90606463ffffffff61457416565b10613488576132bd8560036132b3565b6132cd856004610ccc565b6000811180156134bf575060175481906134bc906001600160a01b0316630dc6f8476001613011565b10155b156134d9576134d48460038560016002614a19565b6134e4565b6134e4846006610ccc565b6000848152600c6020526040902060020154156121f557601954600054604080516227050b60e31b815261544360f01b600482015290516001600160a01b03938416936340c10f199316916301382858916024808301926020929190829003018186803b15801561355457600080fd5b505afa158015613568573d6000803e3d6000fd5b505050506040513d602081101561357e57600080fd5b505160008781526004602081905260408083206003015481516001600160e01b031960e088901b1681526001600160a01b039095169285019290925260248401919091525160448084019382900301818387803b1580156135de57600080fd5b505af1158015611d33573d6000803e3d6000fd5b60185460408051637800529760e01b81526004810184905290516001600160a01b0390921691637800529791602480820192602092909190829003018186803b15801561363e57600080fd5b505afa158015613652573d6000803e3d6000fd5b505050506040513d602081101561366857600080fd5b50511580613674575080155b61367d57600080fd5b6015546000818152600460208181526040808420600580820180546001600160a01b031916331790554291909401559181528183208054600181018083559185528285208451938401948590529285905290936136df93929091019190615339565b50506015805460010190556040805142808252608060208084018281528a51928501929092528951869533957f470106408ef1beec24fa0f364830357ef2a70d11457aa4eb9b30b1bbc0172abe95948d948d948d94840191606085019160a086019189019080838360005b8381101561376257818101518382015260200161374a565b50505050905090810190601f16801561378f5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b838110156137c25781810151838201526020016137aa565b50505050905090810190601f1680156137ef5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101561382257818101518382015260200161380a565b50505050905090810190601f16801561384f5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a381156138735761387381836000613d48565b5050505050565b60008381526004602081905260408083206002015460185482516357c7bec160e01b8152938401829052915190936001600160a01b03909216926357c7bec1926024808301939192829003018186803b1580156138d657600080fd5b505afa1580156138ea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561391357600080fd5b8101908080516040519392919084600160201b82111561393257600080fd5b90830190602082018581111561394757600080fd5b8251600160201b81118282018810171561396057600080fd5b82525081516020918201929091019080838360005b8381101561398d578181015183820152602001613975565b50505050905090810190601f1680156139ba5780820380516001836020036101000a031916815260200191505b506040525050505160001415613a0e57815160208301207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470146139fc57600080fd5b60046000858152601a60205260409020555b613a19848385614cc6565b613a24846002610ccc565b6018546040805163253eca1f60e01b81526004810184905290516000926001600160a01b03169163253eca1f9160248083019286929190829003018186803b158015613a6f57600080fd5b505afa158015613a83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015613aac57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115613ae657600080fd5b908301906020820185811115613afb57600080fd5b82518660208202830111600160201b82111715613b1757600080fd5b82525081516020918201928201910280838360005b83811015613b44578181015183820152602001613b2c565b5050505091909101604052506020015197508b96507fc5be51db6c7799c3f641eecd22b62761981da3190ac6d1d306bc3672435662589550613b9594508793504292505063ffffffff612e07169050565b60408051918252519081900360200190a25050505050565b6000612e6183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614dc7565b6001600160a01b038116600090815260096020526040902054613c10615319565b60038281548110613c1d57fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b0390811684526001820154169383018490526002015490820152915015610e52576020808201516001600160a01b03166000908152600a90915260409020548015613cb857613c9981600163ffffffff614e6916565b6020808401516001600160a01b03166000908152600a90915260409020555b600060038481548110613cc757fe5b906000526020600020906003020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260038481548110613d0a57fe5b60009182526020808320600260039093020191909101929092556001600160a01b038616815260068252604080822054600e90935290205550505050565b600082118015613dd05750601860009054906101000a90046001600160a01b03166001600160a01b03166339275b0a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613da157600080fd5b505afa158015613db5573d6000803e3d6000fd5b505050506040513d6020811015613dcb57600080fd5b505182105b613e14576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642063617465676f727960801b604482015290519081900360640190fd5b60008381526004602090815260409182902060028101859055600381018490556001905581518481529151339286927f5c0ed4086100f9e2c57a36b2c5ae3a1f991b2fd6af5a44cf0b9afb8a21796cdc92918290030190a3505050565b600260008481526004602052604090205414613ec2576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6000838152600560205260409020548210613edc57600080fd5b3360009081526009602090815260408083205460185487855260049384905282852060020154835163253eca1f60e01b8152948501529151909392839283926001600160a01b039091169163253eca1f9160248083019286929190829003018186803b158015613f4b57600080fd5b505afa158015613f5f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015613f8857600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115613fc257600080fd5b908301906020820185811115613fd757600080fd5b82518660208202830111600160201b82111715613ff357600080fd5b82525081516020918201928201910280838360005b83811015614020578181015183820152602001614008565b5050505090500160405260200180519060200190929190805190602001909291905050509091929394955090919250909150508093508194508295505050504261408982600460008b815260200190815260200160002060040154612e0790919063ffffffff16565b116140c4576040805162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b604482015290519081900360640190fd5b3360009081526008602090815260408083208a84529091529020541561411f576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b8315806141975750600084118015614169575060006001600160a01b03166003858154811061414a57fe5b60009182526020909120600160039092020101546001600160a01b0316145b801561419757506141976003858154811061418057fe5b906000526020600020906003020160020154614eab565b6141a057600080fd5b6017546040805163505ef22f60e01b81523360048201526024810186905290516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b1580156141f257600080fd5b505afa158015614206573d6000803e3d6000fd5b505050506040513d602081101561421c57600080fd5b5051614260576040805162461bcd60e51b815260206004820152600e60248201526d139bdd08105d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6002805433600081815260066020908152604080832080546001808201835591855283852001869055848452600883528184208e8552835281842086905581516060810183528581528084018f8152428285018181528a549485018b559990965290517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600390930292830180546001600160a01b0319166001600160a01b03909216919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015595517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad090960195909555845191825281018a90528351929384938c93927f89eb0be5e1a1bcbad3c382ad8d3f2698ea4d54d9a179cd2368d184358ecad45192908290030190a460038414156143dc5786600114156143cc576143c788600360008b81526004602052604090206002015460016003614a19565b6143d7565b6143d7886004610ccc565b611d33565b60175460408051630dc6f84760e01b81526004810187905290516000926001600160a01b031691630dc6f847916024808301926020929190829003018186803b15801561442857600080fd5b505afa15801561443c573d6000803e3d6000fd5b505050506040513d602081101561445257600080fd5b505190506144628989878a614eb7565b600185141561451c576000898152600c6020908152604080832060018085520190915290205484906144a190839061298a90606463ffffffff61457416565b1015806144de57506000898152600c602090815260408083208380526001908101909252808320549183529091205482916144dc9190612e07565b145b1561451757604080518a815290517f9593d9bd30eff4872ec3bab10360ad82eaac80651801e68f47f0674c38415c3d9181900360200190a15b614569565b6000898152600c602052604090206002015481141561456957604080518a815290517f9593d9bd30eff4872ec3bab10360ad82eaac80651801e68f47f0674c38415c3d9181900360200190a15b505050505050505050565b60008261458357506000612e64565b8282028284828161459057fe5b0414612e615760405162461bcd60e51b81526004018080602001828103825260218152602001806153f56021913960400191505060405180910390fd5b6000828152601a602052604080822060039055601854815163352aabed60e21b815260048101859052915183926060926001600160a01b03169163d4aaafb4916024808201928792909190829003018186803b15801561462c57600080fd5b505afa158015614640573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260a081101561466957600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156146a357600080fd5b9083019060208201858111156146b857600080fd5b8251600160201b8111828201881017156146d157600080fd5b82525081516020918201929091019080838360005b838110156146fe5781810151838201526020016146e6565b50505050905090810190601f16801561472b5780820380516001836020036101000a031916815260200191505b506040525093985093965094505050506001600160f01b03198416614d5360f01b14159050614767576000546001600160a01b03169150614800565b6108ab60f31b6001600160f01b031984161461480057600054604080516227050b60e31b81526001600160f01b03198616600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b1580156147d157600080fd5b505afa1580156147e5573d6000803e3d6000fd5b505050506040513d60208110156147fb57600080fd5b505191505b60006060836001600160a01b031683600560008a815260200190815260200160002060018154811061482e57fe5b906000526020600020016040516020018083805190602001908083835b6020831061486a5780518252601f19909201916020918201910161484b565b6001836020036101000a038019825116818451168082178552505050505050905001828054600181600116156101000203166002900480156148e35780601f106148c15761010080835404028352918201916148e3565b820191906000526020600020905b8154815290600101906020018083116148cf575b5050925050506040516020818303038152906040526040518082805190602001908083835b602083106149275780518252601f199092019160209182019101614908565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614989576040519150601f19603f3d011682016040523d82523d6000602084013e61498e565b606091505b5091509150816149dd578051806149d65760405162461bcd60e51b81526004018080602001828103825260238152602001806153d26023913960400191505060405180910390fd5b8060208301fd5b6040805188815290517f6535f242c0cf5f7c126188bcde0e013c21a0251762fa3be3c854f59ac30a5cdd9181900360200190a150505050505050565b6000858152600460205260409020600101829055614a378585612e6a565b6040805186815290517fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b9181900360200190a160046000868152601a602052604090205414613873576001816004811115614a8e57fe5b1415614aa357614a9e85846145cd565b613873565b60016000868152601a6020526040902055601f54614ac7904263ffffffff612e0716565b6000868152601b60205260409020555050505050565b6018546040805163253eca1f60e01b8152600481018490529051600092839283926001600160a01b039092169163253eca1f916024808201928692909190829003018186803b158015614b2f57600080fd5b505afa158015614b43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015614b6c57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115614ba657600080fd5b908301906020820185811115614bbb57600080fd5b82518660208202830111600160201b82111715614bd757600080fd5b82525081516020918201928201910280838360005b83811015614c04578181015183820152602001614bec565b50505050919091016040818152601754630dc6f84760e01b8352600483018b90529051979c50989a508b9950614cbb98614c7d98506131ef97670de0b6b3a764000097506001600160a01b039091169550630dc6f847945060248083019450602093509091829003018186803b1580156131b757600080fd5b6000888152600c60209081526040808320600184529091528082205482805291205461298a91606491614caf91612e07565b9063ffffffff61457416565b101595945050505050565b600083815260056020908152604082208054600181018083559184529282902085519193614cfa9391019190860190615339565b50506001600560008581526020019081526020016000208054905003336001600160a01b0316847f28aed3fdbf1b73725998bf6a5f364a2b9a08b85236c75f0c0270cfe1b65fba8c84426040518080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015614d87578181015183820152602001614d6f565b50505050905090810190601f168015614db45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b60008183614e535760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614e18578181015183820152602001614e00565b50505050905090810190601f168015614e455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614e5f57fe5b0495945050505050565b6000612e6183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506152b0565b60105442919091031190565b60185460008581526004602081905260408083206002015481516307149ba360e01b81529283015251919283926001600160a01b03909116916307149ba3916024808301926060929190829003018186803b158015614f1557600080fd5b505afa158015614f29573d6000803e3d6000fd5b505050506040513d6060811015614f3f57600080fd5b50602081810151604092830151601754845163505ef22f60e01b81523360048201526001602482015294519296509094506001600160a01b03169263505ef22f926044808301939192829003018186803b158015614f9c57600080fd5b505afa158015614fb0573d6000803e3d6000fd5b505050506040513d6020811015614fc657600080fd5b50518015614fd45750600082115b80614fdf5750600184145b1561500b576000868152600c602090815260408083208884526001908101909252909120805490910190555b60195460105460408051634c47e71d60e01b81523360048201526024810192909252516001600160a01b0390921691634c47e71d9160448082019260009290919082900301818387803b15801561506157600080fd5b505af1158015615075573d6000803e3d6000fd5b5060019250615082915050565b84146122f85760008361510b57601954604080516351626ddd60e01b815233600482015290516001600160a01b03909216916351626ddd91602480820192602092909190829003018186803b1580156150da57600080fd5b505afa1580156150ee573d6000803e3d6000fd5b505050506040513d602081101561510457600080fd5b5051615183565b60195460408051632587701560e11b815233600482015290516001600160a01b0390921691634b0ee02a91602480820192602092909190829003018186803b15801561515657600080fd5b505afa15801561516a573d6000803e3d6000fd5b505050506040513d602081101561518057600080fd5b50515b90506000601960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156151d557600080fd5b505afa1580156151e9573d6000803e3d6000fd5b505050506040513d60208110156151ff57600080fd5b50519050600061521d83670de0b6b3a764000063ffffffff612e0716565b90508361524d57600061524982615244606461298a8760125461457490919063ffffffff16565b61530a565b9150505b6000898152600c602090815260408083208b8452909152902054615277908263ffffffff612e0716565b60008a8152600c602081815260408084208d855280835290842094909455918c9052905260020180546001019055505050505050505050565b600081848411156153025760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614e18578181015183820152602001614e00565b505050900390565b8181811115612e645750919050565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061537a57805160ff19168380011785556153a7565b828001600101855582156153a7579182015b828111156153a757825182559160200191906001019061538c565b506153b39291506153b7565b5090565b61231691905b808211156153b357600081556001016153bd56fe416374696f6e206661696c656420776974686f75742072657665727420726561736f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a72315820d5e05dcdda1e48e0134c2f4dc39c924222d09a3615f80dde0846584a100f50e764736f6c63430005110032
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.