Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
This contract contains unverified libraries: XPUtils
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
XP
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.0; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "./lib/BasicMetaTransaction.sol"; import "./Admin.sol"; // Potential statuses of an asset enum ProjectStatus { NonExistant, Running, Paused } enum Direction { increase, decrease } struct Scoreboard { mapping(string => uint256) scores; } struct Project { bytes32 id; string name; mapping(string => Action) nameToAction; Action[] actions; address[] owners; mapping(address => bool) isAddressOwner; // used to check if an address is an owner address[] updaters; // contracts and wallets allowed to update the score mapping(address => bool) isAddressUpdater; // used to check if an address is an updater ProjectStatus status; // allow the owner of this to pause project updates mapping(address => Scoreboard) addressToScoreboard; mapping(bytes32 => bool) updateIdToDoesExist; mapping(string => bool) scoreTypeToDoesExist; string[] scoreTypes; } struct Action { string name; uint256 points; Direction direction; bool isValid; } library XPUtils { using SafeMath for uint256; function createProject( Project storage _project, bytes32[] storage _projectIds, bytes32 _projectId, string memory _name, Action[] memory _inputActions, string[] memory _scoreTypes, address[] memory _owners, address[] memory _updaters ) external { require(_inputActions.length <= 20, "Can submit up to 20 actions"); require(_scoreTypes.length <= 20, "Can submit up to 20 score types"); _project.id = _projectId; _project.name = _name; _project.scoreTypes = _scoreTypes; _project.owners = _owners; _project.updaters = _updaters; _project.status = ProjectStatus.Running; for (uint256 i = 0; i < _scoreTypes.length; i++) { _project.scoreTypeToDoesExist[_scoreTypes[i]] = true; } // Loops through and add actions 1 by 1, limit actions list to 20 for (uint256 i = 0; i < _inputActions.length; i++) { _project.actions.push( Action( _inputActions[i].name, _inputActions[i].points, _inputActions[i].direction, true ) ); // Mapping points each name to the action object associated _project.nameToAction[_inputActions[i].name] = Action( _inputActions[i].name, _inputActions[i].points, _inputActions[i].direction, true ); } for (uint256 j = 0; j < _owners.length; j++) { // Owners array placed into mapping _project.isAddressOwner[_owners[j]] = true; } for (uint256 k = 0; k < _updaters.length; k++) { // Owners array placed into mapping _project.isAddressUpdater[_updaters[k]] = true; } _projectIds.push(_projectId); } function addActions(Project storage _project, Action[] memory _inputActions) external { require( _project.status != ProjectStatus.NonExistant, "Project does not exist" ); require(_inputActions.length <= 20, "Can submit up to 20 actions"); // Loops through and add actions 1 by 1, limit actions list to 20 for (uint256 i = 0; i < _inputActions.length; i++) { if (_project.nameToAction[_inputActions[i].name].isValid) { // Action exists, only need to update _project.nameToAction[_inputActions[i].name] = Action( _inputActions[i].name, _inputActions[i].points, _inputActions[i].direction, true ); } else { //Action does not exist so update it in the mapping as well as the actions list _project.actions.push( Action( _inputActions[i].name, _inputActions[i].points, _inputActions[i].direction, true ) ); //List of actions to loop through. _project.nameToAction[_inputActions[i].name] = Action( _inputActions[i].name, _inputActions[i].points, _inputActions[i].direction, true ); } } } function addProjectOwner(Project storage _project, address _newOwner) external { _project.isAddressOwner[_newOwner] = true; _project.owners.push(_newOwner); } function removeProjectOwner(Project storage _project, address _owner) external { require(_project.owners.length > 1, "Cannot delete last remaining owner"); _project.isAddressOwner[_owner] = false; for (uint256 i = 0; i < _project.owners.length; i++) { if (_project.owners[i] == _owner) { _project.owners[i] = _project.owners[_project.owners.length - 1]; _project.owners.pop(); //always pop last element break; } } } function addProjectUpdater(Project storage _project, address _newUpdater) external { _project.isAddressUpdater[_newUpdater] = true; _project.updaters.push(_newUpdater); } function removeProjectUpdater(Project storage _project, address _updater) external { _project.isAddressUpdater[_updater] = false; for (uint256 i = 0; i < _project.updaters.length; i++) { if (_project.updaters[i] == _updater) { _project.updaters[i] = _project.updaters[_project.updaters.length - 1]; _project.updaters.pop(); //always pop last element break; } } } function addScoreTypes(Project storage _project, string[] memory _scoreTypes) external { for (uint256 i = 0; i < _scoreTypes.length; i++) { _project.scoreTypes.push(_scoreTypes[i]); _project.scoreTypeToDoesExist[_scoreTypes[i]] = true; } } function removeScoreType(Project storage _project, string memory _scoreType) external { _project.scoreTypeToDoesExist[_scoreType] = false; for (uint256 i = 0; i < _project.scoreTypes.length; i++) { if ( keccak256(abi.encodePacked(_scoreType)) == keccak256(abi.encodePacked(_project.scoreTypes[i])) ) { _project.scoreTypes[i] = _project.scoreTypes[ _project.scoreTypes.length - 1 ]; _project.scoreTypes.pop(); break; } } } function updateScore( Project storage _project, bytes32 _updateId, Scoreboard storage currScoreboard, Action memory currAction, string memory _scoreType ) external returns (bool) { require(_project.status == ProjectStatus.Running, "Project is not active"); require(currAction.isValid, "Action must exist"); require( _project.scoreTypeToDoesExist[_scoreType] == true, "Score type does not exist in this project" ); if (_project.updateIdToDoesExist[_updateId] == false) { _project.updateIdToDoesExist[_updateId] = true; if (currAction.direction == Direction.increase) { currScoreboard.scores[_scoreType] = currScoreboard .scores[_scoreType] .add(currAction.points); } else if (currAction.direction == Direction.decrease) { //check if score will go below zero, if so then set it to 0 (lower limit); if (currAction.points >= currScoreboard.scores[_scoreType]) { currScoreboard.scores[_scoreType] = uint256(0); } else { currScoreboard.scores[_scoreType] = currScoreboard .scores[_scoreType] .sub(currAction.points); } } else { return false; } return true; } else { return false; } } } contract XP is Pausable, BasicMetaTransaction, Admin { using SafeMath for uint256; event ProjectCreated( bytes32 indexed projectId, string name, address creator, Action[] actions, string[] _scoreTypes, address[] owners, address[] updaters ); event NewActions(bytes32 projectId, Action[] actions); event NewScoreTypes( bytes32 projectId, string[] scoreTypesAdded, string[] allScoreTypes ); event RemoveScoreType( bytes32 projectId, string scoreTypeRemoved, string[] allScoreTypes ); event UpdateScore( bytes32 updateId, bytes32 projectId, address targetAddress, uint256 newPoints, uint256 pointChange, Direction direction, string actionName, string scoreType, string[] scoreTypes // All score types for the project ); event UpdateScoreFailed( bytes32 updateId, bytes32 projectId, address targetAddress ); event ProjectOwnerAdded(bytes32 projectId, address newOwner); event ProjectOwnerRemoved(bytes32 projectId, address ownerRemoved); event ProjectUpdaterAdded(bytes32 projectId, address newUpdater); event ProjectUpdaterRemoved(bytes32 projectId, address updaterRemoved); /* A project is an instance of an XP system */ bytes32[] projectIds; // keeps track of all project ids // Mapping of all the exists projects mapping(bytes32 => Project) public idToProject; // ************************ OWNER ONLY CALLABLE FUNCTIONS ******************************* function pause() external onlyOwner whenNotPaused { _pause(); // from Pausable.sol } function unpause() external onlyOwner whenPaused { _unpause(); //from Pausable.sol } // ************************ END ---- OWNER ONLY CALLABLE FUNCTIONS ----- END ******************************* function createProject( bytes32 _projectId, string memory _name, Action[] memory _inputActions, string[] memory _scoreTypes, address[] memory _owners, address[] memory _updaters ) public whenNotPaused { require( idToProject[_projectId].status == ProjectStatus.NonExistant, "Project already exists" ); XPUtils.createProject( idToProject[_projectId], projectIds, _projectId, _name, _inputActions, _scoreTypes, _owners, _updaters ); emit ProjectCreated( _projectId, _name, msgSender(), idToProject[_projectId].actions, _scoreTypes, _owners, _updaters ); } function addProjectOwner(bytes32 _projectId, address _newOwner) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project" ); XPUtils.addProjectOwner(idToProject[_projectId], _newOwner); emit ProjectOwnerAdded(_projectId, _newOwner); } function removeProjectOwner(bytes32 _projectId, address _owner) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project" ); require( idToProject[_projectId].isAddressOwner[_owner] == true, "This address is not an owner." ); XPUtils.removeProjectOwner(idToProject[_projectId], _owner); emit ProjectOwnerRemoved(_projectId, _owner); } function addProjectUpdater(bytes32 _projectId, address _newUpdater) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project" ); XPUtils.addProjectUpdater(idToProject[_projectId], _newUpdater); emit ProjectUpdaterAdded(_projectId, _newUpdater); } function removeProjectUpdater(bytes32 _projectId, address _updater) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project" ); require( idToProject[_projectId].isAddressUpdater[_updater] == true, "This address is not an updater." ); XPUtils.removeProjectUpdater(idToProject[_projectId], _updater); emit ProjectUpdaterRemoved(_projectId, _updater); } function pauseProject(bytes32 _projectId) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project" ); idToProject[_projectId].status = ProjectStatus.Paused; } function resumeProject(bytes32 _projectId) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project" ); idToProject[_projectId].status = ProjectStatus.Running; } function addScoreTypes(bytes32 _projectId, string[] memory _scoreTypes) public whenNotPaused { require( idToProject[_projectId].status != ProjectStatus.NonExistant, "Project does not exist" ); require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project to update actions" ); require(_scoreTypes.length <= 20, "Can submit up to 20 actions"); XPUtils.addScoreTypes(idToProject[_projectId], _scoreTypes); emit NewScoreTypes( _projectId, _scoreTypes, idToProject[_projectId].scoreTypes ); } function removeScoreType(bytes32 _projectId, string memory _scoreType) public whenNotPaused { require( idToProject[_projectId].status != ProjectStatus.NonExistant, "Project does not exist" ); require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project to update actions" ); XPUtils.removeScoreType(idToProject[_projectId], _scoreType); emit RemoveScoreType( _projectId, _scoreType, idToProject[_projectId].scoreTypes ); } /* Add new action types to project Scoreboards */ function addActions(bytes32 _projectId, Action[] memory _inputActions) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be an owner of the project to update actions" ); XPUtils.addActions(idToProject[_projectId], _inputActions); emit NewActions(_projectId, _inputActions); } function updateScore( bytes32 _updateId, bytes32 _projectId, string memory _actionName, string memory _scoreType, address _targetWallet ) public whenNotPaused { require( (idToProject[_projectId].isAddressOwner[msgSender()] || idToProject[_projectId].isAddressUpdater[msgSender()] || owner() == msgSender() || isAdmin(msgSender()) == true), "You must be either an owner or an updater to use this function" ); bool updated = XPUtils.updateScore( idToProject[_projectId], _updateId, idToProject[_projectId].addressToScoreboard[_targetWallet], idToProject[_projectId].nameToAction[_actionName], _scoreType ); if (updated) { emit UpdateScore( _updateId, _projectId, _targetWallet, idToProject[_projectId].addressToScoreboard[_targetWallet].scores[ _scoreType ], idToProject[_projectId].nameToAction[_actionName].points, idToProject[_projectId].nameToAction[_actionName].direction, _actionName, _scoreType, idToProject[_projectId].scoreTypes ); } else { emit UpdateScoreFailed(_updateId, _projectId, _targetWallet); } } /* Returns specific score for a user (must specift score type) */ function getScore( bytes32 _projectId, string memory _scoreType, address _targetWallet ) external view returns (uint256) { return idToProject[_projectId].addressToScoreboard[_targetWallet].scores[ _scoreType ]; } function getScoreTypesFromProject(bytes32 _projectId) external view returns (string[] memory) { return idToProject[_projectId].scoreTypes; } function getActionsFromProjectId(bytes32 _projectId) external view returns (Action[] memory) { return idToProject[_projectId].actions; } function getUpdatersFromProjectId(bytes32 _projectId) external view returns (address[] memory) { return idToProject[_projectId].updaters; } function getOwnersFromProjectId(bytes32 _projectId) external view returns (address[] memory) { return idToProject[_projectId].owners; } }
pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; contract BasicMetaTransaction { using SafeMath for uint256; event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; function getChainID() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Main function to be called when user wants to execute meta transaction. * The actual function to be called should be passed as param with name functionSignature * Here the basic signature recovery is being used. Signature is expected to be generated using * personal_sign method. * @param userAddress Address of user trying to do meta transaction * @param functionSignature Signature of the actual function to be called via meta transaction * @param sigR R part of the signature * @param sigS S part of the signature * @param sigV V part of the signature */ function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { require( verify( userAddress, nonces[userAddress], getChainID(), functionSignature, sigR, sigS, sigV ), "Signer and signature do not match" ); nonces[userAddress] = nonces[userAddress].add(1); // Append userAddress at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successfull"); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); return returnData; } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } // Builds a prefixed hash to mimic the behavior of eth_sign. function prefixed(bytes32 hash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } function verify( address owner, uint256 nonce, uint256 chainID, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public view returns (bool) { bytes32 hash = prefixed( keccak256(abi.encodePacked(nonce, this, chainID, functionSignature)) ); address signer = ecrecover(hash, sigV, sigR, sigS); require(signer != address(0), "Invalid signature"); return (owner == signer); } function msgSender() internal view returns (address sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { return msg.sender; } } }
pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; contract Admin is Ownable { // Contract level admins mapping(address => bool) addressToIsAdmin; address[] public admins; function isAdmin(address _user) internal view returns (bool) { return addressToIsAdmin[_user]; } function addAdmin(address _newAdmin) external onlyOwner { addressToIsAdmin[_newAdmin] = true; admins.push(_newAdmin); } function getAdmins() external view returns (address[] memory) { return admins; } function removeAdmin(address _removeAdmin) external onlyOwner { addressToIsAdmin[_removeAdmin] = false; for (uint256 i = 0; i < admins.length; i++) { if (admins[i] == _removeAdmin) { admins[i] = admins[admins.length - 1]; admins.pop(); //always pop last element break; } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "istanbul", "libraries": { "/contracts/XP.sol": { "XPUtils": "0xF20f60334825195E21B8F1338c9c024f98eF71B8" } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"indexed":false,"internalType":"struct Action[]","name":"actions","type":"tuple[]"}],"name":"NewActions","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"string[]","name":"scoreTypesAdded","type":"string[]"},{"indexed":false,"internalType":"string[]","name":"allScoreTypes","type":"string[]"}],"name":"NewScoreTypes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"indexed":false,"internalType":"struct Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"string[]","name":"_scoreTypes","type":"string[]"},{"indexed":false,"internalType":"address[]","name":"owners","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"updaters","type":"address[]"}],"name":"ProjectCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"ProjectOwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"ownerRemoved","type":"address"}],"name":"ProjectOwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"newUpdater","type":"address"}],"name":"ProjectUpdaterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"updaterRemoved","type":"address"}],"name":"ProjectUpdaterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"scoreTypeRemoved","type":"string"},{"indexed":false,"internalType":"string[]","name":"allScoreTypes","type":"string[]"}],"name":"RemoveScoreType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"updateId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pointChange","type":"uint256"},{"indexed":false,"internalType":"enum Direction","name":"direction","type":"uint8"},{"indexed":false,"internalType":"string","name":"actionName","type":"string"},{"indexed":false,"internalType":"string","name":"scoreType","type":"string"},{"indexed":false,"internalType":"string[]","name":"scoreTypes","type":"string[]"}],"name":"UpdateScore","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"updateId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"}],"name":"UpdateScoreFailed","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct Action[]","name":"_inputActions","type":"tuple[]"}],"name":"addActions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"addProjectOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_newUpdater","type":"address"}],"name":"addProjectUpdater","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string[]","name":"_scoreTypes","type":"string[]"}],"name":"addScoreTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct Action[]","name":"_inputActions","type":"tuple[]"},{"internalType":"string[]","name":"_scoreTypes","type":"string[]"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"address[]","name":"_updaters","type":"address[]"}],"name":"createProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getActionsFromProjectId","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct Action[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getOwnersFromProjectId","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_scoreType","type":"string"},{"internalType":"address","name":"_targetWallet","type":"address"}],"name":"getScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getScoreTypesFromProject","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getUpdatersFromProjectId","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"idToProject","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"enum ProjectStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"pauseProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_removeAdmin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_owner","type":"address"}],"name":"removeProjectOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_updater","type":"address"}],"name":"removeProjectUpdater","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_scoreType","type":"string"}],"name":"removeScoreType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"resumeProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_updateId","type":"bytes32"},{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_actionName","type":"string"},{"internalType":"string","name":"_scoreType","type":"string"},{"internalType":"address","name":"_targetWallet","type":"address"}],"name":"updateScore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"chainID","type":"uint256"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060008060006101000a81548160ff0219169083151502179055506200004c620000406200005260201b60201c565b6200005a60201b60201c565b62000120565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615f4d80620001306000396000f3fe6080604052600436106101d85760003560e01c80635c975abb116101025780638da5cb5b11610095578063b70ac26711610064578063b70ac26714610697578063c294dbf3146106c0578063c72884f5146106fd578063f2fde38b1461073a576101d8565b80638da5cb5b146105f15780638dffc7b81461061c578063969fa1ec14610645578063b556ebf01461066e576101d8565b8063740d8415116100d1578063740d84151461055f5780637fdaad76146105885780638456cb59146105b15780638696355c146105c8576101d8565b80635c975abb146104b75780636281133d146104e2578063704802751461051f578063715018a614610548576101d8565b806331ae450b1161017a57806347348b6e1161014957806347348b6e146103e75780634bb6e028146104245780634dc1c04b14610463578063564b81ef1461048c576101d8565b806331ae450b1461035357806334399a781461037e5780633f4ba83a146103a757806345689684146103be576101d8565b806314bfd6d0116101b657806314bfd6d0146102875780631785f53c146102c45780631c6c5a86146102ed5780632d0335ab14610316576101d8565b806309851aee146101dd5780630b0e17cf1461021a5780630c53c51c14610257575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613cf3565b610763565b6040516102119190615095565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190613cf3565b610852565b60405161024e9190615073565b60405180910390f35b610271600480360381019061026c9190613b85565b6108f6565b60405161027e9190615333565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190614063565b610b3a565b6040516102bb9190614fff565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613b5c565b610b79565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613cf3565b610e76565b005b34801561032257600080fd5b5061033d60048036038101906103389190613b5c565b61102f565b60405161034a9190615774565b60405180910390f35b34801561035f57600080fd5b50610368611078565b6040516103759190615073565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613dac565b611106565b005b3480156103b357600080fd5b506103bc61130f565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613f62565b6113dc565b005b3480156103f357600080fd5b5061040e60048036038101906104099190613efb565b6115e8565b60405161041b9190615774565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190613cf3565b611666565b60405161045a939291906152b0565b60405180910390f35b34801561046f57600080fd5b5061048a60048036038101906104859190613d58565b611725565b005b34801561049857600080fd5b506104a1611a61565b6040516104ae9190615774565b60405180910390f35b3480156104c357600080fd5b506104cc611a6e565b6040516104d991906150d9565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190613c14565b611a84565b60405161051691906150d9565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190613b5c565b611bbf565b005b34801561055457600080fd5b5061055d611cf9565b005b34801561056b57600080fd5b5061058660048036038101906105819190613d1c565b611d81565b005b34801561059457600080fd5b506105af60048036038101906105aa9190613d1c565b612031565b005b3480156105bd57600080fd5b506105c661223a565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613e00565b612308565b005b3480156105fd57600080fd5b50610606612784565b6040516106139190614fff565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613d1c565b6127ae565b005b34801561065157600080fd5b5061066c60048036038101906106679190613ea7565b612a5e565b005b34801561067a57600080fd5b5061069560048036038101906106909190613d1c565b612d55565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613cf3565b612f5e565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613cf3565b613117565b6040516106f49190615073565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190613cf3565b6131bb565b60405161073191906150b7565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613b5c565b61336e565b005b606060066000838152602001908152602001600020600c01805480602002602001604051908101604052809291908181526020016000905b828210156108475783829060005260206000200180546107ba90615c77565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690615c77565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b50505050508152602001906001019061079b565b505050509050919050565b6060600660008381526020019081526020016000206006018054806020026020016040519081016040528092919081815260200182805480156108ea57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108a0575b50505050509050919050565b606061094d86600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610944611a61565b88888888611a84565b61098c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610983906154b9565b60405180910390fd5b6109de60018060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461346690919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000803073ffffffffffffffffffffffffffffffffffffffff168789604051602001610a4e929190614f50565b604051602081830303815290604052604051610a6a9190614f39565b6000604051808303816000865af19150503d8060008114610aa7576040519150601f19603f3d011682016040523d82523d6000602084013e610aac565b606091505b509150915081610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890615439565b60405180910390fd5b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b883389604051610b2493929190615035565b60405180910390a1809250505095945050505050565b60048181548110610b4a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b8161347c565b73ffffffffffffffffffffffffffffffffffffffff16610b9f612784565b73ffffffffffffffffffffffffffffffffffffffff1614610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec90615499565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b600480549050811015610e72578173ffffffffffffffffffffffffffffffffffffffff1660048281548110610cae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e5f5760046001600480549050610d099190615ac8565b81548110610d40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660048281548110610da5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004805480610e25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610e72565b8080610e6a90615cf7565b915050610c50565b5050565b610e7e611a6e565b15610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590615479565b60405180910390fd5b600660008281526020019081526020016000206005016000610ede613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610f6a5750610f34613484565b73ffffffffffffffffffffffffffffffffffffffff16610f52612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f88575060011515610f84610f7f613484565b61353a565b1515145b610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906154d9565b60405180910390fd5b60026006600083815260200190815260200160002060080160006101000a81548160ff02191690836002811115611027577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054806020026020016040519081016040528092919081815260200182805480156110fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116110b2575b5050505050905090565b61110e611a6e565b1561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590615479565b60405180910390fd5b60066000838152602001908152602001600020600501600061116e613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806111fa57506111c4613484565b73ffffffffffffffffffffffffffffffffffffffff166111e2612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061121857506001151561121461120f613484565b61353a565b1515145b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615559565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863e761573d60066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016112a29291906156b3565b60006040518083038186803b1580156112ba57600080fd5b505af41580156112ce573d6000803e3d6000fd5b505050507f925a971da7b8a2422c4fa67db7c7410b16fa33451659314737ba70a81a936d068282604051611303929190615162565b60405180910390a15050565b61131761347c565b73ffffffffffffffffffffffffffffffffffffffff16611335612784565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290615499565b60405180910390fd5b611393611a6e565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906153d9565b60405180910390fd5b6113da613590565b565b6113e4611a6e565b15611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90615479565b60405180910390fd5b6000600281111561145e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600088815260200190815260200160002060080160009054906101000a900460ff1660028111156114ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190615519565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b8634154855c6006600089815260200190815260200160002060058989898989896040518963ffffffff1660e01b81526004016115529897969594939291906155e2565b60006040518083038186803b15801561156a57600080fd5b505af415801561157e573d6000803e3d6000fd5b50505050857feea62333b1dae4ca57dec1af5888ffdcc29542d61d7d75835247a0357da3d951866115ad613484565b600660008b81526020019081526020016000206003018787876040516115d896959493929190615355565b60405180910390a2505050505050565b60006006600085815260200190815260200160002060090160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018360405161164e9190614f78565b90815260200160405180910390205490509392505050565b600660205280600052604060002060009150905080600001549080600101805461168f90615c77565b80601f01602080910402602001604051908101604052809291908181526020018280546116bb90615c77565b80156117085780601f106116dd57610100808354040283529160200191611708565b820191906000526020600020905b8154815290600101906020018083116116eb57829003601f168201915b5050505050908060080160009054906101000a900460ff16905083565b61172d611a6e565b1561176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490615479565b60405180910390fd5b600060028111156117a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600084815260200190815260200160002060080160009054906101000a900460ff166002811115611803577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b90615539565b60405180910390fd5b600660008381526020019081526020016000206005016000611864613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806118f057506118ba613484565b73ffffffffffffffffffffffffffffffffffffffff166118d8612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061190e57506001151561190a611905613484565b61353a565b1515145b61194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490615559565b60405180910390fd5b601481511115611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990615579565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863119088e360066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016119dd929190615683565b60006040518083038186803b1580156119f557600080fd5b505af4158015611a09573d6000803e3d6000fd5b505050507f8979a46d5d18c11dd2a3c05ab9c3aca95408ba0e58bd24ca49585c362b749bcb828260066000868152602001908152602001600020600c01604051611a559392919061511d565b60405180910390a15050565b6000804690508091505090565b60008060009054906101000a900460ff16905090565b600080611abc88308989604051602001611aa19493929190614fb5565b60405160208183030381529060405280519060200120613631565b9050600060018285888860405160008152602001604052604051611ae394939291906152ee565b6020604051602081039080840390855afa158015611b05573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890615459565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161492505050979650505050505050565b611bc761347c565b73ffffffffffffffffffffffffffffffffffffffff16611be5612784565b73ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3290615499565b60405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d0161347c565b73ffffffffffffffffffffffffffffffffffffffff16611d1f612784565b73ffffffffffffffffffffffffffffffffffffffff1614611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90615499565b60405180910390fd5b611d7f6000613661565b565b611d89611a6e565b15611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc090615479565b60405180910390fd5b600660008381526020019081526020016000206005016000611de9613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e755750611e3f613484565b73ffffffffffffffffffffffffffffffffffffffff16611e5d612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e93575060011515611e8f611e8a613484565b61353a565b1515145b611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906154d9565b60405180910390fd5b600115156006600084815260200190815260200160002060050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090615419565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863a825cc4f60066000858152602001908152602001600020836040518363ffffffff1660e01b8152600401611fc49291906155b9565b60006040518083038186803b158015611fdc57600080fd5b505af4158015611ff0573d6000803e3d6000fd5b505050507f4d05a6384888ac850d53aa052a22c622af19eb4fc706564d6d2c5e5c1315ff5e82826040516120259291906150f4565b60405180910390a15050565b612039611a6e565b15612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090615479565b60405180910390fd5b600660008381526020019081526020016000206005016000612099613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061212557506120ef613484565b73ffffffffffffffffffffffffffffffffffffffff1661210d612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214357506001151561213f61213a613484565b61353a565b1515145b612182576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612179906154d9565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863c9b2aa3a60066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016121cd9291906155b9565b60006040518083038186803b1580156121e557600080fd5b505af41580156121f9573d6000803e3d6000fd5b505050507fa47203dcb0d9b586516ee8d3f53c3bb54a50102bf92747a833dd698eac729983828260405161222e9291906150f4565b60405180910390a15050565b61224261347c565b73ffffffffffffffffffffffffffffffffffffffff16612260612784565b73ffffffffffffffffffffffffffffffffffffffff16146122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90615499565b60405180910390fd5b6122be611a6e565b156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590615479565b60405180910390fd5b612306613727565b565b612310611a6e565b15612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790615479565b60405180910390fd5b600660008581526020019081526020016000206005016000612370613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061242757506006600085815260200190815260200160002060070160006123de613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061246b5750612435613484565b73ffffffffffffffffffffffffffffffffffffffff16612453612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80612489575060011515612485612480613484565b61353a565b1515145b6124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90615599565b60405180910390fd5b600073f20f60334825195e21b8f1338c9c024f98ef71b863743207106006600088815260200190815260200160002088600660008a815260200190815260200160002060090160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600660008b81526020019081526020016000206002018960405161256f9190614f78565b9081526020016040518091039020886040518663ffffffff1660e01b815260040161259e9594939291906156e3565b60206040518083038186803b1580156125b657600080fd5b505af41580156125ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ee9190613cca565b90508015612740577f6ded0f47391f4098773ec0e338d3c321e7fcf92b580d0925ae90942f292236ac868684600660008a815260200190815260200160002060090160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018760405161267e9190614f78565b908152602001604051809103902054600660008b8152602001908152602001600020600201896040516126b19190614f78565b908152602001604051809103902060010154600660008c81526020019081526020016000206002018a6040516126e79190614f78565b908152602001604051809103902060020160009054906101000a900460ff168a8a600660008f8152602001908152602001600020600c01604051612733999897969594939291906151c9565b60405180910390a161277c565b7fd22d7033fccba80f2459d8d4091adaf35ec8f6666b4ddaf5c788e17e9e296e0b86868460405161277393929190615192565b60405180910390a15b505050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127b6611a6e565b156127f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ed90615479565b60405180910390fd5b600660008381526020019081526020016000206005016000612816613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128a2575061286c613484565b73ffffffffffffffffffffffffffffffffffffffff1661288a612784565b73ffffffffffffffffffffffffffffffffffffffff16145b806128c05750600115156128bc6128b7613484565b61353a565b1515145b6128ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f6906154d9565b60405180910390fd5b600115156006600084815260200190815260200160002060070160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299d906154f9565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863ade2140660066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016129f19291906155b9565b60006040518083038186803b158015612a0957600080fd5b505af4158015612a1d573d6000803e3d6000fd5b505050507f4a9d9ee7c0b327bc99524679cd76120147a0a4e217ee786a788c589de5ba32ed8282604051612a529291906150f4565b60405180910390a15050565b612a66611a6e565b15612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90615479565b60405180910390fd5b60006002811115612ae0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600084815260200190815260200160002060080160009054906101000a900460ff166002811115612b3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7490615539565b60405180910390fd5b600660008381526020019081526020016000206005016000612b9d613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612c295750612bf3613484565b73ffffffffffffffffffffffffffffffffffffffff16612c11612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c47575060011515612c43612c3e613484565b61353a565b1515145b612c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7d90615559565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863a906966860066000858152602001908152602001600020836040518363ffffffff1660e01b8152600401612cd1929190615744565b60006040518083038186803b158015612ce957600080fd5b505af4158015612cfd573d6000803e3d6000fd5b505050507f343017b33b7b2d39684beb179472777aea84c82fa3054c3fe9d58e7b83f60b37828260066000868152602001908152602001600020600c01604051612d499392919061526b565b60405180910390a15050565b612d5d611a6e565b15612d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9490615479565b60405180910390fd5b600660008381526020019081526020016000206005016000612dbd613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612e495750612e13613484565b73ffffffffffffffffffffffffffffffffffffffff16612e31612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e67575060011515612e63612e5e613484565b61353a565b1515145b612ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9d906154d9565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b86371ac355b60066000858152602001908152602001600020836040518363ffffffff1660e01b8152600401612ef19291906155b9565b60006040518083038186803b158015612f0957600080fd5b505af4158015612f1d573d6000803e3d6000fd5b505050507f411e236ca045537c05e826c50853ca8f495389389e3eb578dfdef2b23d60ea8c8282604051612f529291906150f4565b60405180910390a15050565b612f66611a6e565b15612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d90615479565b60405180910390fd5b600660008281526020019081526020016000206005016000612fc6613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613052575061301c613484565b73ffffffffffffffffffffffffffffffffffffffff1661303a612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061307057506001151561306c613067613484565b61353a565b1515145b6130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a6906154d9565b60405180910390fd5b60016006600083815260200190815260200160002060080160006101000a81548160ff0219169083600281111561310f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6060600660008381526020019081526020016000206004018054806020026020016040519081016040528092919081815260200182805480156131af57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613165575b50505050509050919050565b606060066000838152602001908152602001600020600301805480602002602001604051908101604052809291908181526020016000905b82821015613363578382906000526020600020906003020160405180608001604052908160008201805461322690615c77565b80601f016020809104026020016040519081016040528092919081815260200182805461325290615c77565b801561329f5780601f106132745761010080835404028352916020019161329f565b820191906000526020600020905b81548152906001019060200180831161328257829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900460ff1660018111156132fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6001811115613335577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020016002820160019054906101000a900460ff161515151581525050815260200190600101906131f3565b505050509050919050565b61337661347c565b73ffffffffffffffffffffffffffffffffffffffff16613394612784565b73ffffffffffffffffffffffffffffffffffffffff16146133ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190615499565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561345a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613451906153f9565b60405180910390fd5b61346381613661565b50565b600081836134749190615a72565b905092915050565b600033905090565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561352e57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050613536565b339050613537565b5b90565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b613598611a6e565b6135d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ce906153d9565b60405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61361a61347c565b604051613627919061501a565b60405180910390a1565b6000816040516020016136449190614f8f565b604051602081830303815290604052805190602001209050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61372f611a6e565b1561376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376690615479565b60405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137b261347c565b6040516137bf919061501a565b60405180910390a1565b60006137dc6137d7846157c0565b61578f565b905080838252602082019050828560208602820111156137fb57600080fd5b60005b8581101561382b5781613811888261396b565b8452602084019350602083019250506001810190506137fe565b5050509392505050565b6000613848613843846157ec565b61578f565b9050808382526020820190508260005b85811015613888578135850161386e8882613a7c565b845260208401935060208301925050600181019050613858565b5050509392505050565b60006138a56138a084615818565b61578f565b9050808382526020820190508260005b858110156138e557813585016138cb8882613aa6565b8452602084019350602083019250506001810190506138b5565b5050509392505050565b60006139026138fd84615844565b61578f565b90508281526020810184848401111561391a57600080fd5b613925848285615c35565b509392505050565b600061394061393b84615874565b61578f565b90508281526020810184848401111561395857600080fd5b613963848285615c35565b509392505050565b60008135905061397a81615e94565b92915050565b600082601f83011261399157600080fd5b81356139a18482602086016137c9565b91505092915050565b600082601f8301126139bb57600080fd5b81356139cb848260208601613835565b91505092915050565b600082601f8301126139e557600080fd5b81356139f5848260208601613892565b91505092915050565b600081359050613a0d81615eab565b92915050565b600081519050613a2281615eab565b92915050565b600081359050613a3781615ec2565b92915050565b600082601f830112613a4e57600080fd5b8135613a5e8482602086016138ef565b91505092915050565b600081359050613a7681615ed9565b92915050565b600082601f830112613a8d57600080fd5b8135613a9d84826020860161392d565b91505092915050565b600060808284031215613ab857600080fd5b613ac2608061578f565b9050600082013567ffffffffffffffff811115613ade57600080fd5b613aea84828501613a7c565b6000830152506020613afe84828501613b32565b6020830152506040613b1284828501613a67565b6040830152506060613b26848285016139fe565b60608301525092915050565b600081359050613b4181615ee9565b92915050565b600081359050613b5681615f00565b92915050565b600060208284031215613b6e57600080fd5b6000613b7c8482850161396b565b91505092915050565b600080600080600060a08688031215613b9d57600080fd5b6000613bab8882890161396b565b955050602086013567ffffffffffffffff811115613bc857600080fd5b613bd488828901613a3d565b9450506040613be588828901613a28565b9350506060613bf688828901613a28565b9250506080613c0788828901613b47565b9150509295509295909350565b600080600080600080600060e0888a031215613c2f57600080fd5b6000613c3d8a828b0161396b565b9750506020613c4e8a828b01613b32565b9650506040613c5f8a828b01613b32565b955050606088013567ffffffffffffffff811115613c7c57600080fd5b613c888a828b01613a3d565b9450506080613c998a828b01613a28565b93505060a0613caa8a828b01613a28565b92505060c0613cbb8a828b01613b47565b91505092959891949750929550565b600060208284031215613cdc57600080fd5b6000613cea84828501613a13565b91505092915050565b600060208284031215613d0557600080fd5b6000613d1384828501613a28565b91505092915050565b60008060408385031215613d2f57600080fd5b6000613d3d85828601613a28565b9250506020613d4e8582860161396b565b9150509250929050565b60008060408385031215613d6b57600080fd5b6000613d7985828601613a28565b925050602083013567ffffffffffffffff811115613d9657600080fd5b613da2858286016139aa565b9150509250929050565b60008060408385031215613dbf57600080fd5b6000613dcd85828601613a28565b925050602083013567ffffffffffffffff811115613dea57600080fd5b613df6858286016139d4565b9150509250929050565b600080600080600060a08688031215613e1857600080fd5b6000613e2688828901613a28565b9550506020613e3788828901613a28565b945050604086013567ffffffffffffffff811115613e5457600080fd5b613e6088828901613a7c565b935050606086013567ffffffffffffffff811115613e7d57600080fd5b613e8988828901613a7c565b9250506080613e9a8882890161396b565b9150509295509295909350565b60008060408385031215613eba57600080fd5b6000613ec885828601613a28565b925050602083013567ffffffffffffffff811115613ee557600080fd5b613ef185828601613a7c565b9150509250929050565b600080600060608486031215613f1057600080fd5b6000613f1e86828701613a28565b935050602084013567ffffffffffffffff811115613f3b57600080fd5b613f4786828701613a7c565b9250506040613f588682870161396b565b9150509250925092565b60008060008060008060c08789031215613f7b57600080fd5b6000613f8989828a01613a28565b965050602087013567ffffffffffffffff811115613fa657600080fd5b613fb289828a01613a7c565b955050604087013567ffffffffffffffff811115613fcf57600080fd5b613fdb89828a016139d4565b945050606087013567ffffffffffffffff811115613ff857600080fd5b61400489828a016139aa565b935050608087013567ffffffffffffffff81111561402157600080fd5b61402d89828a01613980565b92505060a087013567ffffffffffffffff81111561404a57600080fd5b61405689828a01613980565b9150509295509295509295565b60006020828403121561407557600080fd5b600061408384828501613b32565b91505092915050565b60006140988383614152565b60208301905092915050565b60006140b0838361417f565b60208301905092915050565b60006140c88383614643565b905092915050565b60006140dc83836146ee565b905092915050565b60006140f08383614758565b905092915050565b60006141048383614d16565b905092915050565b60006141188383614d79565b905092915050565b600061412c8383614ddc565b905092915050565b61413d81615bb7565b82525050565b61414c81615b32565b82525050565b61415b81615b20565b82525050565b61416a81615b20565b82525050565b61417981615b20565b82525050565b61418881615b20565b82525050565b61419f61419a82615b20565b615d40565b82525050565b60006141b082615913565b6141ba81856159a1565b93506141c5836158a4565b8060005b838110156141f65781516141dd888261408c565b97506141e883615960565b9250506001810190506141c9565b5085935050505092915050565b600061420e82615913565b61421881856159b2565b9350614223836158a4565b8060005b8381101561425457815161423b88826140a4565b975061424683615960565b925050600181019050614227565b5085935050505092915050565b8082525050565b60006142738261591e565b61427d81856159c3565b93508360208202850161428f856158b4565b8060005b858110156142cb57848403895281516142ac85826140bc565b94506142b78361596d565b925060208a01995050600181019050614293565b50829750879550505050505092915050565b60006142e88261591e565b6142f281856159d4565b935083602082028501614304856158b4565b8060005b85811015614340578484038952815161432185826140d0565b945061432c8361596d565b925060208a01995050600181019050614308565b50829750879550505050505092915050565b600061435d82615929565b61436781856159c3565b935083602082028501614379856158c4565b8060005b858110156143b45784840389528161439585826140e4565b94506143a08361597a565b925060208a0199505060018101905061437d565b50829750879550505050505092915050565b60006143d182615934565b6143db81856159e5565b9350836020820285016143ed856158d9565b8060005b85811015614429578484038952815161440a85826140f8565b945061441583615987565b925060208a019950506001810190506143f1565b50829750879550505050505092915050565b600061444682615934565b61445081856159f6565b935083602082028501614462856158d9565b8060005b8581101561449e578484038952815161447f858261410c565b945061448a83615987565b925060208a01995050600181019050614466565b50829750879550505050505092915050565b60006144bb8261593f565b6144c581856159e5565b9350836020820285016144d7856158e9565b8060005b85811015614512578484038952816144f38582614120565b94506144fe83615994565b925060208a019950506001810190506144db565b50829750879550505050505092915050565b61452d81615b44565b82525050565b61453c81615b44565b82525050565b61454b81615b44565b82525050565b61455a81615b50565b82525050565b61456981615b50565b82525050565b61458061457b82615b50565b615d52565b82525050565b60006145918261594a565b61459b8185615a07565b93506145ab818560208601615c44565b6145b481615e34565b840191505092915050565b60006145ca8261594a565b6145d48185615a18565b93506145e4818560208601615c44565b80840191505092915050565b6146016145fc82615bc9565b615d40565b82525050565b61461081615bed565b82525050565b61461f81615bed565b82525050565b61462e81615bed565b82525050565b61463d81615bff565b82525050565b600061464e82615955565b6146588185615a23565b9350614668818560208601615c44565b61467181615e34565b840191505092915050565b600061468782615955565b6146918185615a34565b93506146a1818560208601615c44565b6146aa81615e34565b840191505092915050565b60006146c082615955565b6146ca8185615a45565b93506146da818560208601615c44565b6146e381615e34565b840191505092915050565b60006146f982615955565b6147038185615a56565b9350614713818560208601615c44565b61471c81615e34565b840191505092915050565b600061473282615955565b61473c8185615a67565b935061474c818560208601615c44565b80840191505092915050565b6000815461476581615c77565b61476f8186615a23565b9450600182166000811461478a576001811461479c576147cf565b60ff19831686526020860193506147cf565b6147a5856158fe565b60005b838110156147c7578154818901526001820191506020810190506147a8565b808801955050505b50505092915050565b600081546147e581615c77565b6147ef8186615a56565b9450600182166000811461480a576001811461481c5761484f565b60ff198316865260208601935061484f565b614825856158fe565b60005b8381101561484757815481890152600182019150602081019050614828565b808801955050505b50505092915050565b6000614865601483615a34565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006148a5601c83615a67565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b60006148e5602683615a34565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061494b601d83615a34565b91507f546869732061646472657373206973206e6f7420616e206f776e65722e0000006000830152602082019050919050565b600061498b601d83615a34565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c6c0000006000830152602082019050919050565b60006149cb601183615a34565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614a0b601083615a34565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000614a4b602083615a34565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a8b602183615a34565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614af1602383615a34565b91507f596f75206d75737420626520616e206f776e6572206f66207468652070726f6a60008301527f65637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b57601f83615a34565b91507f546869732061646472657373206973206e6f7420616e20757064617465722e006000830152602082019050919050565b6000614b97601683615a34565b91507f50726f6a65637420616c726561647920657869737473000000000000000000006000830152602082019050919050565b6000614bd7601683615a34565b91507f50726f6a65637420646f6573206e6f74206578697374000000000000000000006000830152602082019050919050565b6000614c17603583615a34565b91507f596f75206d75737420626520616e206f776e6572206f66207468652070726f6a60008301527f65637420746f2075706461746520616374696f6e7300000000000000000000006020830152604082019050919050565b6000614c7d601b83615a34565b91507f43616e207375626d697420757020746f20323020616374696f6e7300000000006000830152602082019050919050565b6000614cbd603e83615a34565b91507f596f75206d7573742062652065697468657220616e206f776e6572206f72206160008301527f6e207570646174657220746f2075736520746869732066756e6374696f6e00006020830152604082019050919050565b60006080830160008301518482036000860152614d338282614643565b9150506020830151614d486020860182614ee6565b506040830151614d5b6040860182614607565b506060830151614d6e6060860182614524565b508091505092915050565b60006080830160008301518482036000860152614d9682826146ee565b9150506020830151614dab6020860182614f04565b506040830151614dbe6040860182614625565b506060830151614dd16060860182614542565b508091505092915050565b60006080830160008084018583036000870152614df98382614758565b92505060018401549050614e0c81615cc3565b614e196020870182614ee6565b5060028401549050614e2a81615ca9565b614e376040870182614607565b50614e4181615cdd565b614e4e6060870182614524565b50819250505092915050565b60006080830160008084018583036000870152614e7783826147d8565b92505060018401549050614e8a81615cc3565b614e976020870182614f04565b5060028401549050614ea881615ca9565b614eb56040870182614625565b50614ebf81615cdd565b614ecc6060870182614542565b50819250505092915050565b8082525050565b8082525050565b614eef81615ba0565b82525050565b614efe81615ba0565b82525050565b614f0d81615ba0565b82525050565b614f24614f1f82615ba0565b615d6e565b82525050565b614f3381615baa565b82525050565b6000614f4582846145bf565b915081905092915050565b6000614f5c82856145bf565b9150614f68828461418e565b6014820191508190509392505050565b6000614f848284614727565b915081905092915050565b6000614f9a82614898565b9150614fa6828461456f565b60208201915081905092915050565b6000614fc18287614f13565b602082019150614fd182866145f0565b601482019150614fe18285614f13565b602082019150614ff182846145bf565b915081905095945050505050565b60006020820190506150146000830184614161565b92915050565b600060208201905061502f6000830184614134565b92915050565b600060608201905061504a6000830186614161565b6150576020830185614143565b81810360408301526150698184614586565b9050949350505050565b6000602082019050818103600083015261508d81846141a5565b905092915050565b600060208201905081810360008301526150af8184614268565b905092915050565b600060208201905081810360008301526150d181846143c6565b905092915050565b60006020820190506150ee6000830184614533565b92915050565b60006040820190506151096000830185614551565b6151166020830184614161565b9392505050565b60006060820190506151326000830186614551565b81810360208301526151448185614268565b905081810360408301526151588184614352565b9050949350505050565b60006040820190506151776000830185614551565b818103602083015261518981846143c6565b90509392505050565b60006060820190506151a76000830186614551565b6151b46020830185614551565b6151c16040830184614161565b949350505050565b6000610120820190506151df600083018c614551565b6151ec602083018b614551565b6151f9604083018a614161565b6152066060830189614ef5565b6152136080830188614ef5565b61522060a0830187614616565b81810360c0830152615232818661467c565b905081810360e0830152615246818561467c565b905081810361010083015261525b8184614352565b90509a9950505050505050505050565b60006060820190506152806000830186614551565b8181036020830152615292818561467c565b905081810360408301526152a68184614352565b9050949350505050565b60006060820190506152c56000830186614551565b81810360208301526152d7818561467c565b90506152e66040830184614634565b949350505050565b60006080820190506153036000830187614551565b6153106020830186614f2a565b61531d6040830185614551565b61532a6060830184614551565b95945050505050565b6000602082019050818103600083015261534d8184614586565b905092915050565b600060c082019050818103600083015261536f818961467c565b905061537e6020830188614161565b818103604083015261539081876144b0565b905081810360608301526153a48186614268565b905081810360808301526153b881856141a5565b905081810360a08301526153cc81846141a5565b9050979650505050505050565b600060208201905081810360008301526153f281614858565b9050919050565b60006020820190508181036000830152615412816148d8565b9050919050565b600060208201905081810360008301526154328161493e565b9050919050565b600060208201905081810360008301526154528161497e565b9050919050565b60006020820190508181036000830152615472816149be565b9050919050565b60006020820190508181036000830152615492816149fe565b9050919050565b600060208201905081810360008301526154b281614a3e565b9050919050565b600060208201905081810360008301526154d281614a7e565b9050919050565b600060208201905081810360008301526154f281614ae4565b9050919050565b6000602082019050818103600083015261551281614b4a565b9050919050565b6000602082019050818103600083015261553281614b8a565b9050919050565b6000602082019050818103600083015261555281614bca565b9050919050565b6000602082019050818103600083015261557281614c0a565b9050919050565b6000602082019050818103600083015261559281614c70565b9050919050565b600060208201905081810360008301526155b281614cb0565b9050919050565b60006040820190506155ce6000830185614ed8565b6155db6020830184614170565b9392505050565b6000610100820190506155f8600083018b614ed8565b615605602083018a614261565b6156126040830189614560565b818103606083015261562481886146b5565b90508181036080830152615638818761443b565b905081810360a083015261564c81866142dd565b905081810360c08301526156608185614203565b905081810360e08301526156748184614203565b90509998505050505050505050565b60006040820190506156986000830185614ed8565b81810360208301526156aa81846142dd565b90509392505050565b60006040820190506156c86000830185614ed8565b81810360208301526156da818461443b565b90509392505050565b600060a0820190506156f86000830188614ed8565b6157056020830187614560565b6157126040830186614edf565b81810360608301526157248185614e5a565b9050818103608083015261573881846146b5565b90509695505050505050565b60006040820190506157596000830185614ed8565b818103602083015261576b81846146b5565b90509392505050565b60006020820190506157896000830184614ef5565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157b6576157b5615e05565b5b8060405250919050565b600067ffffffffffffffff8211156157db576157da615e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561580757615806615e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561583357615832615e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561585f5761585e615e05565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561588f5761588e615e05565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000600182019050919050565b6000602082019050919050565b6000600382019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615a7d82615ba0565b9150615a8883615ba0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615abd57615abc615d78565b5b828201905092915050565b6000615ad382615ba0565b9150615ade83615ba0565b925082821015615af157615af0615d78565b5b828203905092915050565b600060ff82169050919050565b600060ff82169050919050565b6000819050919050565b6000615b2b82615b80565b9050919050565b6000615b3d82615b80565b9050919050565b60008115159050919050565b6000819050919050565b6000819050615b6882615e6c565b919050565b6000819050615b7b82615e80565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615bc282615c11565b9050919050565b6000615bd482615bdb565b9050919050565b6000615be682615b80565b9050919050565b6000615bf882615b5a565b9050919050565b6000615c0a82615b6d565b9050919050565b6000615c1c82615c23565b9050919050565b6000615c2e82615b80565b9050919050565b82818337600083830152505050565b60005b83811015615c62578082015181840152602081019050615c47565b83811115615c71576000848401525b50505050565b60006002820490506001821680615c8f57607f821691505b60208210811415615ca357615ca2615dd6565b5b50919050565b6000615cbc615cb783615e52565b615b09565b9050919050565b6000615cd6615cd183615e52565b615b16565b9050919050565b6000615cf0615ceb83615e5f565b615afc565b9050919050565b6000615d0282615ba0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d3557615d34615d78565b5b600182019050919050565b6000615d4b82615d5c565b9050919050565b6000819050919050565b6000615d6782615e45565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160081c9050919050565b60028110615e7d57615e7c615da7565b5b50565b60038110615e9157615e90615da7565b5b50565b615e9d81615b20565b8114615ea857600080fd5b50565b615eb481615b44565b8114615ebf57600080fd5b50565b615ecb81615b50565b8114615ed657600080fd5b50565b60028110615ee657600080fd5b50565b615ef281615ba0565b8114615efd57600080fd5b50565b615f0981615baa565b8114615f1457600080fd5b5056fea264697066735822122024e3031b562fab4dff039fd8de531017fda18a47d73390a6a358e91b20c98e7a64736f6c63430008000033
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.