ETH Price: $3,344.84 (-0.91%)

Contract

0xBb7baf0534423e3108E1D03c259104cDba2C1cB7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Delegate Tokens ...188225192023-12-19 20:58:47339 days ago1703019527IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0222550246.90531665
Delegate Tokens ...187238792023-12-06 1:00:59353 days ago1701824459IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0311152254.92140678
Delegate Tokens ...186986412023-12-02 12:12:23356 days ago1701519143IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0097789726.30150312
Delegate Tokens ...186986042023-12-02 12:04:59356 days ago1701518699IN
0xBb7baf05...Dba2C1cB7
0 ETH0.010412126.77088494
Delegate Tokens ...186836132023-11-30 9:44:47358 days ago1701337487IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0101786527.3773631
Delegate Tokens ...186624252023-11-27 10:36:11361 days ago1701081371IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0154866330.74495362
Delegate Tokens ...186561932023-11-26 13:37:47362 days ago1701005867IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0115539324.35139614
Delegate Tokens ...186347022023-11-23 13:22:47365 days ago1700745767IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0037176541.1599783
Delegate Tokens ...185838762023-11-16 10:33:35372 days ago1700130815IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0061601828.93952575
Delegate Tokens ...185486022023-11-11 12:10:47377 days ago1699704647IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0094893420
Delegate Tokens ...184982102023-11-04 10:54:47384 days ago1699095287IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0029633113.91960244
Delegate Tokens ...184768852023-11-01 11:14:11387 days ago1698837251IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0030986917.90760663
Delegate Tokens ...184730692023-10-31 22:24:59388 days ago1698791099IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0112615920.4955631
Delegate Tokens ...184683822023-10-31 6:39:59389 days ago1698734399IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0050362523.65816768
Delegate Tokens ...184613822023-10-30 7:07:23390 days ago1698649643IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0023122710.86145731
Delegate Tokens ...184583302023-10-29 20:50:35390 days ago1698612635IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0091996220.1138004
Delegate Tokens ...184483802023-10-28 11:24:23391 days ago1698492263IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0026744312.56263048
Delegate Tokens ...184464112023-10-28 4:47:23392 days ago1698468443IN
0xBb7baf05...Dba2C1cB7
0 ETH0.004458369.39656547
Delegate Tokens ...184249732023-10-25 4:46:59395 days ago1698209219IN
0xBb7baf05...Dba2C1cB7
0 ETH0.0025436411.94827609
Delegate Tokens ...184124852023-10-23 10:51:11396 days ago1698058271IN
0xBb7baf05...Dba2C1cB7
0 ETH0.001683778.59999225
Delegate Tokens ...184044822023-10-22 7:54:59397 days ago1697961299IN
0xBb7baf05...Dba2C1cB7
0 ETH0.001279946.01295689
Delegate Tokens ...183963702023-10-21 4:41:59399 days ago1697863319IN
0xBb7baf05...Dba2C1cB7
0 ETH0.001255965.89998133
Delegate Tokens ...183836062023-10-19 9:52:59400 days ago1697709179IN
0xBb7baf05...Dba2C1cB7
0 ETH0.00145956.85572071
Delegate Tokens ...183815792023-10-19 3:03:11401 days ago1697684591IN
0xBb7baf05...Dba2C1cB7
0 ETH0.001277326
Delegate Tokens ...183745202023-10-18 3:20:11402 days ago1697599211IN
0xBb7baf05...Dba2C1cB7
0 ETH0.001372576.44741566
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GovernanceV2Helper

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : GovernanceV2Helper.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

import {IAaveGovernanceV2} from '../interfaces/IAaveGovernanceV2.sol';
import {IProposalValidator} from '../interfaces/IProposalValidator.sol';
import {IExecutorWithTimelock} from '../interfaces/IExecutorWithTimelock.sol';
import {IGovernanceStrategy} from '../interfaces/IGovernanceStrategy.sol';
import {IGovernancePowerDelegationToken} from '../interfaces/IGovernancePowerDelegationToken.sol';
import {IGovernanceV2Helper} from './interfaces/IGovernanceV2Helper.sol';
import {SafeMath} from '../dependencies/open-zeppelin/SafeMath.sol';

/**
 * @title Governance V2 helper contract
 * @dev Helper contract to fetch data from the AaveGovernanceV2 contract and batch write calls
 * - List of proposals with state
 * - List of votes per proposal and voters
 * - Batch token delegations calls
 * @author Aave
 **/
contract GovernanceV2Helper is IGovernanceV2Helper {
  using SafeMath for uint256;
  uint256 public constant ONE_HUNDRED_WITH_PRECISION = 10000;

  function getProposal(uint256 id, IAaveGovernanceV2 governance)
    public
    view
    override
    returns (ProposalStats memory proposalStats)
  {
    IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(id);
    uint256 votingSupply = IGovernanceStrategy(proposal.strategy).getTotalVotingSupplyAt(
      proposal.startBlock
    );
    return
      ProposalStats({
        totalVotingSupply: votingSupply,
        minimumQuorum: IProposalValidator(address(proposal.executor)).MINIMUM_QUORUM(),
        minimumDiff: IProposalValidator(address(proposal.executor)).VOTE_DIFFERENTIAL(),
        executionTimeWithGracePeriod: proposal.executionTime > 0
          ? IExecutorWithTimelock(proposal.executor).GRACE_PERIOD().add(proposal.executionTime)
          : proposal.executionTime,
        proposalCreated: proposal.startBlock.sub(governance.getVotingDelay()),
        id: proposal.id,
        creator: proposal.creator,
        executor: proposal.executor,
        targets: proposal.targets,
        values: proposal.values,
        signatures: proposal.signatures,
        calldatas: proposal.calldatas,
        withDelegatecalls: proposal.withDelegatecalls,
        startBlock: proposal.startBlock,
        endBlock: proposal.endBlock,
        executionTime: proposal.executionTime,
        forVotes: proposal.forVotes,
        againstVotes: proposal.againstVotes,
        executed: proposal.executed,
        canceled: proposal.canceled,
        strategy: proposal.strategy,
        ipfsHash: proposal.ipfsHash,
        proposalState: governance.getProposalState(id)
      });
  }

  function getProposals(
    uint256 skip,
    uint256 limit,
    IAaveGovernanceV2 governance
  ) external view override returns (ProposalStats[] memory proposalsStats) {
    uint256 count = governance.getProposalsCount().sub(skip);
    uint256 maxLimit = limit > count ? count : limit;

    proposalsStats = new ProposalStats[](maxLimit);

    for (uint256 i = 0; i < maxLimit; i++) {
      proposalsStats[i] = getProposal(i.add(skip), governance);
    }

    return proposalsStats;
  }

  function getTokensPower(address user, address[] memory tokens)
    external
    view
    override
    returns (Power[] memory power)
  {
    power = new Power[](tokens.length);
    for (uint256 i = 0; i < tokens.length; i++) {
      IGovernancePowerDelegationToken delegation = IGovernancePowerDelegationToken(tokens[i]);
      uint256 currentVotingPower = delegation.getPowerCurrent(
        user,
        IGovernancePowerDelegationToken.DelegationType.VOTING_POWER
      );
      uint256 currentPropositionPower = delegation.getPowerCurrent(
        user,
        IGovernancePowerDelegationToken.DelegationType.PROPOSITION_POWER
      );
      address delegatedAddressVotingPower = delegation.getDelegateeByType(
        user,
        IGovernancePowerDelegationToken.DelegationType.VOTING_POWER
      );
      address delegatedAddressPropositionPower = delegation.getDelegateeByType(
        user,
        IGovernancePowerDelegationToken.DelegationType.PROPOSITION_POWER
      );

      power[i] = Power(
        currentVotingPower,
        delegatedAddressVotingPower,
        currentPropositionPower,
        delegatedAddressPropositionPower
      );
    }

    return power;
  }

  function delegateTokensBySig(address[] calldata tokens, DelegateBySigParams[] calldata params)
    external
    override
  {
    require(tokens.length == params.length, 'INCONSISTENT_PARAMS_LENGTH');
    for (uint256 i = 0; i < tokens.length; i++) {
      IGovernancePowerDelegationToken(tokens[i]).delegateBySig(
        params[i].delegatee,
        params[i].nonce,
        params[i].expiry,
        params[i].v,
        params[i].r,
        params[i].s
      );
    }
  }

  function delegateTokensByTypeBySig(
    address[] calldata tokens,
    DelegateByTypeBySigParams[] calldata params
  ) external override {
    require(tokens.length == params.length, 'INCONSISTENT_PARAMS_LENGTH');
    for (uint256 i = 0; i < tokens.length; i++) {
      IGovernancePowerDelegationToken(tokens[i]).delegateByTypeBySig(
        params[i].delegatee,
        params[i].delegationType,
        params[i].nonce,
        params[i].expiry,
        params[i].v,
        params[i].r,
        params[i].s
      );
    }
  }
}

File 2 of 8 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
  /**
   * @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) {
    uint256 c = a + b;
    require(c >= a, 'SafeMath: addition overflow');

    return c;
  }

  /**
   * @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 sub(a, b, 'SafeMath: subtraction overflow');
  }

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
   * overflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot overflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @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) {
    // 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 0;
    }

    uint256 c = a * b;
    require(c / a == b, 'SafeMath: multiplication overflow');

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
    return div(a, b, 'SafeMath: division by zero');
  }

  /**
   * @dev Returns the integer division of two unsigned integers. Reverts 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) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts 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 mod(a, b, 'SafeMath: modulo by zero');
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message 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,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

File 3 of 8 : IGovernanceV2Helper.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

import {IAaveGovernanceV2} from '../../interfaces/IAaveGovernanceV2.sol';
import {IExecutorWithTimelock} from '../../interfaces/IExecutorWithTimelock.sol';
import {
  IGovernancePowerDelegationToken
} from '../../interfaces/IGovernancePowerDelegationToken.sol';

interface IGovernanceV2Helper {
  struct ProposalStats {
    uint256 totalVotingSupply;
    uint256 minimumQuorum;
    uint256 minimumDiff;
    uint256 executionTimeWithGracePeriod;
    uint256 proposalCreated;
    uint256 id;
    address creator;
    IExecutorWithTimelock executor;
    address[] targets;
    uint256[] values;
    string[] signatures;
    bytes[] calldatas;
    bool[] withDelegatecalls;
    uint256 startBlock;
    uint256 endBlock;
    uint256 executionTime;
    uint256 forVotes;
    uint256 againstVotes;
    bool executed;
    bool canceled;
    address strategy;
    bytes32 ipfsHash;
    IAaveGovernanceV2.ProposalState proposalState;
  }

  struct Power {
    uint256 votingPower;
    address delegatedAddressVotingPower;
    uint256 propositionPower;
    address delegatedAddressPropositionPower;
  }

  struct DelegateByTypeBySigParams {
    address delegatee;
    IGovernancePowerDelegationToken.DelegationType delegationType;
    uint256 nonce;
    uint256 expiry;
    uint8 v;
    bytes32 r;
    bytes32 s;
  }

  struct DelegateBySigParams {
    address delegatee;
    uint256 nonce;
    uint256 expiry;
    uint8 v;
    bytes32 r;
    bytes32 s;
  }

  function getProposals(
    uint256 skip,
    uint256 limit,
    IAaveGovernanceV2 governance
  ) external view virtual returns (ProposalStats[] memory proposalsStats);

  function getProposal(uint256 id, IAaveGovernanceV2 governance)
    external
    view
    virtual
    returns (ProposalStats memory proposalStats);

  function getTokensPower(address user, address[] memory tokens)
    external
    view
    virtual
    returns (Power[] memory power);

  function delegateTokensBySig(address[] calldata tokens, DelegateBySigParams[] calldata params)
    external;

  function delegateTokensByTypeBySig(
    address[] calldata tokens,
    DelegateByTypeBySigParams[] calldata params
  ) external;
}

File 4 of 8 : IGovernancePowerDelegationToken.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

interface IGovernancePowerDelegationToken {
  enum DelegationType {VOTING_POWER, PROPOSITION_POWER}

  /**
   * @dev returns the delegatee of an user
   * @param delegator the address of the delegator
   **/
  function getDelegateeByType(address delegator, DelegationType delegationType)
    external
    view
    virtual
    returns (address);

  /**
   * @dev returns the current delegated power of a user. The current power is the
   * power delegated at the time of the last snapshot
   * @param user the user
   **/
  function getPowerCurrent(address user, DelegationType delegationType)
    external
    view
    virtual
    returns (uint256);

  /**
   * @dev get the power of a user at a specified block
   * @param user address of the user
   * @param blockNumber block number at which to get power
   * @param delegationType delegation type (propose/vote)
   **/
  function getPowerAtBlock(
    address user,
    uint256 blockNumber,
    DelegationType delegationType
  ) external view returns (uint256);

  /**
   * @dev Delegates power from signatory to `delegatee`
   * @param delegatee The address to delegate votes to
   * @param delegationType the type of delegation (VOTING_POWER, PROPOSITION_POWER)
   * @param nonce The contract state required to match the signature
   * @param expiry The time at which to expire the signature
   * @param v The recovery byte of the signature
   * @param r Half of the ECDSA signature pair
   * @param s Half of the ECDSA signature pair
   **/
  function delegateByTypeBySig(
    address delegatee,
    DelegationType delegationType,
    uint256 nonce,
    uint256 expiry,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  /**
   * @dev Delegates power from signatory to `delegatee`
   * @param delegatee The address to delegate votes to
   * @param nonce The contract state required to match the signature
   * @param expiry The time at which to expire the signature
   * @param v The recovery byte of the signature
   * @param r Half of the ECDSA signature pair
   * @param s Half of the ECDSA signature pair
   **/
  function delegateBySig(
    address delegatee,
    uint256 nonce,
    uint256 expiry,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;
}

File 5 of 8 : IGovernanceStrategy.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

interface IGovernanceStrategy {
  /**
   * @dev Returns the Proposition Power of a user at a specific block number.
   * @param user Address of the user.
   * @param blockNumber Blocknumber at which to fetch Proposition Power
   * @return Power number
   **/
  function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256);
  /**
   * @dev Returns the total supply of Outstanding Proposition Tokens 
   * @param blockNumber Blocknumber at which to evaluate
   * @return total supply at blockNumber
   **/
  function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256);
  /**
   * @dev Returns the total supply of Outstanding Voting Tokens 
   * @param blockNumber Blocknumber at which to evaluate
   * @return total supply at blockNumber
   **/
  function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256);
  /**
   * @dev Returns the Vote Power of a user at a specific block number.
   * @param user Address of the user.
   * @param blockNumber Blocknumber at which to fetch Vote Power
   * @return Vote number
   **/
  function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256);
}

File 6 of 8 : IExecutorWithTimelock.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

import {IAaveGovernanceV2} from './IAaveGovernanceV2.sol';

interface IExecutorWithTimelock {
  /**
   * @dev emitted when a new pending admin is set
   * @param newPendingAdmin address of the new pending admin
   **/
  event NewPendingAdmin(address newPendingAdmin);

  /**
   * @dev emitted when a new admin is set
   * @param newAdmin address of the new admin
   **/
  event NewAdmin(address newAdmin);

  /**
   * @dev emitted when a new delay (between queueing and execution) is set
   * @param delay new delay
   **/
  event NewDelay(uint256 delay);

  /**
   * @dev emitted when a new (trans)action is Queued.
   * @param actionHash hash of the action
   * @param target address of the targeted contract
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  event QueuedAction(
    bytes32 actionHash,
    address indexed target,
    uint256 value,
    string signature,
    bytes data,
    uint256 executionTime,
    bool withDelegatecall
  );

  /**
   * @dev emitted when an action is Cancelled
   * @param actionHash hash of the action
   * @param target address of the targeted contract
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  event CancelledAction(
    bytes32 actionHash,
    address indexed target,
    uint256 value,
    string signature,
    bytes data,
    uint256 executionTime,
    bool withDelegatecall
  );

  /**
   * @dev emitted when an action is Cancelled
   * @param actionHash hash of the action
   * @param target address of the targeted contract
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   * @param resultData the actual callData used on the target
   **/
  event ExecutedAction(
    bytes32 actionHash,
    address indexed target,
    uint256 value,
    string signature,
    bytes data,
    uint256 executionTime,
    bool withDelegatecall,
    bytes resultData
  );
  /**
   * @dev Getter of the current admin address (should be governance)
   * @return The address of the current admin 
   **/
  function getAdmin() external view returns (address);
  /**
   * @dev Getter of the current pending admin address
   * @return The address of the pending admin 
   **/
  function getPendingAdmin() external view returns (address);
  /**
   * @dev Getter of the delay between queuing and execution
   * @return The delay in seconds
   **/
  function getDelay() external view returns (uint256);
  /**
   * @dev Returns whether an action (via actionHash) is queued
   * @param actionHash hash of the action to be checked
   * keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall))
   * @return true if underlying action of actionHash is queued
   **/
  function isActionQueued(bytes32 actionHash) external view returns (bool);
  /**
   * @dev Checks whether a proposal is over its grace period 
   * @param governance Governance contract
   * @param proposalId Id of the proposal against which to test
   * @return true of proposal is over grace period
   **/
  function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);
  /**
   * @dev Getter of grace period constant
   * @return grace period in seconds
   **/
  function GRACE_PERIOD() external view returns (uint256);
  /**
   * @dev Getter of minimum delay constant
   * @return minimum delay in seconds
   **/
  function MINIMUM_DELAY() external view returns (uint256);
  /**
   * @dev Getter of maximum delay constant
   * @return maximum delay in seconds
   **/
  function MAXIMUM_DELAY() external view returns (uint256);
  /**
   * @dev Function, called by Governance, that queue a transaction, returns action hash
   * @param target smart contract target
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  function queueTransaction(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 executionTime,
    bool withDelegatecall
  ) external returns (bytes32);
  /**
   * @dev Function, called by Governance, that cancels a transaction, returns the callData executed
   * @param target smart contract target
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  function executeTransaction(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 executionTime,
    bool withDelegatecall
  ) external payable returns (bytes memory);
  /**
   * @dev Function, called by Governance, that cancels a transaction, returns action hash
   * @param target smart contract target
   * @param value wei value of the transaction
   * @param signature function signature of the transaction
   * @param data function arguments of the transaction or callData if signature empty
   * @param executionTime time at which to execute the transaction
   * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target
   **/
  function cancelTransaction(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 executionTime,
    bool withDelegatecall
  ) external returns (bytes32);
}

File 7 of 8 : IProposalValidator.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

import {IAaveGovernanceV2} from './IAaveGovernanceV2.sol';

interface IProposalValidator {

  /**
   * @dev Called to validate a proposal (e.g when creating new proposal in Governance)
   * @param governance Governance Contract
   * @param user Address of the proposal creator
   * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1).
   * @return boolean, true if can be created
   **/
  function validateCreatorOfProposal(
    IAaveGovernanceV2 governance,
    address user,
    uint256 blockNumber
  ) external view returns (bool);

  /**
   * @dev Called to validate the cancellation of a proposal
   * @param governance Governance Contract
   * @param user Address of the proposal creator
   * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1).
   * @return boolean, true if can be cancelled
   **/
  function validateProposalCancellation(
    IAaveGovernanceV2 governance,
    address user,
    uint256 blockNumber
  ) external view returns (bool);

  /**
   * @dev Returns whether a user has enough Proposition Power to make a proposal.
   * @param governance Governance Contract
   * @param user Address of the user to be challenged.
   * @param blockNumber Block Number against which to make the challenge.
   * @return true if user has enough power
   **/
  function isPropositionPowerEnough(
    IAaveGovernanceV2 governance,
    address user,
    uint256 blockNumber
  ) external view returns (bool);

  /**
   * @dev Returns the minimum Proposition Power needed to create a proposition.
   * @param governance Governance Contract
   * @param blockNumber Blocknumber at which to evaluate
   * @return minimum Proposition Power needed
   **/
  function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber)
    external
    view
    returns (uint256);

  /**
   * @dev Returns whether a proposal passed or not
   * @param governance Governance Contract
   * @param proposalId Id of the proposal to set
   * @return true if proposal passed
   **/
  function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Check whether a proposal has reached quorum, ie has enough FOR-voting-power
   * Here quorum is not to understand as number of votes reached, but number of for-votes reached
   * @param governance Governance Contract
   * @param proposalId Id of the proposal to verify
   * @return voting power needed for a proposal to pass
   **/
  function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Check whether a proposal has enough extra FOR-votes than AGAINST-votes
   * FOR VOTES - AGAINST VOTES > VOTE_DIFFERENTIAL * voting supply
   * @param governance Governance Contract
   * @param proposalId Id of the proposal to verify
   * @return true if enough For-Votes
   **/
  function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId)
    external
    view
    returns (bool);

  /**
   * @dev Calculates the minimum amount of Voting Power needed for a proposal to Pass
   * @param votingSupply Total number of oustanding voting tokens
   * @return voting power needed for a proposal to pass
   **/
  function getMinimumVotingPowerNeeded(uint256 votingSupply) external view returns (uint256);

  /**
   * @dev Get proposition threshold constant value
   * @return the proposition threshold value (100 <=> 1%)
   **/
  function PROPOSITION_THRESHOLD() external view returns (uint256);

  /**
   * @dev Get voting duration constant value
   * @return the voting duration value in seconds
   **/
  function VOTING_DURATION() external view returns (uint256);

  /**
   * @dev Get the vote differential threshold constant value
   * to compare with % of for votes/total supply - % of against votes/total supply
   * @return the vote differential threshold value (100 <=> 1%)
   **/
  function VOTE_DIFFERENTIAL() external view returns (uint256);

  /**
   * @dev Get quorum threshold constant value
   * to compare with % of for votes/total supply
   * @return the quorum threshold value (100 <=> 1%)
   **/
  function MINIMUM_QUORUM() external view returns (uint256);

  /**
   * @dev precision helper: 100% = 10000
   * @return one hundred percents with our chosen precision
   **/
  function ONE_HUNDRED_WITH_PRECISION() external view returns (uint256);
}

File 8 of 8 : IAaveGovernanceV2.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;
pragma abicoder v2;

import {IExecutorWithTimelock} from './IExecutorWithTimelock.sol';

interface IAaveGovernanceV2 {
  enum ProposalState {Pending, Canceled, Active, Failed, Succeeded, Queued, Expired, Executed}

  struct Vote {
    bool support;
    uint248 votingPower;
  }

  struct Proposal {
    uint256 id;
    address creator;
    IExecutorWithTimelock executor;
    address[] targets;
    uint256[] values;
    string[] signatures;
    bytes[] calldatas;
    bool[] withDelegatecalls;
    uint256 startBlock;
    uint256 endBlock;
    uint256 executionTime;
    uint256 forVotes;
    uint256 againstVotes;
    bool executed;
    bool canceled;
    address strategy;
    bytes32 ipfsHash;
    mapping(address => Vote) votes;
  }

  struct ProposalWithoutVotes {
    uint256 id;
    address creator;
    IExecutorWithTimelock executor;
    address[] targets;
    uint256[] values;
    string[] signatures;
    bytes[] calldatas;
    bool[] withDelegatecalls;
    uint256 startBlock;
    uint256 endBlock;
    uint256 executionTime;
    uint256 forVotes;
    uint256 againstVotes;
    bool executed;
    bool canceled;
    address strategy;
    bytes32 ipfsHash;
  }

  /**
   * @dev emitted when a new proposal is created
   * @param id Id of the proposal
   * @param creator address of the creator
   * @param executor The ExecutorWithTimelock contract that will execute the proposal
   * @param targets list of contracts called by proposal's associated transactions
   * @param values list of value in wei for each propoposal's associated transaction
   * @param signatures list of function signatures (can be empty) to be used when created the callData
   * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments
   * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target
   * @param startBlock block number when vote starts
   * @param endBlock block number when vote ends
   * @param strategy address of the governanceStrategy contract
   * @param ipfsHash IPFS hash of the proposal
   **/
  event ProposalCreated(
    uint256 id,
    address indexed creator,
    IExecutorWithTimelock indexed executor,
    address[] targets,
    uint256[] values,
    string[] signatures,
    bytes[] calldatas,
    bool[] withDelegatecalls,
    uint256 startBlock,
    uint256 endBlock,
    address strategy,
    bytes32 ipfsHash
  );

  /**
   * @dev emitted when a proposal is canceled
   * @param id Id of the proposal
   **/
  event ProposalCanceled(uint256 id);

  /**
   * @dev emitted when a proposal is queued
   * @param id Id of the proposal
   * @param executionTime time when proposal underlying transactions can be executed
   * @param initiatorQueueing address of the initiator of the queuing transaction
   **/
  event ProposalQueued(uint256 id, uint256 executionTime, address indexed initiatorQueueing);
  /**
   * @dev emitted when a proposal is executed
   * @param id Id of the proposal
   * @param initiatorExecution address of the initiator of the execution transaction
   **/
  event ProposalExecuted(uint256 id, address indexed initiatorExecution);
  /**
   * @dev emitted when a vote is registered
   * @param id Id of the proposal
   * @param voter address of the voter
   * @param support boolean, true = vote for, false = vote against
   * @param votingPower Power of the voter/vote
   **/
  event VoteEmitted(uint256 id, address indexed voter, bool support, uint256 votingPower);

  event GovernanceStrategyChanged(address indexed newStrategy, address indexed initiatorChange);

  event VotingDelayChanged(uint256 newVotingDelay, address indexed initiatorChange);

  event ExecutorAuthorized(address executor);

  event ExecutorUnauthorized(address executor);

  /**
   * @dev Creates a Proposal (needs Proposition Power of creator > Threshold)
   * @param executor The ExecutorWithTimelock contract that will execute the proposal
   * @param targets list of contracts called by proposal's associated transactions
   * @param values list of value in wei for each propoposal's associated transaction
   * @param signatures list of function signatures (can be empty) to be used when created the callData
   * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments
   * @param withDelegatecalls if true, transaction delegatecalls the taget, else calls the target
   * @param ipfsHash IPFS hash of the proposal
   **/
  function create(
    IExecutorWithTimelock executor,
    address[] memory targets,
    uint256[] memory values,
    string[] memory signatures,
    bytes[] memory calldatas,
    bool[] memory withDelegatecalls,
    bytes32 ipfsHash
  ) external returns (uint256);

  /**
   * @dev Cancels a Proposal,
   * either at anytime by guardian
   * or when proposal is Pending/Active and threshold no longer reached
   * @param proposalId id of the proposal
   **/
  function cancel(uint256 proposalId) external;

  /**
   * @dev Queue the proposal (If Proposal Succeeded)
   * @param proposalId id of the proposal to queue
   **/
  function queue(uint256 proposalId) external;

  /**
   * @dev Execute the proposal (If Proposal Queued)
   * @param proposalId id of the proposal to execute
   **/
  function execute(uint256 proposalId) external payable;

  /**
   * @dev Function allowing msg.sender to vote for/against a proposal
   * @param proposalId id of the proposal
   * @param support boolean, true = vote for, false = vote against
   **/
  function submitVote(uint256 proposalId, bool support) external;

  /**
   * @dev Function to register the vote of user that has voted offchain via signature
   * @param proposalId id of the proposal
   * @param support boolean, true = vote for, false = vote against
   * @param v v part of the voter signature
   * @param r r part of the voter signature
   * @param s s part of the voter signature
   **/
  function submitVoteBySignature(
    uint256 proposalId,
    bool support,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  /**
   * @dev Set new GovernanceStrategy
   * Note: owner should be a timelocked executor, so needs to make a proposal
   * @param governanceStrategy new Address of the GovernanceStrategy contract
   **/
  function setGovernanceStrategy(address governanceStrategy) external;

  /**
   * @dev Set new Voting Delay (delay before a newly created proposal can be voted on)
   * Note: owner should be a timelocked executor, so needs to make a proposal
   * @param votingDelay new voting delay in seconds
   **/
  function setVotingDelay(uint256 votingDelay) external;

  /**
   * @dev Add new addresses to the list of authorized executors
   * @param executors list of new addresses to be authorized executors
   **/
  function authorizeExecutors(address[] memory executors) external;

  /**
   * @dev Remove addresses to the list of authorized executors
   * @param executors list of addresses to be removed as authorized executors
   **/
  function unauthorizeExecutors(address[] memory executors) external;

  /**
   * @dev Let the guardian abdicate from its priviledged rights
   **/
  function __abdicate() external;

  /**
   * @dev Getter of the current GovernanceStrategy address
   * @return The address of the current GovernanceStrategy contracts
   **/
  function getGovernanceStrategy() external view returns (address);

  /**
   * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on)
   * Different from the voting duration
   * @return The voting delay in seconds
   **/
  function getVotingDelay() external view returns (uint256);

  /**
   * @dev Returns whether an address is an authorized executor
   * @param executor address to evaluate as authorized executor
   * @return true if authorized
   **/
  function isExecutorAuthorized(address executor) external view returns (bool);

  /**
   * @dev Getter the address of the guardian, that can mainly cancel proposals
   * @return The address of the guardian
   **/
  function getGuardian() external view returns (address);

  /**
   * @dev Getter of the proposal count (the current number of proposals ever created)
   * @return the proposal count
   **/
  function getProposalsCount() external view returns (uint256);

  /**
   * @dev Getter of a proposal by id
   * @param proposalId id of the proposal to get
   * @return the proposal as ProposalWithoutVotes memory object
   **/
  function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory);

  /**
   * @dev Getter of the Vote of a voter about a proposal
   * Note: Vote is a struct: ({bool support, uint248 votingPower})
   * @param proposalId id of the proposal
   * @param voter address of the voter
   * @return The associated Vote memory object
   **/
  function getVoteOnProposal(uint256 proposalId, address voter) external view returns (Vote memory);

  /**
   * @dev Get the current state of a proposal
   * @param proposalId id of the proposal
   * @return The current state if the proposal
   **/
  function getProposalState(uint256 proposalId) external view returns (ProposalState);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"ONE_HUNDRED_WITH_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"components":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IGovernanceV2Helper.DelegateBySigParams[]","name":"params","type":"tuple[]"}],"name":"delegateTokensBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"components":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"enum IGovernancePowerDelegationToken.DelegationType","name":"delegationType","type":"uint8"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IGovernanceV2Helper.DelegateByTypeBySigParams[]","name":"params","type":"tuple[]"}],"name":"delegateTokensByTypeBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"}],"name":"getProposal","outputs":[{"components":[{"internalType":"uint256","name":"totalVotingSupply","type":"uint256"},{"internalType":"uint256","name":"minimumQuorum","type":"uint256"},{"internalType":"uint256","name":"minimumDiff","type":"uint256"},{"internalType":"uint256","name":"executionTimeWithGracePeriod","type":"uint256"},{"internalType":"uint256","name":"proposalCreated","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"},{"internalType":"enum IAaveGovernanceV2.ProposalState","name":"proposalState","type":"uint8"}],"internalType":"struct IGovernanceV2Helper.ProposalStats","name":"proposalStats","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"skip","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"}],"name":"getProposals","outputs":[{"components":[{"internalType":"uint256","name":"totalVotingSupply","type":"uint256"},{"internalType":"uint256","name":"minimumQuorum","type":"uint256"},{"internalType":"uint256","name":"minimumDiff","type":"uint256"},{"internalType":"uint256","name":"executionTimeWithGracePeriod","type":"uint256"},{"internalType":"uint256","name":"proposalCreated","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"contract IExecutorWithTimelock","name":"executor","type":"address"},{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"bytes32","name":"ipfsHash","type":"bytes32"},{"internalType":"enum IAaveGovernanceV2.ProposalState","name":"proposalState","type":"uint8"}],"internalType":"struct IGovernanceV2Helper.ProposalStats[]","name":"proposalsStats","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"getTokensPower","outputs":[{"components":[{"internalType":"uint256","name":"votingPower","type":"uint256"},{"internalType":"address","name":"delegatedAddressVotingPower","type":"address"},{"internalType":"uint256","name":"propositionPower","type":"uint256"},{"internalType":"address","name":"delegatedAddressPropositionPower","type":"address"}],"internalType":"struct IGovernanceV2Helper.Power[]","name":"power","type":"tuple[]"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50612cf2806100206000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631d73fd6d146100675780632a877f111461008557806367e7dc36146100a1578063a3cc31d5146100bd578063a72b6325146100ed578063e37261151461011d575b600080fd5b61006f61014d565b60405161007c919061273c565b60405180910390f35b61009f600480360381019061009a9190611aab565b610153565b005b6100bb60048036038101906100b69190611a36565b610311565b005b6100d760048036038101906100d291906119e2565b6104aa565b6040516100e491906126b6565b60405180910390f35b61010760048036038101906101029190611bdc565b6107e2565b604051610114919061271a565b60405180910390f35b61013760048036038101906101329190611c18565b610d24565b60405161014491906126d8565b60405180910390f35b61271081565b81819050848490501461019b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610192906126fa565b60405180910390fd5b60005b8484905081101561030a578484828181106101b557fe5b90506020020160208101906101ca9190611990565b73ffffffffffffffffffffffffffffffffffffffff1663f713d8a88484848181106101f157fe5b905060e0020160000160208101906102099190611990565b85858581811061021557fe5b905060e00201602001602081019061022d9190611b20565b86868681811061023957fe5b905060e002016040013587878781811061024f57fe5b905060e002016060013588888881811061026557fe5b905060e00201608001602081019061027d9190611c67565b89898981811061028957fe5b905060e0020160a001358a8a8a81811061029f57fe5b905060e0020160c001356040518863ffffffff1660e01b81526004016102cb97969594939291906125e6565b600060405180830381600087803b1580156102e557600080fd5b505af11580156102f9573d6000803e3d6000fd5b50505050808060010191505061019e565b5050505050565b818190508484905014610359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610350906126fa565b60405180910390fd5b60005b848490508110156104a35784848281811061037357fe5b90506020020160208101906103889190611990565b73ffffffffffffffffffffffffffffffffffffffff1663c3cda5208484848181106103af57fe5b905060c0020160000160208101906103c79190611990565b8585858181106103d357fe5b905060c00201602001358686868181106103e957fe5b905060c00201604001358787878181106103ff57fe5b905060c0020160600160208101906104179190611c67565b88888881811061042357fe5b905060c002016080013589898981811061043957fe5b905060c0020160a001356040518763ffffffff1660e01b815260040161046496959493929190612655565b600060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b50505050808060010191505061035c565b5050505050565b6060815167ffffffffffffffff811180156104c457600080fd5b506040519080825280602002602001820160405280156104fe57816020015b6104eb611008565b8152602001906001900390816104e35790505b50905060005b82518110156107db57600083828151811061051b57fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff1663b2f4201d8760006040518363ffffffff1660e01b81526004016105639291906125bd565b60206040518083038186803b15801561057b57600080fd5b505afa15801561058f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b39190611bb3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663b2f4201d8860016040518363ffffffff1660e01b81526004016105f39291906125bd565b60206040518083038186803b15801561060b57600080fd5b505afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106439190611bb3565b905060008373ffffffffffffffffffffffffffffffffffffffff16636f50458d8960006040518363ffffffff1660e01b81526004016106839291906125bd565b60206040518083038186803b15801561069b57600080fd5b505afa1580156106af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d391906119b9565b905060008473ffffffffffffffffffffffffffffffffffffffff16636f50458d8a60016040518363ffffffff1660e01b81526004016107139291906125bd565b60206040518083038186803b15801561072b57600080fd5b505afa15801561073f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076391906119b9565b905060405180608001604052808581526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018273ffffffffffffffffffffffffffffffffffffffff168152508787815181106107be57fe5b602002602001018190525050505050508080600101915050610504565b5092915050565b6107ea61105c565b6107f261115e565b8273ffffffffffffffffffffffffffffffffffffffff16633656de21856040518263ffffffff1660e01b815260040161082b919061273c565b60006040518083038186803b15801561084357600080fd5b505afa158015610857573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108809190611b72565b90506000816101e0015173ffffffffffffffffffffffffffffffffffffffff16637a71f9d78361010001516040518263ffffffff1660e01b81526004016108c7919061273c565b60206040518083038186803b1580156108df57600080fd5b505afa1580156108f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109179190611bb3565b9050604051806102e00160405280828152602001836040015173ffffffffffffffffffffffffffffffffffffffff1663b159beac6040518163ffffffff1660e01b815260040160206040518083038186803b15801561097557600080fd5b505afa158015610989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ad9190611bb3565b8152602001836040015173ffffffffffffffffffffffffffffffffffffffff16639125fb586040518163ffffffff1660e01b815260040160206040518083038186803b1580156109fc57600080fd5b505afa158015610a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a349190611bb3565b8152602001600084610140015111610a5157836101400151610aeb565b610aea846101400151856040015173ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa457600080fd5b505afa158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc9190611bb3565b610e7690919063ffffffff16565b5b8152602001610b858673ffffffffffffffffffffffffffffffffffffffff1663a2b170b06040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3957600080fd5b505afa158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190611bb3565b856101000151610efe90919063ffffffff16565b815260200183600001518152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001836040015173ffffffffffffffffffffffffffffffffffffffff16815260200183606001518152602001836080015181526020018360a0015181526020018360c0015181526020018360e00151815260200183610100015181526020018361012001518152602001836101400151815260200183610160015181526020018361018001518152602001836101a0015115158152602001836101c0015115158152602001836101e0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610200015181526020018573ffffffffffffffffffffffffffffffffffffffff16639080936f886040518263ffffffff1660e01b8152600401610cbc919061273c565b60206040518083038186803b158015610cd457600080fd5b505afa158015610ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0c9190611b49565b6007811115610d1757fe5b8152509250505092915050565b60606000610db8858473ffffffffffffffffffffffffffffffffffffffff166398e527d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190611bb3565b610efe90919063ffffffff16565b90506000818511610dc95784610dcb565b815b90508067ffffffffffffffff81118015610de457600080fd5b50604051908082528060200260200182016040528015610e1e57816020015b610e0b61105c565b815260200190600190039081610e035790505b50925060005b81811015610e6c57610e48610e428883610e7690919063ffffffff16565b866107e2565b848281518110610e5457fe5b60200260200101819052508080600101915050610e24565b5050509392505050565b600080828401905083811015610ef4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000610f4083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f48565b905092915050565b6000838311158290610ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fba578082015181840152602081019050610f9f565b50505050905090810190601f168015610fe75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b604051806080016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604051806102e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600080191681526020016000600781111561115857fe5b81525090565b60405180610220016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600080191681525090565b60008135905061123a81612bfb565b92915050565b60008151905061124f81612bfb565b92915050565b60008083601f84011261126757600080fd5b8235905067ffffffffffffffff81111561128057600080fd5b60208301915083602082028301111561129857600080fd5b9250929050565b600082601f8301126112b057600080fd5b81356112c36112be82612788565b612757565b915081818352602084019350602081019050838560208402820111156112e857600080fd5b60005b8381101561131857816112fe888261122b565b8452602084019350602083019250506001810190506112eb565b5050505092915050565b600082601f83011261133357600080fd5b815161134661134182612788565b612757565b9150818183526020840193506020810190508385602084028201111561136b57600080fd5b60005b8381101561139b57816113818882611240565b84526020840193506020830192505060018101905061136e565b5050505092915050565b600082601f8301126113b657600080fd5b81516113c96113c4826127b4565b612757565b915081818352602084019350602081019050838560208402820111156113ee57600080fd5b60005b8381101561141e57816114048882611627565b8452602084019350602083019250506001810190506113f1565b5050505092915050565b600082601f83011261143957600080fd5b815161144c611447826127e0565b612757565b9150818183526020840193506020810190508360005b8381101561149257815186016114788882611651565b845260208401935060208301925050600181019050611462565b5050505092915050565b600082601f8301126114ad57600080fd5b81516114c06114bb8261280c565b612757565b9150818183526020840193506020810190508360005b8381101561150657815186016114ec88826116f9565b8452602084019350602083019250506001810190506114d6565b5050505092915050565b60008083601f84011261152257600080fd5b8235905067ffffffffffffffff81111561153b57600080fd5b6020830191508360c082028301111561155357600080fd5b9250929050565b60008083601f84011261156c57600080fd5b8235905067ffffffffffffffff81111561158557600080fd5b6020830191508360e082028301111561159d57600080fd5b9250929050565b600082601f8301126115b557600080fd5b81516115c86115c382612838565b612757565b915081818352602084019350602081019050838560208402820111156115ed57600080fd5b60005b8381101561161d57816116038882611966565b8452602084019350602083019250506001810190506115f0565b5050505092915050565b60008151905061163681612c12565b92915050565b60008151905061164b81612c29565b92915050565b600082601f83011261166257600080fd5b815161167561167082612864565b612757565b9150808252602083016020830185838301111561169157600080fd5b61169c838284612b8d565b50505092915050565b6000813590506116b481612c40565b92915050565b6000815190506116c981612c57565b92915050565b6000813590506116de81612c6e565b92915050565b6000815190506116f381612c7e565b92915050565b600082601f83011261170a57600080fd5b815161171d61171882612894565b612757565b9150808252602083016020830185838301111561173957600080fd5b611744838284612b8d565b50505092915050565b6000610220828403121561176057600080fd5b61176b610220612757565b9050600061177b84828501611966565b600083015250602061178f84828501611240565b60208301525060406117a3848285016116ba565b604083015250606082015167ffffffffffffffff8111156117c357600080fd5b6117cf84828501611322565b606083015250608082015167ffffffffffffffff8111156117ef57600080fd5b6117fb848285016115a4565b60808301525060a082015167ffffffffffffffff81111561181b57600080fd5b6118278482850161149c565b60a08301525060c082015167ffffffffffffffff81111561184757600080fd5b61185384828501611428565b60c08301525060e082015167ffffffffffffffff81111561187357600080fd5b61187f848285016113a5565b60e08301525061010061189484828501611966565b610100830152506101206118aa84828501611966565b610120830152506101406118c084828501611966565b610140830152506101606118d684828501611966565b610160830152506101806118ec84828501611966565b610180830152506101a061190284828501611627565b6101a0830152506101c061191884828501611627565b6101c0830152506101e061192e84828501611240565b6101e0830152506102006119448482850161163c565b6102008301525092915050565b60008135905061196081612c8e565b92915050565b60008151905061197581612c8e565b92915050565b60008135905061198a81612ca5565b92915050565b6000602082840312156119a257600080fd5b60006119b08482850161122b565b91505092915050565b6000602082840312156119cb57600080fd5b60006119d984828501611240565b91505092915050565b600080604083850312156119f557600080fd5b6000611a038582860161122b565b925050602083013567ffffffffffffffff811115611a2057600080fd5b611a2c8582860161129f565b9150509250929050565b60008060008060408587031215611a4c57600080fd5b600085013567ffffffffffffffff811115611a6657600080fd5b611a7287828801611255565b9450945050602085013567ffffffffffffffff811115611a9157600080fd5b611a9d87828801611510565b925092505092959194509250565b60008060008060408587031215611ac157600080fd5b600085013567ffffffffffffffff811115611adb57600080fd5b611ae787828801611255565b9450945050602085013567ffffffffffffffff811115611b0657600080fd5b611b128782880161155a565b925092505092959194509250565b600060208284031215611b3257600080fd5b6000611b40848285016116cf565b91505092915050565b600060208284031215611b5b57600080fd5b6000611b69848285016116e4565b91505092915050565b600060208284031215611b8457600080fd5b600082015167ffffffffffffffff811115611b9e57600080fd5b611baa8482850161174d565b91505092915050565b600060208284031215611bc557600080fd5b6000611bd384828501611966565b91505092915050565b60008060408385031215611bef57600080fd5b6000611bfd85828601611951565b9250506020611c0e858286016116a5565b9150509250929050565b600080600060608486031215611c2d57600080fd5b6000611c3b86828701611951565b9350506020611c4c86828701611951565b9250506040611c5d868287016116a5565b9150509250925092565b600060208284031215611c7957600080fd5b6000611c878482850161197b565b91505092915050565b6000611c9c8383611d2c565b60208301905092915050565b6000611cb48383612021565b60208301905092915050565b6000611ccc838361204e565b905092915050565b6000611ce083836120b4565b905092915050565b6000611cf4838361212d565b60808301905092915050565b6000611d0c8383612182565b905092915050565b6000611d208383612590565b60208301905092915050565b611d3581612a9c565b82525050565b611d4481612a9c565b82525050565b6000611d5582612934565b611d5f81856129f2565b9350611d6a836128c4565b8060005b83811015611d9b578151611d828882611c90565b9750611d8d83612997565b925050600181019050611d6e565b5085935050505092915050565b6000611db38261293f565b611dbd8185612a03565b9350611dc8836128d4565b8060005b83811015611df9578151611de08882611ca8565b9750611deb836129a4565b925050600181019050611dcc565b5085935050505092915050565b6000611e118261294a565b611e1b8185612a14565b935083602082028501611e2d856128e4565b8060005b85811015611e695784840389528151611e4a8582611cc0565b9450611e55836129b1565b925060208a01995050600181019050611e31565b50829750879550505050505092915050565b6000611e8682612955565b611e908185612a25565b935083602082028501611ea2856128f4565b8060005b85811015611ede5784840389528151611ebf8582611cd4565b9450611eca836129be565b925060208a01995050600181019050611ea6565b50829750879550505050505092915050565b6000611efb82612960565b611f058185612a36565b9350611f1083612904565b8060005b83811015611f41578151611f288882611ce8565b9750611f33836129cb565b925050600181019050611f14565b5085935050505092915050565b6000611f598261296b565b611f638185612a47565b935083602082028501611f7585612914565b8060005b85811015611fb15784840389528151611f928582611d00565b9450611f9d836129d8565b925060208a01995050600181019050611f79565b50829750879550505050505092915050565b6000611fce82612976565b611fd88185612a58565b9350611fe383612924565b8060005b83811015612014578151611ffb8882611d14565b9750612006836129e5565b925050600181019050611fe7565b5085935050505092915050565b61202a81612aae565b82525050565b61203981612aba565b82525050565b61204881612aba565b82525050565b600061205982612981565b6120638185612a69565b9350612073818560208601612b8d565b61207c81612bc2565b840191505092915050565b61209081612b45565b82525050565b61209f81612b69565b82525050565b6120ae81612b7b565b82525050565b60006120bf8261298c565b6120c98185612a7a565b93506120d9818560208601612b8d565b6120e281612bc2565b840191505092915050565b60006120fa601a83612a8b565b91507f494e434f4e53495354454e545f504152414d535f4c454e4754480000000000006000830152602082019050919050565b6080820160008201516121436000850182612590565b5060208201516121566020850182611d2c565b5060408201516121696040850182612590565b50606082015161217c6060850182611d2c565b50505050565b60006102e08301600083015161219b6000860182612590565b5060208301516121ae6020860182612590565b5060408301516121c16040860182612590565b5060608301516121d46060860182612590565b5060808301516121e76080860182612590565b5060a08301516121fa60a0860182612590565b5060c083015161220d60c0860182611d2c565b5060e083015161222060e0860182612087565b5061010083015184820361010086015261223a8282611d4a565b9150506101208301518482036101208601526122568282611fc3565b9150506101408301518482036101408601526122728282611e7b565b91505061016083015184820361016086015261228e8282611e06565b9150506101808301518482036101808601526122aa8282611da8565b9150506101a08301516122c16101a0860182612590565b506101c08301516122d66101c0860182612590565b506101e08301516122eb6101e0860182612590565b50610200830151612300610200860182612590565b50610220830151612315610220860182612590565b5061024083015161232a610240860182612021565b5061026083015161233f610260860182612021565b50610280830151612354610280860182611d2c565b506102a08301516123696102a0860182612030565b506102c083015161237e6102c08601826120a5565b508091505092915050565b60006102e0830160008301516123a26000860182612590565b5060208301516123b56020860182612590565b5060408301516123c86040860182612590565b5060608301516123db6060860182612590565b5060808301516123ee6080860182612590565b5060a083015161240160a0860182612590565b5060c083015161241460c0860182611d2c565b5060e083015161242760e0860182612087565b506101008301518482036101008601526124418282611d4a565b91505061012083015184820361012086015261245d8282611fc3565b9150506101408301518482036101408601526124798282611e7b565b9150506101608301518482036101608601526124958282611e06565b9150506101808301518482036101808601526124b18282611da8565b9150506101a08301516124c86101a0860182612590565b506101c08301516124dd6101c0860182612590565b506101e08301516124f26101e0860182612590565b50610200830151612507610200860182612590565b5061022083015161251c610220860182612590565b50610240830151612531610240860182612021565b50610260830151612546610260860182612021565b5061028083015161255b610280860182611d2c565b506102a08301516125706102a0860182612030565b506102c08301516125856102c08601826120a5565b508091505092915050565b61259981612b2e565b82525050565b6125a881612b2e565b82525050565b6125b781612b38565b82525050565b60006040820190506125d26000830185611d3b565b6125df6020830184612096565b9392505050565b600060e0820190506125fb600083018a611d3b565b6126086020830189612096565b612615604083018861259f565b612622606083018761259f565b61262f60808301866125ae565b61263c60a083018561203f565b61264960c083018461203f565b98975050505050505050565b600060c08201905061266a6000830189611d3b565b612677602083018861259f565b612684604083018761259f565b61269160608301866125ae565b61269e608083018561203f565b6126ab60a083018461203f565b979650505050505050565b600060208201905081810360008301526126d08184611ef0565b905092915050565b600060208201905081810360008301526126f28184611f4e565b905092915050565b60006020820190508181036000830152612713816120ed565b9050919050565b600060208201905081810360008301526127348184612389565b905092915050565b6000602082019050612751600083018461259f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561277e5761277d612bc0565b5b8060405250919050565b600067ffffffffffffffff8211156127a3576127a2612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156127cf576127ce612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156127fb576127fa612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561282757612826612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561285357612852612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561287f5761287e612bc0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156128af576128ae612bc0565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612aa782612b0e565b9050919050565b60008115159050919050565b6000819050919050565b6000612acf82612a9c565b9050919050565b6000612ae182612a9c565b9050919050565b6000819050612af682612bd3565b919050565b6000819050612b0982612be7565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612b5082612b57565b9050919050565b6000612b6282612b0e565b9050919050565b6000612b7482612ae8565b9050919050565b6000612b8682612afb565b9050919050565b60005b83811015612bab578082015181840152602081019050612b90565b83811115612bba576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b60028110612be457612be3612bc0565b5b50565b60088110612bf857612bf7612bc0565b5b50565b612c0481612a9c565b8114612c0f57600080fd5b50565b612c1b81612aae565b8114612c2657600080fd5b50565b612c3281612aba565b8114612c3d57600080fd5b50565b612c4981612ac4565b8114612c5457600080fd5b50565b612c6081612ad6565b8114612c6b57600080fd5b50565b60028110612c7b57600080fd5b50565b60088110612c8b57600080fd5b50565b612c9781612b2e565b8114612ca257600080fd5b50565b612cae81612b38565b8114612cb957600080fd5b5056fea264697066735822122072ef7b6e75146e320e285db806407fdad63091c870d4297aed4e00948dda80dc64736f6c63430007050033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100625760003560e01c80631d73fd6d146100675780632a877f111461008557806367e7dc36146100a1578063a3cc31d5146100bd578063a72b6325146100ed578063e37261151461011d575b600080fd5b61006f61014d565b60405161007c919061273c565b60405180910390f35b61009f600480360381019061009a9190611aab565b610153565b005b6100bb60048036038101906100b69190611a36565b610311565b005b6100d760048036038101906100d291906119e2565b6104aa565b6040516100e491906126b6565b60405180910390f35b61010760048036038101906101029190611bdc565b6107e2565b604051610114919061271a565b60405180910390f35b61013760048036038101906101329190611c18565b610d24565b60405161014491906126d8565b60405180910390f35b61271081565b81819050848490501461019b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610192906126fa565b60405180910390fd5b60005b8484905081101561030a578484828181106101b557fe5b90506020020160208101906101ca9190611990565b73ffffffffffffffffffffffffffffffffffffffff1663f713d8a88484848181106101f157fe5b905060e0020160000160208101906102099190611990565b85858581811061021557fe5b905060e00201602001602081019061022d9190611b20565b86868681811061023957fe5b905060e002016040013587878781811061024f57fe5b905060e002016060013588888881811061026557fe5b905060e00201608001602081019061027d9190611c67565b89898981811061028957fe5b905060e0020160a001358a8a8a81811061029f57fe5b905060e0020160c001356040518863ffffffff1660e01b81526004016102cb97969594939291906125e6565b600060405180830381600087803b1580156102e557600080fd5b505af11580156102f9573d6000803e3d6000fd5b50505050808060010191505061019e565b5050505050565b818190508484905014610359576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610350906126fa565b60405180910390fd5b60005b848490508110156104a35784848281811061037357fe5b90506020020160208101906103889190611990565b73ffffffffffffffffffffffffffffffffffffffff1663c3cda5208484848181106103af57fe5b905060c0020160000160208101906103c79190611990565b8585858181106103d357fe5b905060c00201602001358686868181106103e957fe5b905060c00201604001358787878181106103ff57fe5b905060c0020160600160208101906104179190611c67565b88888881811061042357fe5b905060c002016080013589898981811061043957fe5b905060c0020160a001356040518763ffffffff1660e01b815260040161046496959493929190612655565b600060405180830381600087803b15801561047e57600080fd5b505af1158015610492573d6000803e3d6000fd5b50505050808060010191505061035c565b5050505050565b6060815167ffffffffffffffff811180156104c457600080fd5b506040519080825280602002602001820160405280156104fe57816020015b6104eb611008565b8152602001906001900390816104e35790505b50905060005b82518110156107db57600083828151811061051b57fe5b6020026020010151905060008173ffffffffffffffffffffffffffffffffffffffff1663b2f4201d8760006040518363ffffffff1660e01b81526004016105639291906125bd565b60206040518083038186803b15801561057b57600080fd5b505afa15801561058f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b39190611bb3565b905060008273ffffffffffffffffffffffffffffffffffffffff1663b2f4201d8860016040518363ffffffff1660e01b81526004016105f39291906125bd565b60206040518083038186803b15801561060b57600080fd5b505afa15801561061f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106439190611bb3565b905060008373ffffffffffffffffffffffffffffffffffffffff16636f50458d8960006040518363ffffffff1660e01b81526004016106839291906125bd565b60206040518083038186803b15801561069b57600080fd5b505afa1580156106af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d391906119b9565b905060008473ffffffffffffffffffffffffffffffffffffffff16636f50458d8a60016040518363ffffffff1660e01b81526004016107139291906125bd565b60206040518083038186803b15801561072b57600080fd5b505afa15801561073f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076391906119b9565b905060405180608001604052808581526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018273ffffffffffffffffffffffffffffffffffffffff168152508787815181106107be57fe5b602002602001018190525050505050508080600101915050610504565b5092915050565b6107ea61105c565b6107f261115e565b8273ffffffffffffffffffffffffffffffffffffffff16633656de21856040518263ffffffff1660e01b815260040161082b919061273c565b60006040518083038186803b15801561084357600080fd5b505afa158015610857573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108809190611b72565b90506000816101e0015173ffffffffffffffffffffffffffffffffffffffff16637a71f9d78361010001516040518263ffffffff1660e01b81526004016108c7919061273c565b60206040518083038186803b1580156108df57600080fd5b505afa1580156108f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109179190611bb3565b9050604051806102e00160405280828152602001836040015173ffffffffffffffffffffffffffffffffffffffff1663b159beac6040518163ffffffff1660e01b815260040160206040518083038186803b15801561097557600080fd5b505afa158015610989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ad9190611bb3565b8152602001836040015173ffffffffffffffffffffffffffffffffffffffff16639125fb586040518163ffffffff1660e01b815260040160206040518083038186803b1580156109fc57600080fd5b505afa158015610a10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a349190611bb3565b8152602001600084610140015111610a5157836101400151610aeb565b610aea846101400151856040015173ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa457600080fd5b505afa158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc9190611bb3565b610e7690919063ffffffff16565b5b8152602001610b858673ffffffffffffffffffffffffffffffffffffffff1663a2b170b06040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3957600080fd5b505afa158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190611bb3565b856101000151610efe90919063ffffffff16565b815260200183600001518152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001836040015173ffffffffffffffffffffffffffffffffffffffff16815260200183606001518152602001836080015181526020018360a0015181526020018360c0015181526020018360e00151815260200183610100015181526020018361012001518152602001836101400151815260200183610160015181526020018361018001518152602001836101a0015115158152602001836101c0015115158152602001836101e0015173ffffffffffffffffffffffffffffffffffffffff16815260200183610200015181526020018573ffffffffffffffffffffffffffffffffffffffff16639080936f886040518263ffffffff1660e01b8152600401610cbc919061273c565b60206040518083038186803b158015610cd457600080fd5b505afa158015610ce8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0c9190611b49565b6007811115610d1757fe5b8152509250505092915050565b60606000610db8858473ffffffffffffffffffffffffffffffffffffffff166398e527d36040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7257600080fd5b505afa158015610d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daa9190611bb3565b610efe90919063ffffffff16565b90506000818511610dc95784610dcb565b815b90508067ffffffffffffffff81118015610de457600080fd5b50604051908082528060200260200182016040528015610e1e57816020015b610e0b61105c565b815260200190600190039081610e035790505b50925060005b81811015610e6c57610e48610e428883610e7690919063ffffffff16565b866107e2565b848281518110610e5457fe5b60200260200101819052508080600101915050610e24565b5050509392505050565b600080828401905083811015610ef4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000610f4083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f48565b905092915050565b6000838311158290610ff5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610fba578082015181840152602081019050610f9f565b50505050905090810190601f168015610fe75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b604051806080016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604051806102e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600080191681526020016000600781111561115857fe5b81525090565b60405180610220016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160608152602001606081526020016060815260200160608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600015158152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600080191681525090565b60008135905061123a81612bfb565b92915050565b60008151905061124f81612bfb565b92915050565b60008083601f84011261126757600080fd5b8235905067ffffffffffffffff81111561128057600080fd5b60208301915083602082028301111561129857600080fd5b9250929050565b600082601f8301126112b057600080fd5b81356112c36112be82612788565b612757565b915081818352602084019350602081019050838560208402820111156112e857600080fd5b60005b8381101561131857816112fe888261122b565b8452602084019350602083019250506001810190506112eb565b5050505092915050565b600082601f83011261133357600080fd5b815161134661134182612788565b612757565b9150818183526020840193506020810190508385602084028201111561136b57600080fd5b60005b8381101561139b57816113818882611240565b84526020840193506020830192505060018101905061136e565b5050505092915050565b600082601f8301126113b657600080fd5b81516113c96113c4826127b4565b612757565b915081818352602084019350602081019050838560208402820111156113ee57600080fd5b60005b8381101561141e57816114048882611627565b8452602084019350602083019250506001810190506113f1565b5050505092915050565b600082601f83011261143957600080fd5b815161144c611447826127e0565b612757565b9150818183526020840193506020810190508360005b8381101561149257815186016114788882611651565b845260208401935060208301925050600181019050611462565b5050505092915050565b600082601f8301126114ad57600080fd5b81516114c06114bb8261280c565b612757565b9150818183526020840193506020810190508360005b8381101561150657815186016114ec88826116f9565b8452602084019350602083019250506001810190506114d6565b5050505092915050565b60008083601f84011261152257600080fd5b8235905067ffffffffffffffff81111561153b57600080fd5b6020830191508360c082028301111561155357600080fd5b9250929050565b60008083601f84011261156c57600080fd5b8235905067ffffffffffffffff81111561158557600080fd5b6020830191508360e082028301111561159d57600080fd5b9250929050565b600082601f8301126115b557600080fd5b81516115c86115c382612838565b612757565b915081818352602084019350602081019050838560208402820111156115ed57600080fd5b60005b8381101561161d57816116038882611966565b8452602084019350602083019250506001810190506115f0565b5050505092915050565b60008151905061163681612c12565b92915050565b60008151905061164b81612c29565b92915050565b600082601f83011261166257600080fd5b815161167561167082612864565b612757565b9150808252602083016020830185838301111561169157600080fd5b61169c838284612b8d565b50505092915050565b6000813590506116b481612c40565b92915050565b6000815190506116c981612c57565b92915050565b6000813590506116de81612c6e565b92915050565b6000815190506116f381612c7e565b92915050565b600082601f83011261170a57600080fd5b815161171d61171882612894565b612757565b9150808252602083016020830185838301111561173957600080fd5b611744838284612b8d565b50505092915050565b6000610220828403121561176057600080fd5b61176b610220612757565b9050600061177b84828501611966565b600083015250602061178f84828501611240565b60208301525060406117a3848285016116ba565b604083015250606082015167ffffffffffffffff8111156117c357600080fd5b6117cf84828501611322565b606083015250608082015167ffffffffffffffff8111156117ef57600080fd5b6117fb848285016115a4565b60808301525060a082015167ffffffffffffffff81111561181b57600080fd5b6118278482850161149c565b60a08301525060c082015167ffffffffffffffff81111561184757600080fd5b61185384828501611428565b60c08301525060e082015167ffffffffffffffff81111561187357600080fd5b61187f848285016113a5565b60e08301525061010061189484828501611966565b610100830152506101206118aa84828501611966565b610120830152506101406118c084828501611966565b610140830152506101606118d684828501611966565b610160830152506101806118ec84828501611966565b610180830152506101a061190284828501611627565b6101a0830152506101c061191884828501611627565b6101c0830152506101e061192e84828501611240565b6101e0830152506102006119448482850161163c565b6102008301525092915050565b60008135905061196081612c8e565b92915050565b60008151905061197581612c8e565b92915050565b60008135905061198a81612ca5565b92915050565b6000602082840312156119a257600080fd5b60006119b08482850161122b565b91505092915050565b6000602082840312156119cb57600080fd5b60006119d984828501611240565b91505092915050565b600080604083850312156119f557600080fd5b6000611a038582860161122b565b925050602083013567ffffffffffffffff811115611a2057600080fd5b611a2c8582860161129f565b9150509250929050565b60008060008060408587031215611a4c57600080fd5b600085013567ffffffffffffffff811115611a6657600080fd5b611a7287828801611255565b9450945050602085013567ffffffffffffffff811115611a9157600080fd5b611a9d87828801611510565b925092505092959194509250565b60008060008060408587031215611ac157600080fd5b600085013567ffffffffffffffff811115611adb57600080fd5b611ae787828801611255565b9450945050602085013567ffffffffffffffff811115611b0657600080fd5b611b128782880161155a565b925092505092959194509250565b600060208284031215611b3257600080fd5b6000611b40848285016116cf565b91505092915050565b600060208284031215611b5b57600080fd5b6000611b69848285016116e4565b91505092915050565b600060208284031215611b8457600080fd5b600082015167ffffffffffffffff811115611b9e57600080fd5b611baa8482850161174d565b91505092915050565b600060208284031215611bc557600080fd5b6000611bd384828501611966565b91505092915050565b60008060408385031215611bef57600080fd5b6000611bfd85828601611951565b9250506020611c0e858286016116a5565b9150509250929050565b600080600060608486031215611c2d57600080fd5b6000611c3b86828701611951565b9350506020611c4c86828701611951565b9250506040611c5d868287016116a5565b9150509250925092565b600060208284031215611c7957600080fd5b6000611c878482850161197b565b91505092915050565b6000611c9c8383611d2c565b60208301905092915050565b6000611cb48383612021565b60208301905092915050565b6000611ccc838361204e565b905092915050565b6000611ce083836120b4565b905092915050565b6000611cf4838361212d565b60808301905092915050565b6000611d0c8383612182565b905092915050565b6000611d208383612590565b60208301905092915050565b611d3581612a9c565b82525050565b611d4481612a9c565b82525050565b6000611d5582612934565b611d5f81856129f2565b9350611d6a836128c4565b8060005b83811015611d9b578151611d828882611c90565b9750611d8d83612997565b925050600181019050611d6e565b5085935050505092915050565b6000611db38261293f565b611dbd8185612a03565b9350611dc8836128d4565b8060005b83811015611df9578151611de08882611ca8565b9750611deb836129a4565b925050600181019050611dcc565b5085935050505092915050565b6000611e118261294a565b611e1b8185612a14565b935083602082028501611e2d856128e4565b8060005b85811015611e695784840389528151611e4a8582611cc0565b9450611e55836129b1565b925060208a01995050600181019050611e31565b50829750879550505050505092915050565b6000611e8682612955565b611e908185612a25565b935083602082028501611ea2856128f4565b8060005b85811015611ede5784840389528151611ebf8582611cd4565b9450611eca836129be565b925060208a01995050600181019050611ea6565b50829750879550505050505092915050565b6000611efb82612960565b611f058185612a36565b9350611f1083612904565b8060005b83811015611f41578151611f288882611ce8565b9750611f33836129cb565b925050600181019050611f14565b5085935050505092915050565b6000611f598261296b565b611f638185612a47565b935083602082028501611f7585612914565b8060005b85811015611fb15784840389528151611f928582611d00565b9450611f9d836129d8565b925060208a01995050600181019050611f79565b50829750879550505050505092915050565b6000611fce82612976565b611fd88185612a58565b9350611fe383612924565b8060005b83811015612014578151611ffb8882611d14565b9750612006836129e5565b925050600181019050611fe7565b5085935050505092915050565b61202a81612aae565b82525050565b61203981612aba565b82525050565b61204881612aba565b82525050565b600061205982612981565b6120638185612a69565b9350612073818560208601612b8d565b61207c81612bc2565b840191505092915050565b61209081612b45565b82525050565b61209f81612b69565b82525050565b6120ae81612b7b565b82525050565b60006120bf8261298c565b6120c98185612a7a565b93506120d9818560208601612b8d565b6120e281612bc2565b840191505092915050565b60006120fa601a83612a8b565b91507f494e434f4e53495354454e545f504152414d535f4c454e4754480000000000006000830152602082019050919050565b6080820160008201516121436000850182612590565b5060208201516121566020850182611d2c565b5060408201516121696040850182612590565b50606082015161217c6060850182611d2c565b50505050565b60006102e08301600083015161219b6000860182612590565b5060208301516121ae6020860182612590565b5060408301516121c16040860182612590565b5060608301516121d46060860182612590565b5060808301516121e76080860182612590565b5060a08301516121fa60a0860182612590565b5060c083015161220d60c0860182611d2c565b5060e083015161222060e0860182612087565b5061010083015184820361010086015261223a8282611d4a565b9150506101208301518482036101208601526122568282611fc3565b9150506101408301518482036101408601526122728282611e7b565b91505061016083015184820361016086015261228e8282611e06565b9150506101808301518482036101808601526122aa8282611da8565b9150506101a08301516122c16101a0860182612590565b506101c08301516122d66101c0860182612590565b506101e08301516122eb6101e0860182612590565b50610200830151612300610200860182612590565b50610220830151612315610220860182612590565b5061024083015161232a610240860182612021565b5061026083015161233f610260860182612021565b50610280830151612354610280860182611d2c565b506102a08301516123696102a0860182612030565b506102c083015161237e6102c08601826120a5565b508091505092915050565b60006102e0830160008301516123a26000860182612590565b5060208301516123b56020860182612590565b5060408301516123c86040860182612590565b5060608301516123db6060860182612590565b5060808301516123ee6080860182612590565b5060a083015161240160a0860182612590565b5060c083015161241460c0860182611d2c565b5060e083015161242760e0860182612087565b506101008301518482036101008601526124418282611d4a565b91505061012083015184820361012086015261245d8282611fc3565b9150506101408301518482036101408601526124798282611e7b565b9150506101608301518482036101608601526124958282611e06565b9150506101808301518482036101808601526124b18282611da8565b9150506101a08301516124c86101a0860182612590565b506101c08301516124dd6101c0860182612590565b506101e08301516124f26101e0860182612590565b50610200830151612507610200860182612590565b5061022083015161251c610220860182612590565b50610240830151612531610240860182612021565b50610260830151612546610260860182612021565b5061028083015161255b610280860182611d2c565b506102a08301516125706102a0860182612030565b506102c08301516125856102c08601826120a5565b508091505092915050565b61259981612b2e565b82525050565b6125a881612b2e565b82525050565b6125b781612b38565b82525050565b60006040820190506125d26000830185611d3b565b6125df6020830184612096565b9392505050565b600060e0820190506125fb600083018a611d3b565b6126086020830189612096565b612615604083018861259f565b612622606083018761259f565b61262f60808301866125ae565b61263c60a083018561203f565b61264960c083018461203f565b98975050505050505050565b600060c08201905061266a6000830189611d3b565b612677602083018861259f565b612684604083018761259f565b61269160608301866125ae565b61269e608083018561203f565b6126ab60a083018461203f565b979650505050505050565b600060208201905081810360008301526126d08184611ef0565b905092915050565b600060208201905081810360008301526126f28184611f4e565b905092915050565b60006020820190508181036000830152612713816120ed565b9050919050565b600060208201905081810360008301526127348184612389565b905092915050565b6000602082019050612751600083018461259f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561277e5761277d612bc0565b5b8060405250919050565b600067ffffffffffffffff8211156127a3576127a2612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156127cf576127ce612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156127fb576127fa612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561282757612826612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561285357612852612bc0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561287f5761287e612bc0565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156128af576128ae612bc0565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000612aa782612b0e565b9050919050565b60008115159050919050565b6000819050919050565b6000612acf82612a9c565b9050919050565b6000612ae182612a9c565b9050919050565b6000819050612af682612bd3565b919050565b6000819050612b0982612be7565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000612b5082612b57565b9050919050565b6000612b6282612b0e565b9050919050565b6000612b7482612ae8565b9050919050565b6000612b8682612afb565b9050919050565b60005b83811015612bab578082015181840152602081019050612b90565b83811115612bba576000848401525b50505050565bfe5b6000601f19601f8301169050919050565b60028110612be457612be3612bc0565b5b50565b60088110612bf857612bf7612bc0565b5b50565b612c0481612a9c565b8114612c0f57600080fd5b50565b612c1b81612aae565b8114612c2657600080fd5b50565b612c3281612aba565b8114612c3d57600080fd5b50565b612c4981612ac4565b8114612c5457600080fd5b50565b612c6081612ad6565b8114612c6b57600080fd5b50565b60028110612c7b57600080fd5b50565b60088110612c8b57600080fd5b50565b612c9781612b2e565b8114612ca257600080fd5b50565b612cae81612b38565b8114612cb957600080fd5b5056fea264697066735822122072ef7b6e75146e320e285db806407fdad63091c870d4297aed4e00948dda80dc64736f6c63430007050033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.