Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
Celeste
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-11-29 */ // Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/Uint256Helpers.sol // Adapted to use pragma ^0.5.8 and satisfy our linter rules pragma solidity ^0.5.8; library Uint256Helpers { uint256 private constant MAX_UINT8 = uint8(-1); uint256 private constant MAX_UINT64 = uint64(-1); string private constant ERROR_UINT8_NUMBER_TOO_BIG = "UINT8_NUMBER_TOO_BIG"; string private constant ERROR_UINT64_NUMBER_TOO_BIG = "UINT64_NUMBER_TOO_BIG"; function toUint8(uint256 a) internal pure returns (uint8) { require(a <= MAX_UINT8, ERROR_UINT8_NUMBER_TOO_BIG); return uint8(a); } function toUint64(uint256 a) internal pure returns (uint64) { require(a <= MAX_UINT64, ERROR_UINT64_NUMBER_TOO_BIG); return uint64(a); } } // File: contracts/lib/os/IsContract.sol // Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/IsContract.sol // Adapted to use pragma ^0.5.8 and satisfy our linter rules pragma solidity ^0.5.8; contract IsContract { /* * NOTE: this should NEVER be used for authentication * (see pitfalls: https://github.com/fergarrui/ethereum-security/tree/master/contracts/extcodesize). * * This is only intended to be used as a sanity check that an address is actually a contract, * RATHER THAN an address not being a contract. */ function isContract(address _target) internal view returns (bool) { if (_target == address(0)) { return false; } uint256 size; assembly { size := extcodesize(_target) } return size > 0; } } // File: contracts/lib/os/SafeMath64.sol // Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/lib/math/SafeMath64.sol // Adapted to use pragma ^0.5.8 and satisfy our linter rules pragma solidity ^0.5.8; /** * @title SafeMath64 * @dev Math operations for uint64 with safety checks that revert on error */ library SafeMath64 { string private constant ERROR_ADD_OVERFLOW = "MATH64_ADD_OVERFLOW"; string private constant ERROR_SUB_UNDERFLOW = "MATH64_SUB_UNDERFLOW"; string private constant ERROR_MUL_OVERFLOW = "MATH64_MUL_OVERFLOW"; string private constant ERROR_DIV_ZERO = "MATH64_DIV_ZERO"; /** * @dev Multiplies two numbers, reverts on overflow. */ function mul(uint64 _a, uint64 _b) internal pure returns (uint64) { uint256 c = uint256(_a) * uint256(_b); require(c < 0x010000000000000000, ERROR_MUL_OVERFLOW); // 2**64 (less gas this way) return uint64(c); } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint64 _a, uint64 _b) internal pure returns (uint64) { require(_b > 0, ERROR_DIV_ZERO); // Solidity only automatically asserts when dividing by 0 uint64 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint64 _a, uint64 _b) internal pure returns (uint64) { require(_b <= _a, ERROR_SUB_UNDERFLOW); uint64 c = _a - _b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint64 _a, uint64 _b) internal pure returns (uint64) { uint64 c = _a + _b; require(c >= _a, ERROR_ADD_OVERFLOW); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint64 a, uint64 b) internal pure returns (uint64) { require(b != 0, ERROR_DIV_ZERO); return a % b; } } // File: contracts/lib/os/TimeHelpers.sol // Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/common/TimeHelpers.sol // Adapted to use pragma ^0.5.8 and satisfy our linter rules pragma solidity ^0.5.8; contract TimeHelpers { using Uint256Helpers for uint256; /** * @dev Returns the current block number. * Using a function rather than `block.number` allows us to easily mock the block number in * tests. */ function getBlockNumber() internal view returns (uint256) { return block.number; } /** * @dev Returns the current block number, converted to uint64. * Using a function rather than `block.number` allows us to easily mock the block number in * tests. */ function getBlockNumber64() internal view returns (uint64) { return getBlockNumber().toUint64(); } /** * @dev Returns the current timestamp. * Using a function rather than `block.timestamp` allows us to easily mock it in * tests. */ function getTimestamp() internal view returns (uint256) { return block.timestamp; // solium-disable-line security/no-block-members } /** * @dev Returns the current timestamp, converted to uint64. * Using a function rather than `block.timestamp` allows us to easily mock it in * tests. */ function getTimestamp64() internal view returns (uint64) { return getTimestamp().toUint64(); } } // File: contracts/lib/os/ERC20.sol // Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/lib/token/ERC20.sol // Adapted to use pragma ^0.5.8 and satisfy our linter rules pragma solidity ^0.5.8; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 { function totalSupply() public view returns (uint256); function balanceOf(address _who) public view returns (uint256); function allowance(address _owner, address _spender) public view returns (uint256); function transfer(address _to, uint256 _value) public returns (bool); function approve(address _spender, uint256 _value) public returns (bool); function transferFrom(address _from, address _to, uint256 _value) public returns (bool); event Transfer( address indexed from, address indexed to, uint256 value ); event Approval( address indexed owner, address indexed spender, uint256 value ); } // File: contracts/court/clock/IClock.sol pragma solidity ^0.5.8; interface IClock { /** * @dev Ensure that the current term of the clock is up-to-date * @return Identification number of the current term */ function ensureCurrentTerm() external returns (uint64); /** * @dev Transition up to a certain number of terms to leave the clock up-to-date * @param _maxRequestedTransitions Max number of term transitions allowed by the sender * @return Identification number of the term ID after executing the heartbeat transitions */ function heartbeat(uint64 _maxRequestedTransitions) external returns (uint64); /** * @dev Ensure that a certain term has its randomness set * @return Randomness of the current term */ function ensureCurrentTermRandomness() external returns (bytes32); /** * @dev Tell the last ensured term identification number * @return Identification number of the last ensured term */ function getLastEnsuredTermId() external view returns (uint64); /** * @dev Tell the current term identification number. Note that there may be pending term transitions. * @return Identification number of the current term */ function getCurrentTermId() external view returns (uint64); /** * @dev Tell the number of terms the clock should transition to be up-to-date * @return Number of terms the clock should transition to be up-to-date */ function getNeededTermTransitions() external view returns (uint64); /** * @dev Tell the information related to a term based on its ID * @param _termId ID of the term being queried * @return startTime Term start time * @return randomnessBN Block number used for randomness in the requested term * @return randomness Randomness computed for the requested term * @return celesteTokenTotalSupply Total supply of the Celeste token */ function getTerm(uint64 _termId) external view returns (uint64 startTime, uint64 randomnessBN, bytes32 randomness, uint256 celesteTokenTotalSupply); /** * @dev Tell the randomness of a term even if it wasn't computed yet * @param _termId Identification number of the term being queried * @return Randomness of the requested term */ function getTermRandomness(uint64 _termId) external view returns (bytes32); /** * @dev Tell the total supply of the celeste token at a specific term * @param _termId Identification number of the term being queried * @return Total supply of celeste token */ function getTermTokenTotalSupply(uint64 _termId) external view returns (uint256); } // File: contracts/court/clock/CourtClock.sol pragma solidity ^0.5.8; contract CourtClock is IClock, TimeHelpers { using SafeMath64 for uint64; string private constant ERROR_TERM_DOES_NOT_EXIST = "CLK_TERM_DOES_NOT_EXIST"; string private constant ERROR_TERM_DURATION_TOO_LONG = "CLK_TERM_DURATION_TOO_LONG"; string private constant ERROR_TERM_RANDOMNESS_NOT_YET = "CLK_TERM_RANDOMNESS_NOT_YET"; string private constant ERROR_TERM_RANDOMNESS_UNAVAILABLE = "CLK_TERM_RANDOMNESS_UNAVAILABLE"; string private constant ERROR_BAD_FIRST_TERM_START_TIME = "CLK_BAD_FIRST_TERM_START_TIME"; string private constant ERROR_TOO_MANY_TRANSITIONS = "CLK_TOO_MANY_TRANSITIONS"; string private constant ERROR_INVALID_TRANSITION_TERMS = "CLK_INVALID_TRANSITION_TERMS"; string private constant ERROR_CANNOT_DELAY_STARTED_COURT = "CLK_CANNOT_DELAY_STARTED_COURT"; string private constant ERROR_CANNOT_DELAY_PAST_START_TIME = "CLK_CANNOT_DELAY_PAST_START_TIME"; // Maximum number of term transitions a callee may have to assume in order to call certain functions that require the Court being up-to-date uint64 internal constant MAX_AUTO_TERM_TRANSITIONS_ALLOWED = 1; // Max duration in seconds that a term can last uint64 internal constant MAX_TERM_DURATION = 365 days; // Max time until first term starts since contract is deployed uint64 internal constant MAX_FIRST_TERM_DELAY_PERIOD = 2 * MAX_TERM_DURATION; struct Term { uint64 startTime; // Timestamp when the term started uint64 randomnessBN; // Block number for entropy bytes32 randomness; // Entropy from randomnessBN block hash uint256 celesteTokenTotalSupply; } // Duration in seconds for each term of the Court uint64 private termDuration; // Last ensured term id uint64 private termId; // List of Court terms indexed by id mapping (uint64 => Term) private terms; event Heartbeat(uint64 previousTermId, uint64 currentTermId); event StartTimeDelayed(uint64 previousStartTime, uint64 currentStartTime); /** * @dev Ensure a certain term has already been processed * @param _termId Identification number of the term to be checked */ modifier termExists(uint64 _termId) { require(_termId <= termId, ERROR_TERM_DOES_NOT_EXIST); _; } /** * @dev Constructor function * @param _termParams Array containing: * 0. _termDuration Duration in seconds per term * 1. _firstTermStartTime Timestamp in seconds when the court will open (to give time for juror on-boarding) */ constructor(uint64[2] memory _termParams, ERC20 _celesteToken) public { uint64 _termDuration = _termParams[0]; uint64 _firstTermStartTime = _termParams[1]; require(_termDuration < MAX_TERM_DURATION, ERROR_TERM_DURATION_TOO_LONG); require(_firstTermStartTime >= getTimestamp64() + _termDuration, ERROR_BAD_FIRST_TERM_START_TIME); require(_firstTermStartTime <= getTimestamp64() + MAX_FIRST_TERM_DELAY_PERIOD, ERROR_BAD_FIRST_TERM_START_TIME); termDuration = _termDuration; // No need for SafeMath: we already checked values above terms[0].startTime = _firstTermStartTime - _termDuration; terms[0].celesteTokenTotalSupply = _celesteToken.totalSupply(); } /** * @notice Ensure that the current term of the Court is up-to-date. If the Court is outdated by more than `MAX_AUTO_TERM_TRANSITIONS_ALLOWED` * terms, the heartbeat function must be called manually instead. * @return Identification number of the current term */ function ensureCurrentTerm() external returns (uint64) { return _ensureCurrentTerm(); } /** * @notice Transition up to `_maxRequestedTransitions` terms * @param _maxRequestedTransitions Max number of term transitions allowed by the sender * @return Identification number of the term ID after executing the heartbeat transitions */ function heartbeat(uint64 _maxRequestedTransitions) external returns (uint64) { return _heartbeat(_maxRequestedTransitions); } /** * @notice Ensure that a certain term has its randomness set. As we allow to draft disputes requested for previous terms, if there * were mined more than 256 blocks for the current term, the blockhash of its randomness BN is no longer available, given * round will be able to be drafted in the following term. * @return Randomness of the current term */ function ensureCurrentTermRandomness() external returns (bytes32) { // If the randomness for the given term was already computed, return uint64 currentTermId = termId; Term storage term = terms[currentTermId]; bytes32 termRandomness = term.randomness; if (termRandomness != bytes32(0)) { return termRandomness; } // Compute term randomness bytes32 newRandomness = _computeTermRandomness(currentTermId); require(newRandomness != bytes32(0), ERROR_TERM_RANDOMNESS_UNAVAILABLE); term.randomness = newRandomness; return newRandomness; } /** * @dev Tell the term duration of the Court * @return Duration in seconds of the Court term */ function getTermDuration() external view returns (uint64) { return termDuration; } /** * @dev Tell the last ensured term identification number * @return Identification number of the last ensured term */ function getLastEnsuredTermId() external view returns (uint64) { return _lastEnsuredTermId(); } /** * @dev Tell the current term identification number. Note that there may be pending term transitions. * @return Identification number of the current term */ function getCurrentTermId() external view returns (uint64) { return _currentTermId(); } /** * @dev Tell the number of terms the Court should transition to be up-to-date * @return Number of terms the Court should transition to be up-to-date */ function getNeededTermTransitions() external view returns (uint64) { return _neededTermTransitions(); } /** * @dev Tell the information related to a term based on its ID. Note that if the term has not been reached, the * information returned won't be computed yet. This function allows querying future terms that were not computed yet. * @param _termId ID of the term being queried * @return startTime Term start time * @return randomnessBN Block number used for randomness in the requested term * @return randomness Randomness computed for the requested term * @return celesteTokenTotalSupply Total supply of the Celeste token */ function getTerm(uint64 _termId) external view returns (uint64 startTime, uint64 randomnessBN, bytes32 randomness, uint256 celesteTokenTotalSupply) { Term storage term = terms[_termId]; return (term.startTime, term.randomnessBN, term.randomness, term.celesteTokenTotalSupply); } /** * @dev Tell the randomness of a term even if it wasn't computed yet * @param _termId Identification number of the term being queried * @return Randomness of the requested term */ function getTermRandomness(uint64 _termId) external view termExists(_termId) returns (bytes32) { return _computeTermRandomness(_termId); } /** * @dev Tell the total supply of the celeste token at a specific term * @param _termId Identification number of the term being queried * @return Total supply of celeste token */ function getTermTokenTotalSupply(uint64 _termId) external view termExists(_termId) returns (uint256) { return terms[_termId].celesteTokenTotalSupply; } /** * @dev Internal function to ensure that the current term of the Court is up-to-date. If the Court is outdated by more than * `MAX_AUTO_TERM_TRANSITIONS_ALLOWED` terms, the heartbeat function must be called manually. * @return Identification number of the resultant term ID after executing the corresponding transitions */ function _ensureCurrentTerm() internal returns (uint64) { // Check the required number of transitions does not exceeds the max allowed number to be processed automatically uint64 requiredTransitions = _neededTermTransitions(); require(requiredTransitions <= MAX_AUTO_TERM_TRANSITIONS_ALLOWED, ERROR_TOO_MANY_TRANSITIONS); // If there are no transitions pending, return the last ensured term id if (uint256(requiredTransitions) == 0) { return termId; } // Process transition if there is at least one pending return _heartbeat(requiredTransitions); } /** * @dev Internal function to transition the Court terms up to a requested number of terms * @param _maxRequestedTransitions Max number of term transitions allowed by the sender * @return Identification number of the resultant term ID after executing the requested transitions */ function _heartbeat(uint64 _maxRequestedTransitions) internal returns (uint64) { // Transition the minimum number of terms between the amount requested and the amount actually needed uint64 neededTransitions = _neededTermTransitions(); uint256 transitions = uint256(_maxRequestedTransitions < neededTransitions ? _maxRequestedTransitions : neededTransitions); require(transitions > 0, ERROR_INVALID_TRANSITION_TERMS); uint64 blockNumber = getBlockNumber64(); uint64 previousTermId = termId; uint64 currentTermId = previousTermId; for (uint256 transition = 1; transition <= transitions; transition++) { // Term IDs are incremented by one based on the number of time periods since the Court started. Since time is represented in uint64, // even if we chose the minimum duration possible for a term (1 second), we can ensure terms will never reach 2^64 since time is // already assumed to fit in uint64. Term storage previousTerm = terms[currentTermId++]; Term storage currentTerm = terms[currentTermId]; (ERC20 feeToken,,,,,, uint256[4] memory jurorsParams) = _getConfig(currentTermId); _onTermTransitioned(currentTermId); // Set the start time of the new term. Note that we are using a constant term duration value to guarantee // equally long terms, regardless of heartbeats. currentTerm.startTime = previousTerm.startTime.add(termDuration); // In order to draft a random number of jurors in a term, we use a randomness factor for each term based on a // block number that is set once the term has started. Note that this information could not be known beforehand. currentTerm.randomnessBN = blockNumber + 1; // We check if the feeTokenTotalSupply is set, which means this networks feeToken doesn't have an accurate // totalSupply so we will use the hardcoded value currentTerm.celesteTokenTotalSupply = jurorsParams[3] > 0 ? jurorsParams[3] : feeToken.totalSupply(); } termId = currentTermId; emit Heartbeat(previousTermId, currentTermId); return currentTermId; } /** * @dev Internal function to delay the first term start time only if it wasn't reached yet * @param _newFirstTermStartTime New timestamp in seconds when the court will open */ function _delayStartTime(uint64 _newFirstTermStartTime) internal { require(_currentTermId() == 0, ERROR_CANNOT_DELAY_STARTED_COURT); Term storage term = terms[0]; uint64 currentFirstTermStartTime = term.startTime.add(termDuration); require(_newFirstTermStartTime > currentFirstTermStartTime, ERROR_CANNOT_DELAY_PAST_START_TIME); // No need for SafeMath: we already checked above that `_newFirstTermStartTime` > `currentFirstTermStartTime` >= `termDuration` term.startTime = _newFirstTermStartTime - termDuration; emit StartTimeDelayed(currentFirstTermStartTime, _newFirstTermStartTime); } /** * @dev Internal function to notify when a term has been transitioned. This function must be overridden to provide custom behavior. * @param _termId Identification number of the new current term that has been transitioned */ function _onTermTransitioned(uint64 _termId) internal; /** * @dev Internal function to tell the last ensured term identification number * @return Identification number of the last ensured term */ function _lastEnsuredTermId() internal view returns (uint64) { return termId; } /** * @dev Internal function to tell the current term identification number. Note that there may be pending term transitions. * @return Identification number of the current term */ function _currentTermId() internal view returns (uint64) { return termId.add(_neededTermTransitions()); } /** * @dev Internal function to tell the number of terms the Court should transition to be up-to-date * @return Number of terms the Court should transition to be up-to-date */ function _neededTermTransitions() internal view returns (uint64) { // Note that the Court is always initialized providing a start time for the first-term in the future. If that's the case, // no term transitions are required. uint64 currentTermStartTime = terms[termId].startTime; if (getTimestamp64() < currentTermStartTime) { return uint64(0); } // No need for SafeMath: we already know that the start time of the current term is in the past return (getTimestamp64() - currentTermStartTime) / termDuration; } /** * @dev Internal function to compute the randomness that will be used to draft jurors for the given term. This * function assumes the given term exists. To determine the randomness factor for a term we use the hash of a * block number that is set once the term has started to ensure it cannot be known beforehand. Note that the * hash function being used only works for the 256 most recent block numbers. * @param _termId Identification number of the term being queried * @return Randomness computed for the given term */ function _computeTermRandomness(uint64 _termId) internal view returns (bytes32) { Term storage term = terms[_termId]; require(getBlockNumber64() > term.randomnessBN, ERROR_TERM_RANDOMNESS_NOT_YET); return blockhash(term.randomnessBN); } /** * @dev Tell the full Court configuration parameters at a certain term * @param _termId Identification number of the term querying the Court config of * @return token Address of the token used to pay for fees * @return fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @return maxRulingOptions Max number of selectable outcomes for each dispute * @return roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @return pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @return appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @return jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function _getConfig(uint64 _termId) internal view returns ( ERC20 feeToken, uint256[3] memory fees, uint8 maxRulingOptions, uint64[9] memory roundParams, uint16[2] memory pcts, uint256[2] memory appealCollateralParams, uint256[4] memory jurorsParams ); } // File: contracts/court/config/IConfig.sol pragma solidity ^0.5.8; interface IConfig { /** * @dev Tell the full Court configuration parameters at a certain term * @param _termId Identification number of the term querying the Court config of * @return token Address of the token used to pay for fees * @return fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @return maxRulingOptions Max number of selectable outcomes for each dispute * @return roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @return pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @return appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @return jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function getConfig(uint64 _termId) external view returns ( ERC20 feeToken, uint256[3] memory fees, uint8 maxRulingOptions, uint64[9] memory roundParams, uint16[2] memory pcts, uint256[2] memory appealCollateralParams, uint256[4] memory jurorsParams ); /** * @dev Tell the draft config at a certain term * @param _termId Identification number of the term querying the draft config of * @return feeToken Address of the token used to pay for fees * @return draftFee Amount of fee tokens per juror to cover the drafting cost * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) */ function getDraftConfig(uint64 _termId) external view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct); /** * @dev Tell the min active balance config at a certain term * @param _termId Term querying the min active balance config of * @return Minimum amount of tokens jurors have to activate to participate in the Court */ function getMinActiveBalance(uint64 _termId) external view returns (uint256); /** * @dev Tell whether a certain holder accepts automatic withdrawals of tokens or not * @return True if the given holder accepts automatic withdrawals of their tokens, false otherwise */ function areWithdrawalsAllowedFor(address _holder) external view returns (bool); } // File: contracts/court/config/CourtConfigData.sol pragma solidity ^0.5.8; contract CourtConfigData { struct Config { FeesConfig fees; // Full fees-related config DisputesConfig disputes; // Full disputes-related config JurorsConfig jurors; // Full juror-related config } struct FeesConfig { ERC20 token; // ERC20 token to be used for the fees of the Court uint16 finalRoundReduction; // Permyriad of fees reduction applied for final appeal round (‱ - 1/10,000) uint256 jurorFee; // Amount of tokens paid to draft a juror to adjudicate a dispute uint256 draftFee; // Amount of tokens paid per round to cover the costs of drafting jurors uint256 settleFee; // Amount of tokens paid per round to cover the costs of slashing jurors } struct DisputesConfig { uint8 maxRulingOptions; // Max number of ruling options selectable by jurors for a dispute uint64 evidenceTerms; // Max submitting evidence period duration in terms uint64 commitTerms; // Committing period duration in terms uint64 revealTerms; // Revealing period duration in terms uint64 appealTerms; // Appealing period duration in terms uint64 appealConfirmTerms; // Confirmation appeal period duration in terms uint16 penaltyPct; // Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) uint64 firstRoundJurorsNumber; // Number of jurors drafted on first round uint64 appealStepFactor; // Factor in which the jurors number is increased on each appeal uint64 finalRoundLockTerms; // Period a coherent juror in the final round will remain locked uint256 maxRegularAppealRounds; // Before the final appeal uint256 appealCollateralFactor; // Permyriad multiple of dispute fees required to appeal a preliminary ruling (‱ - 1/10,000) uint256 appealConfirmCollateralFactor; // Permyriad multiple of dispute fees required to confirm appeal (‱ - 1/10,000) } struct JurorsConfig { uint256 minActiveBalance; // Minimum amount of tokens jurors have to activate to participate in the Court uint256 minMaxPctTotalSupply; // Minimum max percent of the total supply a juror can activate, applied for total supply active stake uint256 maxMaxPctTotalSupply; // Maximum max percent of the total supply a juror can activate, applied for 0 active stake uint256 feeTokenTotalSupply; // Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do } struct DraftConfig { ERC20 feeToken; // ERC20 token to be used for the fees of the Court uint16 penaltyPct; // Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) uint256 draftFee; // Amount of tokens paid per round to cover the costs of drafting jurors } } // File: contracts/lib/os/SafeMath.sol // Brought from https://github.com/aragon/aragonOS/blob/v4.3.0/contracts/lib/math/SafeMath.sol // Adapted to use pragma ^0.5.8 and satisfy our linter rules pragma solidity >=0.4.24 <0.6.0; /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { string private constant ERROR_ADD_OVERFLOW = "MATH_ADD_OVERFLOW"; string private constant ERROR_SUB_UNDERFLOW = "MATH_SUB_UNDERFLOW"; string private constant ERROR_MUL_OVERFLOW = "MATH_MUL_OVERFLOW"; string private constant ERROR_DIV_ZERO = "MATH_DIV_ZERO"; /** * @dev Multiplies two numbers, reverts on 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-solidity/pull/522 if (_a == 0) { return 0; } uint256 c = _a * _b; require(c / _a == _b, ERROR_MUL_OVERFLOW); return c; } /** * @dev Integer division of two numbers truncating the quotient, reverts on division by zero. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { require(_b > 0, ERROR_DIV_ZERO); // Solidity only automatically asserts when dividing by 0 uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { require(_b <= _a, ERROR_SUB_UNDERFLOW); uint256 c = _a - _b; return c; } /** * @dev Adds two numbers, reverts on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256) { uint256 c = _a + _b; require(c >= _a, ERROR_ADD_OVERFLOW); return c; } /** * @dev Divides two numbers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, ERROR_DIV_ZERO); return a % b; } } // File: contracts/lib/PctHelpers.sol pragma solidity ^0.5.8; library PctHelpers { using SafeMath for uint256; uint256 internal constant PCT_BASE = 10000; // ‱ (1 / 10,000) uint256 internal constant PCT_BASE_HIGH_PRECISION = 1e18; // 100% function isValid(uint16 _pct) internal pure returns (bool) { return _pct <= PCT_BASE; } function isValidHighPrecision(uint256 _pct) internal pure returns (bool) { return _pct <= PCT_BASE_HIGH_PRECISION; } function pct(uint256 self, uint16 _pct) internal pure returns (uint256) { return self.mul(uint256(_pct)) / PCT_BASE; } function pct256(uint256 self, uint256 _pct) internal pure returns (uint256) { return self.mul(_pct) / PCT_BASE; } function pctHighPrecision(uint256 self, uint256 _pct) internal pure returns (uint256) { return self.mul(_pct) / PCT_BASE_HIGH_PRECISION; } function pctIncrease(uint256 self, uint16 _pct) internal pure returns (uint256) { // No need for SafeMath: for addition note that `PCT_BASE` is lower than (2^256 - 2^16) return self.mul(PCT_BASE + uint256(_pct)) / PCT_BASE; } } // File: contracts/court/config/CourtConfig.sol pragma solidity ^0.5.8; contract CourtConfig is IConfig, CourtConfigData { using SafeMath64 for uint64; using PctHelpers for uint256; string private constant ERROR_TOO_OLD_TERM = "CONF_TOO_OLD_TERM"; string private constant ERROR_RULING_OPTIONS_LESS_THAN_MIN = "CONF_RULING_OPTIONS_LESS_THAN_MIN"; string private constant ERROR_RULING_OPTIONS_MORE_THAN_MAX = "CONF_RULING_OPTIONS_MORE_THAN_MAX"; string private constant ERROR_INVALID_PENALTY_PCT = "CONF_INVALID_PENALTY_PCT"; string private constant ERROR_INVALID_FINAL_ROUND_REDUCTION_PCT = "CONF_INVALID_FINAL_ROUND_RED_PCT"; string private constant ERROR_INVALID_MAX_APPEAL_ROUNDS = "CONF_INVALID_MAX_APPEAL_ROUNDS"; string private constant ERROR_LARGE_ROUND_PHASE_DURATION = "CONF_LARGE_ROUND_PHASE_DURATION"; string private constant ERROR_BAD_INITIAL_JURORS_NUMBER = "CONF_BAD_INITIAL_JURORS_NUMBER"; string private constant ERROR_BAD_APPEAL_STEP_FACTOR = "CONF_BAD_APPEAL_STEP_FACTOR"; string private constant ERROR_ZERO_COLLATERAL_FACTOR = "CONF_ZERO_COLLATERAL_FACTOR"; string private constant ERROR_ZERO_MIN_ACTIVE_BALANCE = "CONF_ZERO_MIN_ACTIVE_BALANCE"; string private constant ERROR_MIN_MAX_TOTAL_SUPPLY_ZERO = "CONF_MIN_MAX_TOTAL_SUPPLY_ZERO"; string private constant ERROR_INVALID_MAX_MAX_TOTAL_SUPPLY_PCT = "CONF_INVALID_MAX_MAX_TOTAL_SUPPLY_PCT"; string private constant ERROR_MIN_MORE_THAN_MAX_ACTIVE_PCT = "CONF_MIN_MORE_THAN_MAX_ACTIVE_PCT"; // Max number of terms that each of the different adjudication states can last (if lasted 1h, this would be a year) uint64 internal constant MAX_ADJ_STATE_DURATION = 8670; // Cap the max number of regular appeal rounds uint256 internal constant MAX_REGULAR_APPEAL_ROUNDS_LIMIT = 10; // Future term ID in which a config change has been scheduled uint64 private configChangeTermId; // List of all the configs used in the Court Config[] private configs; // List of configs indexed by id mapping (uint64 => uint256) private configIdByTerm; // Holders opt-in config for automatic withdrawals mapping (address => bool) private withdrawalsAllowed; event NewConfig(uint64 fromTermId, uint64 courtConfigId); event AutomaticWithdrawalsAllowedChanged(address indexed holder, bool allowed); /** * @dev Constructor function * @param _feeToken Address of the token contract that is used to pay for fees * @param _fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @param _maxRulingOptions Max number of selectable outcomes for each dispute * @param _roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @param _pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @param _appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @param _jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ constructor( ERC20 _feeToken, uint256[3] memory _fees, uint8 _maxRulingOptions, uint64[9] memory _roundParams, uint16[2] memory _pcts, uint256[2] memory _appealCollateralParams, uint256[4] memory _jurorsParams ) public { // Leave config at index 0 empty for non-scheduled config changes configs.length = 1; _setConfig( 0, 0, _feeToken, _fees, _maxRulingOptions, _roundParams, _pcts, _appealCollateralParams, _jurorsParams ); } /** * @notice Set the automatic withdrawals config for the sender to `_allowed` * @param _allowed Whether or not the automatic withdrawals are allowed by the sender */ function setAutomaticWithdrawals(bool _allowed) external { withdrawalsAllowed[msg.sender] = _allowed; emit AutomaticWithdrawalsAllowedChanged(msg.sender, _allowed); } /** * @dev Tell the full Court configuration parameters at a certain term * @param _termId Identification number of the term querying the Court config of * @return token Address of the token used to pay for fees * @return fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @return maxRulingOptions Max number of selectable outcomes for each dispute * @return roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @return pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @return appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @return jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function getConfig(uint64 _termId) external view returns ( ERC20 feeToken, uint256[3] memory fees, uint8 maxRulingOptions, uint64[9] memory roundParams, uint16[2] memory pcts, uint256[2] memory appealCollateralParams, uint256[4] memory jurorsParams ); /** * @dev Tell the draft config at a certain term * @param _termId Identification number of the term querying the draft config of * @return feeToken Address of the token used to pay for fees * @return draftFee Amount of fee tokens per juror to cover the drafting cost * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) */ function getDraftConfig(uint64 _termId) external view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct); /** * @dev Tell the min active balance config at a certain term * @param _termId Term querying the min active balance config of * @return Minimum amount of tokens jurors have to activate to participate in the Court */ function getMinActiveBalance(uint64 _termId) external view returns (uint256); /** * @dev Tell whether a certain holder accepts automatic withdrawals of tokens or not * @param _holder Address of the token holder querying if withdrawals are allowed for * @return True if the given holder accepts automatic withdrawals of their tokens, false otherwise */ function areWithdrawalsAllowedFor(address _holder) external view returns (bool) { return withdrawalsAllowed[_holder]; } /** * @dev Tell the term identification number of the next scheduled config change * @return Term identification number of the next scheduled config change */ function getConfigChangeTermId() external view returns (uint64) { return configChangeTermId; } /** * @dev Internal to make sure to set a config for the new term, it will copy the previous term config if none * @param _termId Identification number of the new current term that has been transitioned */ function _ensureTermConfig(uint64 _termId) internal { // If the term being transitioned had no config change scheduled, keep the previous one uint256 currentConfigId = configIdByTerm[_termId]; if (currentConfigId == 0) { uint256 previousConfigId = configIdByTerm[_termId.sub(1)]; configIdByTerm[_termId] = previousConfigId; } } /** * @dev Assumes that sender it's allowed (either it's from governor or it's on init) * @param _termId Identification number of the current Court term * @param _fromTermId Identification number of the term in which the config will be effective at * @param _feeToken Address of the token contract that is used to pay for fees. * @param _fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @param _maxRulingOptions Max number of selectable outcomes for each dispute * @param _roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @param _pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @param _appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @param _jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function _setConfig( uint64 _termId, uint64 _fromTermId, ERC20 _feeToken, uint256[3] memory _fees, uint8 _maxRulingOptions, uint64[9] memory _roundParams, uint16[2] memory _pcts, uint256[2] memory _appealCollateralParams, uint256[4] memory _jurorsParams ) internal { // If the current term is not zero, changes must be scheduled at least after the current period. // No need to ensure delays for on-going disputes since these already use their creation term for that. require(_termId == 0 || _fromTermId > _termId, ERROR_TOO_OLD_TERM); require(_maxRulingOptions >= 2, ERROR_RULING_OPTIONS_LESS_THAN_MIN); // Ruling options 0, 1 and 2 are reserved for special cases. require(_maxRulingOptions <= uint8(-1) - 3, ERROR_RULING_OPTIONS_MORE_THAN_MAX); // Make sure appeal collateral factors are greater than zero require(_appealCollateralParams[0] > 0 && _appealCollateralParams[1] > 0, ERROR_ZERO_COLLATERAL_FACTOR); // Make sure the given penalty and final round reduction pcts are not greater than 100% require(PctHelpers.isValid(_pcts[0]), ERROR_INVALID_PENALTY_PCT); require(PctHelpers.isValid(_pcts[1]), ERROR_INVALID_FINAL_ROUND_REDUCTION_PCT); // Disputes must request at least one juror to be drafted initially require(_roundParams[5] > 0, ERROR_BAD_INITIAL_JURORS_NUMBER); // Prevent that further rounds have zero jurors require(_roundParams[6] > 0, ERROR_BAD_APPEAL_STEP_FACTOR); // Make sure the max number of appeals allowed does not reach the limit uint256 _maxRegularAppealRounds = _roundParams[7]; bool isMaxAppealRoundsValid = _maxRegularAppealRounds > 0 && _maxRegularAppealRounds <= MAX_REGULAR_APPEAL_ROUNDS_LIMIT; require(isMaxAppealRoundsValid, ERROR_INVALID_MAX_APPEAL_ROUNDS); // Make sure each adjudication round phase duration is valid for (uint i = 0; i < 5; i++) { require(_roundParams[i] > 0 && _roundParams[i] < MAX_ADJ_STATE_DURATION, ERROR_LARGE_ROUND_PHASE_DURATION); } // Make sure min active balance is not zero require(_jurorsParams[0] > 0, ERROR_ZERO_MIN_ACTIVE_BALANCE); // Make sure min max pct of total supply active balance is not zero require(_jurorsParams[1] > 0, ERROR_MIN_MAX_TOTAL_SUPPLY_ZERO); // Make sure the max max pct of total supply active balance is less than 100% require(PctHelpers.isValidHighPrecision(_jurorsParams[2]), ERROR_INVALID_MAX_MAX_TOTAL_SUPPLY_PCT); // Make sure min max pct of total supply active balance is less than the max max pct of total supply active balance require(_jurorsParams[1] < _jurorsParams[2], ERROR_MIN_MORE_THAN_MAX_ACTIVE_PCT); // If there was a config change already scheduled, reset it (in that case we will overwrite last array item). // Otherwise, schedule a new config. if (configChangeTermId > _termId) { configIdByTerm[configChangeTermId] = 0; } else { configs.length++; } uint64 courtConfigId = uint64(configs.length - 1); Config storage config = configs[courtConfigId]; config.fees = FeesConfig({ token: _feeToken, jurorFee: _fees[0], draftFee: _fees[1], settleFee: _fees[2], finalRoundReduction: _pcts[1] }); config.disputes = DisputesConfig({ maxRulingOptions: _maxRulingOptions, evidenceTerms: _roundParams[0], commitTerms: _roundParams[1], revealTerms: _roundParams[2], appealTerms: _roundParams[3], appealConfirmTerms: _roundParams[4], penaltyPct: _pcts[0], firstRoundJurorsNumber: _roundParams[5], appealStepFactor: _roundParams[6], maxRegularAppealRounds: _maxRegularAppealRounds, finalRoundLockTerms: _roundParams[8], appealCollateralFactor: _appealCollateralParams[0], appealConfirmCollateralFactor: _appealCollateralParams[1] }); config.jurors = JurorsConfig({ minActiveBalance: _jurorsParams[0], minMaxPctTotalSupply: _jurorsParams[1], maxMaxPctTotalSupply: _jurorsParams[2], feeTokenTotalSupply: _jurorsParams[3] }); configIdByTerm[_fromTermId] = courtConfigId; configChangeTermId = _fromTermId; emit NewConfig(_fromTermId, courtConfigId); } /** * @dev Internal function to get the Court config for a given term * @param _termId Identification number of the term querying the Court config of * @param _lastEnsuredTermId Identification number of the last ensured term of the Court * @return token Address of the token used to pay for fees * @return fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @return maxRulingOptions Max number of selectable outcomes for each dispute * @return roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @return pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @return appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @return jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function _getConfigAt(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns ( ERC20 feeToken, uint256[3] memory fees, uint8 maxRulingOptions, uint64[9] memory roundParams, uint16[2] memory pcts, uint256[2] memory appealCollateralParams, uint256[4] memory jurorsParams ) { Config storage config = _getConfigFor(_termId, _lastEnsuredTermId); FeesConfig storage feesConfig = config.fees; feeToken = feesConfig.token; fees = [feesConfig.jurorFee, feesConfig.draftFee, feesConfig.settleFee]; DisputesConfig storage disputesConfig = config.disputes; maxRulingOptions = disputesConfig.maxRulingOptions; roundParams = [ disputesConfig.evidenceTerms, disputesConfig.commitTerms, disputesConfig.revealTerms, disputesConfig.appealTerms, disputesConfig.appealConfirmTerms, disputesConfig.firstRoundJurorsNumber, disputesConfig.appealStepFactor, uint64(disputesConfig.maxRegularAppealRounds), disputesConfig.finalRoundLockTerms ]; pcts = [disputesConfig.penaltyPct, feesConfig.finalRoundReduction]; appealCollateralParams = [disputesConfig.appealCollateralFactor, disputesConfig.appealConfirmCollateralFactor]; JurorsConfig storage jurorsConfig = config.jurors; jurorsParams = [ jurorsConfig.minActiveBalance, jurorsConfig.minMaxPctTotalSupply, jurorsConfig.maxMaxPctTotalSupply, jurorsConfig.feeTokenTotalSupply ]; } /** * @dev Tell the draft config at a certain term * @param _termId Identification number of the term querying the draft config of * @param _lastEnsuredTermId Identification number of the last ensured term of the Court * @return feeToken Address of the token used to pay for fees * @return draftFee Amount of fee tokens per juror to cover the drafting cost * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) */ function _getDraftConfig(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct) { Config storage config = _getConfigFor(_termId, _lastEnsuredTermId); return (config.fees.token, config.fees.draftFee, config.disputes.penaltyPct); } /** * @dev Internal function to get the min active balance config for a given term * @param _termId Identification number of the term querying the min active balance config of * @param _lastEnsuredTermId Identification number of the last ensured term of the Court * @return Minimum amount of juror tokens that can be activated at the given term */ function _getMinActiveBalance(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (uint256) { Config storage config = _getConfigFor(_termId, _lastEnsuredTermId); return config.jurors.minActiveBalance; } /** * @dev Internal function to get the Court config for a given term * @param _termId Identification number of the term querying the min active balance config of * @param _lastEnsuredTermId Identification number of the last ensured term of the Court * @return Court config for the given term */ function _getConfigFor(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (Config storage) { uint256 id = _getConfigIdFor(_termId, _lastEnsuredTermId); return configs[id]; } /** * @dev Internal function to get the Court config ID for a given term * @param _termId Identification number of the term querying the Court config of * @param _lastEnsuredTermId Identification number of the last ensured term of the Court * @return Identification number of the config for the given terms */ function _getConfigIdFor(uint64 _termId, uint64 _lastEnsuredTermId) internal view returns (uint256) { // If the given term is lower or equal to the last ensured Court term, it is safe to use a past Court config if (_termId <= _lastEnsuredTermId) { return configIdByTerm[_termId]; } // If the given term is in the future but there is a config change scheduled before it, use the incoming config uint64 scheduledChangeTermId = configChangeTermId; if (scheduledChangeTermId <= _termId) { return configIdByTerm[scheduledChangeTermId]; } // If no changes are scheduled, use the Court config of the last ensured term return configIdByTerm[_lastEnsuredTermId]; } } // File: contracts/court/controller/Controller.sol pragma solidity ^0.5.8; contract Controller is IsContract, CourtClock, CourtConfig { string private constant ERROR_SENDER_NOT_GOVERNOR = "CTR_SENDER_NOT_GOVERNOR"; string private constant ERROR_INVALID_GOVERNOR_ADDRESS = "CTR_INVALID_GOVERNOR_ADDRESS"; string private constant ERROR_IMPLEMENTATION_NOT_CONTRACT = "CTR_IMPLEMENTATION_NOT_CONTRACT"; string private constant ERROR_INVALID_IMPLS_INPUT_LENGTH = "CTR_INVALID_IMPLS_INPUT_LENGTH"; address private constant ZERO_ADDRESS = address(0); // DisputeManager module ID - keccak256(abi.encodePacked("DISPUTE_MANAGER")) bytes32 internal constant DISPUTE_MANAGER = 0x14a6c70f0f6d449c014c7bbc9e68e31e79e8474fb03b7194df83109a2d888ae6; // Treasury module ID - keccak256(abi.encodePacked("TREASURY")) bytes32 internal constant TREASURY = 0x06aa03964db1f7257357ef09714a5f0ca3633723df419e97015e0c7a3e83edb7; // Voting module ID - keccak256(abi.encodePacked("VOTING")) bytes32 internal constant VOTING = 0x7cbb12e82a6d63ff16fe43977f43e3e2b247ecd4e62c0e340da8800a48c67346; // JurorsRegistry module ID - keccak256(abi.encodePacked("JURORS_REGISTRY")) bytes32 internal constant JURORS_REGISTRY = 0x3b21d36b36308c830e6c4053fb40a3b6d79dde78947fbf6b0accd30720ab5370; // Subscriptions module ID - keccak256(abi.encodePacked("SUBSCRIPTIONS")) bytes32 internal constant SUBSCRIPTIONS = 0x2bfa3327fe52344390da94c32a346eeb1b65a8b583e4335a419b9471e88c1365; // BrightIDRegister module ID - keccak256(abi.encodePacked("BRIGHTID_REGISTER")) bytes32 internal constant BRIGHTID_REGISTER = 0xc8d8a5444a51ecc23e5091f18c4162834512a4bc5cae72c637db45c8c37b3329; /** * @dev Governor of the whole system. Set of three addresses to recover funds, change configuration settings and setup modules */ struct Governor { address funds; // This address can be unset at any time. It is allowed to recover funds from the ControlledRecoverable modules address config; // This address is meant not to be unset. It is allowed to change the different configurations of the whole system address feesUpdater;// This is a second address that can update the config. It is expected to be used with a price oracle for updating fees address modules; // This address can be unset at any time. It is allowed to plug/unplug modules from the system } // Governor addresses of the system Governor private governor; // List of modules registered for the system indexed by ID mapping (bytes32 => address) internal modules; event ModuleSet(bytes32 id, address addr); event FundsGovernorChanged(address previousGovernor, address currentGovernor); event ConfigGovernorChanged(address previousGovernor, address currentGovernor); event FeesUpdaterChanged(address previousFeesUpdater, address currentFeesUpdater); event ModulesGovernorChanged(address previousGovernor, address currentGovernor); /** * @dev Ensure the msg.sender is the funds governor */ modifier onlyFundsGovernor { require(msg.sender == governor.funds, ERROR_SENDER_NOT_GOVERNOR); _; } /** * @dev Ensure the msg.sender is the config governor */ modifier onlyConfigGovernor { require(msg.sender == governor.config, ERROR_SENDER_NOT_GOVERNOR); _; } /** * @dev Ensure the msg.sender is the config governor or the fees updater */ modifier onlyConfigGovernorOrFeesUpdater { require(msg.sender == governor.config || msg.sender == governor.feesUpdater, ERROR_SENDER_NOT_GOVERNOR); _; } /** * @dev Ensure the msg.sender is the modules governor */ modifier onlyModulesGovernor { require(msg.sender == governor.modules, ERROR_SENDER_NOT_GOVERNOR); _; } /** * @dev Constructor function * @param _termParams Array containing: * 0. _termDuration Duration in seconds per term * 1. _firstTermStartTime Timestamp in seconds when the court will open (to give time for juror on-boarding) * @param _governors Array containing: * 0. _fundsGovernor Address of the funds governor * 1. _configGovernor Address of the config governor * 2. _feesUpdater Address of the price feesUpdater * 3. _modulesGovernor Address of the modules governor * @param _feeToken Address of the token contract that is used to pay for fees * @param _fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @param _maxRulingOptions Max number of selectable outcomes for each dispute * @param _roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @param _pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked to each drafted jurors (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @param _appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Permyriad multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Permyriad multiple of dispute fees required to confirm appeal * @param _jurorsParams Array containing params for jurors: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ constructor( uint64[2] memory _termParams, address[4] memory _governors, ERC20 _feeToken, uint256[3] memory _fees, uint8 _maxRulingOptions, uint64[9] memory _roundParams, uint16[2] memory _pcts, uint256[2] memory _appealCollateralParams, uint256[4] memory _jurorsParams ) public CourtClock(_termParams, _feeToken) CourtConfig(_feeToken, _fees, _maxRulingOptions, _roundParams, _pcts, _appealCollateralParams, _jurorsParams) { _setFundsGovernor(_governors[0]); _setConfigGovernor(_governors[1]); _setFeesUpdater(_governors[2]); _setModulesGovernor(_governors[3]); } /** * @notice Change Court configuration params * @param _fromTermId Identification number of the term in which the config will be effective at * @param _feeToken Address of the token contract that is used to pay for fees * @param _fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @param _maxRulingOptions Max number of selectable outcomes for each dispute * @param _roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @param _pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked to each drafted jurors (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @param _appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Permyriad multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Permyriad multiple of dispute fees required to confirm appeal * @param _jurorsParams Array containing params for jurors: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function setConfig( uint64 _fromTermId, ERC20 _feeToken, uint256[3] calldata _fees, uint8 _maxRulingOptions, uint64[9] calldata _roundParams, uint16[2] calldata _pcts, uint256[2] calldata _appealCollateralParams, uint256[4] calldata _jurorsParams ) external onlyConfigGovernorOrFeesUpdater { uint64 currentTermId = _ensureCurrentTerm(); _setConfig( currentTermId, _fromTermId, _feeToken, _fees, _maxRulingOptions, _roundParams, _pcts, _appealCollateralParams, _jurorsParams ); } /** * @notice Delay the Court start time to `_newFirstTermStartTime` * @param _newFirstTermStartTime New timestamp in seconds when the court will open */ function delayStartTime(uint64 _newFirstTermStartTime) external onlyConfigGovernor { _delayStartTime(_newFirstTermStartTime); } /** * @notice Change funds governor address to `_newFundsGovernor` * @param _newFundsGovernor Address of the new funds governor to be set */ function changeFundsGovernor(address _newFundsGovernor) external onlyFundsGovernor { require(_newFundsGovernor != ZERO_ADDRESS, ERROR_INVALID_GOVERNOR_ADDRESS); _setFundsGovernor(_newFundsGovernor); } /** * @notice Change config governor address to `_newConfigGovernor` * @param _newConfigGovernor Address of the new config governor to be set */ function changeConfigGovernor(address _newConfigGovernor) external onlyConfigGovernor { require(_newConfigGovernor != ZERO_ADDRESS, ERROR_INVALID_GOVERNOR_ADDRESS); _setConfigGovernor(_newConfigGovernor); } /** * @notice Change fees updater to `_newFeesUpdater` * @param _newFeesUpdater Address of the new fees updater to be set */ function changeFeesUpdater(address _newFeesUpdater) external onlyConfigGovernor { _setFeesUpdater(_newFeesUpdater); } /** * @notice Change modules governor address to `_newModulesGovernor` * @param _newModulesGovernor Address of the new governor to be set */ function changeModulesGovernor(address _newModulesGovernor) external onlyModulesGovernor { require(_newModulesGovernor != ZERO_ADDRESS, ERROR_INVALID_GOVERNOR_ADDRESS); _setModulesGovernor(_newModulesGovernor); } /** * @notice Remove the funds governor. Set the funds governor to the zero address. * @dev This action cannot be rolled back, once the funds governor has been unset, funds cannot be recovered from recoverable modules anymore */ function ejectFundsGovernor() external onlyFundsGovernor { _setFundsGovernor(ZERO_ADDRESS); } /** * @notice Remove the modules governor. Set the modules governor to the zero address. * @dev This action cannot be rolled back, once the modules governor has been unset, system modules cannot be changed anymore */ function ejectModulesGovernor() external onlyModulesGovernor { _setModulesGovernor(ZERO_ADDRESS); } /** * @notice Set module `_id` to `_addr` * @param _id ID of the module to be set * @param _addr Address of the module to be set */ function setModule(bytes32 _id, address _addr) external onlyModulesGovernor { _setModule(_id, _addr); } /** * @notice Set many modules at once * @param _ids List of ids of each module to be set * @param _addresses List of addressed of each the module to be set */ function setModules(bytes32[] calldata _ids, address[] calldata _addresses) external onlyModulesGovernor { require(_ids.length == _addresses.length, ERROR_INVALID_IMPLS_INPUT_LENGTH); for (uint256 i = 0; i < _ids.length; i++) { _setModule(_ids[i], _addresses[i]); } } /** * @dev Tell the full Court configuration parameters at a certain term * @param _termId Identification number of the term querying the Court config of * @return token Address of the token used to pay for fees * @return fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @return maxRulingOptions Max number of selectable outcomes for each dispute * @return roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @return pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @return appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Multiple of dispute fees required to confirm appeal * @return jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake\ * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ function getConfig(uint64 _termId) external view returns ( ERC20 feeToken, uint256[3] memory fees, uint8 maxRulingOptions, uint64[9] memory roundParams, uint16[2] memory pcts, uint256[2] memory appealCollateralParams, uint256[4] memory jurorsParams ) { return _getConfig(_termId); } /** * @dev This function overrides one in the CourtClock, giving the CourtClock access to the config. */ function _getConfig(uint64 _termId) internal view returns ( ERC20 feeToken, uint256[3] memory fees, uint8 maxRulingOptions, uint64[9] memory roundParams, uint16[2] memory pcts, uint256[2] memory appealCollateralParams, uint256[4] memory jurorsParams ) { uint64 lastEnsuredTermId = _lastEnsuredTermId(); return _getConfigAt(_termId, lastEnsuredTermId); } /** * @dev Tell the draft config at a certain term * @param _termId Identification number of the term querying the draft config of * @return feeToken Address of the token used to pay for fees * @return draftFee Amount of fee tokens per juror to cover the drafting cost * @return penaltyPct Permyriad of min active tokens balance to be locked for each drafted juror (‱ - 1/10,000) */ function getDraftConfig(uint64 _termId) external view returns (ERC20 feeToken, uint256 draftFee, uint16 penaltyPct) { uint64 lastEnsuredTermId = _lastEnsuredTermId(); return _getDraftConfig(_termId, lastEnsuredTermId); } /** * @dev Tell the min active balance config at a certain term * @param _termId Identification number of the term querying the min active balance config of * @return Minimum amount of tokens jurors have to activate to participate in the Court */ function getMinActiveBalance(uint64 _termId) external view returns (uint256) { uint64 lastEnsuredTermId = _lastEnsuredTermId(); return _getMinActiveBalance(_termId, lastEnsuredTermId); } /** * @dev Tell the address of the funds governor * @return Address of the funds governor */ function getFundsGovernor() external view returns (address) { return governor.funds; } /** * @dev Tell the address of the config governor * @return Address of the config governor */ function getConfigGovernor() external view returns (address) { return governor.config; } /** * @dev Tell the address of the fees updater * @return Address of the fees updater */ function getFeesUpdater() external view returns (address) { return governor.feesUpdater; } /** * @dev Tell the address of the modules governor * @return Address of the modules governor */ function getModulesGovernor() external view returns (address) { return governor.modules; } /** * @dev Tell address of a module based on a given ID * @param _id ID of the module being queried * @return Address of the requested module */ function getModule(bytes32 _id) external view returns (address) { return _getModule(_id); } /** * @dev Tell the address of the DisputeManager module * @return Address of the DisputeManager module */ function getDisputeManager() external view returns (address) { return _getDisputeManager(); } /** * @dev Tell the address of the Treasury module * @return Address of the Treasury module */ function getTreasury() external view returns (address) { return _getModule(TREASURY); } /** * @dev Tell the address of the Voting module * @return Address of the Voting module */ function getVoting() external view returns (address) { return _getModule(VOTING); } /** * @dev Tell the address of the JurorsRegistry module * @return Address of the JurorsRegistry module */ function getJurorsRegistry() external view returns (address) { return _getModule(JURORS_REGISTRY); } /** * @dev Tell the address of the Subscriptions module * @return Address of the Subscriptions module */ function getSubscriptions() external view returns (address) { return _getSubscriptions(); } /** * @dev Tell the address of the BrightId register * @return Address of the BrightId register */ function getBrightIdRegister() external view returns (address) { return _getBrightIdRegister(); } /** * @dev Internal function to set the address of the funds governor * @param _newFundsGovernor Address of the new config governor to be set */ function _setFundsGovernor(address _newFundsGovernor) internal { emit FundsGovernorChanged(governor.funds, _newFundsGovernor); governor.funds = _newFundsGovernor; } /** * @dev Internal function to set the address of the config governor * @param _newConfigGovernor Address of the new config governor to be set */ function _setConfigGovernor(address _newConfigGovernor) internal { emit ConfigGovernorChanged(governor.config, _newConfigGovernor); governor.config = _newConfigGovernor; } /** * @dev Internal function to set the address of the fees updater * @param _newFeesUpdater Address of the new fees updater to be set */ function _setFeesUpdater(address _newFeesUpdater) internal { emit FeesUpdaterChanged(governor.feesUpdater, _newFeesUpdater); governor.feesUpdater = _newFeesUpdater; } /** * @dev Internal function to set the address of the modules governor * @param _newModulesGovernor Address of the new modules governor to be set */ function _setModulesGovernor(address _newModulesGovernor) internal { emit ModulesGovernorChanged(governor.modules, _newModulesGovernor); governor.modules = _newModulesGovernor; } /** * @dev Internal function to set a module * @param _id Id of the module to be set * @param _addr Address of the module to be set */ function _setModule(bytes32 _id, address _addr) internal { require(isContract(_addr), ERROR_IMPLEMENTATION_NOT_CONTRACT); modules[_id] = _addr; emit ModuleSet(_id, _addr); } /** * @dev Internal function to notify when a term has been transitioned * @param _termId Identification number of the new current term that has been transitioned */ function _onTermTransitioned(uint64 _termId) internal { _ensureTermConfig(_termId); } /** * @dev Internal function to tell the address of the DisputeManager module * @return Address of the DisputeManager module */ function _getDisputeManager() internal view returns (address) { return _getModule(DISPUTE_MANAGER); } /** * @dev Internal function to tell the address of the Subscriptions module * @return Address of the Subscriptions module */ function _getSubscriptions() internal view returns (address) { return _getModule(SUBSCRIPTIONS); } /** * @dev Internal function to tell the address of the BrightId register * @return Address of the BrightId register */ function _getBrightIdRegister() internal view returns (address) { return _getModule(BRIGHTID_REGISTER); } /** * @dev Internal function to tell address of a module based on a given ID * @param _id ID of the module being queried * @return Address of the requested module */ function _getModule(bytes32 _id) internal view returns (address) { return modules[_id]; } } // File: contracts/arbitration/IArbitrator.sol pragma solidity ^0.5.8; interface IArbitrator { /** * @dev Create a dispute over the Arbitrable sender with a number of possible rulings * @param _possibleRulings Number of possible rulings allowed for the dispute * @param _metadata Optional metadata that can be used to provide additional information on the dispute to be created * @return Dispute identification number */ function createDispute(uint256 _possibleRulings, bytes calldata _metadata) external returns (uint256); /** * @dev Submit evidence for a dispute * @param _disputeId Id of the dispute in the Protocol * @param _submitter Address of the account submitting the evidence * @param _evidence Data submitted for the evidence related to the dispute */ function submitEvidence(uint256 _disputeId, address _submitter, bytes calldata _evidence) external; /** * @dev Close the evidence period of a dispute * @param _disputeId Identification number of the dispute to close its evidence submitting period */ function closeEvidencePeriod(uint256 _disputeId) external; /** * @notice Rule dispute #`_disputeId` if ready * @param _disputeId Identification number of the dispute to be ruled * @return subject Arbitrable instance associated to the dispute * @return ruling Ruling number computed for the given dispute */ function rule(uint256 _disputeId) external returns (address subject, uint256 ruling); /** * @dev Tell the dispute fees information to create a dispute * @return recipient Address where the corresponding dispute fees must be transferred to * @return feeToken ERC20 token used for the fees * @return feeAmount Total amount of fees that must be allowed to the recipient */ function getDisputeFees() external view returns (address recipient, ERC20 feeToken, uint256 feeAmount); } // File: contracts/arbitration/IArbitrable.sol pragma solidity ^0.5.8; contract IArbitrable { /** * @dev Emitted when an IArbitrable instance's dispute is ruled by an IArbitrator * @param arbitrator IArbitrator instance ruling the dispute * @param disputeId Identification number of the dispute being ruled by the arbitrator * @param ruling Ruling given by the arbitrator */ event Ruled(IArbitrator indexed arbitrator, uint256 indexed disputeId, uint256 ruling); } // File: contracts/disputes/IDisputeManager.sol pragma solidity ^0.5.8; interface IDisputeManager { enum DisputeState { PreDraft, Adjudicating, Ruled } enum AdjudicationState { Invalid, Committing, Revealing, Appealing, ConfirmingAppeal, Ended } /** * @dev Create a dispute to be drafted in a future term * @param _subject Arbitrable instance creating the dispute * @param _possibleRulings Number of possible rulings allowed for the drafted jurors to vote on the dispute * @param _metadata Optional metadata that can be used to provide additional information on the dispute to be created * @return Dispute identification number */ function createDispute(IArbitrable _subject, uint8 _possibleRulings, bytes calldata _metadata) external returns (uint256); /** * @dev Submit evidence for a dispute * @param _subject Arbitrable instance submitting the dispute * @param _disputeId Identification number of the dispute receiving new evidence * @param _submitter Address of the account submitting the evidence * @param _evidence Data submitted for the evidence of the dispute */ function submitEvidence(IArbitrable _subject, uint256 _disputeId, address _submitter, bytes calldata _evidence) external; /** * @dev Close the evidence period of a dispute * @param _subject IArbitrable instance requesting to close the evidence submission period * @param _disputeId Identification number of the dispute to close its evidence submitting period */ function closeEvidencePeriod(IArbitrable _subject, uint256 _disputeId) external; /** * @dev Draft jurors for the next round of a dispute * @param _disputeId Identification number of the dispute to be drafted */ function draft(uint256 _disputeId) external; /** * @dev Appeal round of a dispute in favor of a certain ruling * @param _disputeId Identification number of the dispute being appealed * @param _roundId Identification number of the dispute round being appealed * @param _ruling Ruling appealing a dispute round in favor of */ function createAppeal(uint256 _disputeId, uint256 _roundId, uint8 _ruling) external; /** * @dev Confirm appeal for a round of a dispute in favor of a ruling * @param _disputeId Identification number of the dispute confirming an appeal of * @param _roundId Identification number of the dispute round confirming an appeal of * @param _ruling Ruling being confirmed against a dispute round appeal */ function confirmAppeal(uint256 _disputeId, uint256 _roundId, uint8 _ruling) external; /** * @dev Compute the final ruling for a dispute * @param _disputeId Identification number of the dispute to compute its final ruling * @return subject Arbitrable instance associated to the dispute * @return finalRuling Final ruling decided for the given dispute */ function computeRuling(uint256 _disputeId) external returns (IArbitrable subject, uint8 finalRuling); /** * @dev Settle penalties for a round of a dispute * @param _disputeId Identification number of the dispute to settle penalties for * @param _roundId Identification number of the dispute round to settle penalties for * @param _jurorsToSettle Maximum number of jurors to be slashed in this call */ function settlePenalties(uint256 _disputeId, uint256 _roundId, uint256 _jurorsToSettle) external; /** * @dev Claim rewards for a round of a dispute for juror * @dev For regular rounds, it will only reward winning jurors * @param _disputeId Identification number of the dispute to settle rewards for * @param _roundId Identification number of the dispute round to settle rewards for * @param _juror Address of the juror to settle their rewards */ function settleReward(uint256 _disputeId, uint256 _roundId, address _juror) external; /** * @dev Settle appeal deposits for a round of a dispute * @param _disputeId Identification number of the dispute to settle appeal deposits for * @param _roundId Identification number of the dispute round to settle appeal deposits for */ function settleAppealDeposit(uint256 _disputeId, uint256 _roundId) external; /** * @dev Tell the amount of token fees required to create a dispute * @return feeToken ERC20 token used for the fees * @return feeAmount Total amount of fees to be paid for a dispute at the given term */ function getDisputeFees() external view returns (ERC20 feeToken, uint256 feeAmount); /** * @dev Tell information of a certain dispute * @param _disputeId Identification number of the dispute being queried * @return subject Arbitrable subject being disputed * @return possibleRulings Number of possible rulings allowed for the drafted jurors to vote on the dispute * @return state Current state of the dispute being queried: pre-draft, adjudicating, or ruled * @return finalRuling The winning ruling in case the dispute is finished * @return lastRoundId Identification number of the last round created for the dispute * @return createTermId Identification number of the term when the dispute was created */ function getDispute(uint256 _disputeId) external view returns (IArbitrable subject, uint8 possibleRulings, DisputeState state, uint8 finalRuling, uint256 lastRoundId, uint64 createTermId); /** * @dev Tell information of a certain adjudication round * @param _disputeId Identification number of the dispute being queried * @param _roundId Identification number of the round being queried * @return draftTerm Term from which the requested round can be drafted * @return delayedTerms Number of terms the given round was delayed based on its requested draft term id * @return jurorsNumber Number of jurors requested for the round * @return selectedJurors Number of jurors already selected for the requested round * @return settledPenalties Whether or not penalties have been settled for the requested round * @return collectedTokens Amount of juror tokens that were collected from slashed jurors for the requested round * @return coherentJurors Number of jurors that voted in favor of the final ruling in the requested round * @return state Adjudication state of the requested round */ function getRound(uint256 _disputeId, uint256 _roundId) external view returns ( uint64 draftTerm, uint64 delayedTerms, uint64 jurorsNumber, uint64 selectedJurors, uint256 jurorFees, bool settledPenalties, uint256 collectedTokens, uint64 coherentJurors, AdjudicationState state ); /** * @dev Tell appeal-related information of a certain adjudication round * @param _disputeId Identification number of the dispute being queried * @param _roundId Identification number of the round being queried * @return maker Address of the account appealing the given round * @return appealedRuling Ruling confirmed by the appealer of the given round * @return taker Address of the account confirming the appeal of the given round * @return opposedRuling Ruling confirmed by the appeal taker of the given round */ function getAppeal(uint256 _disputeId, uint256 _roundId) external view returns (address maker, uint64 appealedRuling, address taker, uint64 opposedRuling); /** * @dev Tell information related to the next round due to an appeal of a certain round given. * @param _disputeId Identification number of the dispute being queried * @param _roundId Identification number of the round requesting the appeal details of * @return nextRoundStartTerm Term ID from which the next round will start * @return nextRoundJurorsNumber Jurors number for the next round * @return newDisputeState New state for the dispute associated to the given round after the appeal * @return feeToken ERC20 token used for the next round fees * @return jurorFees Total amount of fees to be distributed between the winning jurors of the next round * @return totalFees Total amount of fees for a regular round at the given term * @return appealDeposit Amount to be deposit of fees for a regular round at the given term * @return confirmAppealDeposit Total amount of fees for a regular round at the given term */ function getNextRoundDetails(uint256 _disputeId, uint256 _roundId) external view returns ( uint64 nextRoundStartTerm, uint64 nextRoundJurorsNumber, DisputeState newDisputeState, ERC20 feeToken, uint256 totalFees, uint256 jurorFees, uint256 appealDeposit, uint256 confirmAppealDeposit ); /** * @dev Tell juror-related information of a certain adjudication round * @param _disputeId Identification number of the dispute being queried * @param _roundId Identification number of the round being queried * @param _juror Address of the juror being queried * @return weight Juror weight drafted for the requested round * @return rewarded Whether or not the given juror was rewarded based on the requested round */ function getJuror(uint256 _disputeId, uint256 _roundId, address _juror) external view returns (uint64 weight, bool rewarded); } // File: contracts/court/Celeste.sol pragma solidity ^0.5.8; contract Celeste is Controller, IArbitrator { using Uint256Helpers for uint256; // Arbitrable interface ID based on ERC-165 bytes4 private constant ARBITRABLE_INTERFACE_ID = bytes4(0x88f3ee69); /** * @dev Constructor function * @param _termParams Array containing: * 0. _termDuration Duration in seconds per term * 1. _firstTermStartTime Timestamp in seconds when the court will open (to give time for juror on-boarding) * @param _governors Array containing: * 0. _fundsGovernor Address of the funds governor * 1. _configGovernor Address of the config governor * 2. _oracle Address of the price oracle * 3. _modulesGovernor Address of the modules governor * @param _feeToken Address of the token contract that is used to pay for fees * @param _fees Array containing: * 0. jurorFee Amount of fee tokens that is paid per juror per dispute * 1. draftFee Amount of fee tokens per juror to cover the drafting cost * 2. settleFee Amount of fee tokens per juror to cover round settlement cost * @param _maxRulingOptions Max number of selectable outcomes for each dispute * @param _roundParams Array containing durations of phases of a dispute and other params for rounds: * 0. evidenceTerms Max submitting evidence period duration in terms * 1. commitTerms Commit period duration in terms * 2. revealTerms Reveal period duration in terms * 3. appealTerms Appeal period duration in terms * 4. appealConfirmationTerms Appeal confirmation period duration in terms * 5. firstRoundJurorsNumber Number of jurors to be drafted for the first round of disputes * 6. appealStepFactor Increasing factor for the number of jurors of each round of a dispute * 7. maxRegularAppealRounds Number of regular appeal rounds before the final round is triggered * 8. finalRoundLockTerms Number of terms that a coherent juror in a final round is disallowed to withdraw (to prevent 51% attacks) * @param _pcts Array containing: * 0. penaltyPct Permyriad of min active tokens balance to be locked to each drafted jurors (‱ - 1/10,000) * 1. finalRoundReduction Permyriad of fee reduction for the last appeal round (‱ - 1/10,000) * @param _appealCollateralParams Array containing params for appeal collateral: * 0. appealCollateralFactor Permyriad multiple of dispute fees required to appeal a preliminary ruling * 1. appealConfirmCollateralFactor Permyriad multiple of dispute fees required to confirm appeal * @param _jurorsParams Array containing params for juror registry: * 0. minActiveBalance Minimum amount of juror tokens that can be activated * 1. minMaxPctTotalSupply The min max percent of the total supply a juror can activate, applied for total supply active stake * 2. maxMaxPctTotalSupply The max max percent of the total supply a juror can activate, applied for 0 active stake * 3. feeTokenTotalSupply Set for networks that don't have access to the fee token's total supply, set to 0 for networks that do */ constructor( uint64[2] memory _termParams, address[4] memory _governors, ERC20 _feeToken, uint256[3] memory _fees, uint8 _maxRulingOptions, uint64[9] memory _roundParams, uint16[2] memory _pcts, uint256[2] memory _appealCollateralParams, uint256[4] memory _jurorsParams ) public Controller( _termParams, _governors, _feeToken, _fees, _maxRulingOptions, _roundParams, _pcts, _appealCollateralParams, _jurorsParams ) { // solium-disable-previous-line no-empty-blocks } /** * @notice Create a dispute with `_possibleRulings` possible rulings * @param _possibleRulings Number of possible rulings allowed for the drafted jurors to vote on the dispute * @param _metadata Optional metadata that can be used to provide additional information on the dispute to be created * @return Dispute identification number */ function createDispute(uint256 _possibleRulings, bytes calldata _metadata) external returns (uint256) { IArbitrable subject = IArbitrable(msg.sender); IDisputeManager disputeManager = IDisputeManager(_getDisputeManager()); return disputeManager.createDispute(subject, _possibleRulings.toUint8(), _metadata); } /** * @notice Submit `_evidence` as evidence from `_submitter` for dispute #`_disputeId` * @param _disputeId Id of the dispute in the Protocol * @param _submitter Address of the account submitting the evidence * @param _evidence Data submitted for the evidence related to the dispute */ function submitEvidence(uint256 _disputeId, address _submitter, bytes calldata _evidence) external { IDisputeManager disputeManager = IDisputeManager(_getDisputeManager()); IArbitrable subject = IArbitrable(msg.sender); disputeManager.submitEvidence(subject, _disputeId, _submitter, _evidence); } /** * @notice Close the evidence period of dispute #`_disputeId` * @param _disputeId Identification number of the dispute to close its evidence submitting period */ function closeEvidencePeriod(uint256 _disputeId) external { IArbitrable subject = IArbitrable(msg.sender); IDisputeManager disputeManager = IDisputeManager(_getDisputeManager()); disputeManager.closeEvidencePeriod(subject, _disputeId); } /** * @notice Rule dispute #`_disputeId` if ready * @param _disputeId Identification number of the dispute to be ruled * @return subject Arbitrable instance associated to the dispute * @return ruling Ruling number computed for the given dispute */ function rule(uint256 _disputeId) external returns (address subject, uint256 ruling) { IDisputeManager disputeManager = IDisputeManager(_getDisputeManager()); (IArbitrable _subject, uint8 _ruling) = disputeManager.computeRuling(_disputeId); return (address(_subject), uint256(_ruling)); } /** * @dev Tell the dispute fees information to create a dispute * @return recipient Address where the corresponding dispute fees must be transferred to * @return feeToken ERC20 token used for the fees * @return feeAmount Total amount of fees that must be allowed to the recipient */ function getDisputeFees() external view returns (address recipient, ERC20 feeToken, uint256 feeAmount) { recipient = _getDisputeManager(); IDisputeManager disputeManager = IDisputeManager(recipient); (feeToken, feeAmount) = disputeManager.getDisputeFees(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"getCurrentTermId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVoting","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTermDuration","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ids","type":"bytes32[]"},{"name":"_addresses","type":"address[]"}],"name":"setModules","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_holder","type":"address"}],"name":"areWithdrawalsAllowedFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTreasury","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSubscriptions","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFundsGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ensureCurrentTerm","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getModulesGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNeededTermTransitions","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeesUpdater","type":"address"}],"name":"changeFeesUpdater","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_addr","type":"address"}],"name":"setModule","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getTermRandomness","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getDraftConfig","outputs":[{"name":"feeToken","type":"address"},{"name":"draftFee","type":"uint256"},{"name":"penaltyPct","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getConfigChangeTermId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBrightIdRegister","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDisputeFees","outputs":[{"name":"recipient","type":"address"},{"name":"feeToken","type":"address"},{"name":"feeAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_disputeId","type":"uint256"},{"name":"_submitter","type":"address"},{"name":"_evidence","type":"bytes"}],"name":"submitEvidence","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ensureCurrentTermRandomness","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_disputeId","type":"uint256"}],"name":"closeEvidencePeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_allowed","type":"bool"}],"name":"setAutomaticWithdrawals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getTermTokenTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"bytes32"}],"name":"getModule","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ejectModulesGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newFundsGovernor","type":"address"}],"name":"changeFundsGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getJurorsRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getMinActiveBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getConfigGovernor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxRequestedTransitions","type":"uint64"}],"name":"heartbeat","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFeesUpdater","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_possibleRulings","type":"uint256"},{"name":"_metadata","type":"bytes"}],"name":"createDispute","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ejectFundsGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newModulesGovernor","type":"address"}],"name":"changeModulesGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newConfigGovernor","type":"address"}],"name":"changeConfigGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fromTermId","type":"uint64"},{"name":"_feeToken","type":"address"},{"name":"_fees","type":"uint256[3]"},{"name":"_maxRulingOptions","type":"uint8"},{"name":"_roundParams","type":"uint64[9]"},{"name":"_pcts","type":"uint16[2]"},{"name":"_appealCollateralParams","type":"uint256[2]"},{"name":"_jurorsParams","type":"uint256[4]"}],"name":"setConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_disputeId","type":"uint256"}],"name":"rule","outputs":[{"name":"subject","type":"address"},{"name":"ruling","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getDisputeManager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getConfig","outputs":[{"name":"feeToken","type":"address"},{"name":"fees","type":"uint256[3]"},{"name":"maxRulingOptions","type":"uint8"},{"name":"roundParams","type":"uint64[9]"},{"name":"pcts","type":"uint16[2]"},{"name":"appealCollateralParams","type":"uint256[2]"},{"name":"jurorsParams","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFirstTermStartTime","type":"uint64"}],"name":"delayStartTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_termId","type":"uint64"}],"name":"getTerm","outputs":[{"name":"startTime","type":"uint64"},{"name":"randomnessBN","type":"uint64"},{"name":"randomness","type":"bytes32"},{"name":"celesteTokenTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLastEnsuredTermId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_termParams","type":"uint64[2]"},{"name":"_governors","type":"address[4]"},{"name":"_feeToken","type":"address"},{"name":"_fees","type":"uint256[3]"},{"name":"_maxRulingOptions","type":"uint8"},{"name":"_roundParams","type":"uint64[9]"},{"name":"_pcts","type":"uint16[2]"},{"name":"_appealCollateralParams","type":"uint256[2]"},{"name":"_jurorsParams","type":"uint256[4]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"bytes32"},{"indexed":false,"name":"addr","type":"address"}],"name":"ModuleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousGovernor","type":"address"},{"indexed":false,"name":"currentGovernor","type":"address"}],"name":"FundsGovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousGovernor","type":"address"},{"indexed":false,"name":"currentGovernor","type":"address"}],"name":"ConfigGovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousFeesUpdater","type":"address"},{"indexed":false,"name":"currentFeesUpdater","type":"address"}],"name":"FeesUpdaterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousGovernor","type":"address"},{"indexed":false,"name":"currentGovernor","type":"address"}],"name":"ModulesGovernorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fromTermId","type":"uint64"},{"indexed":false,"name":"courtConfigId","type":"uint64"}],"name":"NewConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"allowed","type":"bool"}],"name":"AutomaticWithdrawalsAllowedChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousTermId","type":"uint64"},{"indexed":false,"name":"currentTermId","type":"uint64"}],"name":"Heartbeat","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousStartTime","type":"uint64"},{"indexed":false,"name":"currentStartTime","type":"uint64"}],"name":"StartTimeDelayed","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405161038080620054a683398101806040526103808110156200003557600080fd5b5060c081015161014082015160408301919060e0840190610160850161028086016102c087016103008801888888888888888888868686868686868f8760008281602002015190506000836001602002015190506301e133806001600160401b0316826001600160401b0316106040518060400160405280601a81526020017f434c4b5f5445524d5f4455524154494f4e5f544f4f5f4c4f4e47000000000000815250906200017f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200014357818101518382015260200162000129565b50505050905090810190601f168015620001715780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b508162000191620004de60201b60201c565b016001600160401b0316816001600160401b031610156040518060400160405280601d81526020017f434c4b5f4241445f46495253545f5445524d5f53544152545f54494d450000008152509062000246576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506301e133806002026200025f620004de60201b60201c565b016001600160401b0316816001600160401b031611156040518060400160405280601d81526020017f434c4b5f4241445f46495253545f5445524d5f53544152545f54494d450000008152509062000314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50600080546001600160401b038085166001600160401b0319928316178355918052600160209081527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805486860390941693909216929092179055604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516001600160a01b038616926318160ddd9260048082019391829003018186803b158015620003c657600080fd5b505afa158015620003db573d6000803e3d6000fd5b505050506040513d6020811015620003f257600080fd5b505160008052600160208190527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4b9190915593506200043992506003915083905062001669565b5062000454600080898989898989896200050b60201b60201c565b505050505050506200047e886000600481106200046d57fe5b6020020151620013ef60201b60201c565b6200049688600160200201516200145960201b60201c565b620004ae8860026020020151620014c360201b60201c565b620004c688600360200201516200152d60201b60201c565b5050505050505050505050505050505050506200175c565b600062000505620004f46200159760201b60201c565b6200159b60201b620038111760201c565b90505b90565b6001600160401b0389161580620005335750886001600160401b0316886001600160401b0316115b6040518060400160405280601181526020017f434f4e465f544f4f5f4f4c445f5445524d00000000000000000000000000000081525090620005d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060028560ff1610156040518060600160405280602181526020016200546460219139906200065e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506040805160608101909152602180825260fc60ff88161115919062005443602083013990620006eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50815115801590620007005750602082015115155b6040518060400160405280601b81526020017f434f4e465f5a45524f5f434f4c4c41544552414c5f464143544f520000000000815250906200079f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50620007be8360005b60200201516200164c60201b620034fa1760201c565b6040518060400160405280601881526020017f434f4e465f494e56414c49445f50454e414c54595f5043540000000000000000815250906200085d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506200086b836001620007a8565b6040518060400160405280602081526020017f434f4e465f494e56414c49445f46494e414c5f524f554e445f5245445f504354815250906200090a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060a084015160408051808201909152601e81527f434f4e465f4241445f494e495449414c5f4a55524f52535f4e554d42455200006020820152906001600160401b0316620009b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060c084015160408051808201909152601b81527f434f4e465f4241445f41505045414c5f535445505f464143544f5200000000006020820152906001600160401b031662000a62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060e08401516001600160401b03166000811580159062000a845750600a8211155b9050806040518060400160405280601e81526020017f434f4e465f494e56414c49445f4d41585f41505045414c5f524f554e445300008152509062000b26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060005b600581101562000c2357600087826009811062000b4357fe5b60200201516001600160401b031611801562000b7a57506121de87826009811062000b6a57fe5b60200201516001600160401b0316105b6040518060400160405280601f81526020017f434f4e465f4c415247455f524f554e445f50484153455f4455524154494f4e008152509062000c19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060010162000b2a565b50825160408051808201909152601c81527f434f4e465f5a45524f5f4d494e5f4143544956455f42414c414e43450000000060208201529062000cc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5060008360016020020151116040518060400160405280601e81526020017f434f4e465f4d494e5f4d41585f544f54414c5f535550504c595f5a45524f00008152509062000d6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5062000d8c83600260200201516200165b60201b620035091760201c565b6040518060600160405280602581526020016200541e602591399062000e0f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b50826002602002015183600160200201511060405180606001604052806021815260200162005485602191399062000ea4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b506002546001600160401b03808d169116111562000edd576002546001600160401b031660009081526004602052604081205562000ef3565b600380549062000ef1906001830162001669565b505b600380546000198101916000916001600160401b03841690811062000f1457fe5b90600052602060002090600e020190506040518060a001604052808c6001600160a01b031681526020018860016002811062000f4c57fe5b602002015161ffff1681526020018b60006003811062000f6857fe5b602002015181526020018b60016003811062000f8057fe5b602002015181526020018b60026003811062000f9857fe5b60209081029190910151909152815183548383015161ffff167401000000000000000000000000000000000000000002600160a01b61ffff02196001600160a01b039093166001600160a01b03199092169190911791909116178355604080830151600185015560608301516002850155608090920151600384015581516101a0810190925260ff8b168252810189600060200201516001600160401b03168152602001896001600981106200104a57fe5b60200201516001600160401b03168152602001896002600981106200106b57fe5b60200201516001600160401b03168152602001896003600981106200108c57fe5b60200201516001600160401b0316815260200189600460098110620010ad57fe5b60200201516001600160401b0316815260200188600060028110620010ce57fe5b602002015161ffff16815260200189600560098110620010ea57fe5b60200201516001600160401b03168152602001896006600981106200110b57fe5b60200201516001600160401b03168152602001896008600981106200112c57fe5b60200201516001600160401b03168152602001858152602001876000600281106200115357fe5b60200201518152602001876001600281106200116b57fe5b6020908102919091015190915281516004840180549284015160408086015160608701516001600160401b039081167101000000000000000000000000000000000002600160881b600160c81b0319928216690100000000000000000002600160481b600160881b0319958316610100908102610100600160481b031960ff909a1660ff19909b169a909a1798909816989098179490941696909617169190911790915560808085015160058701805460a088015160c089015160e08a01518916720100000000000000000000000000000000000002600160901b600160d01b031961ffff90921670010000000000000000000000000000000002600160801b61ffff0219938b1668010000000000000000908102600160401b600160801b0319988d166001600160401b03199788161789161794909416179190911617909255948701516006890180546101208a01518916909302919097169190951617169290921790925561014083015160078501556101608301516008850155610180909201516009840155805191820190528086600060200201518152602001866001600481106200131757fe5b60200201518152602001866002600481106200132f57fe5b60200201518152602001866003600481106200134757fe5b602090810291909101519091528151600a84015581810151600b840155604080830151600c850155606090920151600d8401556001600160401b038e811660008181526004845284902091861691829055600280546001600160401b0319168217905583519081529182015281517ff991c74e88b00b8de409caf790045f133e9a8283d3b989db88e2b2d93612c3a7929181900390910190a150505050505050505050505050565b600654604080516001600160a01b039283168152918316602083015280517f2e8176039aca48fb2df80d8a3f0c25cf4f12ba7ba15aabe562bd39f71967954f9281900390910190a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b600754604080516001600160a01b039283168152918316602083015280517fad1fe49159fc13ce805cb23e72eb6724c008509c8095b9499752efea5747af3e9281900390910190a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516001600160a01b039283168152918316602083015280517fa2b29bedf9f242c3e9603549e73178e898cc1313c338d783974d5e21098327c49281900390910190a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b600954604080516001600160a01b039283168152918316602083015280517faf8bba87fb343f5755495c80323f32cd6bbfaebd666ff5abac709bc1f76f2f179281900390910190a1600980546001600160a01b0319166001600160a01b0392909216919091179055565b4290565b60408051808201909152601581527f55494e5436345f4e554d4245525f544f4f5f424947000000000000000000000060208201526000906001600160401b0383111562001645576040517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482018181528351602484015283519092839260449091019190850190808383600083156200014357818101518382015260200162000129565b5090919050565b61271061ffff82161115919050565b670de0b6b3a7640000101590565b8154818355818111156200169857600e0281600e0283600052602060002091820191016200169891906200169d565b505050565b6200050891905b80821115620017585780546001600160b01b031916815560006001820181905560028201819055600382018190556004820180546001600160c81b03191690556005820180547fffffffffffff00000000000000000000000000000000000000000000000000001690556006820180546001600160801b0319169055600782018190556008820181905560098201819055600a8201819055600b8201819055600c8201819055600d820155600e01620016a4565b5090565b613cb2806200176c6000396000f3fe608060405234801561001057600080fd5b506004361061027e5760003560e01c80637fb011d611610156578063c13517e1116100d3578063db18af6c11610097578063e36057b711610071578063e36057b714610952578063f137b44e14610978578063f7fe5789146109d05761027e565b8063db18af6c146107e3578063db9bee4614610823578063e008cb621461082b5761027e565b8063c13517e1146106bd578063cf0a5af314610734578063d7a846931461073c578063d9296df214610762578063da339d21146107885761027e565b8063953e46a01161011a578063953e46a01461065957806395f3c2da1461066157806397023f81146106875780639bf6fa571461068f5780639e0b7a9c146106b55761027e565b80637fb011d6146105c957806382cf57ae146105e857806385acd6411461060e5780638c8bd2181461062b5780638de10e87146106335761027e565b806350c36580116101ff5780636991fdb8116101c35780637cb57c641161019d5780637cb57c641461051f5780637d1f24c9146105a45780637e9adccf146105ac5761027e565b80636991fdb8146104dd5780636f85a700146104e55780637b751b9e146104ed5761027e565b806350c36580146103f957806351a3578014610401578063541cd4681461042757806361f3be6a14610453578063696670051461048b5761027e565b80633b19e84a116102465780633b19e84a146103d15780633b47a9ac146103d95780633c28e88b146103e15780633f33bf86146103e9578063408a2640146103f15761027e565b806308135a93146102835780631986d376146102a757806322f8f6f3146102cb57806324bdf713146102d357806327fe748c14610397575b600080fd5b61028b6109d8565b604080516001600160401b039092168252519081900360200190f35b6102af6109e8565b604080516001600160a01b039092168252519081900360200190f35b61028b610a13565b610395600480360360408110156102e957600080fd5b81019060208101813564010000000081111561030457600080fd5b82018360208201111561031657600080fd5b8035906020019184602083028401116401000000008311171561033857600080fd5b91939092909160208101903564010000000081111561035657600080fd5b82018360208201111561036857600080fd5b8035906020019184602083028401116401000000008311171561038a57600080fd5b509092509050610a22565b005b6103bd600480360360208110156103ad57600080fd5b50356001600160a01b0316610bb6565b604080519115158252519081900360200190f35b6102af610bd8565b6102af610c03565b6102af610c0d565b61028b610c1c565b6102af610c26565b61028b610c35565b6103956004803603602081101561041757600080fd5b50356001600160a01b0316610c3f565b6103956004803603604081101561043d57600080fd5b50803590602001356001600160a01b0316610ccb565b6104796004803603602081101561046957600080fd5b50356001600160401b0316610d59565b60408051918252519081900360200190f35b6104b1600480360360208110156104a157600080fd5b50356001600160401b0316610e09565b604080516001600160a01b039094168452602084019290925261ffff1682820152519081900360600190f35b61028b610e31565b6102af610e40565b6104f5610e4a565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b6103956004803603606081101561053557600080fd5b8135916001600160a01b036020820135169181019060608101604082013564010000000081111561056557600080fd5b82018360208201111561057757600080fd5b8035906020019184600183028401116401000000008311171561059957600080fd5b509092509050610ed4565b610479610fb1565b610395600480360360208110156105c257600080fd5b5035611088565b610395600480360360208110156105df57600080fd5b50351515611112565b610479600480360360208110156105fe57600080fd5b50356001600160401b0316611168565b6102af6004803603602081101561062457600080fd5b5035611228565b610395611239565b6103956004803603602081101561064957600080fd5b50356001600160a01b03166112c5565b6102af6113db565b6104796004803603602081101561067757600080fd5b50356001600160401b0316611406565b6102af61141d565b61028b600480360360208110156106a557600080fd5b50356001600160401b031661142c565b6102af611437565b610479600480360360408110156106d357600080fd5b813591908101906040810160208201356401000000008111156106f557600080fd5b82018360208201111561070757600080fd5b8035906020019184600183028401116401000000008311171561072957600080fd5b509092509050611446565b610395611523565b6103956004803603602081101561075257600080fd5b50356001600160a01b03166115ad565b6103956004803603602081101561077857600080fd5b50356001600160a01b03166116c3565b61039560048036036102e081101561079f57600080fd5b506001600160401b03813516906001600160a01b0360208201351690604081019060ff60a0820135169060c08101906101e0810190610220810190610260016117d9565b610800600480360360208110156107f957600080fd5b503561194d565b604080516001600160a01b03909316835260208301919091528051918290030190f35b6102af6119e7565b6108516004803603602081101561084157600080fd5b50356001600160401b03166119f1565b6040516001600160a01b03881681526020810187606080838360005b8381101561088557818101518382015260200161086d565b5050505060ff89169201918252506020018561012080838360005b838110156108b85781810151838201526020016108a0565b5050505090500184600260200280838360005b838110156108e35781810151838201526020016108cb565b5050505090500183600260200280838360005b8381101561090e5781810151838201526020016108f6565b5050505090500182600460200280838360005b83811015610939578181015183820152602001610921565b5050505090500197505050505050505060405180910390f35b6103956004803603602081101561096857600080fd5b50356001600160401b0316611a3d565b61099e6004803603602081101561098e57600080fd5b50356001600160401b0316611ac6565b604080516001600160401b03958616815293909416602084015282840191909152606082015290519081900360800190f35b61028b611b02565b60006109e2611b0c565b90505b90565b60006109e27f7cbb12e82a6d63ff16fe43977f43e3e2b247ecd4e62c0e340da8800a48c67346611b32565b6000546001600160401b031690565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314610ade57604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610aa3578181015183820152602001610a8b565b50505050905090810190601f168015610ad05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060408051808201909152601e81527f4354525f494e56414c49445f494d504c535f494e5055545f4c454e47544800006020820152838214610b6457604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060005b83811015610baf57610ba7858583818110610b7f57fe5b90506020020135848484818110610b9257fe5b905060200201356001600160a01b0316611b4d565b600101610b68565b5050505050565b6001600160a01b03811660009081526005602052604090205460ff165b919050565b60006109e27f06aa03964db1f7257357ef09714a5f0ca3633723df419e97015e0c7a3e83edb7611b32565b60006109e2611c44565b6006546001600160a01b031690565b60006109e2611c6f565b6009546001600160a01b031690565b60006109e2611d45565b6007546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314610cbe57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc881611db7565b50565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314610d4a57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610d558282611b4d565b5050565b6000805460408051808201909152601781527f434c4b5f5445524d5f444f45535f4e4f545f4558495354000000000000000000602082015283916001600160401b03600160401b90910481169083161115610df857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610e0283611e21565b9392505050565b600080600080610e17611ef8565b9050610e238582611f0e565b935093509350509193909250565b6002546001600160401b031690565b60006109e2611f4e565b6000806000610e57611f79565b92506000839050806001600160a01b0316637b751b9e6040518163ffffffff1660e01b8152600401604080518083038186803b158015610e9657600080fd5b505afa158015610eaa573d6000803e3d6000fd5b505050506040513d6040811015610ec057600080fd5b508051602090910151949590949350915050565b6000610ede611f79565b6040517f5bdaf9d80000000000000000000000000000000000000000000000000000000081523360048201818152602483018990526001600160a01b03888116604485015260806064850190815260848501889052949550919391851692635bdaf9d89285928b928b928b928b9290919060a401848480828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610f9157600080fd5b505af1158015610fa5573d6000803e3d6000fd5b50505050505050505050565b60008054600160401b90046001600160401b03168082526001602081905260408320908101548015610fe75792506109e5915050565b6000610ff284611e21565b60408051808201909152601f81527f434c4b5f5445524d5f52414e444f4d4e4553535f554e415641494c41424c450060208201529091508161107857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060019092018290555091505090565b336000611093611f79565b9050806001600160a01b031663c39c83d183856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156110f557600080fd5b505af1158015611109573d6000803e3d6000fd5b50505050505050565b33600081815260056020908152604091829020805460ff1916851515908117909155825190815291517f189949428c2e58715ea2f0be0d702bc14e73743bdbb58814a595c19e1285c5be9281900390910190a250565b6000805460408051808201909152601781527f434c4b5f5445524d5f444f45535f4e4f545f4558495354000000000000000000602082015283916001600160401b03600160401b9091048116908316111561120757604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5050506001600160401b031660009081526001602052604090206002015490565b600061123382611b32565b92915050565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b031633146112b857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506112c36000611fa4565b565b6006546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b0316331461134457604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060408051808201909152601c81527f4354525f494e56414c49445f474f5645524e4f525f414444524553530000000060208201526001600160a01b0382166113d157604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc88161200e565b60006109e27f3b21d36b36308c830e6c4053fb40a3b6d79dde78947fbf6b0accd30720ab5370611b32565b600080611411611ef8565b9050610e028382612078565b6007546001600160a01b031690565b600061123382612091565b6008546001600160a01b031690565b60003381611452611f79565b9050806001600160a01b0316631d2fa1fb8361146d8961233e565b60405163ffffffff841660e01b81526001600160a01b0383166004820190815260ff83166024830152606060448301908152606483018b90528b928b929190608401848480828437600081840152601f19601f82011690508083019250505095505050505050602060405180830381600087803b1580156114ed57600080fd5b505af1158015611501573d6000803e3d6000fd5b505050506040513d602081101561151757600080fd5b50519695505050505050565b6006546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b031633146115a257604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506112c3600061200e565b6009546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b0316331461162c57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060408051808201909152601c81527f4354525f494e56414c49445f474f5645524e4f525f414444524553530000000060208201526001600160a01b0382166116b957604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc881611fa4565b6007546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b0316331461174257604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060408051808201909152601c81527f4354525f494e56414c49445f474f5645524e4f525f414444524553530000000060208201526001600160a01b0382166117cf57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc8816123cf565b6007546001600160a01b03163314806117fc57506008546001600160a01b031633145b604051806040016040528060178152602001600080516020613c678339815191528152509061186f57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50600061187a611c6f565b9050611942818a8a8a600380602002604051908101604052809291908260036020028082843760009201919091525050604080516101208181019092528d9250908c9060099083908390808284376000920191909152505060408051808201825291508c9060029083908390808284376000920191909152505060408051808201825291508c9060029083908390808284376000920191909152505060408051608081810190925291508c906004908390839080828437600092019190915250612439915050565b505050505050505050565b600080600061195a611f79565b9050600080826001600160a01b031663bd881e53876040518263ffffffff1660e01b8152600401808281526020019150506040805180830381600087803b1580156119a457600080fd5b505af11580156119b8573d6000803e3d6000fd5b505050506040513d60408110156119ce57600080fd5b50805160209091015190955060ff169350505050915091565b60006109e2611f79565b60006119fb613a48565b6000611a05613a66565b611a0d613a85565b611a15613a85565b611a1d613aa3565b611a26886131a0565b959e949d50929b5090995097509550909350915050565b6007546040805180820190915260178152600080516020613c678339815191526020820152906001600160a01b03163314611abc57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50610cc8816131fa565b6001600160401b03908116600090815260016020819052604090912080549181015460029091015482841694600160401b909304909316929091565b60006109e2611ef8565b60006109e2611b19611d45565b600054600160401b90046001600160401b0316906133df565b6000908152600a60205260409020546001600160a01b031690565b611b5681613480565b6040518060400160405280601f81526020017f4354525f494d504c454d454e544154494f4e5f4e4f545f434f4e54524143540081525090611bdb57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506000828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581529182015281517f0669329f751b07de4aa82f60514a409d0dfaef266e791a4a65a95b07b1c4c324929181900390910190a15050565b60006109e27f2bfa3327fe52344390da94c32a346eeb1b65a8b583e4335a419b9471e88c1365611b32565b600080611c7a611d45565b60408051808201909152601881527f434c4b5f544f4f5f4d414e595f5452414e534954494f4e530000000000000000602082015290915060016001600160401b0383161115611d0d57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506001600160401b038116611d36575050600054600160401b90046001600160401b03166109e5565b611d3f81612091565b91505090565b600080546001600160401b03600160401b90910481168252600160205260408220541680611d7161349f565b6001600160401b03161015611d8a5760009150506109e5565b6000546001600160401b031681611d9f61349f565b036001600160401b031681611db057fe5b0491505090565b600854604080516001600160a01b039283168152918316602083015280517fa2b29bedf9f242c3e9603549e73178e898cc1313c338d783974d5e21098327c49281900390910190a1600880546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160401b038082166000908152600160205260408120805491929091600160401b900416611e506134b1565b6001600160401b0316116040518060400160405280601b81526020017f434c4b5f5445524d5f52414e444f4d4e4553535f4e4f545f594554000000000081525090611edf57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5054600160401b90046001600160401b03164092915050565b600054600160401b90046001600160401b031690565b600080600080611f1e86866134be565b805460028201546005909201546001600160a01b0390911698919750600160801b900461ffff1695509350505050565b60006109e27fc8d8a5444a51ecc23e5091f18c4162834512a4bc5cae72c637db45c8c37b3329611b32565b60006109e27f14a6c70f0f6d449c014c7bbc9e68e31e79e8474fb03b7194df83109a2d888ae6611b32565b600954604080516001600160a01b039283168152918316602083015280517faf8bba87fb343f5755495c80323f32cd6bbfaebd666ff5abac709bc1f76f2f179281900390910190a1600980546001600160a01b0319166001600160a01b0392909216919091179055565b600654604080516001600160a01b039283168152918316602083015280517f2e8176039aca48fb2df80d8a3f0c25cf4f12ba7ba15aabe562bd39f71967954f9281900390910190a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b60008061208584846134be565b600a0154949350505050565b60008061209c611d45565b90506000816001600160401b0316846001600160401b0316106120bf57816120c1565b835b6001600160401b03169050600081116040518060400160405280601c81526020017f434c4b5f494e56414c49445f5452414e534954494f4e5f5445524d53000000008152509061215557604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060006121606134b1565b600054909150600160401b90046001600160401b03168060015b8481116122c4576001600160401b0380831660009081526001602081905260408083209590910192831682528120919391906121b4613aa3565b6121bd866131a0565b9650505050505091506121cf866134f1565b60005484546121f0916001600160401b03918216911663ffffffff6133df16565b835467ffffffffffffffff19166001600160401b03918216176fffffffffffffffff00000000000000001916600160401b60018b01929092169190910217835560008160036020020151116122a957816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227857600080fd5b505afa15801561228c573d6000803e3d6000fd5b505050506040513d60208110156122a257600080fd5b50516122af565b60608101515b6002939093019290925550505060010161217a565b50600080546001600160401b03808416600160401b81026fffffffffffffffff00000000000000001990931692909217909255604080519285168352602083019190915280517fb8818b6d0c27e4fc7cf75de16ac2543426d3c0bcc520931d24e5a7dde4adca119281900390910190a19695505050505050565b60408051808201909152601481527f55494e54385f4e554d4245525f544f4f5f424947000000000000000000000000602082015260009060ff8311156123c857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5090919050565b600754604080516001600160a01b039283168152918316602083015280517fad1fe49159fc13ce805cb23e72eb6724c008509c8095b9499752efea5747af3e9281900390910190a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160401b03891615806124605750886001600160401b0316886001600160401b0316115b6040518060400160405280601181526020017f434f4e465f544f4f5f4f4c445f5445524d000000000000000000000000000000815250906124e557604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060028560ff161015604051806060016040528060218152602001613c25602191399061255657604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506040805160608101909152602180825260fc60ff881611159190613c046020830139906125c857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b508151158015906125dc5750602082015115155b6040518060400160405280601b81526020017f434f4e465f5a45524f5f434f4c4c41544552414c5f464143544f5200000000008152509061266157604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506126738360005b60200201516134fa565b6040518060400160405280601881526020017f434f4e465f494e56414c49445f50454e414c54595f5043540000000000000000815250906126f857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50612704836001612669565b6040518060400160405280602081526020017f434f4e465f494e56414c49445f46494e414c5f524f554e445f5245445f5043548152509061278957604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060a084015160408051808201909152601e81527f434f4e465f4241445f494e495449414c5f4a55524f52535f4e554d42455200006020820152906001600160401b031661281b57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060c084015160408051808201909152601b81527f434f4e465f4241445f41505045414c5f535445505f464143544f5200000000006020820152906001600160401b03166128ad57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060e08401516001600160401b0316600081158015906128ce5750600a8211155b9050806040518060400160405280601e81526020017f434f4e465f494e56414c49445f4d41585f41505045414c5f524f554e445300008152509061295657604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060005b6005811015612a3457600087826009811061297157fe5b60200201516001600160401b03161180156129a657506121de87826009811061299657fe5b60200201516001600160401b0316105b6040518060400160405280601f81526020017f434f4e465f4c415247455f524f554e445f50484153455f4455524154494f4e0081525090612a2b57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060010161295a565b50825160408051808201909152601c81527f434f4e465f5a45524f5f4d494e5f4143544956455f42414c414e434500000000602082015290612aba57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5060008360016020020151116040518060400160405280601e81526020017f434f4e465f4d494e5f4d41585f544f54414c5f535550504c595f5a45524f000081525090612b4b57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506040830151612b5a90613509565b604051806060016040528060258152602001613bdf6025913990612bc257604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b508260026020020151836001602002015110604051806060016040528060218152602001613c466021913990612c3c57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506002546001600160401b03808d1691161115612c73576002546001600160401b0316600090815260046020526040812055612c87565b6003805490612c859060018301613ac1565b505b600380546000198101916000916001600160401b038416908110612ca757fe5b90600052602060002090600e020190506040518060a001604052808c6001600160a01b0316815260200188600160028110612cde57fe5b602002015161ffff1681526020018b600060038110612cf957fe5b602002015181526020018b600160038110612d1057fe5b602002015181526020018b600260038110612d2757fe5b60209081029190910151909152815183548383015161ffff16600160a01b0275ffff0000000000000000000000000000000000000000196001600160a01b039093166001600160a01b03199092169190911791909116178355604080830151600185015560608301516002850155608090920151600384015581516101a0810190925260ff8b168252810189600060200201516001600160401b0316815260200189600160098110612dd557fe5b60200201516001600160401b0316815260200189600260098110612df557fe5b60200201516001600160401b0316815260200189600360098110612e1557fe5b60200201516001600160401b0316815260200189600460098110612e3557fe5b60200201516001600160401b0316815260200188600060028110612e5557fe5b602002015161ffff16815260200189600560098110612e7057fe5b60200201516001600160401b0316815260200189600660098110612e9057fe5b60200201516001600160401b0316815260200189600860098110612eb057fe5b60200201516001600160401b0316815260200185815260200187600060028110612ed657fe5b6020020151815260200187600160028110612eed57fe5b6020908102919091015190915281516004840180549284015160408086015160608701516001600160401b0390811671010000000000000000000000000000000000027fffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffff92821669010000000000000000000270ffffffffffffffff0000000000000000001995831661010090810268ffffffffffffffff001960ff909a1660ff19909b169a909a1798909816989098179490941696909617169190911790915560808085015160058701805460a088015160c089015160e08a015189167201000000000000000000000000000000000000027fffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffff61ffff909216600160801b0271ffff0000000000000000000000000000000019938b16600160401b9081026fffffffffffffffff000000000000000019988d1667ffffffffffffffff199788161789161794909416179190911617909255948701516006890180546101208a01518916909302919097169190951617169290921790925561014083015160078501556101608301516008850155610180909201516009840155805191820190528086600060200201518152602001866001600481106130c957fe5b60200201518152602001866002600481106130e057fe5b60200201518152602001866003600481106130f757fe5b602090810291909101519091528151600a84015581810151600b840155604080830151600c850155606090920151600d8401556001600160401b038e8116600081815260048452849020918616918290556002805467ffffffffffffffff19168217905583519081529182015281517ff991c74e88b00b8de409caf790045f133e9a8283d3b989db88e2b2d93612c3a7929181900390910190a150505050505050505050505050565b60006131aa613a48565b60006131b4613a66565b6131bc613a85565b6131c4613a85565b6131cc613aa3565b60006131d6611ef8565b90506131e28982613517565b959f949e50929c50909a509850965090945092505050565b613202611b0c565b60408051808201909152601e81527f434c4b5f43414e4e4f545f44454c41595f535441525445445f434f55525400006020820152906001600160401b03161561328f57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b506000808052600160205280547fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4980549092916132de916001600160401b03908116911663ffffffff6133df16565b9050806001600160401b0316836001600160401b0316116040518060400160405280602081526020017f434c4b5f43414e4e4f545f44454c41595f504153545f53544152545f54494d458152509061337a57604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b50600054825467ffffffffffffffff19166001600160401b0391821685038216178355604080518383168152918516602083015280517f9b735da8a0762c6e913df06587b4fa81f87b8075e2a2afdeae6afde9456fd8799281900390910190a1505050565b60408051808201909152601381527f4d41544836345f4144445f4f564552464c4f57000000000000000000000000006020820152600090838301906001600160401b03808616908316101561347857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b509392505050565b60006001600160a01b03821661349857506000610bd3565b503b151590565b60006109e26134ac61380d565b613811565b60006109e26134ac6138a1565b6000806134cb84846138a5565b9050600381815481106134da57fe5b90600052602060002090600e020191505092915050565b610cc881613934565b61271061ffff82161115919050565b670de0b6b3a7640000101590565b6000613521613a48565b600061352b613a66565b613533613a85565b61353b613a85565b613543613aa3565b600061354f8a8a6134be565b905060008160000190508060000160009054906101000a90046001600160a01b03169850604051806060016040528082600101548152602001826002015481526020018260030154815250975060008260040190508060000160009054906101000a900460ff1697506040518061012001604052808260000160019054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260000160099054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260000160119054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260010160009054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260010160089054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260010160129054906101000a90046001600160401b03166001600160401b03166001600160401b031681526020018260020160009054906101000a90046001600160401b03166001600160401b03166001600160401b0316815260200182600301546001600160401b03166001600160401b031681526020018260020160089054906101000a90046001600160401b03166001600160401b03166001600160401b0316815250965060405180604001604052808260010160109054906101000a900461ffff1661ffff1661ffff1681526020018360000160149054906101000a900461ffff1661ffff1661ffff16815250955060405180604001604052808260040154815260200182600501548152509450600083600a0190506040518060800160405280826000015481526020018260010154815260200182600201548152602001826003015481525094505050505092959891949750929550565b4290565b60408051808201909152601581527f55494e5436345f4e554d4245525f544f4f5f424947000000000000000000000060208201526000906001600160401b038311156123c857604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b4390565b6000816001600160401b0316836001600160401b0316116138df57506001600160401b038216600090815260046020526040902054611233565b6002546001600160401b039081169084168111613915576001600160401b03166000908152600460205260409020549050611233565b50506001600160401b0316600090815260046020526040902054919050565b6001600160401b03811660009081526004602052604090205480610d555760006004816139716001600160401b038616600163ffffffff6139a416565b6001600160401b039081168252602080830193909352604091820160009081205491871681526004909352912055505050565b6000826001600160401b0316826001600160401b031611156040518060400160405280601481526020017f4d41544836345f5355425f554e444552464c4f5700000000000000000000000081525090613a4157604051600160e51b62461bcd028152602060048201818152835160248401528351909283926044909101919085019080838360008315610aa3578181015183820152602001610a8b565b5050900390565b60405180606001604052806003906020820280388339509192915050565b6040518061012001604052806009906020820280388339509192915050565b60405180604001604052806002906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b815481835581811115613aed57600e0281600e028360005260206000209182019101613aed9190613af2565b505050565b6109e591905b80821115613bda57805475ffffffffffffffffffffffffffffffffffffffffffff1916815560006001820181905560028201819055600382018190556004820180547fffffffffffffff000000000000000000000000000000000000000000000000001690556005820180547fffffffffffff00000000000000000000000000000000000000000000000000001690556006820180546fffffffffffffffffffffffffffffffff19169055600782018190556008820181905560098201819055600a8201819055600b8201819055600c8201819055600d820155600e01613af8565b509056fe434f4e465f494e56414c49445f4d41585f4d41585f544f54414c5f535550504c595f504354434f4e465f52554c494e475f4f5054494f4e535f4d4f52455f5448414e5f4d4158434f4e465f52554c494e475f4f5054494f4e535f4c4553535f5448414e5f4d494e434f4e465f4d494e5f4d4f52455f5448414e5f4d41585f4143544956455f5043544354525f53454e4445525f4e4f545f474f5645524e4f52000000000000000000a165627a7a723058205de7c756ad5207a87b0e7d02e1d0a41da5f123dde29e7a913f18c942b6a25b2f0029434f4e465f494e56414c49445f4d41585f4d41585f544f54414c5f535550504c595f504354434f4e465f52554c494e475f4f5054494f4e535f4d4f52455f5448414e5f4d4158434f4e465f52554c494e475f4f5054494f4e535f4c4553535f5448414e5f4d494e434f4e465f4d494e5f4d4f52455f5448414e5f4d41585f4143544956455f50435400000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000061a537ad00000000000000000000000075ce3dda4f75cff4981b8bc362341c1dd10dda29000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000b371248dd0f9e4061ccf8850e9223ca48aa7ca4b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000075300000000000000000000000000000000000000000000000000000000000004e2000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000689162a44d160dc0000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000061a537ad00000000000000000000000075ce3dda4f75cff4981b8bc362341c1dd10dda29000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02000000000000000000000000b371248dd0f9e4061ccf8850e9223ca48aa7ca4b000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000002d79883d200000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000075300000000000000000000000000000000000000000000000000000000000004e2000000000000000000000000000000000000000000000000006f05b59d3b2000000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000689162a44d160dc0000
-----Decoded View---------------
Arg [0] : _termParams (uint64[2]): 28800,1638217645
Arg [1] : _governors (address[4]): 0x75ce3dda4f75cff4981b8bc362341c1dd10dda29,0xdf456b614fe9ff1c7c0b380330da29c96d40fb02,0xdf456b614fe9ff1c7c0b380330da29c96d40fb02,0xdf456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [2] : _feeToken (address): 0xb371248dd0f9e4061ccf8850e9223ca48aa7ca4b
Arg [3] : _fees (uint256[3]): 10000000000000000,100000000000000,50000000000000
Arg [4] : _maxRulingOptions (uint8): 2
Arg [5] : _roundParams (uint64[9]): 21,6,6,6,6,3,3,4,21
Arg [6] : _pcts (uint16[2]): 3000,5000
Arg [7] : _appealCollateralParams (uint256[2]): 30000,20000
Arg [8] : _jurorsParams (uint256[4]): 500000000000000000,100000000000000,1000000000000000,30863000000000000000000
-----Encoded View---------------
28 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000007080
Arg [1] : 0000000000000000000000000000000000000000000000000000000061a537ad
Arg [2] : 00000000000000000000000075ce3dda4f75cff4981b8bc362341c1dd10dda29
Arg [3] : 000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [4] : 000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [5] : 000000000000000000000000df456b614fe9ff1c7c0b380330da29c96d40fb02
Arg [6] : 000000000000000000000000b371248dd0f9e4061ccf8850e9223ca48aa7ca4b
Arg [7] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [8] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [9] : 00000000000000000000000000000000000000000000000000002d79883d2000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [21] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [22] : 0000000000000000000000000000000000000000000000000000000000007530
Arg [23] : 0000000000000000000000000000000000000000000000000000000000004e20
Arg [24] : 00000000000000000000000000000000000000000000000006f05b59d3b20000
Arg [25] : 00000000000000000000000000000000000000000000000000005af3107a4000
Arg [26] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [27] : 000000000000000000000000000000000000000000000689162a44d160dc0000
Deployed ByteCode Sourcemap
102732:7061:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;102732:7061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15279:101;;;:::i;:::-;;;;-1:-1:-1;;;;;15279:101:0;;;;;;;;;;;;;;86328:97;;;:::i;:::-;;;;-1:-1:-1;;;;;86328:97:0;;;;;;;;;;;;;;14738:96;;;:::i;79386:314::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;79386:314:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;79386:314:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;79386:314:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;79386:314:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;79386:314:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;79386:314:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;79386:314:0;;-1:-1:-1;79386:314:0;-1:-1:-1;79386:314:0;:::i;:::-;;49023:133;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49023:133:0;-1:-1:-1;;;;;49023:133:0;;:::i;:::-;;;;;;;;;;;;;;;;;;86108:101;;;:::i;86807:105::-;;;:::i;84685:100::-;;;:::i;13039:101::-;;;:::i;85356:104::-;;;:::i;15563:117::-;;;:::i;77654:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77654:131:0;-1:-1:-1;;;;;77654:131:0;;:::i;79076:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;79076:117:0;;;;;;-1:-1:-1;;;;;79076:117:0;;:::i;16782:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16782:152:0;-1:-1:-1;;;;;16782:152:0;;:::i;:::-;;;;;;;;;;;;;;;;83832:243;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;83832:243:0;-1:-1:-1;;;;;83832:243:0;;:::i;:::-;;;;-1:-1:-1;;;;;83832:243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49343:108;;;:::i;87039:111::-;;;:::i;109498:290::-;;;:::i;:::-;;;;-1:-1:-1;;;;;109498:290:0;;;;;;;;;;;;;;;;;;;;;;;;;;;107780:328;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;107780:328:0;;;-1:-1:-1;;;;;107780:328:0;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;107780:328:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;107780:328:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;107780:328:0;;-1:-1:-1;107780:328:0;-1:-1:-1;107780:328:0;:::i;13961:651::-;;;:::i;108301:269::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108301:269:0;;:::i;44620:189::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44620:189:0;;;;:::i;17148:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17148:165:0;-1:-1:-1;;;;;17148:165:0;;:::i;85638:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;85638:105:0;;:::i;78798:113::-;;;:::i;76876:223::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76876:223:0;-1:-1:-1;;;;;76876:223:0;;:::i;86560:114::-;;;:::i;84355:209::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;84355:209:0;-1:-1:-1;;;;;84355:209:0;;:::i;84908:102::-;;;:::i;13416:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13416:140:0;-1:-1:-1;;;;;13416:140:0;;:::i;85127:104::-;;;:::i;107114:341::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;107114:341:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;107114:341:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;107114:341:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;107114:341:0;;-1:-1:-1;107114:341:0;-1:-1:-1;107114:341:0;:::i;78446:107::-;;;:::i;77954:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77954:235:0;-1:-1:-1;;;;;77954:235:0;;:::i;77272:229::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;77272:229:0;-1:-1:-1;;;;;77272:229:0;;:::i;75657:727::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;75657:727:0;;;;-1:-1:-1;;;;;75657:727:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;108856:320::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;108856:320:0;;:::i;:::-;;;;-1:-1:-1;;;;;108856:320:0;;;;;;;;;;;;;;;;;;;;;85878:107;;;:::i;82376:410::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;82376:410:0;-1:-1:-1;;;;;82376:410:0;;:::i;:::-;;;-1:-1:-1;;;;;82376:410:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;;;82376:410:0;;;;;;;;-1:-1:-1;82376:410:0;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;82376:410:0;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;82376:410:0;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;82376:410:0;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;82376:410:0;;;;;;;;;;;;;;;;;;;;;;76566:141;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;76566:141:0;-1:-1:-1;;;;;76566:141:0;;:::i;16265:301::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16265:301:0;-1:-1:-1;;;;;16265:301:0;;:::i;:::-;;;;-1:-1:-1;;;;;16265:301:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14982:109;;;:::i;15279:101::-;15330:6;15356:16;:14;:16::i;:::-;15349:23;;15279:101;;:::o;86328:97::-;86372:7;86399:18;66285:66;86399:10;:18::i;14738:96::-;14788:6;14814:12;-1:-1:-1;;;;;14814:12:0;14738:96;:::o;79386:314::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79544:32:0;;;;;;;;;;;;;;;;;79510;;;79502:75;;;;-1:-1:-1;;;;;79502:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;79502:75:0;-1:-1:-1;79595:9:0;79590:103;79610:15;;;79590:103;;;79647:34;79658:4;;79663:1;79658:7;;;;;;;;;;;;;79667:10;;79678:1;79667:13;;;;;;;;;;;;;-1:-1:-1;;;;;79667:13:0;79647:10;:34::i;:::-;79627:3;;79590:103;;;;79386:314;;;;:::o;49023:133::-;-1:-1:-1;;;;;49121:27:0;;49097:4;49121:27;;;:18;:27;;;;;;;;49023:133;;;;:::o;86108:101::-;86154:7;86181:20;66110:66;86181:10;:20::i;86807:105::-;86858:7;86885:19;:17;:19::i;84685:100::-;84763:8;:14;-1:-1:-1;;;;;84763:14:0;84685:100;:::o;13039:101::-;13086:6;13112:20;:18;:20::i;85356:104::-;85436:16;;-1:-1:-1;;;;;85436:16:0;85356:104;:::o;15563:117::-;15622:6;15648:24;:22;:24::i;77654:131::-;68626:15;;68643:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68643:25:0;;;;;-1:-1:-1;;;;;68626:15:0;68612:10;:29;68604:65;;;;-1:-1:-1;;;;;68604:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68604:65:0;;77745:32;77761:15;77745;:32::i;:::-;77654:131;:::o;79076:117::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;69089:66:0;;79163:22;79174:3;79179:5;79163:10;:22::i;:::-;79076:117;;:::o;16782:152::-;16868:7;11653:6;;11661:25;;;;;;;;;;;;;;;;;16850:7;;-1:-1:-1;;;;;;;;11653:6:0;;;;;11642:17;;;;;11634:53;;;;-1:-1:-1;;;;;11634:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11634:53:0;;16895:31;16918:7;16895:22;:31::i;:::-;16888:38;16782:152;-1:-1:-1;;;16782:152:0:o;83832:243::-;83895:14;83911:16;83929:17;83959:24;83986:20;:18;:20::i;:::-;83959:47;;84024:43;84040:7;84049:17;84024:15;:43::i;:::-;84017:50;;;;;;;83832:243;;;;;:::o;49343:108::-;49425:18;;-1:-1:-1;;;;;49425:18:0;49343:108;:::o;87039:111::-;87093:7;87120:22;:20;:22::i;109498:290::-;109547:17;109566:14;109582:17;109624:20;:18;:20::i;:::-;109612:32;;109655:30;109704:9;109655:59;;109749:14;-1:-1:-1;;;;;109749:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;109749:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109749:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;109749:31:0;;;;;;;109498:290;;109749:31;;;-1:-1:-1;109498:290:0;-1:-1:-1;;109498:290:0:o;107780:328::-;107890:30;107939:20;:18;:20::i;:::-;108027:73;;;;;108005:10;108027:73;;;;;;;;;;;;-1:-1:-1;;;;;108027:73:0;;;;;;;;;;;;;;;;;;;;107890:70;;-1:-1:-1;108005:10:0;;108027:29;;;;;;108005:10;;108066;;108078;;108090:9;;;;108027:73;;;;;108090:9;;;;108027:73;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;108027:73:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;108027:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108027:73:0;;;;107780:328;;;;;;:::o;13961:651::-;14018:7;14139:6;;-1:-1:-1;;;14139:6:0;;-1:-1:-1;;;;;14139:6:0;14176:20;;;:5;:20;;;;;;;14232:15;;;;14262:28;;14258:82;;14314:14;-1:-1:-1;14307:21:0;;-1:-1:-1;;14307:21:0;14258:82;14388:21;14412:37;14435:13;14412:22;:37::i;:::-;14497:33;;;;;;;;;;;;;;;;;14388:61;;-1:-1:-1;14468:27:0;14460:71;;;;-1:-1:-1;;;;;14460:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;14460:71:0;-1:-1:-1;14542:15:0;;;;:31;;;-1:-1:-1;14560:13:0;-1:-1:-1;;13961:651:0;:::o;108301:269::-;108404:10;108370:19;108475:20;:18;:20::i;:::-;108426:70;;108507:14;-1:-1:-1;;;;;108507:34:0;;108542:7;108551:10;108507:55;;;;;;;;;;;;;-1:-1:-1;;;;;108507:55:0;-1:-1:-1;;;;;108507:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;108507:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;108507:55:0;;;;108301:269;;;:::o;44620:189::-;44707:10;44688:30;;;;:18;:30;;;;;;;;;:41;;-1:-1:-1;;44688:41:0;;;;;;;;;;44745:56;;;;;;;;;;;;;;;;;44620:189;:::o;17148:165::-;17240:7;11653:6;;11661:25;;;;;;;;;;;;;;;;;17222:7;;-1:-1:-1;;;;;;;;11653:6:0;;;;;11642:17;;;;;11634:53;;;;-1:-1:-1;;;;;11634:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11634:53:0;-1:-1:-1;;;;;;;;17267:14:0;;;;;:5;:14;;;;;:38;;;;17148:165::o;85638:105::-;85693:7;85720:15;85731:3;85720:10;:15::i;:::-;85713:22;85638:105;-1:-1:-1;;85638:105:0:o;78798:113::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;69089:66:0;;78870:33;65792:1;78870:19;:33::i;:::-;78798:113::o;76876:223::-;68421:8;:14;68437:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68437:25:0;;;;;-1:-1:-1;;;;;68421:14:0;68407:10;:28;68399:64;;;;-1:-1:-1;;;;;68399:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68399:64:0;-1:-1:-1;77013:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;76978:33:0;;76970:74;;;;-1:-1:-1;;;;;76970:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;76970:74:0;;77055:36;77073:17;77055;:36::i;86560:114::-;86612:7;86639:27;66486:66;86639:10;:27::i;84355:209::-;84423:7;84443:24;84470:20;:18;:20::i;:::-;84443:47;;84508:48;84529:7;84538:17;84508:20;:48::i;84908:102::-;84987:15;;-1:-1:-1;;;;;84987:15:0;84908:102;:::o;13416:140::-;13486:6;13512:36;13523:24;13512:10;:36::i;85127:104::-;85203:20;;-1:-1:-1;;;;;85203:20:0;85127:104;:::o;107114:341::-;107207:7;107261:10;107207:7;107332:20;:18;:20::i;:::-;107283:70;;107371:14;-1:-1:-1;;;;;107371:28:0;;107400:7;107409:26;:16;:24;:26::i;:::-;107371:76;;;;;;;;;-1:-1:-1;;;;;107371:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;107437:9;;;;107371:76;;;;107437:9;;;;107371:76;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;107371:76:0;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;107371:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;107371:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;107371:76:0;;107114:341;-1:-1:-1;;;;;;107114:341:0:o;78446:107::-;68421:8;:14;68437:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68437:25:0;;;;;-1:-1:-1;;;;;68421:14:0;68407:10;:28;68399:64;;;;-1:-1:-1;;;;;68399:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68399:64:0;;78514:31;65792:1;78514:17;:31::i;77954:235::-;69111:16;;69129:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;69129:25:0;;;;;-1:-1:-1;;;;;69111:16:0;69097:10;:30;69089:66;;;;-1:-1:-1;;;;;69089:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;69089:66:0;-1:-1:-1;78099:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78062:35:0;;78054:76;;;;-1:-1:-1;;;;;78054:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;78054:76:0;;78141:40;78161:19;78141;:40::i;77272:229::-;68626:15;;68643:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68643:25:0;;;;;-1:-1:-1;;;;;68626:15:0;68612:10;:29;68604:65;;;;-1:-1:-1;;;;;68604:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68604:65:0;-1:-1:-1;77413:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77377:34:0;;77369:75;;;;-1:-1:-1;;;;;77369:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;77369:75:0;;77455:38;77474:18;77455;:38::i;75657:727::-;68865:15;;-1:-1:-1;;;;;68865:15:0;68851:10;:29;;:67;;-1:-1:-1;68898:20:0;;-1:-1:-1;;;;;68898:20:0;68884:10;:34;68851:67;68920:25;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68920:25:0;;;68843:103;;;;;-1:-1:-1;;;;;68843:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68843:103:0;;76058:20;76081;:18;:20::i;:::-;76058:43;;76112:264;76137:13;76165:11;76191:9;76215:5;76112:264;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;;76235:17;;-1:-1:-1;76112:264:0;76267:12;;76112:264;;;;76267:12;;76112:264;76267:12;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;-1:-1:-1;76294:5:0;;76112:264;;;;76294:5;;76112:264;76294:5;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;-1:-1:-1;76314:23:0;;76112:264;;;;76314:23;;76112:264;76314:23;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;76112:264:0;;;;;;;;;;;-1:-1:-1;76352:13:0;;76112:264;;;;76352:13;;76112:264;76352:13;76112:264;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;76112:10:0;;-1:-1:-1;;76112:264:0:i;:::-;68957:1;75657:727;;;;;;;;:::o;108856:320::-;108908:15;108925:14;108952:30;109001:20;:18;:20::i;:::-;108952:70;;109034:20;109056:13;109073:14;-1:-1:-1;;;;;109073:28:0;;109102:10;109073:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;109073:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;109073:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;109073:40:0;;;;;;;;;-1:-1:-1;109151:16:0;;;-1:-1:-1;;;;108856:320:0;;;:::o;85878:107::-;85930:7;85957:20;:18;:20::i;82376:410::-;82457:14;82486:22;;:::i;:::-;82523;82560:28;;:::i;:::-;82603:21;;:::i;:::-;82639:40;;:::i;:::-;82694:30;;:::i;:::-;82759:19;82770:7;82759:10;:19::i;:::-;82752:26;;;;-1:-1:-1;82752:26:0;;-1:-1:-1;82752:26:0;;-1:-1:-1;82752:26:0;-1:-1:-1;82752:26:0;-1:-1:-1;82752:26:0;;-1:-1:-1;82376:410:0;-1:-1:-1;;82376:410:0:o;76566:141::-;68626:15;;68643:25;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;68643:25:0;;;;;-1:-1:-1;;;;;68626:15:0;68612:10;:29;68604:65;;;;-1:-1:-1;;;;;68604:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;68604:65:0;;76660:39;76676:22;76660:15;:39::i;16265:301::-;-1:-1:-1;;;;;16444:14:0;;;16321:16;16444:14;;;:5;:14;;;;;;;;16477;;16512:15;;;;16529:28;;;;;16477:14;;;;-1:-1:-1;;;16493:17:0;;;;;;;16512:15;;16265:301::o;14982:109::-;15037:6;15063:20;:18;:20::i;22577:119::-;22626:6;22652:36;22663:24;:22;:24::i;:::-;22652:6;;-1:-1:-1;;;22652:6:0;;-1:-1:-1;;;;;22652:6:0;;:10;:36::i;90284:103::-;90340:7;90367:12;;;:7;:12;;;;;;-1:-1:-1;;;;;90367:12:0;;90284:103::o;88781:205::-;88857:17;88868:5;88857:10;:17::i;:::-;88876:33;;;;;;;;;;;;;;;;;88849:61;;;;;-1:-1:-1;;;;;88849:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;88849:61:0;-1:-1:-1;88921:12:0;;;;:7;:12;;;;;;;;;:20;;-1:-1:-1;;;;;;88921:20:0;-1:-1:-1;;;;;88921:20:0;;;;;;;;88957:21;;;;;;;;;;;;;;;;;;;;;;88781:205;;:::o;89704:112::-;89756:7;89783:25;66682:66;89783:10;:25::i;17677:642::-;17725:6;17867:26;17896:24;:22;:24::i;:::-;17997:26;;;;;;;;;;;;;;;;;17867:53;;-1:-1:-1;10480:1:0;-1:-1:-1;;;;;17939:56:0;;;;17931:93;;;;-1:-1:-1;;;;;17931:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;17931:93:0;-1:-1:-1;;;;;;18122:28:0;;18118:79;;-1:-1:-1;;18179:6:0;;-1:-1:-1;;;18179:6:0;;-1:-1:-1;;;;;18179:6:0;18172:13;;18118:79;18280:31;18291:19;18280:10;:31::i;:::-;18273:38;;;17677:642;:::o;22900:593::-;22957:6;23189;;-1:-1:-1;;;;;;;;23189:6:0;;;;;23183:13;;:5;:13;;;;;:23;;;23221:16;:14;:16::i;:::-;-1:-1:-1;;;;;23221:39:0;;23217:88;;;23291:1;23277:16;;;;;23217:88;23473:12;;-1:-1:-1;;;;;23473:12:0;23449:20;23430:16;:14;:16::i;:::-;:39;-1:-1:-1;;;;;23429:56:0;;;;;;;23422:63;;;22900:593;:::o;88045:189::-;88139:20;;88120:57;;;-1:-1:-1;;;;;88139:20:0;;;88120:57;;;;;;;;;;;;;;;;;;;;;88188:20;:38;;-1:-1:-1;;;;;;88188:38:0;-1:-1:-1;;;;;88188:38:0;;;;;;;;;;88045:189::o;24081:268::-;-1:-1:-1;;;;;24192:14:0;;;24152:7;24192:14;;;:5;:14;;;;;24246:17;;24152:7;;24192:14;;-1:-1:-1;;;24246:17:0;;;24225:18;:16;:18::i;:::-;-1:-1:-1;;;;;24225:38:0;;24265:29;;;;;;;;;;;;;;;;;24217:78;;;;;-1:-1:-1;;;;;24217:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;24217:78:0;-1:-1:-1;24323:17:0;-1:-1:-1;;;24323:17:0;;-1:-1:-1;;;;;24323:17:0;24313:28;;24081:268;-1:-1:-1;;24081:268:0:o;22275:93::-;22328:6;22354;-1:-1:-1;;;22354:6:0;;-1:-1:-1;;;;;22354:6:0;;22275:93::o;62586:331::-;62687:14;62703:16;62721:17;62756:21;62780:42;62794:7;62803:18;62780:13;:42::i;:::-;62841:17;;62860:20;;;;62882:26;;;;;-1:-1:-1;;;;;62841:17:0;;;;62860:20;;-1:-1:-1;;;;62882:26:0;;;;;-1:-1:-1;62586:331:0;-1:-1:-1;;;;62586:331:0:o;89966:119::-;90021:7;90048:29;66889:66;90048:10;:29::i;89435:115::-;89488:7;89515:27;65929:66;89515:10;:27::i;88412:201::-;88518:16;;88495:61;;;-1:-1:-1;;;;;88518:16:0;;;88495:61;;;;;;;;;;;;;;;;;;;;;88567:16;:38;;-1:-1:-1;;;;;;88567:38:0;-1:-1:-1;;;;;88567:38:0;;;;;;;;;;88412:201::o;87323:187::-;87423:8;:14;87402:55;;;-1:-1:-1;;;;;87423:14:0;;;87402:55;;;;;;;;;;;;;;;;;;;;;87468:8;:34;;-1:-1:-1;;;;;;87468:34:0;-1:-1:-1;;;;;87468:34:0;;;;;;;;;;87323:187::o;63303:238::-;63399:7;63419:21;63443:42;63457:7;63466:18;63443:13;:42::i;:::-;63503:13;;:30;;63303:238;-1:-1:-1;;;;63303:238:0:o;18634:2295::-;18705:6;18835:24;18862;:22;:24::i;:::-;18835:51;;18897:19;18954:17;-1:-1:-1;;;;;18927:44:0;:24;-1:-1:-1;;;;;18927:44:0;;:91;;19001:17;18927:91;;;18974:24;18927:91;-1:-1:-1;;;;;18919:100:0;18897:122;;19052:1;19038:11;:15;19055:30;;;;;;;;;;;;;;;;;19030:56;;;;;-1:-1:-1;;;;;19030:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;19030:56:0;;19099:18;19120;:16;:18::i;:::-;19149:21;19173:6;19099:39;;-1:-1:-1;;;;19173:6:0;;-1:-1:-1;;;;;19173:6:0;;19264:1;19238:1562;19281:11;19267:10;:25;19238:1562;;-1:-1:-1;;;;;19689:22:0;;;19661:25;19689:22;;;:5;:22;;;;;;;;19695:15;;;;19753:20;;;;;;;19695:15;;19689:22;19753:20;19810:30;;:::i;:::-;19844:25;19855:13;19844:10;:25::i;:::-;19788:81;;;;;;;;;19884:34;19904:13;19884:19;:34::i;:::-;20167:12;;20140:22;;:40;;-1:-1:-1;;;;;20140:22:0;;;;20167:12;20140:40;:26;:40;:::i;:::-;20116:64;;-1:-1:-1;;20116:64:0;-1:-1:-1;;;;;20116:64:0;;;;-1:-1:-1;;20446:42:0;-1:-1:-1;;;20116:64:0;20473:15;;20446:42;;;;;;;;;;;-1:-1:-1;20726:12:0;20739:1;20726:15;;;;:19;:62;;20766:8;-1:-1:-1;;;;;20766:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20766:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20766:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20766:22:0;20726:62;;;20748:15;;;;20726:62;20688:35;;;;;:100;;;;-1:-1:-1;;;19294:12:0;;19238:1562;;;-1:-1:-1;20812:6:0;:22;;-1:-1:-1;;;;;20812:22:0;;;-1:-1:-1;;;20812:22:0;;-1:-1:-1;;20812:22:0;;;;;;;;;;20850:40;;;;;;;;;;;;;;;;;;;;;;;;;;;20908:13;18634:2295;-1:-1:-1;;;;;;18634:2295:0:o;501:154::-;594:26;;;;;;;;;;;;;;;;;552:5;;583:9;578:14;;;570:51;;;;-1:-1:-1;;;;;570:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;570:51:0;-1:-1:-1;645:1:0;;501:154;-1:-1:-1;501:154:0:o;87685:194::-;87788:15;;87766:58;;;-1:-1:-1;;;;;87788:15:0;;;87766:58;;;;;;;;;;;;;;;;;;;;;87835:15;:36;;-1:-1:-1;;;;;;87835:36:0;-1:-1:-1;;;;;87835:36:0;;;;;;;;;;87685:194::o;52855:4720::-;-1:-1:-1;;;;;53458:12:0;;;;:37;;;53488:7;-1:-1:-1;;;;;53474:21:0;:11;-1:-1:-1;;;;;53474:21:0;;53458:37;53497:18;;;;;;;;;;;;;;;;;53450:66;;;;;-1:-1:-1;;;;;53450:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53450:66:0;;53558:1;53537:17;:22;;;;53561:34;;;;;;;;;;;;;;;;;53529:67;;;;;-1:-1:-1;;;;;53529:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53529:67:0;-1:-1:-1;53721:34:0;;;;;;;;;;;;;53685;;;;;;;53721;;;;;;53677:79;;;;;-1:-1:-1;;;;;53677:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53677:79:0;-1:-1:-1;53847:26:0;;:30;;;;:64;;-1:-1:-1;53881:26:0;;;;:30;;53847:64;53913:28;;;;;;;;;;;;;;;;;53839:103;;;;;-1:-1:-1;;;;;53839:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;53839:103:0;-1:-1:-1;54060:28:0;54079:5;54085:1;54079:8;;;;;54060:18;:28::i;:::-;54090:25;;;;;;;;;;;;;;;;;54052:64;;;;;-1:-1:-1;;;;;54052:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54052:64:0;-1:-1:-1;54135:28:0;54154:5;54160:1;54154:8;;54135:28;54165:39;;;;;;;;;;;;;;;;;54127:78;;;;;-1:-1:-1;;;;;54127:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54127:78:0;-1:-1:-1;54303:15:0;;;;54324:31;;;;;;;;;;;;;54303:15;54324:31;;;;-1:-1:-1;;;;;54303:19:0;54295:61;;;;-1:-1:-1;;;;;54295:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54295:61:0;-1:-1:-1;54434:15:0;;;;54455:28;;;;;;;;;;;;;54434:15;54455:28;;;;-1:-1:-1;;;;;54434:19:0;54426:58;;;;-1:-1:-1;;;;;54426:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54426:58:0;-1:-1:-1;54612:15:0;;;;-1:-1:-1;;;;;54578:49:0;:31;54668:27;;;;;:89;;;40651:2;54699:23;:58;;54668:89;54638:119;;54776:22;54800:31;;;;;;;;;;;;;;;;;54768:64;;;;;-1:-1:-1;;;;;54768:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54768:64:0;-1:-1:-1;54920:6:0;54915:162;54936:1;54932;:5;54915:162;;;54985:1;54967:12;54980:1;54967:15;;;;;;;;;;;-1:-1:-1;;;;;54967:19:0;;:63;;;;-1:-1:-1;40526:4:0;54990:12;55003:1;54990:15;;;;;;;;;;;-1:-1:-1;;;;;54990:40:0;;54967:63;55032:32;;;;;;;;;;;;;;;;;54959:106;;;;;-1:-1:-1;;;;;54959:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;54959:106:0;-1:-1:-1;54939:3:0;;54915:162;;;-1:-1:-1;55150:16:0;;55172:29;;;;;;;;;;;;;55150:16;55172:29;;;;55142:60;;;;-1:-1:-1;;;;;55142:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55142:60:0;-1:-1:-1;55317:1:0;55298:13;55312:1;55298:16;;;;:20;55320:31;;;;;;;;;;;;;;;;;55290:62;;;;;-1:-1:-1;;;;;55290:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55290:62:0;-1:-1:-1;55490:16:0;;;;55458:49;;:31;:49::i;:::-;55509:38;;;;;;;;;;;;;;;;;55450:98;;;;;-1:-1:-1;;;;;55450:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55450:98:0;-1:-1:-1;55711:13:0;55725:1;55711:16;;;;55692:13;55706:1;55692:16;;;;:35;55729:34;;;;;;;;;;;;;;;;;55684:80;;;;;-1:-1:-1;;;;;55684:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;55684:80:0;-1:-1:-1;55946:18:0;;-1:-1:-1;;;;;55946:28:0;;;:18;;:28;55942:148;;;56006:18;;-1:-1:-1;;;;;56006:18:0;56028:1;55991:34;;;:14;:34;;;;;:38;55942:148;;;56062:7;:16;;;;;;;;;:::i;:::-;;55942:148;56132:7;:14;;-1:-1:-1;;56132:18:0;;;56102:20;;-1:-1:-1;;;;;56186:22:0;;;;;;;;;;;;;;;;;;;56162:46;;56235:198;;;;;;;;56268:9;-1:-1:-1;;;;;56235:198:0;;;;;56413:5;56419:1;56413:8;;;;;;;;;;;56235:198;;;;;;56302:5;56308:1;56302:8;;;;;;;;;;;56235:198;;;;56335:5;56341:1;56335:8;;;;;;;;;;;56235:198;;;;56369:5;56375:1;56369:8;;;;;;;;;;;;;;;;56235:198;;;56221:212;;;;;;;;;;-1:-1:-1;;;56221:212:0;-1:-1:-1;;;;;;;56221:212:0;;;-1:-1:-1;;;;;;56221:212:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56464:688;;;;;;;;;;;;;;;56559:12;56221:11;56559:15;;;;-1:-1:-1;;;;;56464:688:0;;;;;56602:12;56615:1;56602:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56645:12;56658:1;56645:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56688:12;56701:1;56688:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56738:12;56751:1;56738:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56780:5;56786:1;56780:8;;;;;;;;;;;56464:688;;;;;;56827:12;56840:1;56827:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56875:12;56888:1;56875:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56988:12;57001:1;56988:15;;;;;;;;;;;-1:-1:-1;;;;;56464:688:0;;;;;56929:23;56464:688;;;;57042:23;57066:1;57042:26;;;;;;;;;;;56464:688;;;;57114:23;57138:1;57114:26;;;;;;;;;;;;;;;;56464:688;;;56446:706;;:15;;;:706;;;;;;;;;;;;;;;-1:-1:-1;;;;;56446:706:0;;;;;;;;;;;-1:-1:-1;;56446:706:0;;;;;;;-1:-1:-1;;56446:706:0;;;;-1:-1:-1;;56446:706:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56446:706:0;-1:-1:-1;;56446:706:0;;;-1:-1:-1;;;56446:706:0;;;-1:-1:-1;;56446:706:0;;;-1:-1:-1;;56446:706:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57181:232;;;;;;;;57227:13;56446:706;57227:16;;;;57181:232;;;;57280:13;57294:1;57280:16;;;;;;;;;;;57181:232;;;;57333:13;57347:1;57333:16;;;;;;;;;;;57181:232;;;;57385:13;57399:1;57385:16;;;;;;;;;;;;;;;;57181:232;;;57165:248;;:13;;;:248;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57426:27:0;;;57165:248;57426:27;;;:14;:27;;;;;:43;;;;;;;57165:248;57480:32;;-1:-1:-1;;57480:32:0;;;;;57530:37;;;;;;;;;;;;;;;;;;;;;;52855:4720;;;;;;;;;;;;;:::o;82914:490::-;82996:14;83025:22;;:::i;:::-;83062;83099:28;;:::i;:::-;83142:21;;:::i;:::-;83178:40;;:::i;:::-;83233:30;;:::i;:::-;83291:24;83318:20;:18;:20::i;:::-;83291:47;;83356:40;83369:7;83378:17;83356:12;:40::i;:::-;83349:47;;;;-1:-1:-1;83349:47:0;;-1:-1:-1;83349:47:0;;-1:-1:-1;83349:47:0;-1:-1:-1;83349:47:0;-1:-1:-1;83349:47:0;;-1:-1:-1;82914:490:0;-1:-1:-1;;;82914:490:0:o;21136:660::-;21220:16;:14;:16::i;:::-;21243:32;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21220:21:0;;21212:64;;;;-1:-1:-1;;;;;21212:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;21212:64:0;-1:-1:-1;21289:17:0;21309:8;;;:5;:8;;21382:12;;21309:8;21363:14;;21309:8;;21289:17;21363:32;;-1:-1:-1;;;;;21363:14:0;;;;21382:12;21363:32;:18;:32;:::i;:::-;21328:67;;21439:25;-1:-1:-1;;;;;21414:50:0;:22;-1:-1:-1;;;;;21414:50:0;;21466:34;;;;;;;;;;;;;;;;;21406:95;;;;;-1:-1:-1;;;;;21406:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;21406:95:0;-1:-1:-1;21693:12:0;;21651:54;;-1:-1:-1;;21651:54:0;-1:-1:-1;;;;;21693:12:0;;;21668:37;;21651:54;;;;;21721:67;;;;;;;;;;;;;;;;;;;;;;;;;;;21136:660;;;:::o;3472:171::-;3595:18;;;;;;;;;;;;;;;;;3530:6;;3560:7;;;;-1:-1:-1;;;;;3586:7:0;;;;;;;;3578:36;;;;-1:-1:-1;;;;;3578:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3578:36:0;-1:-1:-1;3634:1:0;3472:171;-1:-1:-1;;;3472:171:0:o;1425:252::-;1485:4;-1:-1:-1;;;;;1506:21:0;;1502:66;;-1:-1:-1;1551:5:0;1544:12;;1502:66;-1:-1:-1;1622:20:0;1661:8;;;1425:252::o;5365:108::-;5414:6;5440:25;:14;:12;:14::i;:::-;:23;:25::i;4732:112::-;4783:6;4809:27;:16;:14;:16::i;63875:210::-;63964:14;63991:10;64004:44;64020:7;64029:18;64004:15;:44::i;:::-;63991:57;;64066:7;64074:2;64066:11;;;;;;;;;;;;;;;;;;64059:18;;;63875:210;;;;:::o;89180:99::-;89245:26;89263:7;89245:17;:26::i;37851:101::-;37746:5;37928:16;;;;;37851:101;;;:::o;37960:130::-;37830:4;-1:-1:-1;38051:31:0;;37960:130::o;60339:1726::-;60450:14;60479:22;;:::i;:::-;60516;60553:28;;:::i;:::-;60596:21;;:::i;:::-;60632:40;;:::i;:::-;60687:30;;:::i;:::-;60745:21;60769:42;60783:7;60792:18;60769:13;:42::i;:::-;60745:66;;60824:29;60856:6;:11;;60824:43;;60889:10;:16;;;;;;;;;;-1:-1:-1;;;;;60889:16:0;60878:27;;60916:71;;;;;;;;60924:10;:19;;;60916:71;;;;60945:10;:19;;;60916:71;;;;60966:10;:20;;;60916:71;;;;;61000:37;61040:6;:15;;61000:55;;61085:14;:31;;;;;;;;;;;;61066:50;;61127:446;;;;;;;;61156:14;:28;;;;;;;;;;-1:-1:-1;;;;;61156:28:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61199:14;:26;;;;;;;;;;-1:-1:-1;;;;;61199:26:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61240:14;:26;;;;;;;;;;-1:-1:-1;;;;;61240:26:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61281:14;:26;;;;;;;;;;-1:-1:-1;;;;;61281:26:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61322:14;:33;;;;;;;;;;-1:-1:-1;;;;;61322:33:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61370:14;:37;;;;;;;;;;-1:-1:-1;;;;;61370:37:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61422:14;:31;;;;;;;;;;-1:-1:-1;;;;;61422:31:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61475:14;:37;;;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;61528:14;:34;;;;;;;;;;-1:-1:-1;;;;;61528:34:0;-1:-1:-1;;;;;61127:446:0;-1:-1:-1;;;;;61127:446:0;;;;;;61584:66;;;;;;;;61592:14;:25;;;;;;;;;;;;61584:66;;;;;;;;61619:10;:30;;;;;;;;;;;;61584:66;;;;;;;;;61661:110;;;;;;;;61687:14;:37;;;61661:110;;;;61726:14;:44;;;61661:110;;;;;61784:33;61820:6;:13;;61784:49;;61844:213;;;;;;;;61874:12;:29;;;61844:213;;;;61918:12;:33;;;61844:213;;;;61966:12;:33;;;61844:213;;;;62014:12;:32;;;61844:213;;;;;60339:1726;;;;;;;;;;;;;;:::o;5021:146::-;5095:15;5021:146;:::o;663:159::-;759:27;;;;;;;;;;;;;;;;;715:6;;-1:-1:-1;;;;;742:15:0;;;734:53;;;;-1:-1:-1;;;;;734:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4424:96:0;4500:12;4424:96;:::o;64433:771::-;64524:7;64677:18;-1:-1:-1;;;;;64666:29:0;:7;-1:-1:-1;;;;;64666:29:0;;64662:92;;-1:-1:-1;;;;;;64719:23:0;;;;;;:14;:23;;;;;;64712:30;;64662:92;64918:18;;-1:-1:-1;;;;;64918:18:0;;;;64951:32;;;;64947:109;;-1:-1:-1;;;;;65007:37:0;;;;;:14;:37;;;;;;;-1:-1:-1;65000:44:0;;64947:109;-1:-1:-1;;;;;;;65162:34:0;;;;;:14;:34;;;;;;;64433:771;-1:-1:-1;64433:771:0:o;49685:394::-;-1:-1:-1;;;;;49871:23:0;;49845;49871;;;:14;:23;;;;;;49909:20;49905:167;;49946:24;49973:14;49946:24;49988:14;-1:-1:-1;;;;;49988:11:0;;50000:1;49988:14;:11;:14;:::i;:::-;-1:-1:-1;;;;;49973:30:0;;;;;;;;;;;;;;;;;-1:-1:-1;49973:30:0;;;;50018:23;;;;;:14;:23;;;;;:42;-1:-1:-1;49685:394:0;;:::o;3223:173::-;3281:6;3314:2;-1:-1:-1;;;;;3308:8:0;:2;-1:-1:-1;;;;;3308:8:0;;;3318:19;;;;;;;;;;;;;;;;;3300:38;;;;;-1:-1:-1;;;;;3300:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3300:38:0;-1:-1:-1;;3360:7:0;;;3223:173::o;102732:7061::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;102732:7061:0;;;-1:-1:-1;;102732:7061:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;102732:7061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;102732:7061:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://5de7c756ad5207a87b0e7d02e1d0a41da5f123dde29e7a913f18c942b6a25b2f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.