Contract 0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x070ec83cf44e13eea3aebc30d5a67ddce432d30dbc3e06806a6069fedae327ecExecute Meta Tra...316837122022-08-09 4:58:5519 secs ago0x308be8d04dc459e9819b497e5fd3d5b54a0bf8da IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005618182005 41.165477262
0xebe628009d43b1c4befa33a6a38c206310c247339c9d28b0063b314d3c49b428Execute Meta Tra...316837112022-08-09 4:58:4727 secs ago0xb9a13a3e0033bea11fbf5bae2dd054011633a4ae IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005447136705 39.908687125
0xd0db598c28c43a3bea3d2c2a869d03671f585ecc2e297f1c364aa4ceb554b194Execute Meta Tra...316837112022-08-09 4:58:4727 secs ago0x9a33834732c4852ffd7cd7c829cd1136ab43a46d IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005447136705 39.908687125
0x308226ace186a95978c783c449ab48bcacfcccddb4ca7edb51b4251ab6eaddb6Execute Meta Tra...316837092022-08-09 4:58:4331 secs ago0x3f0d3c2997370ac79ccab3bcadcbc58093cbb614 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005450967704 39.933244233
0x4101ec49474913ccb11113a363f3398b5b9b06b1c7fca611b0df7f924365d64cExecute Meta Tra...316837072022-08-09 4:58:3935 secs ago0x0ad44590669ccd4f8993bbfb035a42f045f2786f IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005411407289 39.643428594
0x46bf8aabe1a070c953f46665024284a8cda8e927e7d8278cc1a818c9011149afExecute Meta Tra...316837022022-08-09 4:58:2945 secs ago0x531b77d33d3c654f9df6e228f11c5a0e0fb2c1ef IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005611038489 41.109520767
0xc6b1c92e9f7cd4c9315853d349809b13e4ab9476d423b7a712c41ad2540ae25aExecute Meta Tra...316837012022-08-09 4:58:2747 secs ago0x7e99c384a324944b3fb3e19f51651d10933244e5 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005607585289 41.109520766
0xac14b1353ab13ed6b48e097ef3e2fb635a118b3d0392de1729e93dbd8446b5abExecute Meta Tra...316837002022-08-09 4:58:2549 secs ago0x7bd2d9f1f728facfe1e5fc840ac357f9585db6cd IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005611038489 41.109520765
0x1cf7742e8590c0b927f852e64e1c68fa4c7f502bdc2af36d1771c841cca898e8Execute Meta Tra...316836992022-08-09 4:58:2351 secs ago0x24e2d55d5ab48093ee196b7b65eb456dcdfca369 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005856296116 42.906411577
0x9b515bce25412cb6cab71425b09b42ecdb5812ba2c6e8cc1e74af4884680d6eaExecute Meta Tra...316836892022-08-09 4:58:031 min ago0xe10e129d026eabcccd8e9d5b5c773097b692ea58 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005687508241 41.69544039
0xdf5c174dee1f7631c42feaaabdbbfa916c7f8061e6440407424fedb3729c9071Execute Meta Tra...316836842022-08-09 4:57:531 min ago0x1dbdceb48b13c0bbda35b8d06423425f5ef79520 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005460236669 40.025778633
0x4730c8a547891b3fda6c00e43ec4e4b83a88305e27f6615cc67750a7991c6ee0Execute Meta Tra...316836752022-08-09 4:57:351 min ago0x31aa38e3a099aa96bd61abe1efe17abec6137c19 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.00557978333 40.902104782
0x1e3145d5cfeb69acf5b412c5ade6c5483a01fd7c688f888882912dc83625b01aExecute Meta Tra...316836742022-08-09 4:57:331 min ago0x6c48f45dca2b69cff3a1a3cc9824859ea30d88bf IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005578801679 40.902104782
0x83bafc62acaca0c0254a911a3b74330dda3883719d810cdfc0b6e4e419566774Execute Meta Tra...316836692022-08-09 4:57:231 min ago0x1213eec882778b34b659916bc37e6e3c64402dcd IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005532099192 40.531168531
0x7ed23202009c263b33fdf26c992fed9f24915b952baaf4bc28554a416c3f45edExecute Meta Tra...316836432022-08-09 4:56:252 mins ago0x1d038b43e4634a1246b50518b6bdc0ac5b7b62b2 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005734174926 42.037556458
0x0136aabea8e410587d19d3d617dd0264282f20f228383f78730d1950285745b5Execute Meta Tra...316835802022-08-09 4:54:154 mins ago0x26d3e414ccbcd8fa40c8c82af666b86053fc0b51 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.00337712038 38.669464922
0xbfc0cc76c376d0c945e7cc184754a32424bd29f809731b49e7c174884a5a681aExecute Meta Tra...316835762022-08-09 4:54:075 mins ago0xd52f9ec96996e33fc705670a63b2e0a34fe91aa2 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005248902256 38.479995431
0xf573d2065660ce17902044c3f088655e8f4137e29a7cd7be35450f43eb3c040cExecute Meta Tra...316835742022-08-09 4:54:035 mins ago0xa6869c3001de171c26418e9e2eedca1c0d763ee2 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005336583948 39.10559369
0x2afd6ab89a1a400db302dbe627568774c33f3f78cf988c4d08796852bee9b545Execute Meta Tra...316835022022-08-09 4:51:357 mins ago0x59e4280f71095a1aa5db537400bd56c76e4a2277 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005166846196 37.878437871
0x49e3bd47b055efcdd3eda85cc5756d081757f044d19b3c24adde8afeddf80948Execute Meta Tra...316834972022-08-09 4:51:257 mins ago0x381dce387fc0c23d3526c19ea8b101f0e9152dad IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.003265272242 37.393894277
0x075e9f15806f046917bc2d7e4f62941056898b988d9b06093e226f91a004d3eeExecute Meta Tra...316834932022-08-09 4:51:177 mins ago0xcde4acc511438b9b7942aad7c1c296823191792b IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005026980755 36.836873327
0x93924e6124e980f28c4c2f2ae49cd3fd87345835921aea0170221c145bfae69eExecute Meta Tra...316834882022-08-09 4:51:078 mins ago0x154a09b3a7375202ed970f81acf873156eeb74f8 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.005186297318 38.017690618
0x43a1d633320dae73a1cb4500669c1eac43a1d499ade2762dd6f2a2531439c3b5Execute Meta Tra...316834692022-08-09 4:50:298 mins ago0x7e99c384a324944b3fb3e19f51651d10933244e5 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.004859084734 35.61908791
0xc0d9bfc6a8bea117a0f1b8454dfef3aed6ff6a700e3735c7defa18ba680941d0Execute Meta Tra...316834332022-08-09 4:49:1310 mins ago0xe15b86ee4bb2b6c2a39cb744a741310c4da20ea3 IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.003178017476 36.394652794
0x85b403a692b62df4e0d0a66f58653a45d8bc39f0356514f633586580b9a86ac7Execute Meta Tra...316834322022-08-09 4:49:1110 mins ago0xc59d9eb14f6d1996d489b6569d1c96d4509aacdf IN  0xf1b5af2bd94ddfb696b54dabb06118a79c7460bc0 MATIC0.004967069424 36.394652794
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
This contract contains unverified libraries: XPUtils
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract 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
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";

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

enum Direction {
  increase,
  decrease
}

struct Scoreboard {
  mapping(string => uint256) scores;
}

struct Project {
  bytes32 id;
  string name;
  mapping(string => Action) nameToAction;
  Action[] actions;
  address[] owners;
  mapping(address => bool) isAddressOwner; // used to check if an address is an owner
  address[] updaters; // contracts and wallets allowed to update the score
  mapping(address => bool) isAddressUpdater; // used to check if an address is an updater
  ProjectStatus status; // allow the owner of this to pause project updates
  mapping(address => Scoreboard) addressToScoreboard;
  mapping(bytes32 => bool) updateIdToDoesExist;
  mapping(string => bool) scoreTypeToDoesExist;
  string[] scoreTypes;
}

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

library XPUtils {
  using SafeMath for uint256;

  function createProject(
    Project storage _project,
    bytes32[] storage _projectIds,
    bytes32 _projectId,
    string memory _name,
    Action[] memory _inputActions,
    string[] memory _scoreTypes,
    address[] memory _owners,
    address[] memory _updaters
  ) external {
    require(_inputActions.length <= 20, "Can submit up to 20 actions");
    require(_scoreTypes.length <= 20, "Can submit up to 20 score types");

    _project.id = _projectId;
    _project.name = _name;
    _project.scoreTypes = _scoreTypes;
    _project.owners = _owners;
    _project.updaters = _updaters;
    _project.status = ProjectStatus.Running;

    for (uint256 i = 0; i < _scoreTypes.length; i++) {
      _project.scoreTypeToDoesExist[_scoreTypes[i]] = true;
    }

    // Loops through and add actions 1 by 1, limit actions list to 20
    for (uint256 i = 0; i < _inputActions.length; i++) {
      _project.actions.push(
        Action(
          _inputActions[i].name,
          _inputActions[i].points,
          _inputActions[i].direction,
          true
        )
      );
      // Mapping points each name to the action object associated
      _project.nameToAction[_inputActions[i].name] = Action(
        _inputActions[i].name,
        _inputActions[i].points,
        _inputActions[i].direction,
        true
      );
    }

    for (uint256 j = 0; j < _owners.length; j++) {
      // Owners array placed into mapping
      _project.isAddressOwner[_owners[j]] = true;
    }
    for (uint256 k = 0; k < _updaters.length; k++) {
      // Owners array placed into mapping
      _project.isAddressUpdater[_updaters[k]] = true;
    }

    _projectIds.push(_projectId);
  }

  function addActions(Project storage _project, Action[] memory _inputActions)
    external
  {
    require(
      _project.status != ProjectStatus.NonExistant,
      "Project does not exist"
    );
    require(_inputActions.length <= 20, "Can submit up to 20 actions");

    // Loops through and add actions 1 by 1, limit actions list to 20
    for (uint256 i = 0; i < _inputActions.length; i++) {
      if (_project.nameToAction[_inputActions[i].name].isValid) {
        // Action exists, only need to update
        _project.nameToAction[_inputActions[i].name] = Action(
          _inputActions[i].name,
          _inputActions[i].points,
          _inputActions[i].direction,
          true
        );
      } else {
        //Action does not exist so update it in the mapping as well as the actions list
        _project.actions.push(
          Action(
            _inputActions[i].name,
            _inputActions[i].points,
            _inputActions[i].direction,
            true
          )
        ); //List of actions to loop through.
        _project.nameToAction[_inputActions[i].name] = Action(
          _inputActions[i].name,
          _inputActions[i].points,
          _inputActions[i].direction,
          true
        );
      }
    }
  }

  function addProjectOwner(Project storage _project, address _newOwner)
    external
  {
    _project.isAddressOwner[_newOwner] = true;
    _project.owners.push(_newOwner);
  }

  function removeProjectOwner(Project storage _project, address _owner)
    external
  {
    require(_project.owners.length > 1, "Cannot delete last remaining owner");
    _project.isAddressOwner[_owner] = false;

    for (uint256 i = 0; i < _project.owners.length; i++) {
      if (_project.owners[i] == _owner) {
        _project.owners[i] = _project.owners[_project.owners.length - 1];
        _project.owners.pop(); //always pop last element
        break;
      }
    }
  }

  function addProjectUpdater(Project storage _project, address _newUpdater)
    external
  {
    _project.isAddressUpdater[_newUpdater] = true;
    _project.updaters.push(_newUpdater);
  }

  function removeProjectUpdater(Project storage _project, address _updater)
    external
  {
    _project.isAddressUpdater[_updater] = false;

    for (uint256 i = 0; i < _project.updaters.length; i++) {
      if (_project.updaters[i] == _updater) {
        _project.updaters[i] = _project.updaters[_project.updaters.length - 1];
        _project.updaters.pop(); //always pop last element
        break;
      }
    }
  }

  function addScoreTypes(Project storage _project, string[] memory _scoreTypes)
    external
  {
    for (uint256 i = 0; i < _scoreTypes.length; i++) {
      _project.scoreTypes.push(_scoreTypes[i]);
      _project.scoreTypeToDoesExist[_scoreTypes[i]] = true;
    }
  }

  function removeScoreType(Project storage _project, string memory _scoreType)
    external
  {
    _project.scoreTypeToDoesExist[_scoreType] = false;
    for (uint256 i = 0; i < _project.scoreTypes.length; i++) {
      if (
        keccak256(abi.encodePacked(_scoreType)) ==
        keccak256(abi.encodePacked(_project.scoreTypes[i]))
      ) {
        _project.scoreTypes[i] = _project.scoreTypes[
          _project.scoreTypes.length - 1
        ];
        _project.scoreTypes.pop();
        break;
      }
    }
  }

  function updateScore(
    Project storage _project,
    bytes32 _updateId,
    Scoreboard storage currScoreboard,
    Action memory currAction,
    string memory _scoreType
  ) external returns (bool) {
    require(_project.status == ProjectStatus.Running, "Project is not active");
    require(currAction.isValid, "Action must exist");
    require(
      _project.scoreTypeToDoesExist[_scoreType] == true,
      "Score type does not exist in this project"
    );

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

      if (currAction.direction == Direction.increase) {
        currScoreboard.scores[_scoreType] = currScoreboard
          .scores[_scoreType]
          .add(currAction.points);
      } else if (currAction.direction == Direction.decrease) {
        //check if score will go below zero, if so then set it to 0 (lower limit);
        if (currAction.points >= currScoreboard.scores[_scoreType]) {
          currScoreboard.scores[_scoreType] = uint256(0);
        } else {
          currScoreboard.scores[_scoreType] = currScoreboard
            .scores[_scoreType]
            .sub(currAction.points);
        }
      } else {
        return false;
      }
      return true;
    } else {
      return false;
    }
  }
}

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

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

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

  event NewScoreTypes(
    bytes32 projectId,
    string[] scoreTypesAdded,
    string[] allScoreTypes
  );

  event RemoveScoreType(
    bytes32 projectId,
    string scoreTypeRemoved,
    string[] allScoreTypes
  );

  event UpdateScore(
    bytes32 updateId,
    bytes32 projectId,
    address targetAddress,
    uint256 newPoints,
    uint256 pointChange,
    Direction direction,
    string actionName,
    string scoreType,
    string[] scoreTypes // All score types for the project
  );

  event UpdateScoreFailed(
    bytes32 updateId,
    bytes32 projectId,
    address targetAddress
  );

  event ProjectOwnerAdded(bytes32 projectId, address newOwner);

  event ProjectOwnerRemoved(bytes32 projectId, address ownerRemoved);

  event ProjectUpdaterAdded(bytes32 projectId, address newUpdater);

  event ProjectUpdaterRemoved(bytes32 projectId, address updaterRemoved);

  /*
    A project is an instance of an XP system
  */

  bytes32[] projectIds; // keeps track of all project ids

  // Mapping of all the exists projects
  mapping(bytes32 => Project) public idToProject;

  // ************************    OWNER ONLY CALLABLE FUNCTIONS     *******************************

  function pause() external onlyOwner whenNotPaused {
    _pause(); // from Pausable.sol
  }

  function unpause() external onlyOwner whenPaused {
    _unpause(); //from Pausable.sol
  }

  // ************************ END ---- OWNER ONLY CALLABLE FUNCTIONS ----- END *******************************

  function createProject(
    bytes32 _projectId,
    string memory _name,
    Action[] memory _inputActions,
    string[] memory _scoreTypes,
    address[] memory _owners,
    address[] memory _updaters
  ) public whenNotPaused {
    require(
      idToProject[_projectId].status == ProjectStatus.NonExistant,
      "Project already exists"
    );

    XPUtils.createProject(
      idToProject[_projectId],
      projectIds,
      _projectId,
      _name,
      _inputActions,
      _scoreTypes,
      _owners,
      _updaters
    );

    emit ProjectCreated(
      _projectId,
      _name,
      msgSender(),
      idToProject[_projectId].actions,
      _scoreTypes,
      _owners,
      _updaters
    );
  }

  function addProjectOwner(bytes32 _projectId, address _newOwner)
    public
    whenNotPaused
  {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project"
    );

    XPUtils.addProjectOwner(idToProject[_projectId], _newOwner);

    emit ProjectOwnerAdded(_projectId, _newOwner);
  }

  function removeProjectOwner(bytes32 _projectId, address _owner)
    public
    whenNotPaused
  {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project"
    );
    require(
      idToProject[_projectId].isAddressOwner[_owner] == true,
      "This address is not an owner."
    );
    XPUtils.removeProjectOwner(idToProject[_projectId], _owner);

    emit ProjectOwnerRemoved(_projectId, _owner);
  }

  function addProjectUpdater(bytes32 _projectId, address _newUpdater)
    public
    whenNotPaused
  {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project"
    );

    XPUtils.addProjectUpdater(idToProject[_projectId], _newUpdater);

    emit ProjectUpdaterAdded(_projectId, _newUpdater);
  }

  function removeProjectUpdater(bytes32 _projectId, address _updater)
    public
    whenNotPaused
  {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project"
    );
    require(
      idToProject[_projectId].isAddressUpdater[_updater] == true,
      "This address is not an updater."
    );
    XPUtils.removeProjectUpdater(idToProject[_projectId], _updater);

    emit ProjectUpdaterRemoved(_projectId, _updater);
  }

  function pauseProject(bytes32 _projectId) public whenNotPaused {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project"
    );
    idToProject[_projectId].status = ProjectStatus.Paused;
  }

  function resumeProject(bytes32 _projectId) public whenNotPaused {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project"
    );
    idToProject[_projectId].status = ProjectStatus.Running;
  }

  function addScoreTypes(bytes32 _projectId, string[] memory _scoreTypes)
    public
    whenNotPaused
  {
    require(
      idToProject[_projectId].status != ProjectStatus.NonExistant,
      "Project does not exist"
    );
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project to update actions"
    );
    require(_scoreTypes.length <= 20, "Can submit up to 20 actions");

    XPUtils.addScoreTypes(idToProject[_projectId], _scoreTypes);

    emit NewScoreTypes(
      _projectId,
      _scoreTypes,
      idToProject[_projectId].scoreTypes
    );
  }

  function removeScoreType(bytes32 _projectId, string memory _scoreType)
    public
    whenNotPaused
  {
    require(
      idToProject[_projectId].status != ProjectStatus.NonExistant,
      "Project does not exist"
    );
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project to update actions"
    );
    XPUtils.removeScoreType(idToProject[_projectId], _scoreType);

    emit RemoveScoreType(
      _projectId,
      _scoreType,
      idToProject[_projectId].scoreTypes
    );
  }

  /*
    Add new action types to project Scoreboards
  */
  function addActions(bytes32 _projectId, Action[] memory _inputActions)
    public
    whenNotPaused
  {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be an owner of the project to update actions"
    );

    XPUtils.addActions(idToProject[_projectId], _inputActions);

    emit NewActions(_projectId, _inputActions);
  }

  function updateScore(
    bytes32 _updateId,
    bytes32 _projectId,
    string memory _actionName,
    string memory _scoreType,
    address _targetWallet
  ) public whenNotPaused {
    require(
      (idToProject[_projectId].isAddressOwner[msgSender()] ||
        idToProject[_projectId].isAddressUpdater[msgSender()] ||
        owner() == msgSender() ||
        isAdmin(msgSender()) == true),
      "You must be either an owner or an updater to use this function"
    );

    bool updated = XPUtils.updateScore(
      idToProject[_projectId],
      _updateId,
      idToProject[_projectId].addressToScoreboard[_targetWallet],
      idToProject[_projectId].nameToAction[_actionName],
      _scoreType
    );

    if (updated) {
      emit UpdateScore(
        _updateId,
        _projectId,
        _targetWallet,
        idToProject[_projectId].addressToScoreboard[_targetWallet].scores[
          _scoreType
        ],
        idToProject[_projectId].nameToAction[_actionName].points,
        idToProject[_projectId].nameToAction[_actionName].direction,
        _actionName,
        _scoreType,
        idToProject[_projectId].scoreTypes
      );
    } else {
      emit UpdateScoreFailed(_updateId, _projectId, _targetWallet);
    }
  }

  /*
    Returns specific score for a user (must specift score type)
  */
  function getScore(
    bytes32 _projectId,
    string memory _scoreType,
    address _targetWallet
  ) external view returns (uint256) {
    return
      idToProject[_projectId].addressToScoreboard[_targetWallet].scores[
        _scoreType
      ];
  }

  function getScoreTypesFromProject(bytes32 _projectId)
    external
    view
    returns (string[] memory)
  {
    return idToProject[_projectId].scoreTypes;
  }

  function getActionsFromProjectId(bytes32 _projectId)
    external
    view
    returns (Action[] memory)
  {
    return idToProject[_projectId].actions;
  }

  function getUpdatersFromProjectId(bytes32 _projectId)
    external
    view
    returns (address[] memory)
  {
    return idToProject[_projectId].updaters;
  }

  function getOwnersFromProjectId(bytes32 _projectId)
    external
    view
    returns (address[] memory)
  {
    return idToProject[_projectId].owners;
  }
}

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 getAdmins() external view returns (address[] memory) {
    return admins;
  }

  function removeAdmin(address _removeAdmin) external onlyOwner {
    addressToIsAdmin[_removeAdmin] = false;

    for (uint256 i = 0; i < admins.length; i++) {
      if (admins[i] == _removeAdmin) {
        admins[i] = admins[admins.length - 1];
        admins.pop(); //always pop last element
        break;
      }
    }
  }
}

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": {
    "/contracts/XP.sol": {
      "XPUtils": "0xF20f60334825195E21B8F1338c9c024f98eF71B8"
    }
  },
  "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 Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"indexed":false,"internalType":"struct Action[]","name":"actions","type":"tuple[]"}],"name":"NewActions","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"string[]","name":"scoreTypesAdded","type":"string[]"},{"indexed":false,"internalType":"string[]","name":"allScoreTypes","type":"string[]"}],"name":"NewScoreTypes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"indexed":false,"internalType":"struct Action[]","name":"actions","type":"tuple[]"},{"indexed":false,"internalType":"string[]","name":"_scoreTypes","type":"string[]"},{"indexed":false,"internalType":"address[]","name":"owners","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"updaters","type":"address[]"}],"name":"ProjectCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"ProjectOwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"ownerRemoved","type":"address"}],"name":"ProjectOwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"newUpdater","type":"address"}],"name":"ProjectUpdaterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"updaterRemoved","type":"address"}],"name":"ProjectUpdaterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"scoreTypeRemoved","type":"string"},{"indexed":false,"internalType":"string[]","name":"allScoreTypes","type":"string[]"}],"name":"RemoveScoreType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"updateId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"newPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pointChange","type":"uint256"},{"indexed":false,"internalType":"enum Direction","name":"direction","type":"uint8"},{"indexed":false,"internalType":"string","name":"actionName","type":"string"},{"indexed":false,"internalType":"string","name":"scoreType","type":"string"},{"indexed":false,"internalType":"string[]","name":"scoreTypes","type":"string[]"}],"name":"UpdateScore","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"updateId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"projectId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"}],"name":"UpdateScoreFailed","type":"event"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct Action[]","name":"_inputActions","type":"tuple[]"}],"name":"addActions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"addProjectOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_newUpdater","type":"address"}],"name":"addProjectUpdater","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string[]","name":"_scoreTypes","type":"string[]"}],"name":"addScoreTypes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct Action[]","name":"_inputActions","type":"tuple[]"},{"internalType":"string[]","name":"_scoreTypes","type":"string[]"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"address[]","name":"_updaters","type":"address[]"}],"name":"createProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getActionsFromProjectId","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"enum Direction","name":"direction","type":"uint8"},{"internalType":"bool","name":"isValid","type":"bool"}],"internalType":"struct Action[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getOwnersFromProjectId","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_scoreType","type":"string"},{"internalType":"address","name":"_targetWallet","type":"address"}],"name":"getScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getScoreTypesFromProject","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"getUpdatersFromProjectId","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"idToProject","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"enum ProjectStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"pauseProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_removeAdmin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_owner","type":"address"}],"name":"removeProjectOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"address","name":"_updater","type":"address"}],"name":"removeProjectUpdater","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_scoreType","type":"string"}],"name":"removeScoreType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_projectId","type":"bytes32"}],"name":"resumeProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_updateId","type":"bytes32"},{"internalType":"bytes32","name":"_projectId","type":"bytes32"},{"internalType":"string","name":"_actionName","type":"string"},{"internalType":"string","name":"_scoreType","type":"string"},{"internalType":"address","name":"_targetWallet","type":"address"}],"name":"updateScore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"chainID","type":"uint256"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060008060006101000a81548160ff0219169083151502179055506200004c620000406200005260201b60201c565b6200005a60201b60201c565b62000120565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615f4d80620001306000396000f3fe6080604052600436106101d85760003560e01c80635c975abb116101025780638da5cb5b11610095578063b70ac26711610064578063b70ac26714610697578063c294dbf3146106c0578063c72884f5146106fd578063f2fde38b1461073a576101d8565b80638da5cb5b146105f15780638dffc7b81461061c578063969fa1ec14610645578063b556ebf01461066e576101d8565b8063740d8415116100d1578063740d84151461055f5780637fdaad76146105885780638456cb59146105b15780638696355c146105c8576101d8565b80635c975abb146104b75780636281133d146104e2578063704802751461051f578063715018a614610548576101d8565b806331ae450b1161017a57806347348b6e1161014957806347348b6e146103e75780634bb6e028146104245780634dc1c04b14610463578063564b81ef1461048c576101d8565b806331ae450b1461035357806334399a781461037e5780633f4ba83a146103a757806345689684146103be576101d8565b806314bfd6d0116101b657806314bfd6d0146102875780631785f53c146102c45780631c6c5a86146102ed5780632d0335ab14610316576101d8565b806309851aee146101dd5780630b0e17cf1461021a5780630c53c51c14610257575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190613cf3565b610763565b6040516102119190615095565b60405180910390f35b34801561022657600080fd5b50610241600480360381019061023c9190613cf3565b610852565b60405161024e9190615073565b60405180910390f35b610271600480360381019061026c9190613b85565b6108f6565b60405161027e9190615333565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190614063565b610b3a565b6040516102bb9190614fff565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613b5c565b610b79565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613cf3565b610e76565b005b34801561032257600080fd5b5061033d60048036038101906103389190613b5c565b61102f565b60405161034a9190615774565b60405180910390f35b34801561035f57600080fd5b50610368611078565b6040516103759190615073565b60405180910390f35b34801561038a57600080fd5b506103a560048036038101906103a09190613dac565b611106565b005b3480156103b357600080fd5b506103bc61130f565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613f62565b6113dc565b005b3480156103f357600080fd5b5061040e60048036038101906104099190613efb565b6115e8565b60405161041b9190615774565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190613cf3565b611666565b60405161045a939291906152b0565b60405180910390f35b34801561046f57600080fd5b5061048a60048036038101906104859190613d58565b611725565b005b34801561049857600080fd5b506104a1611a61565b6040516104ae9190615774565b60405180910390f35b3480156104c357600080fd5b506104cc611a6e565b6040516104d991906150d9565b60405180910390f35b3480156104ee57600080fd5b5061050960048036038101906105049190613c14565b611a84565b60405161051691906150d9565b60405180910390f35b34801561052b57600080fd5b5061054660048036038101906105419190613b5c565b611bbf565b005b34801561055457600080fd5b5061055d611cf9565b005b34801561056b57600080fd5b5061058660048036038101906105819190613d1c565b611d81565b005b34801561059457600080fd5b506105af60048036038101906105aa9190613d1c565b612031565b005b3480156105bd57600080fd5b506105c661223a565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613e00565b612308565b005b3480156105fd57600080fd5b50610606612784565b6040516106139190614fff565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190613d1c565b6127ae565b005b34801561065157600080fd5b5061066c60048036038101906106679190613ea7565b612a5e565b005b34801561067a57600080fd5b5061069560048036038101906106909190613d1c565b612d55565b005b3480156106a357600080fd5b506106be60048036038101906106b99190613cf3565b612f5e565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613cf3565b613117565b6040516106f49190615073565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190613cf3565b6131bb565b60405161073191906150b7565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613b5c565b61336e565b005b606060066000838152602001908152602001600020600c01805480602002602001604051908101604052809291908181526020016000905b828210156108475783829060005260206000200180546107ba90615c77565b80601f01602080910402602001604051908101604052809291908181526020018280546107e690615c77565b80156108335780601f1061080857610100808354040283529160200191610833565b820191906000526020600020905b81548152906001019060200180831161081657829003601f168201915b50505050508152602001906001019061079b565b505050509050919050565b6060600660008381526020019081526020016000206006018054806020026020016040519081016040528092919081815260200182805480156108ea57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116108a0575b50505050509050919050565b606061094d86600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610944611a61565b88888888611a84565b61098c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610983906154b9565b60405180910390fd5b6109de60018060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461346690919063ffffffff16565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000803073ffffffffffffffffffffffffffffffffffffffff168789604051602001610a4e929190614f50565b604051602081830303815290604052604051610a6a9190614f39565b6000604051808303816000865af19150503d8060008114610aa7576040519150601f19603f3d011682016040523d82523d6000602084013e610aac565b606091505b509150915081610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890615439565b60405180910390fd5b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b883389604051610b2493929190615035565b60405180910390a1809250505095945050505050565b60048181548110610b4a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b8161347c565b73ffffffffffffffffffffffffffffffffffffffff16610b9f612784565b73ffffffffffffffffffffffffffffffffffffffff1614610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec90615499565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b600480549050811015610e72578173ffffffffffffffffffffffffffffffffffffffff1660048281548110610cae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e5f5760046001600480549050610d099190615ac8565b81548110610d40577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660048281548110610da5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506004805480610e25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610e72565b8080610e6a90615cf7565b915050610c50565b5050565b610e7e611a6e565b15610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590615479565b60405180910390fd5b600660008281526020019081526020016000206005016000610ede613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610f6a5750610f34613484565b73ffffffffffffffffffffffffffffffffffffffff16610f52612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f88575060011515610f84610f7f613484565b61353a565b1515145b610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe906154d9565b60405180910390fd5b60026006600083815260200190815260200160002060080160006101000a81548160ff02191690836002811115611027577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054806020026020016040519081016040528092919081815260200182805480156110fc57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116110b2575b5050505050905090565b61110e611a6e565b1561114e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114590615479565b60405180910390fd5b60066000838152602001908152602001600020600501600061116e613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806111fa57506111c4613484565b73ffffffffffffffffffffffffffffffffffffffff166111e2612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061121857506001151561121461120f613484565b61353a565b1515145b611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90615559565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863e761573d60066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016112a29291906156b3565b60006040518083038186803b1580156112ba57600080fd5b505af41580156112ce573d6000803e3d6000fd5b505050507f925a971da7b8a2422c4fa67db7c7410b16fa33451659314737ba70a81a936d068282604051611303929190615162565b60405180910390a15050565b61131761347c565b73ffffffffffffffffffffffffffffffffffffffff16611335612784565b73ffffffffffffffffffffffffffffffffffffffff161461138b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138290615499565b60405180910390fd5b611393611a6e565b6113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c9906153d9565b60405180910390fd5b6113da613590565b565b6113e4611a6e565b15611424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141b90615479565b60405180910390fd5b6000600281111561145e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600088815260200190815260200160002060080160009054906101000a900460ff1660028111156114ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190615519565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b8634154855c6006600089815260200190815260200160002060058989898989896040518963ffffffff1660e01b81526004016115529897969594939291906155e2565b60006040518083038186803b15801561156a57600080fd5b505af415801561157e573d6000803e3d6000fd5b50505050857feea62333b1dae4ca57dec1af5888ffdcc29542d61d7d75835247a0357da3d951866115ad613484565b600660008b81526020019081526020016000206003018787876040516115d896959493929190615355565b60405180910390a2505050505050565b60006006600085815260200190815260200160002060090160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018360405161164e9190614f78565b90815260200160405180910390205490509392505050565b600660205280600052604060002060009150905080600001549080600101805461168f90615c77565b80601f01602080910402602001604051908101604052809291908181526020018280546116bb90615c77565b80156117085780601f106116dd57610100808354040283529160200191611708565b820191906000526020600020905b8154815290600101906020018083116116eb57829003601f168201915b5050505050908060080160009054906101000a900460ff16905083565b61172d611a6e565b1561176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176490615479565b60405180910390fd5b600060028111156117a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600084815260200190815260200160002060080160009054906101000a900460ff166002811115611803577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b90615539565b60405180910390fd5b600660008381526020019081526020016000206005016000611864613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806118f057506118ba613484565b73ffffffffffffffffffffffffffffffffffffffff166118d8612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061190e57506001151561190a611905613484565b61353a565b1515145b61194d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194490615559565b60405180910390fd5b601481511115611992576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198990615579565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863119088e360066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016119dd929190615683565b60006040518083038186803b1580156119f557600080fd5b505af4158015611a09573d6000803e3d6000fd5b505050507f8979a46d5d18c11dd2a3c05ab9c3aca95408ba0e58bd24ca49585c362b749bcb828260066000868152602001908152602001600020600c01604051611a559392919061511d565b60405180910390a15050565b6000804690508091505090565b60008060009054906101000a900460ff16905090565b600080611abc88308989604051602001611aa19493929190614fb5565b60405160208183030381529060405280519060200120613631565b9050600060018285888860405160008152602001604052604051611ae394939291906152ee565b6020604051602081039080840390855afa158015611b05573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890615459565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161492505050979650505050505050565b611bc761347c565b73ffffffffffffffffffffffffffffffffffffffff16611be5612784565b73ffffffffffffffffffffffffffffffffffffffff1614611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3290615499565b60405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506004819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d0161347c565b73ffffffffffffffffffffffffffffffffffffffff16611d1f612784565b73ffffffffffffffffffffffffffffffffffffffff1614611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c90615499565b60405180910390fd5b611d7f6000613661565b565b611d89611a6e565b15611dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc090615479565b60405180910390fd5b600660008381526020019081526020016000206005016000611de9613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611e755750611e3f613484565b73ffffffffffffffffffffffffffffffffffffffff16611e5d612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e93575060011515611e8f611e8a613484565b61353a565b1515145b611ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec9906154d9565b60405180910390fd5b600115156006600084815260200190815260200160002060050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7090615419565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863a825cc4f60066000858152602001908152602001600020836040518363ffffffff1660e01b8152600401611fc49291906155b9565b60006040518083038186803b158015611fdc57600080fd5b505af4158015611ff0573d6000803e3d6000fd5b505050507f4d05a6384888ac850d53aa052a22c622af19eb4fc706564d6d2c5e5c1315ff5e82826040516120259291906150f4565b60405180910390a15050565b612039611a6e565b15612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090615479565b60405180910390fd5b600660008381526020019081526020016000206005016000612099613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061212557506120ef613484565b73ffffffffffffffffffffffffffffffffffffffff1661210d612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214357506001151561213f61213a613484565b61353a565b1515145b612182576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612179906154d9565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863c9b2aa3a60066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016121cd9291906155b9565b60006040518083038186803b1580156121e557600080fd5b505af41580156121f9573d6000803e3d6000fd5b505050507fa47203dcb0d9b586516ee8d3f53c3bb54a50102bf92747a833dd698eac729983828260405161222e9291906150f4565b60405180910390a15050565b61224261347c565b73ffffffffffffffffffffffffffffffffffffffff16612260612784565b73ffffffffffffffffffffffffffffffffffffffff16146122b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ad90615499565b60405180910390fd5b6122be611a6e565b156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f590615479565b60405180910390fd5b612306613727565b565b612310611a6e565b15612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234790615479565b60405180910390fd5b600660008581526020019081526020016000206005016000612370613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061242757506006600085815260200190815260200160002060070160006123de613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061246b5750612435613484565b73ffffffffffffffffffffffffffffffffffffffff16612453612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80612489575060011515612485612480613484565b61353a565b1515145b6124c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124bf90615599565b60405180910390fd5b600073f20f60334825195e21b8f1338c9c024f98ef71b863743207106006600088815260200190815260200160002088600660008a815260200190815260200160002060090160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600660008b81526020019081526020016000206002018960405161256f9190614f78565b9081526020016040518091039020886040518663ffffffff1660e01b815260040161259e9594939291906156e3565b60206040518083038186803b1580156125b657600080fd5b505af41580156125ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ee9190613cca565b90508015612740577f6ded0f47391f4098773ec0e338d3c321e7fcf92b580d0925ae90942f292236ac868684600660008a815260200190815260200160002060090160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018760405161267e9190614f78565b908152602001604051809103902054600660008b8152602001908152602001600020600201896040516126b19190614f78565b908152602001604051809103902060010154600660008c81526020019081526020016000206002018a6040516126e79190614f78565b908152602001604051809103902060020160009054906101000a900460ff168a8a600660008f8152602001908152602001600020600c01604051612733999897969594939291906151c9565b60405180910390a161277c565b7fd22d7033fccba80f2459d8d4091adaf35ec8f6666b4ddaf5c788e17e9e296e0b86868460405161277393929190615192565b60405180910390a15b505050505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127b6611a6e565b156127f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ed90615479565b60405180910390fd5b600660008381526020019081526020016000206005016000612816613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128a2575061286c613484565b73ffffffffffffffffffffffffffffffffffffffff1661288a612784565b73ffffffffffffffffffffffffffffffffffffffff16145b806128c05750600115156128bc6128b7613484565b61353a565b1515145b6128ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f6906154d9565b60405180910390fd5b600115156006600084815260200190815260200160002060070160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515146129a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299d906154f9565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863ade2140660066000858152602001908152602001600020836040518363ffffffff1660e01b81526004016129f19291906155b9565b60006040518083038186803b158015612a0957600080fd5b505af4158015612a1d573d6000803e3d6000fd5b505050507f4a9d9ee7c0b327bc99524679cd76120147a0a4e217ee786a788c589de5ba32ed8282604051612a529291906150f4565b60405180910390a15050565b612a66611a6e565b15612aa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9d90615479565b60405180910390fd5b60006002811115612ae0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006600084815260200190815260200160002060080160009054906101000a900460ff166002811115612b3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7490615539565b60405180910390fd5b600660008381526020019081526020016000206005016000612b9d613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612c295750612bf3613484565b73ffffffffffffffffffffffffffffffffffffffff16612c11612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c47575060011515612c43612c3e613484565b61353a565b1515145b612c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7d90615559565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b863a906966860066000858152602001908152602001600020836040518363ffffffff1660e01b8152600401612cd1929190615744565b60006040518083038186803b158015612ce957600080fd5b505af4158015612cfd573d6000803e3d6000fd5b505050507f343017b33b7b2d39684beb179472777aea84c82fa3054c3fe9d58e7b83f60b37828260066000868152602001908152602001600020600c01604051612d499392919061526b565b60405180910390a15050565b612d5d611a6e565b15612d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9490615479565b60405180910390fd5b600660008381526020019081526020016000206005016000612dbd613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612e495750612e13613484565b73ffffffffffffffffffffffffffffffffffffffff16612e31612784565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e67575060011515612e63612e5e613484565b61353a565b1515145b612ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9d906154d9565b60405180910390fd5b73f20f60334825195e21b8f1338c9c024f98ef71b86371ac355b60066000858152602001908152602001600020836040518363ffffffff1660e01b8152600401612ef19291906155b9565b60006040518083038186803b158015612f0957600080fd5b505af4158015612f1d573d6000803e3d6000fd5b505050507f411e236ca045537c05e826c50853ca8f495389389e3eb578dfdef2b23d60ea8c8282604051612f529291906150f4565b60405180910390a15050565b612f66611a6e565b15612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d90615479565b60405180910390fd5b600660008281526020019081526020016000206005016000612fc6613484565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613052575061301c613484565b73ffffffffffffffffffffffffffffffffffffffff1661303a612784565b73ffffffffffffffffffffffffffffffffffffffff16145b8061307057506001151561306c613067613484565b61353a565b1515145b6130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a6906154d9565b60405180910390fd5b60016006600083815260200190815260200160002060080160006101000a81548160ff0219169083600281111561310f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6060600660008381526020019081526020016000206004018054806020026020016040519081016040528092919081815260200182805480156131af57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613165575b50505050509050919050565b606060066000838152602001908152602001600020600301805480602002602001604051908101604052809291908181526020016000905b82821015613363578382906000526020600020906003020160405180608001604052908160008201805461322690615c77565b80601f016020809104026020016040519081016040528092919081815260200182805461325290615c77565b801561329f5780601f106132745761010080835404028352916020019161329f565b820191906000526020600020905b81548152906001019060200180831161328257829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900460ff1660018111156132fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6001811115613335577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81526020016002820160019054906101000a900460ff161515151581525050815260200190600101906131f3565b505050509050919050565b61337661347c565b73ffffffffffffffffffffffffffffffffffffffff16613394612784565b73ffffffffffffffffffffffffffffffffffffffff16146133ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190615499565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561345a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613451906153f9565b60405180910390fd5b61346381613661565b50565b600081836134749190615a72565b905092915050565b600033905090565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561352e57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050613536565b339050613537565b5b90565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b613598611a6e565b6135d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ce906153d9565b60405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61361a61347c565b604051613627919061501a565b60405180910390a1565b6000816040516020016136449190614f8f565b604051602081830303815290604052805190602001209050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61372f611a6e565b1561376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376690615479565b60405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586137b261347c565b6040516137bf919061501a565b60405180910390a1565b60006137dc6137d7846157c0565b61578f565b905080838252602082019050828560208602820111156137fb57600080fd5b60005b8581101561382b5781613811888261396b565b8452602084019350602083019250506001810190506137fe565b5050509392505050565b6000613848613843846157ec565b61578f565b9050808382526020820190508260005b85811015613888578135850161386e8882613a7c565b845260208401935060208301925050600181019050613858565b5050509392505050565b60006138a56138a084615818565b61578f565b9050808382526020820190508260005b858110156138e557813585016138cb8882613aa6565b8452602084019350602083019250506001810190506138b5565b5050509392505050565b60006139026138fd84615844565b61578f565b90508281526020810184848401111561391a57600080fd5b613925848285615c35565b509392505050565b600061394061393b84615874565b61578f565b90508281526020810184848401111561395857600080fd5b613963848285615c35565b509392505050565b60008135905061397a81615e94565b92915050565b600082601f83011261399157600080fd5b81356139a18482602086016137c9565b91505092915050565b600082601f8301126139bb57600080fd5b81356139cb848260208601613835565b91505092915050565b600082601f8301126139e557600080fd5b81356139f5848260208601613892565b91505092915050565b600081359050613a0d81615eab565b92915050565b600081519050613a2281615eab565b92915050565b600081359050613a3781615ec2565b92915050565b600082601f830112613a4e57600080fd5b8135613a5e8482602086016138ef565b91505092915050565b600081359050613a7681615ed9565b92915050565b600082601f830112613a8d57600080fd5b8135613a9d84826020860161392d565b91505092915050565b600060808284031215613ab857600080fd5b613ac2608061578f565b9050600082013567ffffffffffffffff811115613ade57600080fd5b613aea84828501613a7c565b6000830152506020613afe84828501613b32565b6020830152506040613b1284828501613a67565b6040830152506060613b26848285016139fe565b60608301525092915050565b600081359050613b4181615ee9565b92915050565b600081359050613b5681615f00565b92915050565b600060208284031215613b6e57600080fd5b6000613b7c8482850161396b565b91505092915050565b600080600080600060a08688031215613b9d57600080fd5b6000613bab8882890161396b565b955050602086013567ffffffffffffffff811115613bc857600080fd5b613bd488828901613a3d565b9450506040613be588828901613a28565b9350506060613bf688828901613a28565b9250506080613c0788828901613b47565b9150509295509295909350565b600080600080600080600060e0888a031215613c2f57600080fd5b6000613c3d8a828b0161396b565b9750506020613c4e8a828b01613b32565b9650506040613c5f8a828b01613b32565b955050606088013567ffffffffffffffff811115613c7c57600080fd5b613c888a828b01613a3d565b9450506080613c998a828b01613a28565b93505060a0613caa8a828b01613a28565b92505060c0613cbb8a828b01613b47565b91505092959891949750929550565b600060208284031215613cdc57600080fd5b6000613cea84828501613a13565b91505092915050565b600060208284031215613d0557600080fd5b6000613d1384828501613a28565b91505092915050565b60008060408385031215613d2f57600080fd5b6000613d3d85828601613a28565b9250506020613d4e8582860161396b565b9150509250929050565b60008060408385031215613d6b57600080fd5b6000613d7985828601613a28565b925050602083013567ffffffffffffffff811115613d9657600080fd5b613da2858286016139aa565b9150509250929050565b60008060408385031215613dbf57600080fd5b6000613dcd85828601613a28565b925050602083013567ffffffffffffffff811115613dea57600080fd5b613df6858286016139d4565b9150509250929050565b600080600080600060a08688031215613e1857600080fd5b6000613e2688828901613a28565b9550506020613e3788828901613a28565b945050604086013567ffffffffffffffff811115613e5457600080fd5b613e6088828901613a7c565b935050606086013567ffffffffffffffff811115613e7d57600080fd5b613e8988828901613a7c565b9250506080613e9a8882890161396b565b9150509295509295909350565b60008060408385031215613eba57600080fd5b6000613ec885828601613a28565b925050602083013567ffffffffffffffff811115613ee557600080fd5b613ef185828601613a7c565b9150509250929050565b600080600060608486031215613f1057600080fd5b6000613f1e86828701613a28565b935050602084013567ffffffffffffffff811115613f3b57600080fd5b613f4786828701613a7c565b9250506040613f588682870161396b565b9150509250925092565b60008060008060008060c08789031215613f7b57600080fd5b6000613f8989828a01613a28565b965050602087013567ffffffffffffffff811115613fa657600080fd5b613fb289828a01613a7c565b955050604087013567ffffffffffffffff811115613fcf57600080fd5b613fdb89828a016139d4565b945050606087013567ffffffffffffffff811115613ff857600080fd5b61400489828a016139aa565b935050608087013567ffffffffffffffff81111561402157600080fd5b61402d89828a01613980565b92505060a087013567ffffffffffffffff81111561404a57600080fd5b61405689828a01613980565b9150509295509295509295565b60006020828403121561407557600080fd5b600061408384828501613b32565b91505092915050565b60006140988383614152565b60208301905092915050565b60006140b0838361417f565b60208301905092915050565b60006140c88383614643565b905092915050565b60006140dc83836146ee565b905092915050565b60006140f08383614758565b905092915050565b60006141048383614d16565b905092915050565b60006141188383614d79565b905092915050565b600061412c8383614ddc565b905092915050565b61413d81615bb7565b82525050565b61414c81615b32565b82525050565b61415b81615b20565b82525050565b61416a81615b20565b82525050565b61417981615b20565b82525050565b61418881615b20565b82525050565b61419f61419a82615b20565b615d40565b82525050565b60006141b082615913565b6141ba81856159a1565b93506141c5836158a4565b8060005b838110156141f65781516141dd888261408c565b97506141e883615960565b9250506001810190506141c9565b5085935050505092915050565b600061420e82615913565b61421881856159b2565b9350614223836158a4565b8060005b8381101561425457815161423b88826140a4565b975061424683615960565b925050600181019050614227565b5085935050505092915050565b8082525050565b60006142738261591e565b61427d81856159c3565b93508360208202850161428f856158b4565b8060005b858110156142cb57848403895281516142ac85826140bc565b94506142b78361596d565b925060208a01995050600181019050614293565b50829750879550505050505092915050565b60006142e88261591e565b6142f281856159d4565b935083602082028501614304856158b4565b8060005b85811015614340578484038952815161432185826140d0565b945061432c8361596d565b925060208a01995050600181019050614308565b50829750879550505050505092915050565b600061435d82615929565b61436781856159c3565b935083602082028501614379856158c4565b8060005b858110156143b45784840389528161439585826140e4565b94506143a08361597a565b925060208a0199505060018101905061437d565b50829750879550505050505092915050565b60006143d182615934565b6143db81856159e5565b9350836020820285016143ed856158d9565b8060005b85811015614429578484038952815161440a85826140f8565b945061441583615987565b925060208a019950506001810190506143f1565b50829750879550505050505092915050565b600061444682615934565b61445081856159f6565b935083602082028501614462856158d9565b8060005b8581101561449e578484038952815161447f858261410c565b945061448a83615987565b925060208a01995050600181019050614466565b50829750879550505050505092915050565b60006144bb8261593f565b6144c581856159e5565b9350836020820285016144d7856158e9565b8060005b85811015614512578484038952816144f38582614120565b94506144fe83615994565b925060208a019950506001810190506144db565b50829750879550505050505092915050565b61452d81615b44565b82525050565b61453c81615b44565b82525050565b61454b81615b44565b82525050565b61455a81615b50565b82525050565b61456981615b50565b82525050565b61458061457b82615b50565b615d52565b82525050565b60006145918261594a565b61459b8185615a07565b93506145ab818560208601615c44565b6145b481615e34565b840191505092915050565b60006145ca8261594a565b6145d48185615a18565b93506145e4818560208601615c44565b80840191505092915050565b6146016145fc82615bc9565b615d40565b82525050565b61461081615bed565b82525050565b61461f81615bed565b82525050565b61462e81615bed565b82525050565b61463d81615bff565b82525050565b600061464e82615955565b6146588185615a23565b9350614668818560208601615c44565b61467181615e34565b840191505092915050565b600061468782615955565b6146918185615a34565b93506146a1818560208601615c44565b6146aa81615e34565b840191505092915050565b60006146c082615955565b6146ca8185615a45565b93506146da818560208601615c44565b6146e381615e34565b840191505092915050565b60006146f982615955565b6147038185615a56565b9350614713818560208601615c44565b61471c81615e34565b840191505092915050565b600061473282615955565b61473c8185615a67565b935061474c818560208601615c44565b80840191505092915050565b6000815461476581615c77565b61476f8186615a23565b9450600182166000811461478a576001811461479c576147cf565b60ff19831686526020860193506147cf565b6147a5856158fe565b60005b838110156147c7578154818901526001820191506020810190506147a8565b808801955050505b50505092915050565b600081546147e581615c77565b6147ef8186615a56565b9450600182166000811461480a576001811461481c5761484f565b60ff198316865260208601935061484f565b614825856158fe565b60005b8381101561484757815481890152600182019150602081019050614828565b808801955050505b50505092915050565b6000614865601483615a34565b91507f5061757361626c653a206e6f74207061757365640000000000000000000000006000830152602082019050919050565b60006148a5601c83615a67565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b60006148e5602683615a34565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061494b601d83615a34565b91507f546869732061646472657373206973206e6f7420616e206f776e65722e0000006000830152602082019050919050565b600061498b601d83615a34565b91507f46756e6374696f6e2063616c6c206e6f74207375636365737366756c6c0000006000830152602082019050919050565b60006149cb601183615a34565b91507f496e76616c6964207369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614a0b601083615a34565b91507f5061757361626c653a20706175736564000000000000000000000000000000006000830152602082019050919050565b6000614a4b602083615a34565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614a8b602183615a34565b91507f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008301527f68000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614af1602383615a34565b91507f596f75206d75737420626520616e206f776e6572206f66207468652070726f6a60008301527f65637400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b57601f83615a34565b91507f546869732061646472657373206973206e6f7420616e20757064617465722e006000830152602082019050919050565b6000614b97601683615a34565b91507f50726f6a65637420616c726561647920657869737473000000000000000000006000830152602082019050919050565b6000614bd7601683615a34565b91507f50726f6a65637420646f6573206e6f74206578697374000000000000000000006000830152602082019050919050565b6000614c17603583615a34565b91507f596f75206d75737420626520616e206f776e6572206f66207468652070726f6a60008301527f65637420746f2075706461746520616374696f6e7300000000000000000000006020830152604082019050919050565b6000614c7d601b83615a34565b91507f43616e207375626d697420757020746f20323020616374696f6e7300000000006000830152602082019050919050565b6000614cbd603e83615a34565b91507f596f75206d7573742062652065697468657220616e206f776e6572206f72206160008301527f6e207570646174657220746f2075736520746869732066756e6374696f6e00006020830152604082019050919050565b60006080830160008301518482036000860152614d338282614643565b9150506020830151614d486020860182614ee6565b506040830151614d5b6040860182614607565b506060830151614d6e6060860182614524565b508091505092915050565b60006080830160008301518482036000860152614d9682826146ee565b9150506020830151614dab6020860182614f04565b506040830151614dbe6040860182614625565b506060830151614dd16060860182614542565b508091505092915050565b60006080830160008084018583036000870152614df98382614758565b92505060018401549050614e0c81615cc3565b614e196020870182614ee6565b5060028401549050614e2a81615ca9565b614e376040870182614607565b50614e4181615cdd565b614e4e6060870182614524565b50819250505092915050565b60006080830160008084018583036000870152614e7783826147d8565b92505060018401549050614e8a81615cc3565b614e976020870182614f04565b5060028401549050614ea881615ca9565b614eb56040870182614625565b50614ebf81615cdd565b614ecc6060870182614542565b50819250505092915050565b8082525050565b8082525050565b614eef81615ba0565b82525050565b614efe81615ba0565b82525050565b614f0d81615ba0565b82525050565b614f24614f1f82615ba0565b615d6e565b82525050565b614f3381615baa565b82525050565b6000614f4582846145bf565b915081905092915050565b6000614f5c82856145bf565b9150614f68828461418e565b6014820191508190509392505050565b6000614f848284614727565b915081905092915050565b6000614f9a82614898565b9150614fa6828461456f565b60208201915081905092915050565b6000614fc18287614f13565b602082019150614fd182866145f0565b601482019150614fe18285614f13565b602082019150614ff182846145bf565b915081905095945050505050565b60006020820190506150146000830184614161565b92915050565b600060208201905061502f6000830184614134565b92915050565b600060608201905061504a6000830186614161565b6150576020830185614143565b81810360408301526150698184614586565b9050949350505050565b6000602082019050818103600083015261508d81846141a5565b905092915050565b600060208201905081810360008301526150af8184614268565b905092915050565b600060208201905081810360008301526150d181846143c6565b905092915050565b60006020820190506150ee6000830184614533565b92915050565b60006040820190506151096000830185614551565b6151166020830184614161565b9392505050565b60006060820190506151326000830186614551565b81810360208301526151448185614268565b905081810360408301526151588184614352565b9050949350505050565b60006040820190506151776000830185614551565b818103602083015261518981846143c6565b90509392505050565b60006060820190506151a76000830186614551565b6151b46020830185614551565b6151c16040830184614161565b949350505050565b6000610120820190506151df600083018c614551565b6151ec602083018b614551565b6151f9604083018a614161565b6152066060830189614ef5565b6152136080830188614ef5565b61522060a0830187614616565b81810360c0830152615232818661467c565b905081810360e0830152615246818561467c565b905081810361010083015261525b8184614352565b90509a9950505050505050505050565b60006060820190506152806000830186614551565b8181036020830152615292818561467c565b905081810360408301526152a68184614352565b9050949350505050565b60006060820190506152c56000830186614551565b81810360208301526152d7818561467c565b90506152e66040830184614634565b949350505050565b60006080820190506153036000830187614551565b6153106020830186614f2a565b61531d6040830185614551565b61532a6060830184614551565b95945050505050565b6000602082019050818103600083015261534d8184614586565b905092915050565b600060c082019050818103600083015261536f818961467c565b905061537e6020830188614161565b818103604083015261539081876144b0565b905081810360608301526153a48186614268565b905081810360808301526153b881856141a5565b905081810360a08301526153cc81846141a5565b9050979650505050505050565b600060208201905081810360008301526153f281614858565b9050919050565b60006020820190508181036000830152615412816148d8565b9050919050565b600060208201905081810360008301526154328161493e565b9050919050565b600060208201905081810360008301526154528161497e565b9050919050565b60006020820190508181036000830152615472816149be565b9050919050565b60006020820190508181036000830152615492816149fe565b9050919050565b600060208201905081810360008301526154b281614a3e565b9050919050565b600060208201905081810360008301526154d281614a7e565b9050919050565b600060208201905081810360008301526154f281614ae4565b9050919050565b6000602082019050818103600083015261551281614b4a565b9050919050565b6000602082019050818103600083015261553281614b8a565b9050919050565b6000602082019050818103600083015261555281614bca565b9050919050565b6000602082019050818103600083015261557281614c0a565b9050919050565b6000602082019050818103600083015261559281614c70565b9050919050565b600060208201905081810360008301526155b281614cb0565b9050919050565b60006040820190506155ce6000830185614ed8565b6155db6020830184614170565b9392505050565b6000610100820190506155f8600083018b614ed8565b615605602083018a614261565b6156126040830189614560565b818103606083015261562481886146b5565b90508181036080830152615638818761443b565b905081810360a083015261564c81866142dd565b905081810360c08301526156608185614203565b905081810360e08301526156748184614203565b90509998505050505050505050565b60006040820190506156986000830185614ed8565b81810360208301526156aa81846142dd565b90509392505050565b60006040820190506156c86000830185614ed8565b81810360208301526156da818461443b565b90509392505050565b600060a0820190506156f86000830188614ed8565b6157056020830187614560565b6157126040830186614edf565b81810360608301526157248185614e5a565b9050818103608083015261573881846146b5565b90509695505050505050565b60006040820190506157596000830185614ed8565b818103602083015261576b81846146b5565b90509392505050565b60006020820190506157896000830184614ef5565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157b6576157b5615e05565b5b8060405250919050565b600067ffffffffffffffff8211156157db576157da615e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561580757615806615e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561583357615832615e05565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561585f5761585e615e05565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561588f5761588e615e05565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081549050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000600182019050919050565b6000602082019050919050565b6000600382019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615a7d82615ba0565b9150615a8883615ba0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615abd57615abc615d78565b5b828201905092915050565b6000615ad382615ba0565b9150615ade83615ba0565b925082821015615af157615af0615d78565b5b828203905092915050565b600060ff82169050919050565b600060ff82169050919050565b6000819050919050565b6000615b2b82615b80565b9050919050565b6000615b3d82615b80565b9050919050565b60008115159050919050565b6000819050919050565b6000819050615b6882615e6c565b919050565b6000819050615b7b82615e80565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615bc282615c11565b9050919050565b6000615bd482615bdb565b9050919050565b6000615be682615b80565b9050919050565b6000615bf882615b5a565b9050919050565b6000615c0a82615b6d565b9050919050565b6000615c1c82615c23565b9050919050565b6000615c2e82615b80565b9050919050565b82818337600083830152505050565b60005b83811015615c62578082015181840152602081019050615c47565b83811115615c71576000848401525b50505050565b60006002820490506001821680615c8f57607f821691505b60208210811415615ca357615ca2615dd6565b5b50919050565b6000615cbc615cb783615e52565b615b09565b9050919050565b6000615cd6615cd183615e52565b615b16565b9050919050565b6000615cf0615ceb83615e5f565b615afc565b9050919050565b6000615d0282615ba0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615d3557615d34615d78565b5b600182019050919050565b6000615d4b82615d5c565b9050919050565b6000819050919050565b6000615d6782615e45565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160001c9050919050565b60008160081c9050919050565b60028110615e7d57615e7c615da7565b5b50565b60038110615e9157615e90615da7565b5b50565b615e9d81615b20565b8114615ea857600080fd5b50565b615eb481615b44565b8114615ebf57600080fd5b50565b615ecb81615b50565b8114615ed657600080fd5b50565b60028110615ee657600080fd5b50565b615ef281615ba0565b8114615efd57600080fd5b50565b615f0981615baa565b8114615f1457600080fd5b5056fea264697066735822122024e3031b562fab4dff039fd8de531017fda18a47d73390a6a358e91b20c98e7a64736f6c63430008000033

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.