Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
DisposableGovernance
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.17; import "../../modules/governance/Governance.sol"; contract DisposableGovernance is Governance { /* disposable initialization function */ // mainnet param values added in comments function initialize( uint _tokenHoldingTime, // 3 days uint _maxDraftTime, // 14 days uint _maxVoteWeigthPer, // 5 uint _maxFollowers, // 40 uint _specialResolutionMajPerc, // 75 uint _actionWaitingTime // 1 day ) external { require(!constructorCheck); constructorCheck = true; totalProposals = 1; allVotes.push(ProposalVote(address(0), 0, 0)); allDelegation.push(DelegateVote(address(0), address(0), now)); roleIdAllowedToCatgorize = uint(IMemberRoles.Role.AdvisoryBoard); tokenHoldingTime = _tokenHoldingTime; maxDraftTime = _maxDraftTime; maxVoteWeigthPer = _maxVoteWeigthPer; maxFollowers = _maxFollowers; specialResolutionMajPerc = _specialResolutionMajPerc; actionWaitingTime = _actionWaitingTime; } }
// 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; } }
// 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)); } } }
{ "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":false,"inputs":[{"internalType":"uint256","name":"_tokenHoldingTime","type":"uint256"},{"internalType":"uint256","name":"_maxDraftTime","type":"uint256"},{"internalType":"uint256","name":"_maxVoteWeigthPer","type":"uint256"},{"internalType":"uint256","name":"_maxFollowers","type":"uint256"},{"internalType":"uint256","name":"_specialResolutionMajPerc","type":"uint256"},{"internalType":"uint256","name":"_actionWaitingTime","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","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"}]
Contract Creation Code
608060405234801561001057600080fd5b5061564a80620000216000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80636edde0bd1161013b578063bcc81c0c116100b8578063d98db80d1161007c578063d98db80d14610b35578063e0429d0914610b58578063e3b34c8814610b7e578063eeff918814610c93578063f17a3bec14610cb05761023d565b8063bcc81c0c14610a39578063c2fe202214610a56578063c5d2eade14610acc578063d46655f414610ae9578063d5950ad114610b0f5761023d565b80639dd86e0f116100ff5780639dd86e0f1461097c5780639ed1c7db146109a9578063a0b2d57f146109c6578063aaf86c30146109ea578063bb73c562146109f25761023d565b80636edde0bd1461083d5780636f93bfb7146108665780637287078614610889578063787112a61461094e5780638263a938146109745761023d565b80631eef225c116101c957806339bb96071161018d57806339bb96071461068a5780634c15676b146106925780634df9d6ba146107a057806353fb6c5c146107c65780636122f840146107f25761023d565b80631eef225c146105405780632b4b16b1146105485780632d7aa82b146105655780632f54243a146105a057806330326c17146106425761023d565b80630fec1dec116102105780630fec1dec146102e757806316e9eaec1461032857806316fdc34e14610345578063174e31c4146104f75780631d35ab49146105235761023d565b80630386a01614610242578063060225f6146102615780630852a6e31461029f5780630ea9c984146102df575b600080fd5b61025f6004803603602081101561025857600080fd5b5035610cb8565b005b61028d6004803603604081101561027757600080fd5b506001600160a01b038135169060200135610e9d565b60408051918252519081900360200190f35b6102cb600480360360408110156102b557600080fd5b50803590602001356001600160a01b0316610eba565b604080519115158252519081900360200190f35b61025f610eda565b61030a600480360360408110156102fd57600080fd5b5080359060200135611094565b60408051938452602084019290925282820152519081900360600190f35b61030a6004803603602081101561033e57600080fd5b50356110c8565b61025f600480360360c081101561035b57600080fd5b810190602081018135600160201b81111561037557600080fd5b82018360208201111561038757600080fd5b803590602001918460018302840111600160201b831117156103a857600080fd5b919390929091602081019035600160201b8111156103c557600080fd5b8201836020820111156103d757600080fd5b803590602001918460018302840111600160201b831117156103f857600080fd5b919390929091602081019035600160201b81111561041557600080fd5b82018360208201111561042757600080fd5b803590602001918460018302840111600160201b8311171561044857600080fd5b91939092823592604081019060200135600160201b81111561046957600080fd5b82018360208201111561047b57600080fd5b803590602001918460018302840111600160201b8311171561049c57600080fd5b919390929091602081019035600160201b8111156104b957600080fd5b8201836020820111156104cb57600080fd5b803590602001918460018302840111600160201b831117156104ec57600080fd5b5090925090506110ed565b61028d6004803603604081101561050d57600080fd5b506001600160a01b038135169060200135611292565b61028d6004803603602081101561053957600080fd5b5035611690565b61025f6116a2565b61025f6004803603602081101561055e57600080fd5b50356117fe565b61025f600480360360c081101561057b57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611ae0565b6105c3600480360360408110156105b657600080fd5b5080359060200135611c9a565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156106065781810151838201526020016105ee565b50505050905090810190601f1680156106335780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61065f6004803603602081101561065857600080fd5b5035611d5d565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b61028d611d86565b61025f600480360360808110156106a857600080fd5b810190602081018135600160201b8111156106c257600080fd5b8201836020820111156106d457600080fd5b803590602001918460018302840111600160201b831117156106f557600080fd5b919390929091602081019035600160201b81111561071257600080fd5b82018360208201111561072457600080fd5b803590602001918460018302840111600160201b8311171561074557600080fd5b919390929091602081019035600160201b81111561076257600080fd5b82018360208201111561077457600080fd5b803590602001918460018302840111600160201b8311171561079557600080fd5b919350915035611d8c565b61028d600480360360208110156107b657600080fd5b50356001600160a01b0316611f3d565b6102cb600480360360408110156107dc57600080fd5b50803590602001356001600160a01b03166121ed565b6108196004803603602081101561080857600080fd5b50356001600160c01b03191661220d565b604080516001600160c01b0319909316835260208301919091528051918290030190f35b61025f6004803603606081101561085357600080fd5b508035906020810135906040013561230e565b61025f6004803603604081101561087c57600080fd5b50803590602001356123fb565b61025f6004803603606081101561089f57600080fd5b81359190810190604081016020820135600160201b8111156108c057600080fd5b8201836020820111156108d257600080fd5b803590602001918460018302840111600160201b831117156108f357600080fd5b919390929091602081019035600160201b81111561091057600080fd5b82018360208201111561092257600080fd5b803590602001918460018302840111600160201b8311171561094357600080fd5b50909250905061240b565b61028d6004803603602081101561096457600080fd5b50356001600160a01b0316612500565b61028d612512565b61025f6004803603604081101561099257600080fd5b506001600160c01b03198135169060200135612519565b6102cb600480360360208110156109bf57600080fd5b50356126d9565b6109ce612910565b604080516001600160a01b039092168252519081900360200190f35b61028d61291f565b610a0f60048036036020811015610a0857600080fd5b5035612925565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b61028d60048036036020811015610a4f57600080fd5b5035612962565b610a7c60048036036020811015610a6c57600080fd5b50356001600160a01b0316612c7d565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ab8578181015183820152602001610aa0565b505050509050019250505060405180910390f35b61025f60048036036020811015610ae257600080fd5b5035612ce9565b61025f60048036036020811015610aff57600080fd5b50356001600160a01b0316612d74565b6102cb60048036036020811015610b2557600080fd5b50356001600160a01b0316612dfd565b61025f60048036036040811015610b4b57600080fd5b5080359060200135612e12565b61028d60048036036020811015610b6e57600080fd5b50356001600160a01b0316612e1e565b61025f60048036036080811015610b9457600080fd5b81359190810190604081016020820135600160201b811115610bb557600080fd5b820183602082011115610bc757600080fd5b803590602001918460018302840111600160201b83111715610be857600080fd5b919390929091602081019035600160201b811115610c0557600080fd5b820183602082011115610c1757600080fd5b803590602001918460018302840111600160201b83111715610c3857600080fd5b919390929091602081019035600160201b811115610c5557600080fd5b820183602082011115610c6757600080fd5b803590602001918460018302840111600160201b83111715610c8857600080fd5b509092509050612e30565b61028d60048036036020811015610ca957600080fd5b5035612fe3565b6109ce612ff8565b60008181526004602081905260408220600281015460165491909201549192914291610cea919063ffffffff61300716565b11158015610d0657506002600084815260046020526040902054105b15610d1c57610d178360065b61306a565b610e98565b610d2583612962565b600114610d3157600080fd5b601854600084815260046020819052604080832060020154815163253eca1f60e01b815292830152516001600160a01b039093169263253eca1f92602480840193919291829003018186803b158015610d8957600080fd5b505afa158015610d9d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015610dc657600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115610e0057600080fd5b908301906020820185811115610e1557600080fd5b82518660208202830111600160201b82111715610e3157600080fd5b82525081516020918201928201910280838360005b83811015610e5e578181015183820152602001610e46565b50505050919091016040525095975060019650610e7d95505050505050565b811415610e8e57610d1783836130ad565b610e9883836132c3565b505050565b600860209081526000928352604080842090915290825290205481565b601c60209081526000928352604080842090915290825290205460ff1681565b600054604080516227050b60e31b815261544360f01b600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b158015610f2957600080fd5b505afa158015610f3d573d6000803e3d6000fd5b505050506040513d6020811015610f5357600080fd5b5051601980546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526126a960f11b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6020811015610fe257600080fd5b5051601780546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261504360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561104757600080fd5b505afa15801561105b573d6000803e3d6000fd5b505050506040513d602081101561107157600080fd5b5051601880546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600c60208181526040808420948452848252808420546001860183529084205495909352526002909101549092565b600081815260056020908152604080832054600c909252909120600201549192909190565b846110f7816126d9565b611136576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b601554604080516020601f8f018190048102820181019092528d8152611202918f908f9081908401838280828437600081840152601f19601f820116905080830192505050505050508c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506137f2915050565b6000871161120f57600080fd5b6112838187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250613a7a92505050565b50505050505050505050505050565b60008054604080516227050b60e31b815261544360f01b600482015290518392839283926001600160a01b0390921691630138285891602480820192602092909190829003018186803b1580156112e857600080fd5b505afa1580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b50516001600160a01b0316331461132857600080fd5b6001600160a01b038616600090815260096020526040902054611349615519565b6003828154811061135657fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b0390811684526001820154169383019390935260029092015491810191909152905081158015906113b9575060208101516001600160a01b031615155b156113d15780602001519350806040015192506113d5565b8793505b6001600160a01b03808516600090815260066020908152604080832054938c168352600e909152812054909190819083905b838110801561141557508b82105b156115f6576001600160a01b038916600090815260066020526040902080548290811061143e57fe5b9060005260206000200154995060028a8154811061145857fe5b90600052602060002090600302016001015494506000600c6000878152602001908152602001600020600201541180156114dd57506010546114a190899063ffffffff61300716565b60028b815481106114ae57fe5b90600052602060002090600302016002015411806114dd57508c6001600160a01b0316896001600160a01b0316145b156115ee57600260008681526004602052604090205411156115e257600760008b815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff166115dd576000858152600c602090815260408083206002015460049092529091206003015461158391611576919063ffffffff613dad16565b8c9063ffffffff61300716565b9a506001600760008c815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555081806001019250505b6115ee565b838314156115ee578092505b600101611407565b8383141561161e576001600160a01b038d166000908152600e6020526040902081905561163a565b6001600160a01b038d166000908152600e602052604090208390555b811561168057604080518c815290516001600160a01b038f16917f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241919081900360200190a25b5050505050505050505092915050565b601a6020526000908152604090205481565b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ef57600080fd5b505afa158015611703573d6000803e3d6000fd5b505050506040513d602081101561171957600080fd5b50511580156117a057506000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b15801561176e57600080fd5b505afa158015611782573d6000803e3d6000fd5b505050506040513d602081101561179857600080fd5b505115156001145b6117a957600080fd5b6117b233611f3d565b156117f3576040805162461bcd60e51b815260206004820152600c60248201526b10db185a5b481c995dd85c9960a21b604482015290519081900360640190fd5b6117fc33613def565b565b6017546040805163505ef22f60e01b81523360048201526001602482015290516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b15801561185057600080fd5b505afa158015611864573d6000803e3d6000fd5b505050506040513d602081101561187a57600080fd5b505161188557600080fd5b60016000828152601a6020526040902054146118a057600080fd5b6000818152601c6020908152604080832033845290915290205460ff16156118c757600080fd5b60408051600480825260248083018452602080840180516001600160e01b0316630c578f2360e41b17815293519093206018546000878152948490528585206002015486516357c7bec160e01b815294850152945190946001600160a01b0316936357c7bec1938084019391929190829003018186803b15801561194a57600080fd5b505afa15801561195e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561198757600080fd5b8101908080516040519392919084600160201b8211156119a657600080fd5b9083019060208201858111156119bb57600080fd5b8251600160201b8111828201881017156119d457600080fd5b82525081516020918201929091019080838360005b83811015611a015781810151838201526020016119e9565b50505050905090810190601f168015611a2e5780820380516001836020036101000a031916815260200191505b50604052505050805190602001201415611a4757600080fd5b6000818152601c6020908152604080832033808552908352818420805460ff19166001908117909155858552601d845293829020805490940190935580519283525183927f56bdda336a8bb949a57770a7cde5b62bd8913d11d9dde767735db889a609692f92908290030190a26000818152601d602052604090205460031415611add5760026000828152601a60205260409020555b50565b600f5460ff1615611af057600080fd5b600f805460ff19166001908117909155601581905560408051606080820183526000808352602080840182815284860183815260028054808a018255908552955160039687027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b039384166001600160a01b03199182161790915593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad090920191909155865194850187528385529184018381524296850196875285548089018755938690529351929094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810180549383169386169390931790925591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8201805491909316931692909217905590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d90910155601155601095909555601693909355601291909155601455601355601f55565b60008281526005602052604081208054606091849182908110611cb957fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529192839190830182828015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b50505050509050915091509250929050565b600081815260046020526040902060028101548154600183015460039093015493949193909291565b60105481565b80611d96816126d9565b611dd5576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b158015611e2057600080fd5b505afa158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b5051611e8a576040805162461bcd60e51b815260206004820152600a6024820152692737ba1026b2b6b132b960b11b604482015290519081900360640190fd5b611f3388888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152508892506137f2915050565b5050505050505050565b6001600160a01b0381166000908152600960205260408120548180611f60615519565b60038481548110611f6d57fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b039081168452600182015416938301939093526002909201549181019190915290508315801590611fd0575060208101516001600160a01b031615155b15611fe8578060200151925080604001519150611fec565b8592505b6001600160a01b0386166000908152600e60205260408120545b6001600160a01b0385166000908152600660205260409020548110156121e25760105461203a90859063ffffffff61300716565b6001600160a01b03861660009081526006602052604090208054600291908490811061206257fe5b90600052602060002001548154811061207757fe5b90600052602060002090600302016002015411806120a65750876001600160a01b0316856001600160a01b0316145b156121da576001600160a01b038516600090815260066020526040812080546007929190849081106120d457fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b038c16825290925290205460ff166121da576001600160a01b03851660009081526006602052604090208054600291908390811061213357fe5b90600052602060002001548154811061214857fe5b90600052602060002090600302016001015491506000600c60008481526020019081526020016000206002015411801561219057506002600083815260046020526040902054115b156121da576000828152600c60209081526040808320600201546004909252909120600301546121d7916121ca919063ffffffff613dad16565b889063ffffffff61300716565b96505b600101612006565b505050505050919050565b600760209081526000928352604080842090915290825290205460ff1681565b8060006611d3d59213d31160ca1b6001600160c01b0319831614156122355750601054612309565b651350561193d360d21b6001600160c01b0319841614156122595750601454612309565b661350561114919560ca1b6001600160c01b03198416141561227e5750601654612309565b631050d5d560e21b6001600160c01b0319841614156122a05750601f54612309565b66434154524f4c4560c81b6001600160c01b0319841614156122c55750601154612309565b654d415856545760d01b6001600160c01b0319841614156122e95750601254612309565b6553505245534d60d01b6001600160c01b03198416141561230957506013545b915091565b8260026000828152600460205260409020541061232a57600080fd5b6017546011546040805163505ef22f60e01b81523360048201526024810192909252516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b15801561237f57600080fd5b505afa158015612393573d6000803e3d6000fd5b505050506040513d60208110156123a957600080fd5b50516123ea576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6123f5848484613f48565b50505050565b61240782826001614071565b5050565b60008581526004602052604090206005015485906001600160a01b03163314612469576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b60016000878152600460205260409020541461248457600080fd5b6124f88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881529250889150879081908401838280828437600092019190915250613a7a92505050565b505050505050565b60096020526000908152604090205481565b6015545b90565b60005460408051632c1a733d60e11b815233600482015290516001600160a01b0390921691635834e67a91602480820192602092909190829003018186803b15801561256457600080fd5b505afa158015612578573d6000803e3d6000fd5b505050506040513d602081101561258e57600080fd5b505161259957600080fd5b6611d3d59213d31160ca1b6001600160c01b0319831614156125bf576010819055612407565b651350561193d360d21b6001600160c01b0319831614156125e4576014819055612407565b661350561114919560ca1b6001600160c01b03198316141561260a576016819055612407565b631050d5d560e21b6001600160c01b03198316141561262d57601f819055612407565b66434154524f4c4560c81b6001600160c01b031983161415612653576011819055612407565b654d415856545760d01b6001600160c01b031983161415612678576012819055612407565b6553505245534d60d01b6001600160c01b03198316141561269d576013819055612407565b6040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b6000816126e85750600161290b565b6018546040805163253eca1f60e01b81526004810185905290516060926001600160a01b03169163253eca1f916024808301926000929190829003018186803b15801561273457600080fd5b505afa158015612748573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561277157600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156127ab57600080fd5b9083019060208201858111156127c057600080fd5b82518660208202830111600160201b821117156127dc57600080fd5b82525081516020918201928201910280838360005b838110156128095781810151838201526020016127f1565b505050509190910160405250929750600096505050505050505b81518110156129085781818151811061283857fe5b6020026020010151600014806128f0575060175482516001600160a01b039091169063505ef22f90339085908590811061286e57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156128c357600080fd5b505afa1580156128d7573d6000803e3d6000fd5b505050506040513d60208110156128ed57600080fd5b50515b156129005760019250505061290b565b600101612823565b50505b919050565b6000546001600160a01b031681565b60115490565b6003818154811061293257fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935091169083565b6000818152600460208190526040808320805481840154601854600290930154845163253eca1f60e01b8152958601529251929390928592839283926001600160a01b039092169163253eca1f916024808201928692909190829003018186803b1580156129cf57600080fd5b505afa1580156129e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015612a0c57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115612a4657600080fd5b908301906020820185811115612a5b57600080fd5b82518660208202830111600160201b82111715612a7757600080fd5b82525081516020918201928201910280838360005b83811015612aa4578181015183820152602001612a8c565b50505050919091016040525060200151995094975092955060029450612aca9350505050565b841415612c4e5760175460408051630dc6f84760e01b81526004810185905290516000926001600160a01b031691630dc6f847916024808301926020929190829003018186803b158015612b1d57600080fd5b505afa158015612b31573d6000803e3d6000fd5b505050506040513d6020811015612b4757600080fd5b505190506001831415612c06576000888152600c602090815260408083206001808552019091529020548290612b96908390612b8a90606463ffffffff61477416565b9063ffffffff613dad16565b101580612bd357506000888152600c60209081526040808320838052600190810190925280832054918352909120548291612bd19190613007565b145b80612bed575042612bea878663ffffffff61300716565b11155b15612c01576001965050505050505061290b565b612c48565b6000888152600c6020526040902060020154811480612c34575042612c31878663ffffffff61300716565b11155b15612c48576001965050505050505061290b565b50612c73565b6002841115612c655760029550505050505061290b565b60009550505050505061290b565b5050505050919050565b6001600160a01b0381166000908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015612cdd57602002820191906000526020600020905b815481526020019060010190808311612cc9575b50505050509050919050565b60016000828152601a6020526040902054148015612d1557506000818152601b60205260409020544210155b612d57576040805162461bcd60e51b815260206004820152600e60248201526d21b0b73737ba103a3934b3b3b2b960911b604482015290519081900360640190fd5b600081815260046020526040902060020154611add9082906147cd565b6000546001600160a01b031615612dd1576000546001600160a01b03163314612dd1576040805162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015290519081900360640190fd5b600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b600d6020526000908152604090205460ff1681565b61240782826000614071565b600e6020526000908152604090205481565b60008781526004602052604090206005015487906001600160a01b03163314612e8e576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b600088815260056020526040902054600211612edf576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b600088815260046020908152604080832083815560028101849055600381019390935560059092015482514280825260809382018481529382018b90528c946001600160a01b03909316937f470106408ef1beec24fa0f364830357ef2a70d11457aa4eb9b30b1bbc0172abe9391928d928d928d928d928d928d929182016060830160a084018a8a80828437600083820152601f01601f191690910185810384528881526020019050888880828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039c50909a5050505050505050505050a35050505050505050565b600c6020526000908152604090206002015481565b6001546001600160a01b031681565b600082820183811015613061576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60048114806130795750600681145b156130905760046000838152601a60205260409020555b600091825260046020819052604090922042928101929092559055565b6018546040805163253eca1f60e01b81526004810184905290516000926001926001600160a01b039091169163253eca1f916024808201928792909190829003018186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561313b57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b82111561317557600080fd5b90830190602082018581111561318a57600080fd5b82518660208202830111600160201b821117156131a657600080fd5b82525081516020918201928201910280838360005b838110156131d35781810151838201526020016131bb565b5050505091909101604052505060175494985088965061329f9550506001600160a01b039093169250630dc6f8479150859050600481111561321157fe5b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561324557600080fd5b505afa158015613259573d6000803e3d6000fd5b505050506040513d602081101561326f57600080fd5b50516000878152600c60209081526040808320600180855201909152902054612b8a90606463ffffffff61477416565b106132b8576132b384600385600185614c19565b6123f5565b6123f5846006610d12565b601854604080516307149ba360e01b815260048101849052905160009283926001600160a01b03909116916307149ba391602480820192606092909190829003018186803b15801561331457600080fd5b505afa158015613328573d6000803e3d6000fd5b505050506040513d606081101561333e57600080fd5b5060208101516040909101519250905060018214156134d3576017546000906134a190613475906133ef90670de0b6b3a7640000906001600160a01b0316630dc6f84760026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156133b757600080fd5b505afa1580156133cb573d6000803e3d6000fd5b505050506040513d60208110156133e157600080fd5b50519063ffffffff61477416565b601960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561343d57600080fd5b505afa158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b50519063ffffffff61300716565b6000878152600c6020908152604080832060018452909152902054612b8a90606463ffffffff61477416565b905060135481106134c2576134bd8560035b8660016002614c19565b6134cd565b6134cd856006610d12565b506136e4565b6134dd8484614cdd565b15613693576018546040805163253eca1f60e01b81526004810186905290516000926001600160a01b03169163253eca1f9160248083019286929190829003018186803b15801561352d57600080fd5b505afa158015613541573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561356a57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156135a457600080fd5b9083019060208201858111156135b957600080fd5b82518660208202830111600160201b821117156135d557600080fd5b82525081516020918201928201910280838360005b838110156136025781810151838201526020016135ea565b5050505091909101604090815260008f8152600c60209081528282206001835290528181205481805291902054979a508a9950613678985061364c97965094505061300792505050565b6000888152600c6020908152604080832060018452909152902054612b8a90606463ffffffff61477416565b10613688576134bd8560036134b3565b6134cd856004610d12565b6000811180156136bf575060175481906136bc906001600160a01b0316630dc6f8476001613211565b10155b156136d9576136d48460038560016002614c19565b6136e4565b6136e4846006610d12565b6000848152600c6020526040902060020154156123f557601954600054604080516227050b60e31b815261544360f01b600482015290516001600160a01b03938416936340c10f199316916301382858916024808301926020929190829003018186803b15801561375457600080fd5b505afa158015613768573d6000803e3d6000fd5b505050506040513d602081101561377e57600080fd5b505160008781526004602081905260408083206003015481516001600160e01b031960e088901b1681526001600160a01b039095169285019290925260248401919091525160448084019382900301818387803b1580156137de57600080fd5b505af1158015611f33573d6000803e3d6000fd5b60185460408051637800529760e01b81526004810184905290516001600160a01b0390921691637800529791602480820192602092909190829003018186803b15801561383e57600080fd5b505afa158015613852573d6000803e3d6000fd5b505050506040513d602081101561386857600080fd5b50511580613874575080155b61387d57600080fd5b6015546000818152600460208181526040808420600580820180546001600160a01b031916331790554291909401559181528183208054600181018083559185528285208451938401948590529285905290936138df93929091019190615539565b50506015805460010190556040805142808252608060208084018281528a51928501929092528951869533957f470106408ef1beec24fa0f364830357ef2a70d11457aa4eb9b30b1bbc0172abe95948d948d948d94840191606085019160a086019189019080838360005b8381101561396257818101518382015260200161394a565b50505050905090810190601f16801561398f5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b838110156139c25781810151838201526020016139aa565b50505050905090810190601f1680156139ef5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015613a22578181015183820152602001613a0a565b50505050905090810190601f168015613a4f5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a38115613a7357613a7381836000613f48565b5050505050565b60008381526004602081905260408083206002015460185482516357c7bec160e01b8152938401829052915190936001600160a01b03909216926357c7bec1926024808301939192829003018186803b158015613ad657600080fd5b505afa158015613aea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613b1357600080fd5b8101908080516040519392919084600160201b821115613b3257600080fd5b908301906020820185811115613b4757600080fd5b8251600160201b811182820188101715613b6057600080fd5b82525081516020918201929091019080838360005b83811015613b8d578181015183820152602001613b75565b50505050905090810190601f168015613bba5780820380516001836020036101000a031916815260200191505b506040525050505160001415613c0e57815160208301207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014613bfc57600080fd5b60046000858152601a60205260409020555b613c19848385614ec6565b613c24846002610d12565b6018546040805163253eca1f60e01b81526004810184905290516000926001600160a01b03169163253eca1f9160248083019286929190829003018186803b158015613c6f57600080fd5b505afa158015613c83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015613cac57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115613ce657600080fd5b908301906020820185811115613cfb57600080fd5b82518660208202830111600160201b82111715613d1757600080fd5b82525081516020918201928201910280838360005b83811015613d44578181015183820152602001613d2c565b5050505091909101604052506020015197508b96507fc5be51db6c7799c3f641eecd22b62761981da3190ac6d1d306bc3672435662589550613d9594508793504292505063ffffffff613007169050565b60408051918252519081900360200190a25050505050565b600061306183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614fc7565b6001600160a01b038116600090815260096020526040902054613e10615519565b60038281548110613e1d57fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b0390811684526001820154169383018490526002015490820152915015610e98576020808201516001600160a01b03166000908152600a90915260409020548015613eb857613e9981600163ffffffff61506916565b6020808401516001600160a01b03166000908152600a90915260409020555b600060038481548110613ec757fe5b906000526020600020906003020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260038481548110613f0a57fe5b60009182526020808320600260039093020191909101929092556001600160a01b038616815260068252604080822054600e90935290205550505050565b600082118015613fd05750601860009054906101000a90046001600160a01b03166001600160a01b03166339275b0a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613fa157600080fd5b505afa158015613fb5573d6000803e3d6000fd5b505050506040513d6020811015613fcb57600080fd5b505182105b614014576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642063617465676f727960801b604482015290519081900360640190fd5b60008381526004602090815260409182902060028101859055600381018490556001905581518481529151339286927f5c0ed4086100f9e2c57a36b2c5ae3a1f991b2fd6af5a44cf0b9afb8a21796cdc92918290030190a3505050565b6002600084815260046020526040902054146140c2576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b60008381526005602052604090205482106140dc57600080fd5b3360009081526009602090815260408083205460185487855260049384905282852060020154835163253eca1f60e01b8152948501529151909392839283926001600160a01b039091169163253eca1f9160248083019286929190829003018186803b15801561414b57600080fd5b505afa15801561415f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561418857600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156141c257600080fd5b9083019060208201858111156141d757600080fd5b82518660208202830111600160201b821117156141f357600080fd5b82525081516020918201928201910280838360005b83811015614220578181015183820152602001614208565b5050505090500160405260200180519060200190929190805190602001909291905050509091929394955090919250909150508093508194508295505050504261428982600460008b81526020019081526020016000206004015461300790919063ffffffff16565b116142c4576040805162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b604482015290519081900360640190fd5b3360009081526008602090815260408083208a84529091529020541561431f576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b8315806143975750600084118015614369575060006001600160a01b03166003858154811061434a57fe5b60009182526020909120600160039092020101546001600160a01b0316145b801561439757506143976003858154811061438057fe5b9060005260206000209060030201600201546150ab565b6143a057600080fd5b6017546040805163505ef22f60e01b81523360048201526024810186905290516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b1580156143f257600080fd5b505afa158015614406573d6000803e3d6000fd5b505050506040513d602081101561441c57600080fd5b5051614460576040805162461bcd60e51b815260206004820152600e60248201526d139bdd08105d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6002805433600081815260066020908152604080832080546001808201835591855283852001869055848452600883528184208e8552835281842086905581516060810183528581528084018f8152428285018181528a549485018b559990965290517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600390930292830180546001600160a01b0319166001600160a01b03909216919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015595517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad090960195909555845191825281018a90528351929384938c93927f89eb0be5e1a1bcbad3c382ad8d3f2698ea4d54d9a179cd2368d184358ecad45192908290030190a460038414156145dc5786600114156145cc576145c788600360008b81526004602052604090206002015460016003614c19565b6145d7565b6145d7886004610d12565b611f33565b60175460408051630dc6f84760e01b81526004810187905290516000926001600160a01b031691630dc6f847916024808301926020929190829003018186803b15801561462857600080fd5b505afa15801561463c573d6000803e3d6000fd5b505050506040513d602081101561465257600080fd5b505190506146628989878a6150b7565b600185141561471c576000898152600c6020908152604080832060018085520190915290205484906146a1908390612b8a90606463ffffffff61477416565b1015806146de57506000898152600c602090815260408083208380526001908101909252808320549183529091205482916146dc9190613007565b145b1561471757604080518a815290517f9593d9bd30eff4872ec3bab10360ad82eaac80651801e68f47f0674c38415c3d9181900360200190a15b614769565b6000898152600c602052604090206002015481141561476957604080518a815290517f9593d9bd30eff4872ec3bab10360ad82eaac80651801e68f47f0674c38415c3d9181900360200190a15b505050505050505050565b60008261478357506000613064565b8282028284828161479057fe5b04146130615760405162461bcd60e51b81526004018080602001828103825260218152602001806155f56021913960400191505060405180910390fd5b6000828152601a602052604080822060039055601854815163352aabed60e21b815260048101859052915183926060926001600160a01b03169163d4aaafb4916024808201928792909190829003018186803b15801561482c57600080fd5b505afa158015614840573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260a081101561486957600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156148a357600080fd5b9083019060208201858111156148b857600080fd5b8251600160201b8111828201881017156148d157600080fd5b82525081516020918201929091019080838360005b838110156148fe5781810151838201526020016148e6565b50505050905090810190601f16801561492b5780820380516001836020036101000a031916815260200191505b506040525093985093965094505050506001600160f01b03198416614d5360f01b14159050614967576000546001600160a01b03169150614a00565b6108ab60f31b6001600160f01b0319841614614a0057600054604080516227050b60e31b81526001600160f01b03198616600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b1580156149d157600080fd5b505afa1580156149e5573d6000803e3d6000fd5b505050506040513d60208110156149fb57600080fd5b505191505b60006060836001600160a01b031683600560008a8152602001908152602001600020600181548110614a2e57fe5b906000526020600020016040516020018083805190602001908083835b60208310614a6a5780518252601f199092019160209182019101614a4b565b6001836020036101000a03801982511681845116808217855250505050505090500182805460018160011615610100020316600290048015614ae35780601f10614ac1576101008083540402835291820191614ae3565b820191906000526020600020905b815481529060010190602001808311614acf575b5050925050506040516020818303038152906040526040518082805190602001908083835b60208310614b275780518252601f199092019160209182019101614b08565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614b89576040519150601f19603f3d011682016040523d82523d6000602084013e614b8e565b606091505b509150915081614bdd57805180614bd65760405162461bcd60e51b81526004018080602001828103825260238152602001806155d26023913960400191505060405180910390fd5b8060208301fd5b6040805188815290517f6535f242c0cf5f7c126188bcde0e013c21a0251762fa3be3c854f59ac30a5cdd9181900360200190a150505050505050565b6000858152600460205260409020600101829055614c37858561306a565b6040805186815290517fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b9181900360200190a160046000868152601a602052604090205414613a73576001816004811115614c8e57fe5b1415614ca357614c9e85846147cd565b613a73565b60016000868152601a6020526040902055601f54614cc7904263ffffffff61300716565b6000868152601b60205260409020555050505050565b6018546040805163253eca1f60e01b8152600481018490529051600092839283926001600160a01b039092169163253eca1f916024808201928692909190829003018186803b158015614d2f57600080fd5b505afa158015614d43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015614d6c57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115614da657600080fd5b908301906020820185811115614dbb57600080fd5b82518660208202830111600160201b82111715614dd757600080fd5b82525081516020918201928201910280838360005b83811015614e04578181015183820152602001614dec565b50505050919091016040818152601754630dc6f84760e01b8352600483018b90529051979c50989a508b9950614ebb98614e7d98506133ef97670de0b6b3a764000097506001600160a01b039091169550630dc6f847945060248083019450602093509091829003018186803b1580156133b757600080fd5b6000888152600c602090815260408083206001845290915280822054828052912054612b8a91606491614eaf91613007565b9063ffffffff61477416565b101595945050505050565b600083815260056020908152604082208054600181018083559184529282902085519193614efa9391019190860190615539565b50506001600560008581526020019081526020016000208054905003336001600160a01b0316847f28aed3fdbf1b73725998bf6a5f364a2b9a08b85236c75f0c0270cfe1b65fba8c84426040518080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015614f87578181015183820152602001614f6f565b50505050905090810190601f168015614fb45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b600081836150535760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615018578181015183820152602001615000565b50505050905090810190601f1680156150455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161505f57fe5b0495945050505050565b600061306183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154b0565b60105442919091031190565b60185460008581526004602081905260408083206002015481516307149ba360e01b81529283015251919283926001600160a01b03909116916307149ba3916024808301926060929190829003018186803b15801561511557600080fd5b505afa158015615129573d6000803e3d6000fd5b505050506040513d606081101561513f57600080fd5b50602081810151604092830151601754845163505ef22f60e01b81523360048201526001602482015294519296509094506001600160a01b03169263505ef22f926044808301939192829003018186803b15801561519c57600080fd5b505afa1580156151b0573d6000803e3d6000fd5b505050506040513d60208110156151c657600080fd5b505180156151d45750600082115b806151df5750600184145b1561520b576000868152600c602090815260408083208884526001908101909252909120805490910190555b60195460105460408051634c47e71d60e01b81523360048201526024810192909252516001600160a01b0390921691634c47e71d9160448082019260009290919082900301818387803b15801561526157600080fd5b505af1158015615275573d6000803e3d6000fd5b5060019250615282915050565b84146124f85760008361530b57601954604080516351626ddd60e01b815233600482015290516001600160a01b03909216916351626ddd91602480820192602092909190829003018186803b1580156152da57600080fd5b505afa1580156152ee573d6000803e3d6000fd5b505050506040513d602081101561530457600080fd5b5051615383565b60195460408051632587701560e11b815233600482015290516001600160a01b0390921691634b0ee02a91602480820192602092909190829003018186803b15801561535657600080fd5b505afa15801561536a573d6000803e3d6000fd5b505050506040513d602081101561538057600080fd5b50515b90506000601960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156153d557600080fd5b505afa1580156153e9573d6000803e3d6000fd5b505050506040513d60208110156153ff57600080fd5b50519050600061541d83670de0b6b3a764000063ffffffff61300716565b90508361544d576000615449826154446064612b8a8760125461477490919063ffffffff16565b61550a565b9150505b6000898152600c602090815260408083208b8452909152902054615477908263ffffffff61300716565b60008a8152600c602081815260408084208d855280835290842094909455918c9052905260020180546001019055505050505050505050565b600081848411156155025760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315615018578181015183820152602001615000565b505050900390565b81818111156130645750919050565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061557a57805160ff19168380011785556155a7565b828001600101855582156155a7579182015b828111156155a757825182559160200191906001019061558c565b506155b39291506155b7565b5090565b61251691905b808211156155b357600081556001016155bd56fe416374696f6e206661696c656420776974686f75742072657665727420726561736f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a7231582023de812ae6f4a55d63d4d8f41bd6cb8095b098e53e0f01e09e6a7592df35088a64736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80636edde0bd1161013b578063bcc81c0c116100b8578063d98db80d1161007c578063d98db80d14610b35578063e0429d0914610b58578063e3b34c8814610b7e578063eeff918814610c93578063f17a3bec14610cb05761023d565b8063bcc81c0c14610a39578063c2fe202214610a56578063c5d2eade14610acc578063d46655f414610ae9578063d5950ad114610b0f5761023d565b80639dd86e0f116100ff5780639dd86e0f1461097c5780639ed1c7db146109a9578063a0b2d57f146109c6578063aaf86c30146109ea578063bb73c562146109f25761023d565b80636edde0bd1461083d5780636f93bfb7146108665780637287078614610889578063787112a61461094e5780638263a938146109745761023d565b80631eef225c116101c957806339bb96071161018d57806339bb96071461068a5780634c15676b146106925780634df9d6ba146107a057806353fb6c5c146107c65780636122f840146107f25761023d565b80631eef225c146105405780632b4b16b1146105485780632d7aa82b146105655780632f54243a146105a057806330326c17146106425761023d565b80630fec1dec116102105780630fec1dec146102e757806316e9eaec1461032857806316fdc34e14610345578063174e31c4146104f75780631d35ab49146105235761023d565b80630386a01614610242578063060225f6146102615780630852a6e31461029f5780630ea9c984146102df575b600080fd5b61025f6004803603602081101561025857600080fd5b5035610cb8565b005b61028d6004803603604081101561027757600080fd5b506001600160a01b038135169060200135610e9d565b60408051918252519081900360200190f35b6102cb600480360360408110156102b557600080fd5b50803590602001356001600160a01b0316610eba565b604080519115158252519081900360200190f35b61025f610eda565b61030a600480360360408110156102fd57600080fd5b5080359060200135611094565b60408051938452602084019290925282820152519081900360600190f35b61030a6004803603602081101561033e57600080fd5b50356110c8565b61025f600480360360c081101561035b57600080fd5b810190602081018135600160201b81111561037557600080fd5b82018360208201111561038757600080fd5b803590602001918460018302840111600160201b831117156103a857600080fd5b919390929091602081019035600160201b8111156103c557600080fd5b8201836020820111156103d757600080fd5b803590602001918460018302840111600160201b831117156103f857600080fd5b919390929091602081019035600160201b81111561041557600080fd5b82018360208201111561042757600080fd5b803590602001918460018302840111600160201b8311171561044857600080fd5b91939092823592604081019060200135600160201b81111561046957600080fd5b82018360208201111561047b57600080fd5b803590602001918460018302840111600160201b8311171561049c57600080fd5b919390929091602081019035600160201b8111156104b957600080fd5b8201836020820111156104cb57600080fd5b803590602001918460018302840111600160201b831117156104ec57600080fd5b5090925090506110ed565b61028d6004803603604081101561050d57600080fd5b506001600160a01b038135169060200135611292565b61028d6004803603602081101561053957600080fd5b5035611690565b61025f6116a2565b61025f6004803603602081101561055e57600080fd5b50356117fe565b61025f600480360360c081101561057b57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611ae0565b6105c3600480360360408110156105b657600080fd5b5080359060200135611c9a565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156106065781810151838201526020016105ee565b50505050905090810190601f1680156106335780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61065f6004803603602081101561065857600080fd5b5035611d5d565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b61028d611d86565b61025f600480360360808110156106a857600080fd5b810190602081018135600160201b8111156106c257600080fd5b8201836020820111156106d457600080fd5b803590602001918460018302840111600160201b831117156106f557600080fd5b919390929091602081019035600160201b81111561071257600080fd5b82018360208201111561072457600080fd5b803590602001918460018302840111600160201b8311171561074557600080fd5b919390929091602081019035600160201b81111561076257600080fd5b82018360208201111561077457600080fd5b803590602001918460018302840111600160201b8311171561079557600080fd5b919350915035611d8c565b61028d600480360360208110156107b657600080fd5b50356001600160a01b0316611f3d565b6102cb600480360360408110156107dc57600080fd5b50803590602001356001600160a01b03166121ed565b6108196004803603602081101561080857600080fd5b50356001600160c01b03191661220d565b604080516001600160c01b0319909316835260208301919091528051918290030190f35b61025f6004803603606081101561085357600080fd5b508035906020810135906040013561230e565b61025f6004803603604081101561087c57600080fd5b50803590602001356123fb565b61025f6004803603606081101561089f57600080fd5b81359190810190604081016020820135600160201b8111156108c057600080fd5b8201836020820111156108d257600080fd5b803590602001918460018302840111600160201b831117156108f357600080fd5b919390929091602081019035600160201b81111561091057600080fd5b82018360208201111561092257600080fd5b803590602001918460018302840111600160201b8311171561094357600080fd5b50909250905061240b565b61028d6004803603602081101561096457600080fd5b50356001600160a01b0316612500565b61028d612512565b61025f6004803603604081101561099257600080fd5b506001600160c01b03198135169060200135612519565b6102cb600480360360208110156109bf57600080fd5b50356126d9565b6109ce612910565b604080516001600160a01b039092168252519081900360200190f35b61028d61291f565b610a0f60048036036020811015610a0857600080fd5b5035612925565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b61028d60048036036020811015610a4f57600080fd5b5035612962565b610a7c60048036036020811015610a6c57600080fd5b50356001600160a01b0316612c7d565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610ab8578181015183820152602001610aa0565b505050509050019250505060405180910390f35b61025f60048036036020811015610ae257600080fd5b5035612ce9565b61025f60048036036020811015610aff57600080fd5b50356001600160a01b0316612d74565b6102cb60048036036020811015610b2557600080fd5b50356001600160a01b0316612dfd565b61025f60048036036040811015610b4b57600080fd5b5080359060200135612e12565b61028d60048036036020811015610b6e57600080fd5b50356001600160a01b0316612e1e565b61025f60048036036080811015610b9457600080fd5b81359190810190604081016020820135600160201b811115610bb557600080fd5b820183602082011115610bc757600080fd5b803590602001918460018302840111600160201b83111715610be857600080fd5b919390929091602081019035600160201b811115610c0557600080fd5b820183602082011115610c1757600080fd5b803590602001918460018302840111600160201b83111715610c3857600080fd5b919390929091602081019035600160201b811115610c5557600080fd5b820183602082011115610c6757600080fd5b803590602001918460018302840111600160201b83111715610c8857600080fd5b509092509050612e30565b61028d60048036036020811015610ca957600080fd5b5035612fe3565b6109ce612ff8565b60008181526004602081905260408220600281015460165491909201549192914291610cea919063ffffffff61300716565b11158015610d0657506002600084815260046020526040902054105b15610d1c57610d178360065b61306a565b610e98565b610d2583612962565b600114610d3157600080fd5b601854600084815260046020819052604080832060020154815163253eca1f60e01b815292830152516001600160a01b039093169263253eca1f92602480840193919291829003018186803b158015610d8957600080fd5b505afa158015610d9d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015610dc657600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115610e0057600080fd5b908301906020820185811115610e1557600080fd5b82518660208202830111600160201b82111715610e3157600080fd5b82525081516020918201928201910280838360005b83811015610e5e578181015183820152602001610e46565b50505050919091016040525095975060019650610e7d95505050505050565b811415610e8e57610d1783836130ad565b610e9883836132c3565b505050565b600860209081526000928352604080842090915290825290205481565b601c60209081526000928352604080842090915290825290205460ff1681565b600054604080516227050b60e31b815261544360f01b600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b158015610f2957600080fd5b505afa158015610f3d573d6000803e3d6000fd5b505050506040513d6020811015610f5357600080fd5b5051601980546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b81526126a960f11b6004820152905191909216916301382858916024808301926020929190829003018186803b158015610fb857600080fd5b505afa158015610fcc573d6000803e3d6000fd5b505050506040513d6020811015610fe257600080fd5b5051601780546001600160a01b0319166001600160a01b03928316179055600054604080516227050b60e31b815261504360f01b6004820152905191909216916301382858916024808301926020929190829003018186803b15801561104757600080fd5b505afa15801561105b573d6000803e3d6000fd5b505050506040513d602081101561107157600080fd5b5051601880546001600160a01b0319166001600160a01b03909216919091179055565b6000828152600c60208181526040808420948452848252808420546001860183529084205495909352526002909101549092565b600081815260056020908152604080832054600c909252909120600201549192909190565b846110f7816126d9565b611136576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b601554604080516020601f8f018190048102820181019092528d8152611202918f908f9081908401838280828437600081840152601f19601f820116905080830192505050505050508c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506137f2915050565b6000871161120f57600080fd5b6112838187878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250613a7a92505050565b50505050505050505050505050565b60008054604080516227050b60e31b815261544360f01b600482015290518392839283926001600160a01b0390921691630138285891602480820192602092909190829003018186803b1580156112e857600080fd5b505afa1580156112fc573d6000803e3d6000fd5b505050506040513d602081101561131257600080fd5b50516001600160a01b0316331461132857600080fd5b6001600160a01b038616600090815260096020526040902054611349615519565b6003828154811061135657fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b0390811684526001820154169383019390935260029092015491810191909152905081158015906113b9575060208101516001600160a01b031615155b156113d15780602001519350806040015192506113d5565b8793505b6001600160a01b03808516600090815260066020908152604080832054938c168352600e909152812054909190819083905b838110801561141557508b82105b156115f6576001600160a01b038916600090815260066020526040902080548290811061143e57fe5b9060005260206000200154995060028a8154811061145857fe5b90600052602060002090600302016001015494506000600c6000878152602001908152602001600020600201541180156114dd57506010546114a190899063ffffffff61300716565b60028b815481106114ae57fe5b90600052602060002090600302016002015411806114dd57508c6001600160a01b0316896001600160a01b0316145b156115ee57600260008681526004602052604090205411156115e257600760008b815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060009054906101000a900460ff166115dd576000858152600c602090815260408083206002015460049092529091206003015461158391611576919063ffffffff613dad16565b8c9063ffffffff61300716565b9a506001600760008c815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555081806001019250505b6115ee565b838314156115ee578092505b600101611407565b8383141561161e576001600160a01b038d166000908152600e6020526040902081905561163a565b6001600160a01b038d166000908152600e602052604090208390555b811561168057604080518c815290516001600160a01b038f16917f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241919081900360200190a25b5050505050505050505092915050565b601a6020526000908152604090205481565b6000809054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ef57600080fd5b505afa158015611703573d6000803e3d6000fd5b505050506040513d602081101561171957600080fd5b50511580156117a057506000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b15801561176e57600080fd5b505afa158015611782573d6000803e3d6000fd5b505050506040513d602081101561179857600080fd5b505115156001145b6117a957600080fd5b6117b233611f3d565b156117f3576040805162461bcd60e51b815260206004820152600c60248201526b10db185a5b481c995dd85c9960a21b604482015290519081900360640190fd5b6117fc33613def565b565b6017546040805163505ef22f60e01b81523360048201526001602482015290516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b15801561185057600080fd5b505afa158015611864573d6000803e3d6000fd5b505050506040513d602081101561187a57600080fd5b505161188557600080fd5b60016000828152601a6020526040902054146118a057600080fd5b6000818152601c6020908152604080832033845290915290205460ff16156118c757600080fd5b60408051600480825260248083018452602080840180516001600160e01b0316630c578f2360e41b17815293519093206018546000878152948490528585206002015486516357c7bec160e01b815294850152945190946001600160a01b0316936357c7bec1938084019391929190829003018186803b15801561194a57600080fd5b505afa15801561195e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561198757600080fd5b8101908080516040519392919084600160201b8211156119a657600080fd5b9083019060208201858111156119bb57600080fd5b8251600160201b8111828201881017156119d457600080fd5b82525081516020918201929091019080838360005b83811015611a015781810151838201526020016119e9565b50505050905090810190601f168015611a2e5780820380516001836020036101000a031916815260200191505b50604052505050805190602001201415611a4757600080fd5b6000818152601c6020908152604080832033808552908352818420805460ff19166001908117909155858552601d845293829020805490940190935580519283525183927f56bdda336a8bb949a57770a7cde5b62bd8913d11d9dde767735db889a609692f92908290030190a26000818152601d602052604090205460031415611add5760026000828152601a60205260409020555b50565b600f5460ff1615611af057600080fd5b600f805460ff19166001908117909155601581905560408051606080820183526000808352602080840182815284860183815260028054808a018255908552955160039687027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180546001600160a01b039384166001600160a01b03199182161790915593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad090920191909155865194850187528385529184018381524296850196875285548089018755938690529351929094027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810180549383169386169390931790925591517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8201805491909316931692909217905590517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d90910155601155601095909555601693909355601291909155601455601355601f55565b60008281526005602052604081208054606091849182908110611cb957fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529192839190830182828015611d4b5780601f10611d2057610100808354040283529160200191611d4b565b820191906000526020600020905b815481529060010190602001808311611d2e57829003601f168201915b50505050509050915091509250929050565b600081815260046020526040902060028101548154600183015460039093015493949193909291565b60105481565b80611d96816126d9565b611dd5576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6000546040805163288c314960e21b815233600482015290516001600160a01b039092169163a230c52491602480820192602092909190829003018186803b158015611e2057600080fd5b505afa158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b5051611e8a576040805162461bcd60e51b815260206004820152600a6024820152692737ba1026b2b6b132b960b11b604482015290519081900360640190fd5b611f3388888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020601f8b0181900481028201810190925289815292508991508890819084018382808284376000920191909152508892506137f2915050565b5050505050505050565b6001600160a01b0381166000908152600960205260408120548180611f60615519565b60038481548110611f6d57fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b039081168452600182015416938301939093526002909201549181019190915290508315801590611fd0575060208101516001600160a01b031615155b15611fe8578060200151925080604001519150611fec565b8592505b6001600160a01b0386166000908152600e60205260408120545b6001600160a01b0385166000908152600660205260409020548110156121e25760105461203a90859063ffffffff61300716565b6001600160a01b03861660009081526006602052604090208054600291908490811061206257fe5b90600052602060002001548154811061207757fe5b90600052602060002090600302016002015411806120a65750876001600160a01b0316856001600160a01b0316145b156121da576001600160a01b038516600090815260066020526040812080546007929190849081106120d457fe5b6000918252602080832090910154835282810193909352604091820181206001600160a01b038c16825290925290205460ff166121da576001600160a01b03851660009081526006602052604090208054600291908390811061213357fe5b90600052602060002001548154811061214857fe5b90600052602060002090600302016001015491506000600c60008481526020019081526020016000206002015411801561219057506002600083815260046020526040902054115b156121da576000828152600c60209081526040808320600201546004909252909120600301546121d7916121ca919063ffffffff613dad16565b889063ffffffff61300716565b96505b600101612006565b505050505050919050565b600760209081526000928352604080842090915290825290205460ff1681565b8060006611d3d59213d31160ca1b6001600160c01b0319831614156122355750601054612309565b651350561193d360d21b6001600160c01b0319841614156122595750601454612309565b661350561114919560ca1b6001600160c01b03198416141561227e5750601654612309565b631050d5d560e21b6001600160c01b0319841614156122a05750601f54612309565b66434154524f4c4560c81b6001600160c01b0319841614156122c55750601154612309565b654d415856545760d01b6001600160c01b0319841614156122e95750601254612309565b6553505245534d60d01b6001600160c01b03198416141561230957506013545b915091565b8260026000828152600460205260409020541061232a57600080fd5b6017546011546040805163505ef22f60e01b81523360048201526024810192909252516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b15801561237f57600080fd5b505afa158015612393573d6000803e3d6000fd5b505050506040513d60208110156123a957600080fd5b50516123ea576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6123f5848484613f48565b50505050565b61240782826001614071565b5050565b60008581526004602052604090206005015485906001600160a01b03163314612469576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b60016000878152600460205260409020541461248457600080fd5b6124f88686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881529250889150879081908401838280828437600092019190915250613a7a92505050565b505050505050565b60096020526000908152604090205481565b6015545b90565b60005460408051632c1a733d60e11b815233600482015290516001600160a01b0390921691635834e67a91602480820192602092909190829003018186803b15801561256457600080fd5b505afa158015612578573d6000803e3d6000fd5b505050506040513d602081101561258e57600080fd5b505161259957600080fd5b6611d3d59213d31160ca1b6001600160c01b0319831614156125bf576010819055612407565b651350561193d360d21b6001600160c01b0319831614156125e4576014819055612407565b661350561114919560ca1b6001600160c01b03198316141561260a576016819055612407565b631050d5d560e21b6001600160c01b03198316141561262d57601f819055612407565b66434154524f4c4560c81b6001600160c01b031983161415612653576011819055612407565b654d415856545760d01b6001600160c01b031983161415612678576012819055612407565b6553505245534d60d01b6001600160c01b03198316141561269d576013819055612407565b6040805162461bcd60e51b815260206004820152600c60248201526b496e76616c696420636f646560a01b604482015290519081900360640190fd5b6000816126e85750600161290b565b6018546040805163253eca1f60e01b81526004810185905290516060926001600160a01b03169163253eca1f916024808301926000929190829003018186803b15801561273457600080fd5b505afa158015612748573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561277157600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156127ab57600080fd5b9083019060208201858111156127c057600080fd5b82518660208202830111600160201b821117156127dc57600080fd5b82525081516020918201928201910280838360005b838110156128095781810151838201526020016127f1565b505050509190910160405250929750600096505050505050505b81518110156129085781818151811061283857fe5b6020026020010151600014806128f0575060175482516001600160a01b039091169063505ef22f90339085908590811061286e57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156128c357600080fd5b505afa1580156128d7573d6000803e3d6000fd5b505050506040513d60208110156128ed57600080fd5b50515b156129005760019250505061290b565b600101612823565b50505b919050565b6000546001600160a01b031681565b60115490565b6003818154811061293257fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03918216935091169083565b6000818152600460208190526040808320805481840154601854600290930154845163253eca1f60e01b8152958601529251929390928592839283926001600160a01b039092169163253eca1f916024808201928692909190829003018186803b1580156129cf57600080fd5b505afa1580156129e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015612a0c57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115612a4657600080fd5b908301906020820185811115612a5b57600080fd5b82518660208202830111600160201b82111715612a7757600080fd5b82525081516020918201928201910280838360005b83811015612aa4578181015183820152602001612a8c565b50505050919091016040525060200151995094975092955060029450612aca9350505050565b841415612c4e5760175460408051630dc6f84760e01b81526004810185905290516000926001600160a01b031691630dc6f847916024808301926020929190829003018186803b158015612b1d57600080fd5b505afa158015612b31573d6000803e3d6000fd5b505050506040513d6020811015612b4757600080fd5b505190506001831415612c06576000888152600c602090815260408083206001808552019091529020548290612b96908390612b8a90606463ffffffff61477416565b9063ffffffff613dad16565b101580612bd357506000888152600c60209081526040808320838052600190810190925280832054918352909120548291612bd19190613007565b145b80612bed575042612bea878663ffffffff61300716565b11155b15612c01576001965050505050505061290b565b612c48565b6000888152600c6020526040902060020154811480612c34575042612c31878663ffffffff61300716565b11155b15612c48576001965050505050505061290b565b50612c73565b6002841115612c655760029550505050505061290b565b60009550505050505061290b565b5050505050919050565b6001600160a01b0381166000908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015612cdd57602002820191906000526020600020905b815481526020019060010190808311612cc9575b50505050509050919050565b60016000828152601a6020526040902054148015612d1557506000818152601b60205260409020544210155b612d57576040805162461bcd60e51b815260206004820152600e60248201526d21b0b73737ba103a3934b3b3b2b960911b604482015290519081900360640190fd5b600081815260046020526040902060020154611add9082906147cd565b6000546001600160a01b031615612dd1576000546001600160a01b03163314612dd1576040805162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015290519081900360640190fd5b600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b600d6020526000908152604090205460ff1681565b61240782826000614071565b600e6020526000908152604090205481565b60008781526004602052604090206005015487906001600160a01b03163314612e8e576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b600088815260056020526040902054600211612edf576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b600088815260046020908152604080832083815560028101849055600381019390935560059092015482514280825260809382018481529382018b90528c946001600160a01b03909316937f470106408ef1beec24fa0f364830357ef2a70d11457aa4eb9b30b1bbc0172abe9391928d928d928d928d928d928d929182016060830160a084018a8a80828437600083820152601f01601f191690910185810384528881526020019050888880828437600083820152601f01601f191690910185810383528681526020019050868680828437600083820152604051601f909101601f19169092018290039c50909a5050505050505050505050a35050505050505050565b600c6020526000908152604090206002015481565b6001546001600160a01b031681565b600082820183811015613061576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b60048114806130795750600681145b156130905760046000838152601a60205260409020555b600091825260046020819052604090922042928101929092559055565b6018546040805163253eca1f60e01b81526004810184905290516000926001926001600160a01b039091169163253eca1f916024808201928792909190829003018186803b1580156130fe57600080fd5b505afa158015613112573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561313b57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b82111561317557600080fd5b90830190602082018581111561318a57600080fd5b82518660208202830111600160201b821117156131a657600080fd5b82525081516020918201928201910280838360005b838110156131d35781810151838201526020016131bb565b5050505091909101604052505060175494985088965061329f9550506001600160a01b039093169250630dc6f8479150859050600481111561321157fe5b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561324557600080fd5b505afa158015613259573d6000803e3d6000fd5b505050506040513d602081101561326f57600080fd5b50516000878152600c60209081526040808320600180855201909152902054612b8a90606463ffffffff61477416565b106132b8576132b384600385600185614c19565b6123f5565b6123f5846006610d12565b601854604080516307149ba360e01b815260048101849052905160009283926001600160a01b03909116916307149ba391602480820192606092909190829003018186803b15801561331457600080fd5b505afa158015613328573d6000803e3d6000fd5b505050506040513d606081101561333e57600080fd5b5060208101516040909101519250905060018214156134d3576017546000906134a190613475906133ef90670de0b6b3a7640000906001600160a01b0316630dc6f84760026040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156133b757600080fd5b505afa1580156133cb573d6000803e3d6000fd5b505050506040513d60208110156133e157600080fd5b50519063ffffffff61477416565b601960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561343d57600080fd5b505afa158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b50519063ffffffff61300716565b6000878152600c6020908152604080832060018452909152902054612b8a90606463ffffffff61477416565b905060135481106134c2576134bd8560035b8660016002614c19565b6134cd565b6134cd856006610d12565b506136e4565b6134dd8484614cdd565b15613693576018546040805163253eca1f60e01b81526004810186905290516000926001600160a01b03169163253eca1f9160248083019286929190829003018186803b15801561352d57600080fd5b505afa158015613541573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561356a57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156135a457600080fd5b9083019060208201858111156135b957600080fd5b82518660208202830111600160201b821117156135d557600080fd5b82525081516020918201928201910280838360005b838110156136025781810151838201526020016135ea565b5050505091909101604090815260008f8152600c60209081528282206001835290528181205481805291902054979a508a9950613678985061364c97965094505061300792505050565b6000888152600c6020908152604080832060018452909152902054612b8a90606463ffffffff61477416565b10613688576134bd8560036134b3565b6134cd856004610d12565b6000811180156136bf575060175481906136bc906001600160a01b0316630dc6f8476001613211565b10155b156136d9576136d48460038560016002614c19565b6136e4565b6136e4846006610d12565b6000848152600c6020526040902060020154156123f557601954600054604080516227050b60e31b815261544360f01b600482015290516001600160a01b03938416936340c10f199316916301382858916024808301926020929190829003018186803b15801561375457600080fd5b505afa158015613768573d6000803e3d6000fd5b505050506040513d602081101561377e57600080fd5b505160008781526004602081905260408083206003015481516001600160e01b031960e088901b1681526001600160a01b039095169285019290925260248401919091525160448084019382900301818387803b1580156137de57600080fd5b505af1158015611f33573d6000803e3d6000fd5b60185460408051637800529760e01b81526004810184905290516001600160a01b0390921691637800529791602480820192602092909190829003018186803b15801561383e57600080fd5b505afa158015613852573d6000803e3d6000fd5b505050506040513d602081101561386857600080fd5b50511580613874575080155b61387d57600080fd5b6015546000818152600460208181526040808420600580820180546001600160a01b031916331790554291909401559181528183208054600181018083559185528285208451938401948590529285905290936138df93929091019190615539565b50506015805460010190556040805142808252608060208084018281528a51928501929092528951869533957f470106408ef1beec24fa0f364830357ef2a70d11457aa4eb9b30b1bbc0172abe95948d948d948d94840191606085019160a086019189019080838360005b8381101561396257818101518382015260200161394a565b50505050905090810190601f16801561398f5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b838110156139c25781810151838201526020016139aa565b50505050905090810190601f1680156139ef5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b83811015613a22578181015183820152602001613a0a565b50505050905090810190601f168015613a4f5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390a38115613a7357613a7381836000613f48565b5050505050565b60008381526004602081905260408083206002015460185482516357c7bec160e01b8152938401829052915190936001600160a01b03909216926357c7bec1926024808301939192829003018186803b158015613ad657600080fd5b505afa158015613aea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613b1357600080fd5b8101908080516040519392919084600160201b821115613b3257600080fd5b908301906020820185811115613b4757600080fd5b8251600160201b811182820188101715613b6057600080fd5b82525081516020918201929091019080838360005b83811015613b8d578181015183820152602001613b75565b50505050905090810190601f168015613bba5780820380516001836020036101000a031916815260200191505b506040525050505160001415613c0e57815160208301207fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47014613bfc57600080fd5b60046000858152601a60205260409020555b613c19848385614ec6565b613c24846002610d12565b6018546040805163253eca1f60e01b81526004810184905290516000926001600160a01b03169163253eca1f9160248083019286929190829003018186803b158015613c6f57600080fd5b505afa158015613c83573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015613cac57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115613ce657600080fd5b908301906020820185811115613cfb57600080fd5b82518660208202830111600160201b82111715613d1757600080fd5b82525081516020918201928201910280838360005b83811015613d44578181015183820152602001613d2c565b5050505091909101604052506020015197508b96507fc5be51db6c7799c3f641eecd22b62761981da3190ac6d1d306bc3672435662589550613d9594508793504292505063ffffffff613007169050565b60408051918252519081900360200190a25050505050565b600061306183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614fc7565b6001600160a01b038116600090815260096020526040902054613e10615519565b60038281548110613e1d57fe5b600091825260209182902060408051606081018252600390930290910180546001600160a01b0390811684526001820154169383018490526002015490820152915015610e98576020808201516001600160a01b03166000908152600a90915260409020548015613eb857613e9981600163ffffffff61506916565b6020808401516001600160a01b03166000908152600a90915260409020555b600060038481548110613ec757fe5b906000526020600020906003020160010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055504260038481548110613f0a57fe5b60009182526020808320600260039093020191909101929092556001600160a01b038616815260068252604080822054600e90935290205550505050565b600082118015613fd05750601860009054906101000a90046001600160a01b03166001600160a01b03166339275b0a6040518163ffffffff1660e01b815260040160206040518083038186803b158015613fa157600080fd5b505afa158015613fb5573d6000803e3d6000fd5b505050506040513d6020811015613fcb57600080fd5b505182105b614014576040805162461bcd60e51b815260206004820152601060248201526f496e76616c69642063617465676f727960801b604482015290519081900360640190fd5b60008381526004602090815260409182902060028101859055600381018490556001905581518481529151339286927f5c0ed4086100f9e2c57a36b2c5ae3a1f991b2fd6af5a44cf0b9afb8a21796cdc92918290030190a3505050565b6002600084815260046020526040902054146140c2576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b60008381526005602052604090205482106140dc57600080fd5b3360009081526009602090815260408083205460185487855260049384905282852060020154835163253eca1f60e01b8152948501529151909392839283926001600160a01b039091169163253eca1f9160248083019286929190829003018186803b15801561414b57600080fd5b505afa15801561415f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e081101561418857600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156141c257600080fd5b9083019060208201858111156141d757600080fd5b82518660208202830111600160201b821117156141f357600080fd5b82525081516020918201928201910280838360005b83811015614220578181015183820152602001614208565b5050505090500160405260200180519060200190929190805190602001909291905050509091929394955090919250909150508093508194508295505050504261428982600460008b81526020019081526020016000206004015461300790919063ffffffff16565b116142c4576040805162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b604482015290519081900360640190fd5b3360009081526008602090815260408083208a84529091529020541561431f576040805162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b8315806143975750600084118015614369575060006001600160a01b03166003858154811061434a57fe5b60009182526020909120600160039092020101546001600160a01b0316145b801561439757506143976003858154811061438057fe5b9060005260206000209060030201600201546150ab565b6143a057600080fd5b6017546040805163505ef22f60e01b81523360048201526024810186905290516001600160a01b039092169163505ef22f91604480820192602092909190829003018186803b1580156143f257600080fd5b505afa158015614406573d6000803e3d6000fd5b505050506040513d602081101561441c57600080fd5b5051614460576040805162461bcd60e51b815260206004820152600e60248201526d139bdd08105d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b6002805433600081815260066020908152604080832080546001808201835591855283852001869055848452600883528184208e8552835281842086905581516060810183528581528084018f8152428285018181528a549485018b559990965290517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600390930292830180546001600160a01b0319166001600160a01b03909216919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82015595517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad090960195909555845191825281018a90528351929384938c93927f89eb0be5e1a1bcbad3c382ad8d3f2698ea4d54d9a179cd2368d184358ecad45192908290030190a460038414156145dc5786600114156145cc576145c788600360008b81526004602052604090206002015460016003614c19565b6145d7565b6145d7886004610d12565b611f33565b60175460408051630dc6f84760e01b81526004810187905290516000926001600160a01b031691630dc6f847916024808301926020929190829003018186803b15801561462857600080fd5b505afa15801561463c573d6000803e3d6000fd5b505050506040513d602081101561465257600080fd5b505190506146628989878a6150b7565b600185141561471c576000898152600c6020908152604080832060018085520190915290205484906146a1908390612b8a90606463ffffffff61477416565b1015806146de57506000898152600c602090815260408083208380526001908101909252808320549183529091205482916146dc9190613007565b145b1561471757604080518a815290517f9593d9bd30eff4872ec3bab10360ad82eaac80651801e68f47f0674c38415c3d9181900360200190a15b614769565b6000898152600c602052604090206002015481141561476957604080518a815290517f9593d9bd30eff4872ec3bab10360ad82eaac80651801e68f47f0674c38415c3d9181900360200190a15b505050505050505050565b60008261478357506000613064565b8282028284828161479057fe5b04146130615760405162461bcd60e51b81526004018080602001828103825260218152602001806155f56021913960400191505060405180910390fd5b6000828152601a602052604080822060039055601854815163352aabed60e21b815260048101859052915183926060926001600160a01b03169163d4aaafb4916024808201928792909190829003018186803b15801561482c57600080fd5b505afa158015614840573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260a081101561486957600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b8211156148a357600080fd5b9083019060208201858111156148b857600080fd5b8251600160201b8111828201881017156148d157600080fd5b82525081516020918201929091019080838360005b838110156148fe5781810151838201526020016148e6565b50505050905090810190601f16801561492b5780820380516001836020036101000a031916815260200191505b506040525093985093965094505050506001600160f01b03198416614d5360f01b14159050614967576000546001600160a01b03169150614a00565b6108ab60f31b6001600160f01b0319841614614a0057600054604080516227050b60e31b81526001600160f01b03198616600482015290516001600160a01b0390921691630138285891602480820192602092909190829003018186803b1580156149d157600080fd5b505afa1580156149e5573d6000803e3d6000fd5b505050506040513d60208110156149fb57600080fd5b505191505b60006060836001600160a01b031683600560008a8152602001908152602001600020600181548110614a2e57fe5b906000526020600020016040516020018083805190602001908083835b60208310614a6a5780518252601f199092019160209182019101614a4b565b6001836020036101000a03801982511681845116808217855250505050505090500182805460018160011615610100020316600290048015614ae35780601f10614ac1576101008083540402835291820191614ae3565b820191906000526020600020905b815481529060010190602001808311614acf575b5050925050506040516020818303038152906040526040518082805190602001908083835b60208310614b275780518252601f199092019160209182019101614b08565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614b89576040519150601f19603f3d011682016040523d82523d6000602084013e614b8e565b606091505b509150915081614bdd57805180614bd65760405162461bcd60e51b81526004018080602001828103825260238152602001806155d26023913960400191505060405180910390fd5b8060208301fd5b6040805188815290517f6535f242c0cf5f7c126188bcde0e013c21a0251762fa3be3c854f59ac30a5cdd9181900360200190a150505050505050565b6000858152600460205260409020600101829055614c37858561306a565b6040805186815290517fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b9181900360200190a160046000868152601a602052604090205414613a73576001816004811115614c8e57fe5b1415614ca357614c9e85846147cd565b613a73565b60016000868152601a6020526040902055601f54614cc7904263ffffffff61300716565b6000868152601b60205260409020555050505050565b6018546040805163253eca1f60e01b8152600481018490529051600092839283926001600160a01b039092169163253eca1f916024808201928692909190829003018186803b158015614d2f57600080fd5b505afa158015614d43573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260e0811015614d6c57600080fd5b8151602083015160408085015160608601516080870180519351959794969295919491939282019284600160201b821115614da657600080fd5b908301906020820185811115614dbb57600080fd5b82518660208202830111600160201b82111715614dd757600080fd5b82525081516020918201928201910280838360005b83811015614e04578181015183820152602001614dec565b50505050919091016040818152601754630dc6f84760e01b8352600483018b90529051979c50989a508b9950614ebb98614e7d98506133ef97670de0b6b3a764000097506001600160a01b039091169550630dc6f847945060248083019450602093509091829003018186803b1580156133b757600080fd5b6000888152600c602090815260408083206001845290915280822054828052912054612b8a91606491614eaf91613007565b9063ffffffff61477416565b101595945050505050565b600083815260056020908152604082208054600181018083559184529282902085519193614efa9391019190860190615539565b50506001600560008581526020019081526020016000208054905003336001600160a01b0316847f28aed3fdbf1b73725998bf6a5f364a2b9a08b85236c75f0c0270cfe1b65fba8c84426040518080602001838152602001828103825284818151815260200191508051906020019080838360005b83811015614f87578181015183820152602001614f6f565b50505050905090810190601f168015614fb45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b600081836150535760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615018578181015183820152602001615000565b50505050905090810190601f1680156150455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161505f57fe5b0495945050505050565b600061306183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154b0565b60105442919091031190565b60185460008581526004602081905260408083206002015481516307149ba360e01b81529283015251919283926001600160a01b03909116916307149ba3916024808301926060929190829003018186803b15801561511557600080fd5b505afa158015615129573d6000803e3d6000fd5b505050506040513d606081101561513f57600080fd5b50602081810151604092830151601754845163505ef22f60e01b81523360048201526001602482015294519296509094506001600160a01b03169263505ef22f926044808301939192829003018186803b15801561519c57600080fd5b505afa1580156151b0573d6000803e3d6000fd5b505050506040513d60208110156151c657600080fd5b505180156151d45750600082115b806151df5750600184145b1561520b576000868152600c602090815260408083208884526001908101909252909120805490910190555b60195460105460408051634c47e71d60e01b81523360048201526024810192909252516001600160a01b0390921691634c47e71d9160448082019260009290919082900301818387803b15801561526157600080fd5b505af1158015615275573d6000803e3d6000fd5b5060019250615282915050565b84146124f85760008361530b57601954604080516351626ddd60e01b815233600482015290516001600160a01b03909216916351626ddd91602480820192602092909190829003018186803b1580156152da57600080fd5b505afa1580156152ee573d6000803e3d6000fd5b505050506040513d602081101561530457600080fd5b5051615383565b60195460408051632587701560e11b815233600482015290516001600160a01b0390921691634b0ee02a91602480820192602092909190829003018186803b15801561535657600080fd5b505afa15801561536a573d6000803e3d6000fd5b505050506040513d602081101561538057600080fd5b50515b90506000601960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156153d557600080fd5b505afa1580156153e9573d6000803e3d6000fd5b505050506040513d60208110156153ff57600080fd5b50519050600061541d83670de0b6b3a764000063ffffffff61300716565b90508361544d576000615449826154446064612b8a8760125461477490919063ffffffff16565b61550a565b9150505b6000898152600c602090815260408083208b8452909152902054615477908263ffffffff61300716565b60008a8152600c602081815260408084208d855280835290842094909455918c9052905260020180546001019055505050505050505050565b600081848411156155025760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315615018578181015183820152602001615000565b505050900390565b81818111156130645750919050565b604080516060810182526000808252602082018190529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061557a57805160ff19168380011785556155a7565b828001600101855582156155a7579182015b828111156155a757825182559160200191906001019061558c565b506155b39291506155b7565b5090565b61251691905b808211156155b357600081556001016155bd56fe416374696f6e206661696c656420776974686f75742072657665727420726561736f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a7231582023de812ae6f4a55d63d4d8f41bd6cb8095b098e53e0f01e09e6a7592df35088a64736f6c63430005110032
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.