Contract 0x9A85A2B1Ee51444c596Cb0986a2a65BCcF296bAf

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x0587c35b642bcc305b65437925986cfeb355739f62c2efb16d22163b42c03d2c0x611e5461163283422022-06-21 14:01:5797 days 2 hrs agoYield Yak: Deployer IN  Create: GeodeUtils0 AVAX0.05708594133
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading
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:
GeodeUtils

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : GeodeUtilsLib.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.7;
import "./DataStoreLib.sol";

/**
 * @title GeodeUtils library
 * @notice Exclusively contains functions responsible for administration of Geode Portal,
 * including functions related to "limited upgradability" with Senate & porposals.
 * @dev Contracts relying on this library must initialize GeodeUtils.Universe
 * @dev ALL "fee" variables are limited by FEE_DENOMINATOR = 100%
 * @dev Admin functions are already protected.
 * Note that this library contains both functions called by users(ID) and admins(GOVERNANCE, SENATE )
 * Note refer to DataStoreUtils before reviewing
 */
library GeodeUtils {
  using DataStoreUtils for DataStoreUtils.DataStore;

  event OperationFeeUpdated(uint256 newFee);
  event MaxOperationFeeUpdated(uint256 newMaxFee);
  event ControllerChanged(uint256 id, address newCONTROLLER);
  event Proposed(
    uint256 id,
    address _CONTROLLER,
    uint256 _type,
    uint256 _duration
  );
  event ProposalApproved(uint256 id);
  event NewElectorType(uint256 _type);
  event Vote(uint256 proposalId, uint256 electorId);
  event NewSenate(address senate, uint256 senate_expire_timestamp);

  /**

   * @notice Proposal basically refers to give the control of an ID to a CONTROLLER.
   *
   * @notice A Proposal has 4 specs:
   * @param TYPE: seperates the proposals and related functionality between different ID types.
   * * RESERVED TYPES on GeodeUtils:
   * * * TYPE 0: inactive
   * * * TYPE 1: Senate: controls state of governance, contract updates and other members of A Universe
   * * * TYPE 2: Upgrade: address of the implementation for desired contract upgrade
   * * * TYPE 3: **gap** : formally it represented the admin contract, however since UUPS is being used as a upgrade path,
   * this TYPE is now reserved to make it easier for secondary contracts to add their own type.
   *
   * @param name: id is created by keccak(name)
   *
   * @param CONTROLLER: the address that refers to the change that is proposed by given proposal ID.
   * * This slot can be given the control of an id to a user, a new implementation contract, a new Senate etc.
   *
   * @param deadline: refers to last timestamp until a proposal expires, limited by MAX_PROPOSAL_DURATION
   * * Expired proposals can not be approved by Senate
   * * Expired proposals can be overriden by new proposals
   **/
  struct Proposal {
    address CONTROLLER;
    uint256 TYPE;
    uint256 deadline;
    bytes name;
  }
  /**
   * @notice Universe is A blockchain. In this case, it defines Avalanche
   * @param GOVERNANCE a community that works to improve the core product and ensures its adoption in the DeFi ecosystem
   * Suggests updates, such as new planets, operators, contract upgrades and new Senate, on the Ecosystem _without any permissions to force them_
   * @param SENATE An address that controls the state of governance, updates and other users in the Geode Ecosystem
   * Note SENATE is proposed by Governance and voted by all planets, if 2/3 approves.
   * @param OPERATION_FEE operation fee of the given contract, acquired by GOVERNANCE. Limited by MAX_OPERATION_FEE
   * @param MAX_OPERATION_FEE set by SENATE, limited by FEE_DENOMINATOR
   * @param FEE_DENOMINATOR represents 100%
   * @param SENATE_EXPIRE_TIMESTAMP refers to the last timestamp that SENATE can continue operating. Enforces a new election, limited by MAX_SENATE_PERIOD
   * @param approvedUpgrade only 1(one) implementation contract can be "approved" at any given time. @dev Should set to address(0) after every upgrade
   * @param _electorCount increased when a new id is added with _electorTypes[id] == true
   * @param _electorTypes only given types can vote @dev must only be used at upgrades.
   * @param _proposalForId proposals are kept seperately instead of setting the parameters of id in DATASTORE, and then setting it's type; to allowe surpassing type checks to save gas cost
   **/
  struct Universe {
    address SENATE;
    address GOVERNANCE;
    uint256 OPERATION_FEE;
    uint256 MAX_OPERATION_FEE;
    uint256 FEE_DENOMINATOR;
    uint256 SENATE_EXPIRE_TIMESTAMP;
    address approvedUpgrade;
    uint256 _electorCount;
    mapping(uint256 => bool) _electorTypes;
    mapping(uint256 => Proposal) _proposalForId;
  }

  uint32 public constant MIN_PROPOSAL_DURATION = 1 days;
  uint32 public constant MAX_PROPOSAL_DURATION = 1 weeks;
  uint32 public constant MAX_SENATE_PERIOD = 730 days; // 2 years

  modifier onlySenate(Universe storage self) {
    require(msg.sender == self.SENATE, "GeodeUtils: SENATE role needed");
    require(
      block.timestamp < self.SENATE_EXPIRE_TIMESTAMP,
      "GeodeUtils: SENATE not active"
    );
    _;
  }

  /**
   *                                         ** UNIVERSE GETTERS **
   **/

  /// @return the address of SENATE
  function getSenate(Universe storage self) public view returns (address) {
    return self.SENATE;
  }

  /// @return the address of GOVERNANCE
  function getGovernance(Universe storage self) public view returns (address) {
    return self.GOVERNANCE;
  }

  /// @notice MAX_OPERATION_FEE must limit OPERATION_FEE even if MAX is changed
  /// @return active OPERATION_FEE; limited by MAX_OPERATION_FEE
  function getOperationFee(Universe storage self)
    public
    view
    returns (uint256)
  {
    return
      self.OPERATION_FEE > self.MAX_OPERATION_FEE
        ? self.MAX_OPERATION_FEE
        : self.OPERATION_FEE;
  }

  /// @return MAX_OPERATION_FEE
  function getMaxOperationFee(Universe storage self)
    public
    view
    returns (uint256)
  {
    return self.MAX_OPERATION_FEE;
  }

  /// @return the expiration date of current SENATE as a timestamp
  function getSenateExpireTimestamp(Universe storage self)
    public
    view
    returns (uint256)
  {
    return self.SENATE_EXPIRE_TIMESTAMP;
  }

  /**
   *                                         ** UNIVERSE SETTERS **
   */

  /// @return true if the operation was succesful, might be helpful when governance rights are distributed
  /// @dev can not set a fee more than MAX
  /// @dev no need to check FEE_DENOMINATOR
  function setOperationFee(Universe storage self, uint256 _newFee)
    external
    returns (bool)
  {
    require(_newFee <= self.MAX_OPERATION_FEE, "GeodeUtils: fee more than MAX");
    self.OPERATION_FEE = _newFee;
    emit OperationFeeUpdated(_newFee);
    return true;
  }

  /// @return true if the operation was succesful
  /// @dev can not set a fee more than FEE_DENOMINATOR (100%)
  function setMaxOperationFee(Universe storage self, uint256 _newMaxFee)
    external
    onlySenate(self)
    returns (bool)
  {
    require(
      _newMaxFee <= self.FEE_DENOMINATOR,
      "GeodeUtils: fee more than 100%"
    );
    self.MAX_OPERATION_FEE = _newMaxFee;
    emit MaxOperationFeeUpdated(_newMaxFee);
    return true;
  }

  /**
  @notice only the current CONTROLLER can change
  @dev this operation can not be reverted by old CONTROLLER
  @dev in case the current controller wants to remove the 
  need to upgrade to NO Controller they should provide smt like 0x0..dead
   */
  function changeIdCONTROLLER(
    DataStoreUtils.DataStore storage _DATASTORE,
    uint256 id,
    address newCONTROLLER
  ) external {
    require(
      newCONTROLLER != address(0),
      "GeodeUtils: CONTROLLER can not be zero"
    );
    require(
      _DATASTORE.readAddressForId(id, "CONTROLLER") == msg.sender,
      "GeodeUtils: not CONTROLLER of given id"
    );
    _DATASTORE.writeAddressForId(id, "CONTROLLER", newCONTROLLER);
    emit ControllerChanged(id, newCONTROLLER);
  }

  /**
   *                                          ** PROPOSALS **
   */

  /**
   * CONTROLLER Proposals
   */

  function getProposal(Universe storage self, uint256 id)
    external
    view
    returns (Proposal memory)
  {
    return self._proposalForId[id];
  }

  /**
   * @notice to ensure the flexibility of Governance-less upgrades in the future, Anyone can create a Proposal.
   * @notice a proposal can be overriden if: expired OR approved. DATASTORE(id) will not be overriden until the proposal is approved.
   * @dev refer to structure of Proposal for explanations of params
   */
  function newProposal(
    Universe storage self,
    address _CONTROLLER,
    uint256 _type,
    uint256 _duration,
    bytes calldata _name
  ) external {
    require(
      _duration >= MIN_PROPOSAL_DURATION,
      "GeodeUtils: duration should be higher than min value"
    );
    require(_duration <= MAX_PROPOSAL_DURATION, "GeodeUtils: duration exceeds");
    uint256 id = uint256(keccak256(abi.encodePacked(_name)));
    require(
      self._proposalForId[id].deadline < block.timestamp,
      "GeodeUtils: name already proposed"
    );
    self._proposalForId[id] = Proposal({
      CONTROLLER: _CONTROLLER,
      TYPE: _type,
      deadline: block.timestamp + _duration,
      name: _name
    });
    emit Proposed(id, _CONTROLLER, _type, _duration);
  }

  /**
   *  @notice type specific changes for reserved_types(1,2,3) are implemented here,
   *  any other addition should take place in Portal, as not related
   *  @param id given ID proposal that has been approved by Senate
   *  @dev Senate should not be able to approve expired proposals
   *  @dev Senate should not be able to approve SENATE proposals :)
   */
  function approveProposal(
    Universe storage self,
    DataStoreUtils.DataStore storage _DATASTORE,
    uint256 id
  ) external onlySenate(self) {
    require(
      self._proposalForId[id].deadline >= block.timestamp,
      "GeodeUtils: proposal expired"
    );
    require(
      self._proposalForId[id].TYPE != 1,
      "GeodeUtils: Senate can not approve Senate Proposal"
    );
    _DATASTORE.writeBytesForId(id, "name", self._proposalForId[id].name);
    _DATASTORE.writeAddressForId(
      id,
      "CONTROLLER",
      self._proposalForId[id].CONTROLLER
    );
    _DATASTORE.writeUintForId(id, "TYPE", self._proposalForId[id].TYPE);
    _DATASTORE.allIdsByType[self._proposalForId[id].TYPE].push(id);

    if (self._proposalForId[id].TYPE == 2) {
      self.approvedUpgrade = self._proposalForId[id].CONTROLLER;
    }
    self._proposalForId[id].deadline = block.timestamp;
    if (self._electorTypes[_DATASTORE.readUintForId(id, "TYPE")])
      self._electorCount += 1;
    emit ProposalApproved(id);
  }

  /**
   * SENATE Proposals
   */

  /**
   * @notice only selected types can vote for senate
   * @param _type selected type
   * @param _isElector true if selected _type can vote for senate from now on
   * @dev can not set with the same value again, preventing double increment/decrements
   */
  function setElectorType(
    Universe storage self,
    DataStoreUtils.DataStore storage _DATASTORE,
    uint256 _type,
    bool _isElector
  ) external {
    require(
      self._electorTypes[_type] != _isElector,
      "GeodeUtils: type already _isElector"
    );
    require(
      _type != 0 && _type != 1 && _type != 2 && _type != 3,
      "GeodeUtils: 0, Senate, Upgrade, ProxyAdmin cannot be elector!"
    );
    self._electorTypes[_type] = _isElector;
    if (_isElector) {
      self._electorCount += _DATASTORE.allIdsByType[_type].length;
    } else {
      self._electorCount -= _DATASTORE.allIdsByType[_type].length;
    }
    emit NewElectorType(_type);
  }

  /**
   * @notice Proposed CONTROLLER is the new Senate after 2/3 of the electors are approved
   * NOTE mathematically, min 4 elector is needed for (c+1)*2/3 to work properly
   * @notice id can not vote if:
   *- approved already
   *- not its type is not elector
   *- not proposal is expired
   *- not senate proposal
   * @param electorId should have the voting rights, msg.sender should be the CONTROLLER of given ID
   * @dev pins id as "voted" when approved
   * @dev increases "approvalCount" of proposalId by 1 when approved
   */
  function approveSenate(
    Universe storage self,
    DataStoreUtils.DataStore storage _DATASTORE,
    uint256 proposalId,
    uint256 electorId
  ) external {
    require(
      self._proposalForId[proposalId].TYPE == 1,
      "GeodeUtils: NOT Senate Proposal"
    );
    require(
      self._proposalForId[proposalId].deadline >= block.timestamp,
      "GeodeUtils: proposal expired"
    );
    require(
      _DATASTORE.readAddressForId(electorId, "CONTROLLER") == msg.sender,
      "GeodeUtils: msg.sender should be CONTROLLER of given electorId!"
    );
    require(
      self._electorTypes[_DATASTORE.readUintForId(electorId, "TYPE")],
      "GeodeUtils: NOT an elector"
    );
    require(
      _DATASTORE.readUintForId(
        proposalId,
        bytes32(keccak256(abi.encodePacked(electorId, "voted")))
      ) == 0,
      " GeodeUtils: already approved"
    );
    _DATASTORE.writeUintForId(
      proposalId,
      bytes32(keccak256(abi.encodePacked(electorId, "voted"))),
      1
    );
    emit Vote(proposalId, electorId);
    _DATASTORE.writeUintForId(
      proposalId,
      "approvalCount",
      _DATASTORE.readUintForId(proposalId, "approvalCount") + 1
    );
    if (
      _DATASTORE.readUintForId(proposalId, "approvalCount") >=
      ((self._electorCount + 1) * 2) / 3
    ) {
      self.SENATE = self._proposalForId[proposalId].CONTROLLER;
      self._proposalForId[proposalId].deadline = block.timestamp;
      self.SENATE_EXPIRE_TIMESTAMP = block.timestamp + MAX_SENATE_PERIOD; // 2 years
      emit NewSenate(self.SENATE, self.SENATE_EXPIRE_TIMESTAMP);
    }
  }

  /**
   * @notice Get if it is allowed to change a specific contract with the current version.
   * @return True if it is allowed by senate and false if not.
   * @dev address(0) should return false
   **/
  function isUpgradeAllowed(
    Universe storage self,
    address proposed_implementation
  ) external view returns (bool) {
    return
      self.approvedUpgrade != address(0) &&
      self.approvedUpgrade == proposed_implementation;
  }
}

File 2 of 2 : DataStoreLib.sol
// SPDX-License-Identifier: MIT

pragma solidity =0.8.7;

/**
 * @title Storage Management library for dynamic structs based on data types
 *
 * DataStoreUtils is a storage management tool designed to create a safe and scalable
 * storage layout with the help of ids and keys.
 * Mainly focusing on upgradable contracts with multiple user types to create a
 * sustainable development environment.
 *
 * In summary, extra gas cost that would be saved with Storage packing are
 * ignored to create upgradable structs.
 *
 * IDs are the representation of a user with any given key as properties.
 * Type for ID is not mandatory, not all IDs should have an explicit type.
 * Thus there is no checks of types or keys.
 *
 * @notice distinct id and key pairs return different storage slots
 *
 */
library DataStoreUtils {
  /**
   * @notice Main Struct for reading and writing data to storage for given id+key pairs
   * @param allIdsByType optional categorization for given ID, requires direct access, type => id[]
   * @param uintData keccak(id, key) =>  returns uint256
   * @param bytesData keccak(id, key) => returns bytes
   * @param addressData keccak(id, key) =>  returns address
   * NOTE any other storage type can be expressed as bytes
   */
  struct DataStore {
    mapping(uint256 => uint256[]) allIdsByType;
    mapping(bytes32 => uint256) uintData;
    mapping(bytes32 => bytes) bytesData;
    mapping(bytes32 => address) addressData;
  }

  /**
   * **DATA GETTERS **
   **/
  function readUintForId(
    DataStore storage self,
    uint256 _id,
    bytes32 _key
  ) public view returns (uint256 data) {
    data = self.uintData[keccak256(abi.encodePacked(_id, _key))];
  }

  function readBytesForId(
    DataStore storage self,
    uint256 _id,
    bytes32 _key
  ) public view returns (bytes memory data) {
    data = self.bytesData[keccak256(abi.encodePacked(_id, _key))];
  }

  function readAddressForId(
    DataStore storage self,
    uint256 _id,
    bytes32 _key
  ) public view returns (address data) {
    data = self.addressData[keccak256(abi.encodePacked(_id, _key))];
  }

  /**
   * **DATA SETTERS **
   **/
  function writeUintForId(
    DataStore storage self,
    uint256 _id,
    bytes32 _key,
    uint256 data
  ) public {
    self.uintData[keccak256(abi.encodePacked(_id, _key))] = data;
  }

  function writeBytesForId(
    DataStore storage self,
    uint256 _id,
    bytes32 _key,
    bytes memory data
  ) public {
    self.bytesData[keccak256(abi.encodePacked(_id, _key))] = data;
  }

  function writeAddressForId(
    DataStore storage self,
    uint256 _id,
    bytes32 _key,
    address data
  ) public {
    self.addressData[keccak256(abi.encodePacked(_id, _key))] = data;
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {
    "contracts/Portal/utils/DataStoreLib.sol": {
      "DataStoreUtils": "0xc7332d9abef755c42b4df9d9db09beef15f8f9fb"
    }
  }
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"newCONTROLLER","type":"address"}],"name":"ControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxFee","type":"uint256"}],"name":"MaxOperationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"}],"name":"NewElectorType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"senate","type":"address"},{"indexed":false,"internalType":"uint256","name":"senate_expire_timestamp","type":"uint256"}],"name":"NewSenate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"OperationFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ProposalApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_CONTROLLER","type":"address"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"Proposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"electorId","type":"uint256"}],"name":"Vote","type":"event"},{"inputs":[],"name":"MAX_PROPOSAL_DURATION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SENATE_PERIOD","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_PROPOSAL_DURATION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"}]

611e5461003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106101155760003560e01c806353803de4116100ac578063b21f21881161007b578063b21f2188146102a1578063bd968216146102ac578063d115f195146102b6578063f00d779d146102d6578063fe70c9aa146102f457600080fd5b806353803de41461023a5780635fff75171461024f578063833520141461026f578063944ee22d1461028257600080fd5b80633c197afe116100e85780633c197afe146101a457806343dbfc05146101c75780634b61f9fe146101e75780634e9130821461020757600080fd5b80630bf249b81461011a5780630bf8c88e1461013c578063105835b01461015c5780633680b4071461017c575b600080fd5b81801561012657600080fd5b5061013a6101353660046119b9565b610314565b005b81801561014857600080fd5b5061013a610157366004611a3b565b610534565b81801561016857600080fd5b5061013a610177366004611b08565b6107b3565b61018f61018a366004611a0b565b61097a565b60405190151581526020015b60405180910390f35b6101b96101b23660046119f2565b6003015490565b60405190815260200161019b565b8180156101d357600080fd5b5061018f6101e2366004611b80565b6109af565b8180156101f357600080fd5b5061013a610202366004611adc565b610af8565b6102226102153660046119f2565b546001600160a01b031690565b6040516001600160a01b03909116815260200161019b565b6101b96102483660046119f2565b6005015490565b81801561025b57600080fd5b5061013a61026a366004611b4e565b610fab565b6101b961027d3660046119f2565b61172c565b61028c6201518081565b60405163ffffffff909116815260200161019b565b61028c6303c2670081565b61028c62093a8081565b6102c96102c4366004611b80565b611753565b60405161019b9190611cc2565b6102226102e43660046119f2565b600101546001600160a01b031690565b81801561030057600080fd5b5061018f61030f366004611b80565b61186a565b6001600160a01b03811661037e5760405162461bcd60e51b815260206004820152602660248201527f47656f64655574696c733a20434f4e54524f4c4c45522063616e206e6f74206260448201526565207a65726f60d01b60648201526084015b60405180910390fd5b604051630143c90b60e71b815260048101849052602481018390526921a7a72a2927a62622a960b11b6044820152339073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063a1e485809060640160206040518083038186803b1580156103e557600080fd5b505af41580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d919061199c565b6001600160a01b0316146104825760405162461bcd60e51b815260206004820152602660248201527f47656f64655574696c733a206e6f7420434f4e54524f4c4c4552206f662067696044820152651d995b881a5960d21b6064820152608401610375565b60405163dff34ff160e01b815273c7332d9abef755c42b4df9d9db09beef15f8f9fb9063dff34ff1906104bd90869086908690600401611c90565b60006040518083038186803b1580156104d557600080fd5b505af41580156104e9573d6000803e3d6000fd5b5050604080518581526001600160a01b03851660208201527ff0d0c255199b45799d6fd3623dce5e99a7cb09d662754eff92d8d0e73a537f0a935001905060405180910390a1505050565b620151808310156105a45760405162461bcd60e51b815260206004820152603460248201527f47656f64655574696c733a206475726174696f6e2073686f756c6420626520686044820152736967686572207468616e206d696e2076616c756560601b6064820152608401610375565b62093a808311156105f75760405162461bcd60e51b815260206004820152601c60248201527f47656f64655574696c733a206475726174696f6e2065786365656473000000006044820152606401610375565b6000828260405160200161060c929190611bbb565b60408051601f198184030181529181528151602092830120600081815260098b0190935291206002015490915042116106915760405162461bcd60e51b815260206004820152602160248201527f47656f64655574696c733a206e616d6520616c72656164792070726f706f73656044820152601960fa1b6064820152608401610375565b6040518060800160405280876001600160a01b0316815260200186815260200185426106bd9190611d45565b815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093909452505083815260098a016020908152604091829020845181546001600160a01b0319166001600160a01b03909116178155848201516001820155918401516002830155606084015180519293506107579260038501929190910190611903565b5050604080518381526001600160a01b0389166020820152908101879052606081018690527fb56e333cd6082a862942820ad6871b5a17d922a7506ff536fc0830784a46b2c6915060800160405180910390a150505050505050565b600082815260088501602052604090205460ff16151581151514156108265760405162461bcd60e51b815260206004820152602360248201527f47656f64655574696c733a207479706520616c7265616479205f6973456c65636044820152623a37b960e91b6064820152608401610375565b8115801590610836575081600114155b8015610843575081600214155b8015610850575081600314155b6108c25760405162461bcd60e51b815260206004820152603d60248201527f47656f64655574696c733a20302c2053656e6174652c20557067726164652c2060448201527f50726f787941646d696e2063616e6e6f7420626520656c6563746f72210000006064820152608401610375565b60008281526008850160205260409020805460ff19168215801591909117909155610916576000828152602084905260408120546007860180549192909161090b908490611d45565b909155506109409050565b6000828152602084905260408120546007860180549192909161093a908490611d9e565b90915550505b6040518281527f0f38b759dc57634790a94ef0592a9330e1e884cab0d4b6427e8c9bc6beabad90906020015b60405180910390a150505050565b60068201546000906001600160a01b0316158015906109a8575060068301546001600160a01b038381169116145b9392505050565b815460009083906001600160a01b03163314610a0d5760405162461bcd60e51b815260206004820152601e60248201527f47656f64655574696c733a2053454e41544520726f6c65206e656564656400006044820152606401610375565b80600501544210610a605760405162461bcd60e51b815260206004820152601d60248201527f47656f64655574696c733a2053454e415445206e6f74206163746976650000006044820152606401610375565b8360040154831115610ab45760405162461bcd60e51b815260206004820152601e60248201527f47656f64655574696c733a20666565206d6f7265207468616e203130302500006044820152606401610375565b600384018390556040518381527f6375dc670be4b258879f3cfb65ade243a534088c4b7474f291ed54499edacb819060200160405180910390a15060019392505050565b825483906001600160a01b03163314610b535760405162461bcd60e51b815260206004820152601e60248201527f47656f64655574696c733a2053454e41544520726f6c65206e656564656400006044820152606401610375565b80600501544210610ba65760405162461bcd60e51b815260206004820152601d60248201527f47656f64655574696c733a2053454e415445206e6f74206163746976650000006044820152606401610375565b6000828152600985016020526040902060020154421115610c095760405162461bcd60e51b815260206004820152601c60248201527f47656f64655574696c733a2070726f706f73616c2065787069726564000000006044820152606401610375565b600082815260098501602052604090206001908101541415610c885760405162461bcd60e51b815260206004820152603260248201527f47656f64655574696c733a2053656e6174652063616e206e6f7420617070726f6044820152711d994814d95b985d1948141c9bdc1bdcd85b60721b6064820152608401610375565b6000828152600985016020526040908190209051630eee4dd960e41b815273c7332d9abef755c42b4df9d9db09beef15f8f9fb9163eee4dd9091610cd6918791879160030190600401611bcb565b60006040518083038186803b158015610cee57600080fd5b505af4158015610d02573d6000803e3d6000fd5b50505060008381526009860160205260409081902054905163dff34ff160e01b815273c7332d9abef755c42b4df9d9db09beef15f8f9fb925063dff34ff191610d5d91879187916001600160a01b0390911690600401611c90565b60006040518083038186803b158015610d7557600080fd5b505af4158015610d89573d6000803e3d6000fd5b5050506000838152600986016020526040908190206001015490516223bfa960ea1b81526004810186905260248101859052635459504560e01b6044820152606481019190915273c7332d9abef755c42b4df9d9db09beef15f8f9fb9150638efea4009060840160006040518083038186803b158015610e0857600080fd5b505af4158015610e1c573d6000803e3d6000fd5b5050506000838152600986016020818152604080842060019081018054865289845291852080549182018155855282852001879055928690525254600214159050610e945760008281526009850160205260409020546006850180546001600160a01b0319166001600160a01b039092169190911790555b6000828152600985016020526040808220426002909101555163f237bab360e01b81526004810185905260248101849052635459504560e01b604482015260088601919073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063f237bab39060640160206040518083038186803b158015610f0f57600080fd5b505af4158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f479190611ba2565b815260208101919091526040016000205460ff1615610f7b576001846007016000828254610f759190611d45565b90915550505b6040518281527f28ec9e38ba73636ceb2f6c1574136f83bd46284a3c74734b711bf45e12f8d9299060200161096c565b600082815260098501602052604090206001908101541461100e5760405162461bcd60e51b815260206004820152601f60248201527f47656f64655574696c733a204e4f542053656e6174652050726f706f73616c006044820152606401610375565b60008281526009850160205260409020600201544211156110715760405162461bcd60e51b815260206004820152601c60248201527f47656f64655574696c733a2070726f706f73616c2065787069726564000000006044820152606401610375565b604051630143c90b60e71b815260048101849052602481018290526921a7a72a2927a62622a960b11b6044820152339073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063a1e485809060640160206040518083038186803b1580156110d857600080fd5b505af41580156110ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611110919061199c565b6001600160a01b03161461118c5760405162461bcd60e51b815260206004820152603f60248201527f47656f64655574696c733a206d73672e73656e6465722073686f756c6420626560448201527f20434f4e54524f4c4c4552206f6620676976656e20656c6563746f72496421006064820152608401610375565b60405163f237bab360e01b81526004810184905260248101829052635459504560e01b6044820152600885019060009073c7332d9abef755c42b4df9d9db09beef15f8f9fb9063f237bab39060640160206040518083038186803b1580156111f357600080fd5b505af4158015611207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122b9190611ba2565b815260208101919091526040016000205460ff1661128b5760405162461bcd60e51b815260206004820152601a60248201527f47656f64655574696c733a204e4f5420616e20656c6563746f720000000000006044820152606401610375565b8273c7332d9abef755c42b4df9d9db09beef15f8f9fb63f237bab3909184846040516020016112ca918152641d9bdd195960da1b602082015260250190565b604051602081830303815290604052805190602001206040518463ffffffff1660e01b815260040161130f939291909283526020830191909152604082015260600190565b60206040518083038186803b15801561132757600080fd5b505af415801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f9190611ba2565b156113ac5760405162461bcd60e51b815260206004820152601d60248201527f2047656f64655574696c733a20616c726561647920617070726f7665640000006044820152606401610375565b8273c7332d9abef755c42b4df9d9db09beef15f8f9fb638efea400909184846040516020016113eb918152641d9bdd195960da1b602082015260250190565b6040516020818303038152906040528051906020012060016040518563ffffffff1660e01b8152600401611438949392919093845260208401929092526040830152606082015260800190565b60006040518083038186803b15801561145057600080fd5b505af4158015611464573d6000803e3d6000fd5b505060408051858152602081018590527f33952ef907843fd2ddd118a92dd935debf65b72965a557a364ea08deffca032f935001905060405180910390a160405163f237bab360e01b815260048101849052602481018390526c185c1c1c9bdd985b10dbdd5b9d609a1b604482015273c7332d9abef755c42b4df9d9db09beef15f8f9fb90638efea4009085908590849063f237bab39060640160206040518083038186803b15801561151657600080fd5b505af415801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611ba2565b611559906001611d45565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526c185c1c1c9bdd985b10dbdd5b9d609a1b6044830152606482015260840160006040518083038186803b1580156115b357600080fd5b505af41580156115c7573d6000803e3d6000fd5b505050506003846007015460016115de9190611d45565b6115e9906002611d7f565b6115f39190611d5d565b60405163f237bab360e01b815260048101859052602481018490526c185c1c1c9bdd985b10dbdd5b9d609a1b604482015273c7332d9abef755c42b4df9d9db09beef15f8f9fb9063f237bab39060640160206040518083038186803b15801561165b57600080fd5b505af415801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190611ba2565b106117265760008281526009850160205260409020805485546001600160a01b0319166001600160a01b039091161785554260029091018190556116dc906303c2670090611d45565b600585018190558454604080516001600160a01b03909216825260208201929092527f3f34afe456fb5b36c04b5d1e2ef0750086747ac542262fbf14a0b1aae5fd7ee8910161096c565b50505050565b6000816003015482600201541161174757816002015461174d565b81600301545b92915050565b611787604051806080016040528060006001600160a01b031681526020016000815260200160008152602001606081525090565b6000828152600984016020908152604091829020825160808101845281546001600160a01b031681526001820154928101929092526002810154928201929092526003820180549192916060840191906117e090611db5565b80601f016020809104026020016040519081016040528092919081815260200182805461180c90611db5565b80156118595780601f1061182e57610100808354040283529160200191611859565b820191906000526020600020905b81548152906001019060200180831161183c57829003601f168201915b505050505081525050905092915050565b600082600301548211156118c05760405162461bcd60e51b815260206004820152601d60248201527f47656f64655574696c733a20666565206d6f7265207468616e204d41580000006044820152606401610375565b600283018290556040518281527fdc0a11b3afd9d2b87730bfe9e9101cd69a837b27ae7237f688776960dcb609d29060200160405180910390a150600192915050565b82805461190f90611db5565b90600052602060002090601f0160209004810192826119315760008555611977565b82601f1061194a57805160ff1916838001178555611977565b82800160010185558215611977579182015b8281111561197757825182559160200191906001019061195c565b50611983929150611987565b5090565b5b808211156119835760008155600101611988565b6000602082840312156119ae57600080fd5b81516109a881611e06565b6000806000606084860312156119ce57600080fd5b833592506020840135915060408401356119e781611e06565b809150509250925092565b600060208284031215611a0457600080fd5b5035919050565b60008060408385031215611a1e57600080fd5b823591506020830135611a3081611e06565b809150509250929050565b60008060008060008060a08789031215611a5457600080fd5b863595506020870135611a6681611e06565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611a9157600080fd5b818901915089601f830112611aa557600080fd5b813581811115611ab457600080fd5b8a6020828501011115611ac657600080fd5b6020830194508093505050509295509295509295565b600080600060608486031215611af157600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215611b1e57600080fd5b84359350602085013592506040850135915060608501358015158114611b4357600080fd5b939692955090935050565b60008060008060808587031215611b6457600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9357600080fd5b50508035926020909101359150565b600060208284031215611bb457600080fd5b5051919050565b8183823760009101908152919050565b838152600060208481840152636e616d6560e01b6040840152608060608401526000845481600182811c915080831680611c0657607f831692505b858310811415611c2457634e487b7160e01b85526022600452602485fd5b6080880183905260a08801818015611c435760018114611c5457611c7f565b60ff19861682528782019650611c7f565b60008b81526020902060005b86811015611c7957815484820152908501908901611c60565b83019750505b50949b9a5050505050505050505050565b92835260208301919091526921a7a72a2927a62622a960b11b60408301526001600160a01b0316606082015260800190565b6000602080835260018060a01b038451168184015280840151604084015260408401516060840152606084015160808085015280518060a086015260005b81811015611d1c5782810184015186820160c001528301611d00565b81811115611d2e57600060c083880101525b50601f01601f19169390930160c001949350505050565b60008219821115611d5857611d58611df0565b500190565b600082611d7a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611d9957611d99611df0565b500290565b600082821015611db057611db0611df0565b500390565b600181811c90821680611dc957607f821691505b60208210811415611dea57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611e1b57600080fd5b5056fea2646970667358221220a61f598da28afb683f60bd99d059deec8dcd68096f4e0bd267d10c807bfca66764736f6c63430008070033

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