Contract 0x658b1975E6C26d435A7e0F27fF7bdF883f694B23

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xba072298e9ca14bf4f627472a3074eb9018b2317235f1c20c11dfa1a45e475ccExecute Meta Tra...302272522022-07-01 21:06:051 day 3 hrs ago0xcf15948f97f42f28817f3ee573b2862c8f1b65ba IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.004343691011 33.000000091
0x6011b4a3a614b7a04a4102c9d7c6676202f8d5e00759d923b22ce927dcfd575bExecute Meta Tra...301979442022-07-01 2:21:491 day 21 hrs ago0x7ff5c94e61a36ea1f8b996edd2f2ff7071304e54 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002388222231 33.009747636
0xbd760709fe3819dab064727da5075e8ed216067905ba6a4fce24194fae01a2e7Execute Meta Tra...301953622022-07-01 0:49:571 day 23 hrs ago0xe94b53fc14cf61102c055519325866d3b9a53fb7 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.061554732936 467.730469191
0xe5f81631bd27268fbd9e4e1c22069fa67dcd98e7763da15efbf3e4e071fa1528Execute Meta Tra...301901452022-06-30 21:32:282 days 2 hrs ago0xe84cb8e785f0e6b37663f00ac0d76f14753b622f IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002620759336 36.229859366
0x0e381cdc1906c00ac45b4470bdbc5e44e86e25f561c7f16cd5f6073063e5752cExecute Meta Tra...301872082022-06-30 19:47:102 days 4 hrs ago0x55127472f867f38d1a152ea788d9b1297a934c02 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002853101578 39.435259348
0x964d146e9762f079a50698cea321dd833f67f0744ce0c735c644114768973a70Execute Meta Tra...301854602022-06-30 18:44:522 days 5 hrs ago0x3163c9c33886a5712493a777407a7608940edd42 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.00240053108 33.179879201
0xccc396b4f16383163cb4eaccf967208c6554a1f369f31a2e8814e989ab21517aExecute Meta Tra...301825382022-06-30 16:55:522 days 7 hrs ago0x381dce387fc0c23d3526c19ea8b101f0e9152dad IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.003087048308 42.668845581
0x915c514c49f6c284dea0a152f2a3b2ba07476bd2d4f9c6d0efbfc8db2b725164Execute Meta Tra...301643652022-06-30 5:54:382 days 18 hrs ago0x6045d77812a0a3f70bd60490e1d0705245a3fb09 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002770516361 38.293775477
0x3588828e9c03ba82fb7cf42f9b691028d871ab0c02d143ff3e1647eb03a028a3Execute Meta Tra...301643232022-06-30 5:53:102 days 18 hrs ago0x58f1d002350da2893a7725bc49cd0e109d3fde46 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002678524993 37.028422426
0xfbc0bd3a0753a33ab86e86dcd4fbc10f9e94f91e9a4369ffc268359ddc438905Execute Meta Tra...301642792022-06-30 5:51:382 days 18 hrs ago0x3587474523c5c8a352c558a2bb52732e1f851d5b IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002747540964 37.982511919
0xb1fda5a9a46ea4bb2f541f9d82f0d47ea9a1fb2f758ea473d9a4e87da36e7896Execute Meta Tra...301609912022-06-30 3:47:492 days 20 hrs ago0x2fa7cfa74d7e394725ce67c91c0fcd4755b472a4 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.004342107024 33.000000183
0x9c9f47a4d8eb1e990aeb9b1638fd924e1c2f00a5e87fad5bfc743552cd70cb6fExecute Meta Tra...301537692022-06-29 23:22:263 days 59 mins ago0xc163c6ef64f44b83befc60a895936eb579b87358 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002500242761 34.569550797
0xd0b6889ed685c026928bab437c39853aedf0eb99b162a0f352d8e2a46fce8e38Execute Meta Tra...301535902022-06-29 23:15:583 days 1 hr ago0x2a14da38894e19ec0522f89cd11c6b2988e8bf39 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.004731182615 35.95369452
0x55dd035f1ef6ebad50b9227fac0b7a63be882fa42430f62fb9217b2b34faf924Execute Meta Tra...301150282022-06-28 23:17:374 days 1 hr ago0xe6f7e0add15c665f5ac2b0eedfd2e8578ef2bf8a IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002945375864 40.717417982
0xeff07520702607540a80580f821b77d2b19ab72a7b5f4f4e627405fd606802fbExecute Meta Tra...301139752022-06-28 22:39:154 days 1 hr ago0x37d221cac206a8f62e3ac0d161f3617216402a83 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.0029610445 40.934024094
0x0931e49d9da77919a9f798b475eb8ba73abc8fccd88bf23726d6c26a496487a4Execute Meta Tra...301137332022-06-28 22:30:594 days 1 hr ago0xcea9e47fd17a786c01b4db8998c01db60ec79cb7 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002468881121 34.124606031
0x66ee5746220c14d67728caf461235be02d086c97a5b81b28027e63f9b63d014dExecute Meta Tra...301123752022-06-28 21:39:594 days 2 hrs ago0x6045d77812a0a3f70bd60490e1d0705245a3fb09 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002387517001 33.000000015
0xfa97e027705e6a83d142f0c4f7521d71a21c7a1d204dfc9ab154b52792746c8eExecute Meta Tra...301070842022-06-28 18:27:254 days 5 hrs ago0x308be8d04dc459e9819b497e5fd3d5b54a0bf8da IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002387519131 33.000029462
0x9e1da52d64b389c2f01340d16a05821314c1b553f12e321eb3129d46a4aa904aExecute Meta Tra...301070732022-06-28 18:27:034 days 5 hrs ago0xc73472d655f99cc18369d2edf12dc11fef8db12c IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002387519776 33.000038383
0x1ce9734eec5ec5f493dab17a6578f0ea92c0a2a90ad1f794fc17b8956f8f3709Execute Meta Tra...301069922022-06-28 18:24:134 days 5 hrs ago0x98fed34f4c26e58a4763cc8a728fc529bdbd70d8 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002481939276 34.305094425
0x25fa14133858fae8b43e4ebb1e241c961a7789e59b803a556e53588d560bcfc0Execute Meta Tra...301069352022-06-28 18:21:594 days 5 hrs ago0x4e7f07cee21c57564c4e86cbcd1f25df62560f57 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.003094974434 42.778399622
0x5181826a9734b4d70722e45ad88bc16bd00c4ec8fb0216a27407c97d3031bdd4Execute Meta Tra...301061892022-06-28 17:54:314 days 6 hrs ago0xcf9a7b593bf623b57c829fe6fb092962bf1e06bf IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002437353163 33.688830029
0x0d3ab3223a047a68015248896988010797e664da64becce98cee737f7f13c188Execute Meta Tra...301061642022-06-28 17:53:374 days 6 hrs ago0x7750cb3b8f22723e3721d1a2f61eeba4d71fd464 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002387663189 33.002020618
0x14dad326760068518f0d130e2cd10767688abafead678666fa7a5ec25b2041d4Execute Meta Tra...300866072022-06-28 5:45:064 days 18 hrs ago0xe24250cfc8a8cc7cc0ae8d1e0205f70eb7c07fe4 IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.004580160125 34.802854991
0x3cf39c16544b151306bbf71d7772ca5b0b787e9248b38116b972fb968a3410a8Execute Meta Tra...300771232022-06-27 23:56:405 days 25 mins ago0x7f2abce71df246ea6235a4222b2a9ea01c9e951b IN  0x658b1975e6c26d435a7e0f27ff7bdf883f694b230 MATIC0.002692804553 37.225825697
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

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)

File 1 of 7 : XP.sol
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";

contract XP is Pausable, BasicMetaTransaction, Admin {
  using SafeMath for uint256;

  // Potential statuses of an asset
  enum ProjectStatus {
    NonExistant,
    Running,
    Paused
  }

  enum Direction {
    increase,
    decrease
  }

  event ProjectCreated(
    bytes32 indexed projectId,
    string name,
    address creator,
    Action[] actions,
    address[] owners,
    address[] updaters
  );

  event NewActions(bytes32 projectId, Action[] actions);

  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 ProjectUpdaterAdded(bytes32 projectId, address newUpdater);

  event ProjectUpdaterRemoved(bytes32 projectId, address updaterRemoved);

  struct Action {
    string name;
    uint256 points;
    Direction direction;
    bool isValid;
  }

  struct ScoreBoard {
    string[] types; // keeps scores for different types, dynamic list of types, futureproof, if you would like to track score for different things on the platform, creator score vs collector score etc.
    mapping(string => bool) scoreToIsAdded;
    mapping(string => uint256) scores;
  }

  /*
    A project is an instance of an XP system
  */
  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;
  }

  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,
    address[] memory _owners,
    address[] memory _updaters
  ) public whenNotPaused returns (bytes32) {
    require(
      idToProject[_projectId].status == ProjectStatus.NonExistant,
      "Project already exists"
    );
    require(_inputActions.length <= 20, "Can submit up to 20 actions");

    Project storage newProject = idToProject[_projectId];
    newProject.id = _projectId;
    newProject.name = _name;
    newProject.owners = _owners;
    newProject.updaters = _updaters;
    newProject.status = ProjectStatus.Running;

    // Loops through and add actions 1 by 1, limit actions list to 20
    for (uint256 i = 0; i < _inputActions.length; i++) {
      newProject.actions.push(
        Action(
          _inputActions[i].name,
          _inputActions[i].points,
          _inputActions[i].direction,
          true
        )
      );
      // Mapping points each name to the action object associated
      newProject.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
      newProject.isAddressOwner[_owners[j]] = true;
    }
    for (uint256 k = 0; k < _updaters.length; k++) {
      // Owners array placed into mapping
      newProject.isAddressUpdater[_updaters[k]] = true;
    }

    projectIds.push(_projectId);

    emit ProjectCreated(
      _projectId,
      _name,
      msgSender(),
      newProject.actions,
      _owners,
      _updaters
    );

    return newProject.id;
  }

  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"
    );
    idToProject[_projectId].isAddressUpdater[_newUpdater] = true;
    idToProject[_projectId].updaters.push(_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."
    );
    idToProject[_projectId].isAddressUpdater[_updater] = false;

    for (uint256 i = 0; i < idToProject[_projectId].updaters.length; i++) {
      if (idToProject[_projectId].updaters[i] == _updater) {
        delete idToProject[_projectId].updaters[i];
        break;
      }
    }

    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;
  }

  /*
    Add new action types to project scoreboards
  */
  function addActions(bytes32 _projectId, Action[] memory _inputActions)
    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(_inputActions.length <= 20, "Can submit up to 20 actions");

    // Loops through and add actions 1 by 1, limit actions list to 20
    Project storage project = idToProject[_projectId];

    for (uint256 i = 0; i < _inputActions.length; i++) {
      if (idToProject[_projectId].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
        );
      }
    }
    emit NewActions(_projectId, _inputActions);
  }

  function updateScore(
    bytes32 _updateId,
    bytes32 _projectId,
    string memory _actionName,
    string memory _scoreType,
    address _targetWallet
  ) public whenNotPaused {
    require(
      idToProject[_projectId].status == ProjectStatus.Running,
      "Project is not active"
    );
    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"
    );
    require(
      idToProject[_projectId].nameToAction[_actionName].isValid,
      "Action must exist"
    );

    bytes32 currentProjectId = _projectId;

    if (idToProject[currentProjectId].updateIdToDoesExist[_updateId] == false) {
      idToProject[currentProjectId].updateIdToDoesExist[_updateId] = true;

      if (
        idToProject[currentProjectId].scoreTypeToDoesExist[_scoreType] == false
      ) {
        idToProject[currentProjectId].scoreTypeToDoesExist[_scoreType] = true;
        idToProject[currentProjectId].scoreTypes.push(_scoreType);
      }

      Action memory currAction = idToProject[currentProjectId].nameToAction[
        _actionName
      ];
      ScoreBoard storage currScoreboard = idToProject[currentProjectId]
        .addressToScoreBoard[_targetWallet];

      if (currScoreboard.scoreToIsAdded[_scoreType] == false) {
        currScoreboard.scoreToIsAdded[_scoreType] = true;
        currScoreboard.types.push(_scoreType);
      }

      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); //score update
        }
      } else {
        return;
      }
      emit UpdateScore(
        _updateId,
        currentProjectId,
        _targetWallet,
        currScoreboard.scores[_scoreType],
        currAction.points,
        currAction.direction,
        _actionName,
        _scoreType,
        idToProject[currentProjectId].scoreTypes
      );
    } else {
      emit UpdateScoreFailed(_updateId, currentProjectId, _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 getScoreTypesFromScoreboard(
    bytes32 _projectId,
    address _targetWallet
  ) external view returns (string[] memory) {
    return idToProject[_projectId].addressToScoreBoard[_targetWallet].types;
  }

  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;
  }
}

File 2 of 7 : BasicMetaTransaction.sol
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;
    }
  }
}

File 3 of 7 : Admin.sol
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 removeAdmin(address _removeAdmin) external onlyOwner {
    addressToIsAdmin[_removeAdmin] = false;

    for (uint256 i = 0; i < admins.length; i++) {
      if (admins[i] == _removeAdmin) {
        delete admins[i];
        break;
      }
    }
  }
}

File 4 of 7 : SafeMath.sol
// 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;
        }
    }
}

File 5 of 7 : Context.sol
// 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;
    }
}

File 6 of 7 : Pausable.sol
// 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());
    }
}

File 7 of 7 : Ownable.sol
// 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);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"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 XP.Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"indexed":false,"internalType":"struct XP.Action[]","name":"actions","type":"tuple[]"}],"name":"NewActions","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 XP.Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"indexed":false,"internalType":"struct XP.Action[]","name":"actions","type":"tuple[]"},{"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":"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":"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 XP.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 XP.Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct XP.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":"_newUpdater","type":"address"}],"name":"addProjectUpdater","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 XP.Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct XP.Action[]","name":"_inputActions","type":"tuple[]"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"address[]","name":"_updaters","type":"address[]"}],"name":"createProject","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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 XP.Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct XP.Action[]","name":"","type":"tuple[]"}],"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"},{"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"},{"internalType":"address","name":"_targetWallet","type":"address"}],"name":"getScoreTypesFromScoreboard","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 XP.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":"_updater","type":"address"}],"name":"removeProjectUpdater","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"}]

60806040523480156200001157600080fd5b5060008060006101000a81548160ff0219169083151502179055506200004c620000406200005260201b60201c565b6200005a60201b60201c565b62000120565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615fc880620001306000396000f3fe6080604052600436106101665760003560e01c80635c975abb116100d15780638696355c1161008a578063b70ac26711610064578063b70ac2671461052d578063c34fb83f14610556578063c72884f514610593578063f2fde38b146105d057610166565b80638696355c146104b05780638da5cb5b146104d95780638dffc7b81461050457610166565b80635c975abb146103c85780636281133d146103f35780637048027514610430578063715018a6146104595780637fdaad76146104705780638456cb591461049957610166565b806334399a781161012357806334399a78146102a45780633f4ba83a146102cd57806347348b6e146102e45780634bb6e0281461032157806354eb66f914610360578063564b81ef1461039d57610166565b80630b0e17cf1461016b5780630c53c51c146101a857806314bfd6d0146101d85780631785f53c146102155780631c6c5a861461023e5780632d0335ab14610267575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d919061446a565b6105f9565b60405161019f919061538e565b60405180910390f35b6101c260048036038101906101bd9190614325565b61069d565b6040516101cf91906155df565b60405180910390f35b3480156101e457600080fd5b506101ff60048036038101906101fa9190614708565b6108e1565b60405161020c919061531a565b60405180910390f35b34801561022157600080fd5b5061023c600480360381019061023791906142fc565b610920565b005b34801561024a57600080fd5b506102656004803603810190610260919061446a565b610b1f565b005b34801561027357600080fd5b5061028e600480360381019061028991906142fc565b610cd8565b60405161029b9190615870565b60405180910390f35b3480156102b057600080fd5b506102cb60048036038101906102c691906144cf565b610d21565b005b3480156102d957600080fd5b506102e26116e1565b005b3480156102f057600080fd5b5061030b600480360381019061030691906145ca565b6117ae565b6040516103189190615870565b60405180910390f35b34801561032d57600080fd5b506103486004803603810190610343919061446a565b61182c565b6040516103579392919061555c565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190614631565b6118eb565b604051610394919061540f565b60405180910390f35b3480156103a957600080fd5b506103b2612146565b6040516103bf9190615870565b60405180910390f35b3480156103d457600080fd5b506103dd612153565b6040516103ea91906153f4565b60405180910390f35b3480156103ff57600080fd5b5061041a600480360381019061041591906143b4565b612169565b60405161042791906153f4565b60405180910390f35b34801561043c57600080fd5b50610457600480360381019061045291906142fc565b6122a4565b005b34801561046557600080fd5b5061046e6123de565b005b34801561047c57600080fd5b5061049760048036038101906104929190614493565b612466565b005b3480156104a557600080fd5b506104ae6126d7565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190614523565b6127a5565b005b3480156104e557600080fd5b506104ee61319c565b6040516104fb919061531a565b60405180910390f35b34801561051057600080fd5b5061052b60048036038101906105269190614493565b6131c6565b005b34801561053957600080fd5b50610554600480360381019061054f919061446a565b6135cb565b005b34801561056257600080fd5b5061057d60048036038101906105789190614493565b613784565b60405161058a91906153b0565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b5919061446a565b6138b4565b6040516105c791906153d2565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906142fc565b613a67565b005b60606006600083815260200190815260200160002060060180548060200260200160405190810160405280929190818152602001828054801561069157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610647575b50505050509050919050565b60606106f486600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106eb612146565b88888888612169565b610733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072a90615750565b60405180910390fd5b61078560018060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613b5f90919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000803073ffffffffffffffffffffffffffffffffffffffff1687896040516020016107f592919061526b565b6040516020818303038152906040526040516108119190615254565b6000604051808303816000865af19150503d806000811461084e576040519150601f19603f3d011682016040523d82523d6000602084013e610853565b606091505b509150915081610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f906156b0565b60405180910390fd5b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8833896040516108cb93929190615350565b60405180910390a1809250505095945050505050565b600481815481106108f157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610928613b75565b73ffffffffffffffffffffffffffffffffffffffff1661094661319c565b73ffffffffffffffffffffffffffffffffffffffff161461099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390615730565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b600480549050811015610b1b578173ffffffffffffffffffffffffffffffffffffffff1660048281548110610a55577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b085760048181548110610ad6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610b1b565b8080610b1390615d72565b9150506109f7565b5050565b610b27612153565b15610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e906156f0565b60405180910390fd5b600660008281526020019081526020016000206005016000610b87613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610c135750610bdd613b7d565b73ffffffffffffffffffffffffffffffffffffffff16610bfb61319c565b73ffffffffffffffffffffffffffffffffffffffff16145b80610c31575060011515610c2d610c28613b7d565b613c33565b1515145b610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790615790565b60405180910390fd5b60026006600083815260200190815260200160002060080160006101000a81548160ff02191690836002811115610cd0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d29612153565b15610d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d60906156f0565b60405180910390fd5b60006002811115610da3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600084815260200190815260200160002060080160009054906101000a900460ff166002811115610dff577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e37906157f0565b60405180910390fd5b600660008381526020019081526020016000206005016000610e60613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610eec5750610eb6613b7d565b73ffffffffffffffffffffffffffffffffffffffff16610ed461319c565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f0a575060011515610f06610f01613b7d565b613c33565b1515145b610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090615810565b60405180910390fd5b601481511115610f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8590615830565b60405180910390fd5b600060066000848152602001908152602001600020905060005b82518110156116a25760066000858152602001908152602001600020600201838281518110611000577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001516040516110199190615293565b908152602001604051809103902060020160019054906101000a900460ff161561126e576040518060800160405280848381518110611081577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015181526020018483815181106110cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001848381518110611115577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516001811115611159577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200160011515815250826002018483815181106111a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001516040516111bb9190615293565b908152602001604051809103902060008201518160000190805190602001906111e5929190613ed8565b506020820151816001015560408201518160020160006101000a81548160ff02191690836001811115611241577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060608201518160020160016101000a81548160ff02191690831515021790555090505061168f565b8160030160405180608001604052808584815181106112b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001858481518110611300577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160200151815260200185848151811061134a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160400151600181111561138e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200160011515815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000190805190602001906113df929190613ed8565b506020820151816001015560408201518160020160006101000a81548160ff0219169083600181111561143b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060608201518160020160016101000a81548160ff021916908315150217905550505060405180608001604052808483815181106114a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000015181526020018483815181106114f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160200151815260200184838151811061153a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160400151600181111561157e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b815260200160011515815250826002018483815181106115c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001516040516115e09190615293565b9081526020016040518091039020600082015181600001908051906020019061160a929190613ed8565b506020820151816001015560408201518160020160006101000a81548160ff02191690836001811115611666577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060608201518160020160016101000a81548160ff0219169083151502179055509050505b808061169a90615d72565b915050610fa8565b507f925a971da7b8a2422c4fa67db7c7410b16fa33451659314737ba70a81a936d0683836040516116d4929190615453565b60405180910390a1505050565b6116e9613b75565b73ffffffffffffffffffffffffffffffffffffffff1661170761319c565b73ffffffffffffffffffffffffffffffffffffffff161461175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490615730565b60405180910390fd5b611765612153565b6117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90615670565b60405180910390fd5b6117ac613c89565b565b60006006600085815260200190815260200160002060090160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201836040516118149190615293565b90815260200160405180910390205490509392505050565b600660205280600052604060002060009150905080600001549080600101805461185590615cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461188190615cf2565b80156118ce5780601f106118a3576101008083540402835291602001916118ce565b820191906000526020600020905b8154815290600101906020018083116118b157829003601f168201915b5050505050908060080160009054906101000a900460ff16905083565b60006118f5612153565b15611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c906156f0565b60405180910390fd5b6000600281111561196f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600088815260200190815260200160002060080160009054906101000a900460ff1660028111156119cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906157d0565b60405180910390fd5b601484511115611a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4790615830565b60405180910390fd5b600060066000888152602001908152602001600020905086816000018190555085816001019080519060200190611a88929190613ed8565b5083816004019080519060200190611aa1929190613f5e565b5082816006019080519060200190611aba929190613f5e565b5060018160080160006101000a81548160ff02191690836002811115611b09577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060005b8551811015611f4d57816003016040518060800160405280888481518110611b62577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001888481518110611bac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001888481518110611bf6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516001811115611c3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020016001151581525090806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000019080519060200190611c8b929190613ed8565b506020820151816001015560408201518160020160006101000a81548160ff02191690836001811115611ce7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060608201518160020160016101000a81548160ff02191690831515021790555050506040518060800160405280878381518110611d52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600001518152602001878381518110611d9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151602001518152602001878381518110611de6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604001516001811115611e2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020016001151581525082600201878381518110611e73577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160000151604051611e8c9190615293565b90815260200160405180910390206000820151816000019080519060200190611eb6929190613ed8565b506020820151816001015560408201518160020160006101000a81548160ff02191690836001811115611f12577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555060608201518160020160016101000a81548160ff0219169083151502179055509050508080611f4590615d72565b915050611b11565b5060005b8451811015612007576001826005016000878481518110611f9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611fff90615d72565b915050611f51565b5060005b83518110156120c1576001826007016000868481518110612055577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806120b990615d72565b91505061200b565b506005879080600181540180825580915050600190039060005260206000200160009091909190915055867fe566cbf7d13703ea4252dbd9e0078954f7f66a67e9f7dd346225cb10fa40864387612116613b7d565b84600301888860405161212d959493929190615601565b60405180910390a2806000015491505095945050505050565b6000804690508091505090565b60008060009054906101000a900460ff16905090565b6000806121a18830898960405160200161218694939291906152d0565b60405160208183030381529060405280519060200120613d2a565b90506000600182858888604051600081526020016040526040516121c8949392919061559a565b6020604051602081039080840390855afa1580156121ea573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d906156d0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161492505050979650505050505050565b6122ac613b75565b73ffffffffffffffffffffffffffffffffffffffff166122ca61319c565b73ffffffffffffffffffffffffffffffffffffffff1614612320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231790615730565b60405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6123e6613b75565b73ffffffffffffffffffffffffffffffffffffffff1661240461319c565b73ffffffffffffffffffffffffffffffffffffffff161461245a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245190615730565b60405180910390fd5b6124646000613d5a565b565b61246e612153565b156124ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a5906156f0565b60405180910390fd5b6006600083815260200190815260200160002060050160006124ce613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061255a5750612524613b7d565b73ffffffffffffffffffffffffffffffffffffffff1661254261319c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061257857506001151561257461256f613b7d565b613c33565b1515145b6125b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ae90615790565b60405180910390fd5b60016006600084815260200190815260200160002060070160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060066000838152602001908152602001600020600601819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fa47203dcb0d9b586516ee8d3f53c3bb54a50102bf92747a833dd698eac72998382826040516126cb92919061542a565b60405180910390a15050565b6126df613b75565b73ffffffffffffffffffffffffffffffffffffffff166126fd61319c565b73ffffffffffffffffffffffffffffffffffffffff1614612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90615730565b60405180910390fd5b61275b612153565b1561279b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612792906156f0565b60405180910390fd5b6127a3613e20565b565b6127ad612153565b156127ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e4906156f0565b60405180910390fd5b60016002811115612827577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600086815260200190815260200160002060080160009054906101000a900460ff166002811115612883577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90615770565b60405180910390fd5b6006600085815260200190815260200160002060050160006128e3613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061299a5750600660008581526020019081526020016000206007016000612951613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806129de57506129a8613b7d565b73ffffffffffffffffffffffffffffffffffffffff166129c661319c565b73ffffffffffffffffffffffffffffffffffffffff16145b806129fc5750600115156129f86129f3613b7d565b613c33565b1515145b612a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3290615850565b60405180910390fd5b6006600085815260200190815260200160002060020183604051612a5f9190615293565b908152602001604051809103902060020160019054906101000a900460ff16612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab490615710565b60405180910390fd5b60008490506000151560066000838152602001908152602001600020600a01600088815260200190815260200160002060009054906101000a900460ff161515141561315757600160066000838152602001908152602001600020600a01600088815260200190815260200160002060006101000a81548160ff0219169083151502179055506000151560066000838152602001908152602001600020600b0184604051612b6b9190615293565b908152602001604051809103902060009054906101000a900460ff1615151415612c2b57600160066000838152602001908152602001600020600b0184604051612bb59190615293565b908152602001604051809103902060006101000a81548160ff02191690831515021790555060066000828152602001908152602001600020600c0183908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190612c29929190613ed8565b505b60006006600083815260200190815260200160002060020185604051612c519190615293565b9081526020016040518091039020604051806080016040529081600082018054612c7a90615cf2565b80601f0160208091040260200160405190810160405280929190818152602001828054612ca690615cf2565b8015612cf35780601f10612cc857610100808354040283529160200191612cf3565b820191906000526020600020905b815481529060010190602001808311612cd657829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900460ff166001811115612d51577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6001811115612d89577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020016002820160019054906101000a900460ff161515151581525050905060006006600084815260200190815260200160002060090160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160010186604051612e179190615293565b908152602001604051809103902060009054906101000a900460ff1615151415612eb35760018160010186604051612e4f9190615293565b908152602001604051809103902060006101000a81548160ff0219169083151502179055508060000185908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190612eb1929190613ed8565b505b60006001811115612eed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82604001516001811115612f2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612f9057612f6782602001518260020187604051612f4a9190615293565b908152602001604051809103902054613b5f90919063ffffffff16565b8160020186604051612f799190615293565b9081526020016040518091039020819055506130cc565b600180811115612fc9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b82604001516001811115613006577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156130c357806002018560405161301e9190615293565b908152602001604051809103902054826020015110613062576000816002018660405161304b9190615293565b9081526020016040518091039020819055506130be565b6130998260200151826002018760405161307c9190615293565b908152602001604051809103902054613ec290919063ffffffff16565b81600201866040516130ab9190615293565b9081526020016040518091039020819055505b6130cb565b505050613195565b5b7f6ded0f47391f4098773ec0e338d3c321e7fcf92b580d0925ae90942f292236ac88848684600201896040516131029190615293565b908152602001604051809103902054866020015187604001518c8c600660008d8152602001908152602001600020600c01604051613148999897969594939291906154ba565b60405180910390a15050613193565b7fd22d7033fccba80f2459d8d4091adaf35ec8f6666b4ddaf5c788e17e9e296e0b86828460405161318a93929190615483565b60405180910390a15b505b5050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6131ce612153565b1561320e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613205906156f0565b60405180910390fd5b60066000838152602001908152602001600020600501600061322e613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806132ba5750613284613b7d565b73ffffffffffffffffffffffffffffffffffffffff166132a261319c565b73ffffffffffffffffffffffffffffffffffffffff16145b806132d85750600115156132d46132cf613b7d565b613c33565b1515145b613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e90615790565b60405180910390fd5b600115156006600084815260200190815260200160002060070160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146133be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b5906157b0565b60405180910390fd5b60006006600084815260200190815260200160002060070160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b600660008481526020019081526020016000206006018054905081101561358d578173ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060060182815481106134b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561357a57600660008481526020019081526020016000206006018181548110613548577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905561358d565b808061358590615d72565b91505061342d565b507f4a9d9ee7c0b327bc99524679cd76120147a0a4e217ee786a788c589de5ba32ed82826040516135bf92919061542a565b60405180910390a15050565b6135d3612153565b15613613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360a906156f0565b60405180910390fd5b600660008281526020019081526020016000206005016000613633613b7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806136bf5750613689613b7d565b73ffffffffffffffffffffffffffffffffffffffff166136a761319c565b73ffffffffffffffffffffffffffffffffffffffff16145b806136dd5750600115156136d96136d4613b7d565b613c33565b1515145b61371c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371390615790565b60405180910390fd5b60016006600083815260200190815260200160002060080160006101000a81548160ff0219169083600281111561377c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b60606006600084815260200190815260200160002060090160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020016000905b828210156138a857838290600052602060002001805461381b90615cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461384790615cf2565b80156138945780601f1061386957610100808354040283529160200191613894565b820191906000526020600020905b81548152906001019060200180831161387757829003601f168201915b5050505050815260200190600101906137fc565b50505050905092915050565b606060066000838152602001908152602001600020600301805480602002602001604051908101604052809291908181526020016000905b82821015613a5c578382906000526020600020906003020160405180608001604052908160008201805461391f90615cf2565b80601f016020809104026020016040519081016040528092919081815260200182805461394b90615cf2565b80156139985780601f1061396d57610100808354040283529160200191613998565b820191906000526020600020905b81548152906001019060200180831161397b57829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900460ff1660018111156139f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6001811115613a2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020016002820160019054906101000a900460ff161515151581525050815260200190600101906138ec565b505050509050919050565b613a6f613b75565b73ffffffffffffffffffffffffffffffffffffffff16613a8d61319c565b73ffffffffffffffffffffffffffffffffffffffff1614613ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ada90615730565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4a90615690565b60405180910390fd5b613b5c81613d5a565b50565b60008183613b6d9190615aed565b905092915050565b600033905090565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415613c2757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050613c2f565b339050613c30565b5b90565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b613c91612153565b613cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc790615670565b60405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613d13613b75565b604051613d209190615335565b60405180910390a1565b600081604051602001613d3d91906152aa565b604051602081830303815290604052805190602001209050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613e28612153565b15613e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5f906156f0565b60405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613eab613b75565b604051613eb89190615335565b60405180910390a1565b60008183613ed09190615b43565b905092915050565b828054613ee490615cf2565b90600052602060002090601f016020900481019282613f065760008555613f4d565b82601f10613f1f57805160ff1916838001178555613f4d565b82800160010185558215613f4d579182015b82811115613f4c578251825591602001919060010190613f31565b5b509050613f5a9190613fe8565b5090565b828054828255906000526020600020908101928215613fd7579160200282015b82811115613fd65782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613f7e565b5b509050613fe49190613fe8565b5090565b5b80821115614001576000816000905550600101613fe9565b5090565b6000614018614013846158bc565b61588b565b9050808382526020820190508285602086028201111561403757600080fd5b60005b85811015614067578161404d888261414a565b84526020840193506020830192505060018101905061403a565b5050509392505050565b600061408461407f846158e8565b61588b565b9050808382526020820190508260005b858110156140c457813585016140aa8882614246565b845260208401935060208301925050600181019050614094565b5050509392505050565b60006140e16140dc84615914565b61588b565b9050828152602081018484840111156140f957600080fd5b614104848285615cb0565b509392505050565b600061411f61411a84615944565b61588b565b90508281526020810184848401111561413757600080fd5b614142848285615cb0565b509392505050565b60008135905061415981615f0f565b92915050565b600082601f83011261417057600080fd5b8135614180848260208601614005565b91505092915050565b600082601f83011261419a57600080fd5b81356141aa848260208601614071565b91505092915050565b6000813590506141c281615f26565b92915050565b6000813590506141d781615f3d565b92915050565b600082601f8301126141ee57600080fd5b81356141fe8482602086016140ce565b91505092915050565b60008135905061421681615f54565b92915050565b600082601f83011261422d57600080fd5b813561423d84826020860161410c565b91505092915050565b60006080828403121561425857600080fd5b614262608061588b565b9050600082013567ffffffffffffffff81111561427e57600080fd5b61428a8482850161421c565b600083015250602061429e848285016142d2565b60208301525060406142b284828501614207565b60408301525060606142c6848285016141b3565b60608301525092915050565b6000813590506142e181615f64565b92915050565b6000813590506142f681615f7b565b92915050565b60006020828403121561430e57600080fd5b600061431c8482850161414a565b91505092915050565b600080600080600060a0868803121561433d57600080fd5b600061434b8882890161414a565b955050602086013567ffffffffffffffff81111561436857600080fd5b614374888289016141dd565b9450506040614385888289016141c8565b9350506060614396888289016141c8565b92505060806143a7888289016142e7565b9150509295509295909350565b600080600080600080600060e0888a0312156143cf57600080fd5b60006143dd8a828b0161414a565b97505060206143ee8a828b016142d2565b96505060406143ff8a828b016142d2565b955050606088013567ffffffffffffffff81111561441c57600080fd5b6144288a828b016141dd565b94505060806144398a828b016141c8565b93505060a061444a8a828b016141c8565b92505060c061445b8a828b016142e7565b91505092959891949750929550565b60006020828403121561447c57600080fd5b600061448a848285016141c8565b91505092915050565b600080604083850312156144a657600080fd5b60006144b4858286016141c8565b92505060206144c58582860161414a565b9150509250929050565b600080604083850312156144e257600080fd5b60006144f0858286016141c8565b925050602083013567ffffffffffffffff81111561450d57600080fd5b61451985828601614189565b9150509250929050565b600080600080600060a0868803121561453b57600080fd5b6000614549888289016141c8565b955050602061455a888289016141c8565b945050604086013567ffffffffffffffff81111561457757600080fd5b6145838882890161421c565b935050606086013567ffffffffffffffff8111156145a057600080fd5b6145ac8882890161421c565b92505060806145bd8882890161414a565b9150509295509295909350565b6000806000606084860312156145df57600080fd5b60006145ed868287016141c8565b935050602084013567ffffffffffffffff81111561460a57600080fd5b6146168682870161421c565b92505060406146278682870161414a565b9150509250925092565b600080600080600060a0868803121561464957600080fd5b6000614657888289016141c8565b955050602086013567ffffffffffffffff81111561467457600080fd5b6146808882890161421c565b945050604086013567ffffffffffffffff81111561469d57600080fd5b6146a988828901614189565b935050606086013567ffffffffffffffff8111156146c657600080fd5b6146d28882890161415f565b925050608086013567ffffffffffffffff8111156146ef57600080fd5b6146fb8882890161415f565b9150509295509295909350565b60006020828403121561471a57600080fd5b6000614728848285016142d2565b91505092915050565b600061473d83836147b7565b60208301905092915050565b60006147558383614b0e565b905092915050565b60006147698383614bb1565b905092915050565b600061477d838361512f565b905092915050565b60006147918383615192565b905092915050565b6147a281615c32565b82525050565b6147b181615bad565b82525050565b6147c081615b9b565b82525050565b6147cf81615b9b565b82525050565b6147e66147e182615b9b565b615dbb565b82525050565b60006147f7826159e3565b6148018185615a71565b935061480c83615974565b8060005b8381101561483d5781516148248882614731565b975061482f83615a30565b925050600181019050614810565b5085935050505092915050565b6000614855826159ee565b61485f8185615a82565b93508360208202850161487185615984565b8060005b858110156148ad578484038952815161488e8582614749565b945061489983615a3d565b925060208a01995050600181019050614875565b50829750879550505050505092915050565b60006148ca826159f9565b6148d48185615a82565b9350836020820285016148e685615994565b8060005b8581101561492157848403895281614902858261475d565b945061490d83615a4a565b925060208a019950506001810190506148ea565b50829750879550505050505092915050565b600061493e82615a04565b6149488185615a93565b93508360208202850161495a856159a9565b8060005b8581101561499657848403895281516149778582614771565b945061498283615a57565b925060208a0199505060018101905061495e565b50829750879550505050505092915050565b60006149b382615a0f565b6149bd8185615a93565b9350836020820285016149cf856159b9565b8060005b85811015614a0a578484038952816149eb8582614785565b94506149f683615a64565b925060208a019950506001810190506149d3565b50829750879550505050505092915050565b614a2581615bbf565b82525050565b614a3481615bbf565b82525050565b614a4381615bcb565b82525050565b614a5a614a5582615bcb565b615dcd565b82525050565b6000614a6b82615a1a565b614a758185615aa4565b9350614a85818560208601615cbf565b614a8e81615eaf565b840191505092915050565b6000614aa482615a1a565b614aae8185615ab5565b9350614abe818560208601615cbf565b80840191505092915050565b614adb614ad682615c44565b615dbb565b82525050565b614aea81615c68565b82525050565b614af981615c68565b82525050565b614b0881615c7a565b82525050565b6000614b1982615a25565b614b238185615ac0565b9350614b33818560208601615cbf565b614b3c81615eaf565b840191505092915050565b6000614b5282615a25565b614b5c8185615ad1565b9350614b6c818560208601615cbf565b614b7581615eaf565b840191505092915050565b6000614b8b82615a25565b614b958185615ae2565b9350614ba5818560208601615cbf565b80840191505092915050565b60008154614bbe81615cf2565b614bc88186615ac0565b94506001821660008114614be35760018114614bf557614c28565b60ff1983168652602086019350614c28565b614bfe856159ce565b60005b83811015614c2057815481890152600182019150602081019050614c01565b808801955050505b50505092915050565b6000614c3e601483615ad1565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b6000614c7e601c83615ae2565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000614cbe602683615ad1565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d24601d83615ad1565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c6c0000006000830152602082019050919050565b6000614d64601183615ad1565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614da4601083615ad1565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000614de4601183615ad1565b91507f416374696f6e206d7573742065786973740000000000000000000000000000006000830152602082019050919050565b6000614e24602083615ad1565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e64602183615ad1565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614eca601583615ad1565b91507f50726f6a656374206973206e6f742061637469766500000000000000000000006000830152602082019050919050565b6000614f0a602383615ad1565b91507f596f75206d75737420626520616e206f776e6572206f66207468652070726f6a60008301527f65637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f70601f83615ad1565b91507f546869732061646472657373206973206e6f7420616e20757064617465722e006000830152602082019050919050565b6000614fb0601683615ad1565b91507f50726f6a65637420616c726561647920657869737473000000000000000000006000830152602082019050919050565b6000614ff0601683615ad1565b91507f50726f6a65637420646f6573206e6f74206578697374000000000000000000006000830152602082019050919050565b6000615030603583615ad1565b91507f596f75206d75737420626520616e206f776e6572206f66207468652070726f6a60008301527f65637420746f2075706461746520616374696f6e7300000000000000000000006020830152604082019050919050565b6000615096601b83615ad1565b91507f43616e207375626d697420757020746f20323020616374696f6e7300000000006000830152602082019050919050565b60006150d6603e83615ad1565b91507f596f75206d7573742062652065697468657220616e206f776e6572206f72206160008301527f6e207570646174657220746f2075736520746869732066756e6374696f6e00006020830152604082019050919050565b6000608083016000830151848203600086015261514c8282614b0e565b91505060208301516151616020860182615210565b5060408301516151746040860182614ae1565b5060608301516151876060860182614a1c565b508091505092915050565b600060808301600080840185830360008701526151af8382614bb1565b925050600184015490506151c281615d3e565b6151cf6020870182615210565b50600284015490506151e081615d24565b6151ed6040870182614ae1565b506151f781615d58565b6152046060870182614a1c565b50819250505092915050565b61521981615c1b565b82525050565b61522881615c1b565b82525050565b61523f61523a82615c1b565b615de9565b82525050565b61524e81615c25565b82525050565b60006152608284614a99565b915081905092915050565b60006152778285614a99565b915061528382846147d5565b6014820191508190509392505050565b600061529f8284614b80565b915081905092915050565b60006152b582614c71565b91506152c18284614a49565b60208201915081905092915050565b60006152dc828761522e565b6020820191506152ec8286614aca565b6014820191506152fc828561522e565b60208201915061530c8284614a99565b915081905095945050505050565b600060208201905061532f60008301846147c6565b92915050565b600060208201905061534a6000830184614799565b92915050565b600060608201905061536560008301866147c6565b61537260208301856147a8565b81810360408301526153848184614a60565b9050949350505050565b600060208201905081810360008301526153a881846147ec565b905092915050565b600060208201905081810360008301526153ca818461484a565b905092915050565b600060208201905081810360008301526153ec8184614933565b905092915050565b60006020820190506154096000830184614a2b565b92915050565b60006020820190506154246000830184614a3a565b92915050565b600060408201905061543f6000830185614a3a565b61544c60208301846147c6565b9392505050565b60006040820190506154686000830185614a3a565b818103602083015261547a8184614933565b90509392505050565b60006060820190506154986000830186614a3a565b6154a56020830185614a3a565b6154b260408301846147c6565b949350505050565b6000610120820190506154d0600083018c614a3a565b6154dd602083018b614a3a565b6154ea604083018a6147c6565b6154f7606083018961521f565b615504608083018861521f565b61551160a0830187614af0565b81810360c08301526155238186614b47565b905081810360e08301526155378185614b47565b905081810361010083015261554c81846148bf565b90509a9950505050505050505050565b60006060820190506155716000830186614a3a565b81810360208301526155838185614b47565b90506155926040830184614aff565b949350505050565b60006080820190506155af6000830187614a3a565b6155bc6020830186615245565b6155c96040830185614a3a565b6155d66060830184614a3a565b95945050505050565b600060208201905081810360008301526155f98184614a60565b905092915050565b600060a082019050818103600083015261561b8188614b47565b905061562a60208301876147c6565b818103604083015261563c81866149a8565b9050818103606083015261565081856147ec565b9050818103608083015261566481846147ec565b90509695505050505050565b6000602082019050818103600083015261568981614c31565b9050919050565b600060208201905081810360008301526156a981614cb1565b9050919050565b600060208201905081810360008301526156c981614d17565b9050919050565b600060208201905081810360008301526156e981614d57565b9050919050565b6000602082019050818103600083015261570981614d97565b9050919050565b6000602082019050818103600083015261572981614dd7565b9050919050565b6000602082019050818103600083015261574981614e17565b9050919050565b6000602082019050818103600083015261576981614e57565b9050919050565b6000602082019050818103600083015261578981614ebd565b9050919050565b600060208201905081810360008301526157a981614efd565b9050919050565b600060208201905081810360008301526157c981614f63565b9050919050565b600060208201905081810360008301526157e981614fa3565b9050919050565b6000602082019050818103600083015261580981614fe3565b9050919050565b6000602082019050818103600083015261582981615023565b9050919050565b6000602082019050818103600083015261584981615089565b9050919050565b60006020820190508181036000830152615869816150c9565b9050919050565b6000602082019050615885600083018461521f565b92915050565b6000604051905081810181811067ffffffffffffffff821117156158b2576158b1615e80565b5b8060405250919050565b600067ffffffffffffffff8211156158d7576158d6615e80565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561590357615902615e80565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561592f5761592e615e80565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561595f5761595e615e80565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000600182019050919050565b6000602082019050919050565b6000600382019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615af882615c1b565b9150615b0383615c1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615b3857615b37615df3565b5b828201905092915050565b6000615b4e82615c1b565b9150615b5983615c1b565b925082821015615b6c57615b6b615df3565b5b828203905092915050565b600060ff82169050919050565b600060ff82169050919050565b6000819050919050565b6000615ba682615bfb565b9050919050565b6000615bb882615bfb565b9050919050565b60008115159050919050565b6000819050919050565b6000819050615be382615ee7565b919050565b6000819050615bf682615efb565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615c3d82615c8c565b9050919050565b6000615c4f82615c56565b9050919050565b6000615c6182615bfb565b9050919050565b6000615c7382615bd5565b9050919050565b6000615c8582615be8565b9050919050565b6000615c9782615c9e565b9050919050565b6000615ca982615bfb565b9050919050565b82818337600083830152505050565b60005b83811015615cdd578082015181840152602081019050615cc2565b83811115615cec576000848401525b50505050565b60006002820490506001821680615d0a57607f821691505b60208210811415615d1e57615d1d615e51565b5b50919050565b6000615d37615d3283615ecd565b615b84565b9050919050565b6000615d51615d4c83615ecd565b615b91565b9050919050565b6000615d6b615d6683615eda565b615b77565b9050919050565b6000615d7d82615c1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615db057615daf615df3565b5b600182019050919050565b6000615dc682615dd7565b9050919050565b6000819050919050565b6000615de282615ec0565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160081c9050919050565b60028110615ef857615ef7615e22565b5b50565b60038110615f0c57615f0b615e22565b5b50565b615f1881615b9b565b8114615f2357600080fd5b50565b615f2f81615bbf565b8114615f3a57600080fd5b50565b615f4681615bcb565b8114615f5157600080fd5b50565b60028110615f6157600080fd5b50565b615f6d81615c1b565b8114615f7857600080fd5b50565b615f8481615c25565b8114615f8f57600080fd5b5056fea2646970667358221220a186a78bc8852f67cecc5fb60dd3d51f5f4102dcb80a48b7a0c73aa973eb0f9464736f6c63430008000033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.