Contract 0x3efb1b284a3eba3955c53b728a2cc4182a07e92f 1

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xeacfba7ea2ea5b5843eb967242bbffc0d955d611bc1322268fb3200d4f73aa2aClaim431208652023-05-25 6:37:442 days 18 hrs ago0x51c1ce246708b2a198f7e7e9dc3d154ee4cd9572 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.047060762233 132.34594499
0x842fb3f056a719d230b5d22eb05b6a653812bb997fbb78a49978806c085fe230Claim429998952023-05-22 3:55:525 days 20 hrs ago0xf6657bbcfeb5c2746e8c609e35018a5a8caa13fb IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.055103664 187
0x9ac83036d1644e20c0ff70192b168acff40873f5bf083775cb524bafdbb1f675Claim428905982023-05-19 10:01:558 days 14 hrs ago0x49430eb37fe84569d91b2f543b5dd19bfe683c33 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.0910593 318
0x55538d79ec4a7f0a3d294f5f4401b3674bc11b5cb50163c7843aa679dd31d0c6Claim428744942023-05-19 0:23:249 days 28 mins ago0x4529054ab4ba35da86798c6f499011f93d7c59b3 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.045150576 149
0x07e21a634f06d9c18f051a2de27c93086521302f5df815a16c6315f66a908de9Claim428488562023-05-18 9:02:479 days 15 hrs ago0x3a645abbc55a6a77e7c424d7e64c289b00b6fa30 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.062725849873 199.694532386
0xbeb027fd34b8f0b113a876d78119f5032c0590e508e55e35282f90fccf66b3fcClaim425788502023-05-11 15:23:0816 days 9 hrs ago0x6f25c74f204fecd35db6d8de0c611dfe0e4acbab IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.074433879 237
0x4b55476abe182377c98ca015822fd2bde04784d6abce5949fbb59f2b7d4ea4c4Claim425771072023-05-11 14:19:3816 days 10 hrs ago0x49a5492fdfe5acc966dd5f41310dfdfe8daa349c IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.055709912899 196.774854387
0xac434d69bd7b8ce7cd6f383059dfd8cd2bfc3c7cb1d3fb4c3db74911c804fb70Claim425145522023-05-10 1:10:2817 days 23 hrs ago0xba56bdde919044a542e0271c66f8c3b2a7d272d3 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.07838064 212
0xfd1232094a26f459020cff8fa3c37dc2aed5d8b4cfaabdf28729e2adff551539Claim425145312023-05-10 1:09:4417 days 23 hrs ago0xba56bdde919044a542e0271c66f8c3b2a7d272d3 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.07875036 213
0xd8639224fc5f49d3d3fc84b7189d684b698e8dc7ce36e350a0fbf34d80dc9f3dClaim425047862023-05-09 19:14:3018 days 5 hrs ago0xf026f106b09e5a54f6854fe0d26a0ab0741a1287 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.039431639239 140.430066526
0x5360d4713d199d48239269d9a6c2318216357d8f7d7400b230f07cf85c1c8a9aClaim424610142023-05-08 17:07:1719 days 7 hrs ago0x13108ab5c6eb7efdcd7ba6f8cc55d265eae6176f IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.06770214198
0xeb779a756ddb73af00820142864be7a45b922d2515ca9050f8724640b2102faaClaim424276502023-05-07 21:00:2220 days 3 hrs ago0x8966d8acbb4b0d5830fca4b0dd3b134e41049b19 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.08695764 198
0x9fca31e2ce4c7d1a5941a711a5f8d215f9bf995727d69fcfc47e1dc319b43100Claim424180322023-05-07 14:56:5620 days 9 hrs ago0x4ede3653957b5b45f81709ed7692e6df63edaa20 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.06666528 220
0x850c4d122ec2bd7c3122cdbd30ea5bb7f82ec5fb3798f5be659d72d962e11a27Claim424106852023-05-07 10:29:4320 days 14 hrs ago0xcf97f74610a18d642e79137b31ae632cb91c3e81 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.084930272 268
0x50e6dbfa72e2b32cc11bc38097ff7ce062298220bb0c59381f2ff65f636842deClaim424011842023-05-07 4:49:0720 days 20 hrs ago0x09fa38eba245bb68354b8950fa2fe71f02863393 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.048456728166
0xb13a3741b9756efcadc028ef68336e3e75616954f1e1b25789e29f021dc689d0Claim423981302023-05-07 2:59:3520 days 21 hrs ago0xcba1a275e2d858ecffaf7a87f606f74b719a8a93 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.075345732 242
0x1cbe63b83c8b20a6b6335e165fb7898cdcf119c197527478c519f61fd0c3b4ccClaim423965512023-05-07 2:02:0520 days 22 hrs ago0x6aafa75a4fc4512a0a3ba6d02e8b6d407402e479 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.08136233 271
0xf50e83834e4bb2e98a5bfa6e1e5e0d650118cfe1cf3a4c16073975239ad9919aClaim423373292023-05-05 14:19:3222 days 10 hrs ago0x287cdd0a59d69e9f101e90bdbcc892607df08cf9 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.099081468 309
0xd97b4af58bf01975f561fc0415c725c1cf4a29346dca10d64ece9597a8e2ee51Claim422896332023-05-04 9:04:2223 days 15 hrs ago0x49a5492fdfe5acc966dd5f41310dfdfe8daa349c IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.076846098085 271.430683948
0x9fbee4dafa4ae19576d1184dc24f2cd4d7f8ab1895680fc93553a4cad4e74e44Claim422299812023-05-02 21:05:1925 days 3 hrs ago0xff65888193b2623ac033975d4e7ddb1f795a4c86 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.073790328089221.577938064
0xec50a2988f0f32450bb1afc66311dcc8881951d9710717816e40d688d85be1aeClaim422156052023-05-02 12:29:5425 days 12 hrs ago0x49a5492fdfe5acc966dd5f41310dfdfe8daa349c IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.066039678543 233.260966547
0x1f45e66cc0d45bedfecdac4a708853bf5bfe53f2ac804b942e2bff6923220e09Claim421378142023-04-30 13:25:3727 days 11 hrs ago0x49430eb37fe84569d91b2f543b5dd19bfe683c33 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.183009162 633
0x5964d0aaba0d030028f9fe6c638ec64c0cbb7e66f5f84a7448a9e31071d71aacClaim421283032023-04-30 7:41:5227 days 17 hrs ago0xf6657bbcfeb5c2746e8c609e35018a5a8caa13fb IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.108706864 376
0x67c0fdacc593d137430fc2ac8d4f12f540ccf21b84e386fc557c2ee46c006d80Claim419078022023-04-24 16:26:0733 days 8 hrs ago0xf026f106b09e5a54f6854fe0d26a0ab0741a1287 IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.1420677653 440.572114855
0xd450052b6df0d579c447d44c60e5cb5b1726aa608a2dbb7fd66dd034da04e8f2Claim417964292023-04-21 18:52:4136 days 5 hrs ago0x17ec133d0774c0e8f463e864f8a31e19c7bfd03f IN  0x3efb1b284a3eba3955c53b728a2cc4182a07e92f0 MATIC0.0864777 302
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xBB5b65FE42B1965eD412fDe45B9b336a2cFba43b

Contract Name:
VeDist

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : VeDist.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

import "../../lib/Math.sol";
import "../../interface/IERC20.sol";
import "../../interface/IVeDist.sol";
import "../../interface/IVe.sol";
import "../../lib/SafeERC20.sol";

contract VeDist is IVeDist {
  using SafeERC20 for IERC20;

  event CheckpointToken(
    uint time,
    uint tokens
  );

  event Claimed(
    uint tokenId,
    uint amount,
    uint claimEpoch,
    uint maxEpoch
  );

  struct ClaimCalculationResult {
    uint toDistribute;
    uint userEpoch;
    uint weekCursor;
    uint maxUserEpoch;
    bool success;
  }


  uint constant WEEK = 7 * 86400;

  uint public startTime;
  uint public timeCursor;
  mapping(uint => uint) public timeCursorOf;
  mapping(uint => uint) public userEpochOf;

  uint public lastTokenTime;
  uint[1000000000000000] public tokensPerWeek;

  address public votingEscrow;
  address public token;
  uint public tokenLastBalance;

  uint[1000000000000000] public veSupply;

  address public depositor;

  constructor(address _votingEscrow) {
    uint _t = block.timestamp / WEEK * WEEK;
    startTime = _t;
    lastTokenTime = _t;
    timeCursor = _t;
    address _token = IVe(_votingEscrow).token();
    token = _token;
    votingEscrow = _votingEscrow;
    depositor = msg.sender;
    IERC20(_token).safeIncreaseAllowance(_votingEscrow, type(uint).max);
  }

  function timestamp() external view returns (uint) {
    return block.timestamp / WEEK * WEEK;
  }

  function _checkpointToken() internal {
    uint tokenBalance = IERC20(token).balanceOf(address(this));
    uint toDistribute = tokenBalance - tokenLastBalance;
    tokenLastBalance = tokenBalance;

    uint t = lastTokenTime;
    uint sinceLast = block.timestamp - t;
    lastTokenTime = block.timestamp;
    uint thisWeek = t / WEEK * WEEK;
    uint nextWeek = 0;

    for (uint i = 0; i < 20; i++) {
      nextWeek = thisWeek + WEEK;
      if (block.timestamp < nextWeek) {
        tokensPerWeek[thisWeek] += _adjustToDistribute(toDistribute, block.timestamp, t, sinceLast);
        break;
      } else {
        tokensPerWeek[thisWeek] += _adjustToDistribute(toDistribute, nextWeek, t, sinceLast);
      }
      t = nextWeek;
      thisWeek = nextWeek;
    }
    emit CheckpointToken(block.timestamp, toDistribute);
  }

  /// @dev For testing purposes.
  function adjustToDistribute(
    uint toDistribute,
    uint t0,
    uint t1,
    uint sinceLastCall
  ) external pure returns (uint) {
    return _adjustToDistribute(
      toDistribute,
      t0,
      t1,
      sinceLastCall
    );
  }

  function _adjustToDistribute(
    uint toDistribute,
    uint t0,
    uint t1,
    uint sinceLast
  ) internal pure returns (uint) {
    if (t0 <= t1 || t0 - t1 == 0 || sinceLast == 0) {
      return toDistribute;
    }
    return toDistribute * (t0 - t1) / sinceLast;
  }

  function checkpointToken() external override {
    require(msg.sender == depositor, "!depositor");
    _checkpointToken();
  }

  function _findTimestampEpoch(address ve, uint _timestamp) internal view returns (uint) {
    uint _min = 0;
    uint _max = IVe(ve).epoch();
    for (uint i = 0; i < 128; i++) {
      if (_min >= _max) break;
      uint _mid = (_min + _max + 2) / 2;
      IVe.Point memory pt = IVe(ve).pointHistory(_mid);
      if (pt.ts <= _timestamp) {
        _min = _mid;
      } else {
        _max = _mid - 1;
      }
    }
    return _min;
  }

  function findTimestampUserEpoch(address ve, uint tokenId, uint _timestamp, uint maxUserEpoch) external view returns (uint) {
    return _findTimestampUserEpoch(ve, tokenId, _timestamp, maxUserEpoch);
  }

  function _findTimestampUserEpoch(address ve, uint tokenId, uint _timestamp, uint maxUserEpoch) internal view returns (uint) {
    uint _min = 0;
    uint _max = maxUserEpoch;
    for (uint i = 0; i < 128; i++) {
      if (_min >= _max) break;
      uint _mid = (_min + _max + 2) / 2;
      IVe.Point memory pt = IVe(ve).userPointHistory(tokenId, _mid);
      if (pt.ts <= _timestamp) {
        _min = _mid;
      } else {
        _max = _mid - 1;
      }
    }
    return _min;
  }

  function veForAt(uint _tokenId, uint _timestamp) external view returns (uint) {
    address ve = votingEscrow;
    uint maxUserEpoch = IVe(ve).userPointEpoch(_tokenId);
    uint epoch = _findTimestampUserEpoch(ve, _tokenId, _timestamp, maxUserEpoch);
    IVe.Point memory pt = IVe(ve).userPointHistory(_tokenId, epoch);
    return uint(int256(Math.positiveInt128(pt.bias - pt.slope * (int128(int256(_timestamp - pt.ts))))));
  }

  function _checkpointTotalSupply() internal {
    address ve = votingEscrow;
    uint t = timeCursor;
    uint roundedTimestamp = block.timestamp / WEEK * WEEK;
    IVe(ve).checkpoint();

    // assume will be called more frequently than 20 weeks
    for (uint i = 0; i < 20; i++) {
      if (t > roundedTimestamp) {
        break;
      } else {
        uint epoch = _findTimestampEpoch(ve, t);
        IVe.Point memory pt = IVe(ve).pointHistory(epoch);
        veSupply[t] = _adjustVeSupply(t, pt.ts, pt.bias, pt.slope);
      }
      t += WEEK;
    }
    timeCursor = t;
  }

  function adjustVeSupply(uint t, uint ptTs, int128 ptBias, int128 ptSlope) external pure returns (uint) {
    return _adjustVeSupply(t, ptTs, ptBias, ptSlope);
  }

  function _adjustVeSupply(uint t, uint ptTs, int128 ptBias, int128 ptSlope) internal pure returns (uint) {
    if (t < ptTs) {
      return 0;
    }
    int128 dt = int128(int256(t - ptTs));
    if (ptBias < ptSlope * dt) {
      return 0;
    }
    return uint(int256(Math.positiveInt128(ptBias - ptSlope * dt)));
  }

  function checkpointTotalSupply() external override {
    _checkpointTotalSupply();
  }

  function _claim(uint _tokenId, address ve, uint _lastTokenTime) internal returns (uint) {
    ClaimCalculationResult memory result = _calculateClaim(_tokenId, ve, _lastTokenTime);
    if (result.success) {
      userEpochOf[_tokenId] = result.userEpoch;
      timeCursorOf[_tokenId] = result.weekCursor;
      emit Claimed(_tokenId, result.toDistribute, result.userEpoch, result.maxUserEpoch);
    }
    return result.toDistribute;
  }

  function _calculateClaim(uint _tokenId, address ve, uint _lastTokenTime) internal view returns (ClaimCalculationResult memory) {
    uint userEpoch;
    uint toDistribute;
    uint maxUserEpoch = IVe(ve).userPointEpoch(_tokenId);
    uint _startTime = startTime;

    if (maxUserEpoch == 0) {
      return ClaimCalculationResult(0, 0, 0, 0, false);
    }

    uint weekCursor = timeCursorOf[_tokenId];

    if (weekCursor == 0) {
      userEpoch = _findTimestampUserEpoch(ve, _tokenId, _startTime, maxUserEpoch);
    } else {
      userEpoch = userEpochOf[_tokenId];
    }

    if (userEpoch == 0) userEpoch = 1;

    IVe.Point memory userPoint = IVe(ve).userPointHistory(_tokenId, userEpoch);
    if (weekCursor == 0) {
      weekCursor = (userPoint.ts + WEEK - 1) / WEEK * WEEK;
    }
    if (weekCursor >= lastTokenTime) {
      return ClaimCalculationResult(0, 0, 0, 0, false);
    }
    if (weekCursor < _startTime) {
      weekCursor = _startTime;
    }

    IVe.Point memory oldUserPoint;
    {
      for (uint i = 0; i < 50; i++) {
        if (weekCursor >= _lastTokenTime) {
          break;
        }
        if (weekCursor >= userPoint.ts && userEpoch <= maxUserEpoch) {
          userEpoch += 1;
          oldUserPoint = userPoint;
          if (userEpoch > maxUserEpoch) {
            userPoint = IVe.Point(0, 0, 0, 0);
          } else {
            userPoint = IVe(ve).userPointHistory(_tokenId, userEpoch);
          }
        } else {
          int128 dt = int128(int256(weekCursor - oldUserPoint.ts));
          uint balanceOf = uint(int256(Math.positiveInt128(oldUserPoint.bias - dt * oldUserPoint.slope)));
          if (balanceOf == 0 && userEpoch > maxUserEpoch) {
            break;
          }
          toDistribute += balanceOf * tokensPerWeek[weekCursor] / veSupply[weekCursor];
          weekCursor += WEEK;
        }
      }
    }
    return ClaimCalculationResult(
      toDistribute,
      Math.min(maxUserEpoch, userEpoch - 1),
      weekCursor,
      maxUserEpoch,
      true
    );
  }

  function claimable(uint _tokenId) external view returns (uint) {
    uint _lastTokenTime = lastTokenTime / WEEK * WEEK;
    ClaimCalculationResult memory result = _calculateClaim(_tokenId, votingEscrow, _lastTokenTime);
    return result.toDistribute;
  }

  function claim(uint _tokenId) external returns (uint) {
    if (block.timestamp >= timeCursor) _checkpointTotalSupply();
    uint _lastTokenTime = lastTokenTime;
    _lastTokenTime = _lastTokenTime / WEEK * WEEK;
    uint amount = _claim(_tokenId, votingEscrow, _lastTokenTime);
    if (amount != 0) {
      IVe(votingEscrow).depositFor(_tokenId, amount);
      tokenLastBalance -= amount;
    }
    return amount;
  }

  function claimMany(uint[] memory _tokenIds) external returns (bool) {
    if (block.timestamp >= timeCursor) _checkpointTotalSupply();
    uint _lastTokenTime = lastTokenTime;
    _lastTokenTime = _lastTokenTime / WEEK * WEEK;
    address _votingEscrow = votingEscrow;
    uint total = 0;

    for (uint i = 0; i < _tokenIds.length; i++) {
      uint _tokenId = _tokenIds[i];
      if (_tokenId == 0) break;
      uint amount = _claim(_tokenId, _votingEscrow, _lastTokenTime);
      if (amount != 0) {
        IVe(_votingEscrow).depositFor(_tokenId, amount);
        total += amount;
      }
    }
    if (total != 0) {
      tokenLastBalance -= total;
    }

    return true;
  }

  // Once off event on contract initialize
  function setDepositor(address _depositor) external {
    require(msg.sender == depositor, "!depositor");
    depositor = _depositor;
  }
}

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

pragma solidity ^0.8.13;

library Math {

  function max(uint a, uint b) internal pure returns (uint) {
    return a >= b ? a : b;
  }

  function min(uint a, uint b) internal pure returns (uint) {
    return a < b ? a : b;
  }

  function positiveInt128(int128 value) internal pure returns (int128) {
    return value < 0 ? int128(0) : value;
  }

  function closeTo(uint a, uint b, uint target) internal pure returns (bool) {
    if (a > b) {
      if (a - b <= target) {
        return true;
      }
    } else {
      if (b - a <= target) {
        return true;
      }
    }
    return false;
  }

  function sqrt(uint y) internal pure returns (uint z) {
    if (y > 3) {
      z = y;
      uint x = y / 2 + 1;
      while (x < z) {
        z = x;
        x = (y / x + x) / 2;
      }
    } else if (y != 0) {
      z = 1;
    }
  }

}

File 3 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `sender` to `recipient` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 7 : IVeDist.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IVeDist {

  function checkpointToken() external;

  function checkpointTotalSupply() external;

}

File 5 of 7 : IVe.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IVe {

  enum DepositType {
    DEPOSIT_FOR_TYPE,
    CREATE_LOCK_TYPE,
    INCREASE_LOCK_AMOUNT,
    INCREASE_UNLOCK_TIME,
    MERGE_TYPE
  }

  struct Point {
    int128 bias;
    int128 slope; // # -dweight / dt
    uint ts;
    uint blk; // block
  }
  /* We cannot really do block numbers per se b/c slope is per time, not per block
  * and per block could be fairly bad b/c Ethereum changes blocktimes.
  * What we can do is to extrapolate ***At functions */

  struct LockedBalance {
    int128 amount;
    uint end;
  }

  function token() external view returns (address);

  function balanceOfNFT(uint) external view returns (uint);

  function isApprovedOrOwner(address, uint) external view returns (bool);

  function createLockFor(uint, uint, address) external returns (uint);

  function userPointEpoch(uint tokenId) external view returns (uint);

  function epoch() external view returns (uint);

  function userPointHistory(uint tokenId, uint loc) external view returns (Point memory);

  function pointHistory(uint loc) external view returns (Point memory);

  function checkpoint() external;

  function depositFor(uint tokenId, uint value) external;

  function attachToken(uint tokenId) external;

  function detachToken(uint tokenId) external;

  function voting(uint tokenId) external;

  function abstain(uint tokenId) external;
}

File 6 of 7 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.13;

import "../interface/IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  using Address for address;

  function safeTransfer(
    IERC20 token,
    address to,
    uint value
  ) internal {
    _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint value
  ) internal {
    _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
  }

  function safeIncreaseAllowance(
    IERC20 token,
    address spender,
    uint value
  ) internal {
    uint newAllowance = token.allowance(address(this), spender) + value;
    _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
  }

  /**
   * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
  function _callOptionalReturn(IERC20 token, bytes memory data) private {
    // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
    // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
    // the target address contains contract code and also asserts for success in the low-level call.

    bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
    if (returndata.length > 0) {
      // Return data is optional
      require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }
  }

}

File 7 of 7 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.13;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
  /**
   * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
  function isContract(address account) internal view returns (bool) {
    // This method relies on extcodesize/address.code.length, which returns 0
    // for contracts in construction, since the code is only stored at the end
    // of the constructor execution.

    return account.code.length > 0;
  }

  function functionCall(
    address target,
    bytes memory data,
    string memory errorMessage
  ) internal returns (bytes memory) {
    require(isContract(target), "Address: call to non-contract");
    (bool success, bytes memory returndata) = target.call(data);
    return verifyCallResult(success, returndata, errorMessage);
  }

  /**
   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
  function verifyCallResult(
    bool success,
    bytes memory returndata,
    string memory errorMessage
  ) internal pure returns (bytes memory) {
    if (success) {
      return returndata;
    } else {
      // Look for revert reason and bubble it up if present
      if (returndata.length > 0) {
        // The easiest way to bubble the revert reason is using memory via assembly
        assembly {
          let returndata_size := mload(returndata)
          revert(add(32, returndata), returndata_size)
        }
      } else {
        revert(errorMessage);
      }
    }
  }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_votingEscrow","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"CheckpointToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxEpoch","type":"uint256"}],"name":"Claimed","type":"event"},{"inputs":[{"internalType":"uint256","name":"toDistribute","type":"uint256"},{"internalType":"uint256","name":"t0","type":"uint256"},{"internalType":"uint256","name":"t1","type":"uint256"},{"internalType":"uint256","name":"sinceLastCall","type":"uint256"}],"name":"adjustToDistribute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"},{"internalType":"uint256","name":"ptTs","type":"uint256"},{"internalType":"int128","name":"ptBias","type":"int128"},{"internalType":"int128","name":"ptSlope","type":"int128"}],"name":"adjustVeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"checkpointToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpointTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimMany","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ve","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"maxUserEpoch","type":"uint256"}],"name":"findTimestampUserEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"setDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeCursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"timeCursorOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLastBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensPerWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userEpochOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"veForAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"veSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingEscrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620021223803806200212283398101604081905262000034916200042d565b600062093a806200004681426200046e565b62000052919062000491565b90508060008190555080600481905550806001819055506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d091906200042d565b66038d7ea4c6800680546001600160a01b038084166001600160a01b0319928316811790935566038d7ea4c68005805491881691831691909117905566071afd498d00088054909116331790559091506200013e90846000196200083262000147602090811b91909117901c565b5050506200058e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000199573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bf9190620004b3565b620001cb9190620004cd565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000227918691906200022d16565b50505050565b600062000289826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200031460201b6200090c179092919060201c565b8051909150156200030f5780806020019051810190620002aa9190620004e8565b6200030f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084015b60405180910390fd5b505050565b60606001600160a01b0384163b6200036f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000306565b600080856001600160a01b0316856040516200038c91906200053b565b6000604051808303816000865af19150503d8060008114620003cb576040519150601f19603f3d011682016040523d82523d6000602084013e620003d0565b606091505b509092509050620003e3828286620003ef565b925050505b9392505050565b6060831562000400575081620003e8565b825115620004115782518084602001fd5b8160405162461bcd60e51b815260040162000306919062000559565b6000602082840312156200044057600080fd5b81516001600160a01b0381168114620003e857600080fd5b634e487b7160e01b600052601160045260246000fd5b6000826200048c57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615620004ae57620004ae62000458565b500290565b600060208284031215620004c657600080fd5b5051919050565b60008219821115620004e357620004e362000458565b500190565b600060208284031215620004fb57600080fd5b81518015158114620003e857600080fd5b60005b83811015620005295781810151838201526020016200050f565b83811115620002275750506000910152565b600082516200054f8184602087016200050c565b9190910192915050565b60208152600082518060208401526200057a8160408501602087016200050c565b601f01601f19169190910160400192915050565b611b84806200059e6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063939ea66b116100b8578063c7c4ff461161007c578063c7c4ff4614610284578063c9e14ed21461029d578063d1d58b25146102b0578063e32890c4146102c3578063f2c098b7146102e3578063fc0c546a146102f657600080fd5b8063939ea66b1461024557806398bdfdee1461024e5780639abd185c14610261578063b80777ea14610274578063bee5dc321461027c57600080fd5b80634f2bfe5b1161010a5780634f2bfe5b146101bd57806378e97925146101ee5780638736659b146101f7578063899519be146102005780638ec8468a14610213578063925489a81461022257600080fd5b80630f6592ef14610147578063326a94071461016d578063379607f5146101775780633935c8021461018a5780634607bf601461019d575b600080fd5b61015a61015536600461165a565b61030f565b6040519081526020015b60405180910390f35b610175610332565b005b61015a61018536600461165a565b61033c565b61015a61019836600461168f565b610426565b61015a6101ab36600461165a565b60026020526000908152604090205481565b66038d7ea4c68005546101d6906001600160a01b031681565b6040516001600160a01b039091168152602001610164565b61015a60005481565b61015a60015481565b61015a61020e36600461165a565b61043f565b61015a66038d7ea4c680075481565b61023561023036600461170f565b610455565b6040519015158152602001610164565b61015a60045481565b61015a61025c3660046117b5565b61059b565b61015a61026f3660046117e7565b6105a9565b61015a6106ea565b610175610709565b66071afd498d0008546101d6906001600160a01b031681565b61015a6102ab36600461181b565b610763565b61015a6102be36600461165a565b610771565b61015a6102d136600461165a565b60036020526000908152604090205481565b6101756102f1366004611865565b6107bd565b66038d7ea4c68006546101d6906001600160a01b031681565b66038d7ea4c680088166038d7ea4c68000811061032b57600080fd5b0154905081565b61033a6109dc565b565b6000600154421061034f5761034f6109dc565b60045462093a806103608183611896565b61036a91906118b8565b66038d7ea4c680055490915060009061038e9085906001600160a01b031684610b57565b9050801561041f5766038d7ea4c680055460405163076426ed60e11b815260048101869052602481018390526001600160a01b0390911690630ec84dda90604401600060405180830381600087803b1580156103e957600080fd5b505af11580156103fd573d6000803e3d6000fd5b505050508066038d7ea4c68007600082825461041991906118d7565b90915550505b9392505050565b600061043485858585610bea565b90505b949350505050565b60058166038d7ea4c68000811061032b57600080fd5b60006001544210610468576104686109dc565b60045462093a806104798183611896565b61048391906118b8565b66038d7ea4c68005549091506001600160a01b03166000805b855181101561056b5760008682815181106104b9576104b96118ee565b60200260200101519050806000036104d1575061056b565b60006104de828688610b57565b905080156105565760405163076426ed60e11b815260048101839052602481018290526001600160a01b03861690630ec84dda90604401600060405180830381600087803b15801561052f57600080fd5b505af1158015610543573d6000803e3d6000fd5b5050505080846105539190611904565b93505b505080806105639061191c565b91505061049c565b508015610590578066038d7ea4c68007600082825461058a91906118d7565b90915550505b506001949350505050565b600061043485858585610cde565b66038d7ea4c680055460405163e58f594760e01b8152600481018490526000916001600160a01b0316908290829063e58f594790602401602060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190611935565b9050600061063183878785610bea565b6040516322565a1560e11b815260048101889052602481018290529091506000906001600160a01b038516906344acb42a90604401608060405180830381865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a7919061194e565b90506106dc8160400151876106bc91906118d7565b82602001516106cb91906119c3565b82516106d79190611a61565b610d2a565b600f0b979650505050505050565b600062093a806106fa8142611896565b61070491906118b8565b905090565b66071afd498d0008546001600160a01b0316331461075b5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064015b60405180910390fd5b61033a610d45565b600061043485858585610f08565b60008062093a80806004546107869190611896565b61079091906118b8565b66038d7ea4c68005549091506000906107b49085906001600160a01b031684610f6d565b51949350505050565b66071afd498d0008546001600160a01b0316331461080a5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606401610752565b66071afd498d000880546001600160a01b0319166001600160a01b0392909216919091179055565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190611935565b6108b19190611904565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790529091506109069085906113df565b50505050565b60606001600160a01b0384163b6109655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610752565b600080856001600160a01b0316856040516109809190611add565b6000604051808303816000865af19150503d80600081146109bd576040519150601f19603f3d011682016040523d82523d6000602084013e6109c2565b606091505b50915091506109d28282866114b6565b9695505050505050565b66038d7ea4c68005546001546001600160a01b0390911690600062093a80610a048142611896565b610a0e91906118b8565b9050826001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a4b57600080fd5b505af1158015610a5f573d6000803e3d6000fd5b5050505060005b6014811015610b4f57818311610b4f576000610a8285856114ef565b604051638ad4c44760e01b8152600481018290529091506000906001600160a01b03871690638ad4c44790602401608060405180830381865afa158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af1919061194e565b9050610b0b85826040015183600001518460200151610f08565b66038d7ea4c680088666038d7ea4c680008110610b2a57610b2a6118ee565b01555050610b3b62093a8084611904565b925080610b478161191c565b915050610a66565b505060015550565b600080610b65858585610f6d565b90508060800151156107b45760208181018051600088815260038452604080822092909255818501516002855290829020558351915160608086015183518b815295860194909452918401528201527fcae2990aa9af8eb1c64713b7eddb3a80bf18e49a94a13fe0d0002b5d61d58f009060800160405180910390a151949350505050565b60008082815b6080811015610cd25781831015610cd25760006002610c0f8486611904565b610c1a906002611904565b610c249190611896565b6040516322565a1560e11b8152600481018a9052602481018290529091506000906001600160a01b038b16906344acb42a90604401608060405180830381865afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a919061194e565b905087816040015111610caf57819450610cbd565b610cba6001836118d7565b93505b50508080610cca9061191c565b915050610bf0565b50909695505050505050565b60008284111580610cf65750610cf483856118d7565b155b80610cff575081155b15610d0b575083610437565b81610d1684866118d7565b610d2090876118b8565b6104349190611896565b60008082600f0b12610d3c5781610d3f565b60005b92915050565b66038d7ea4c68006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db89190611935565b9050600066038d7ea4c680075482610dd091906118d7565b66038d7ea4c680078390556004549091506000610ded82426118d7565b426004559050600062093a80610e038185611896565b610e0d91906118b8565b90506000805b6014811015610ec657610e2962093a8084611904565b915081421015610e7357610e3f86428787610cde565b60058466038d7ea4c680008110610e5857610e586118ee565b016000828254610e689190611904565b90915550610ec69050565b610e7f86838787610cde565b60058466038d7ea4c680008110610e9857610e986118ee565b016000828254610ea89190611904565b90915550508194508192508080610ebe9061191c565b915050610e13565b5060408051428152602081018790527fce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6910160405180910390a1505050505050565b600083851015610f1a57506000610437565b6000610f2685876118d7565b9050610f3281846119c3565b600f0b84600f0b1215610f49576000915050610437565b610f60610f5682856119c3565b6106d79086611a61565b600f0b9695505050505050565b610fa16040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000806000856001600160a01b031663e58f5947886040518263ffffffff1660e01b8152600401610fd491815260200190565b602060405180830381865afa158015610ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110159190611935565b6000805491925082900361105c576040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525094505050505061041f565b600088815260026020526040812054908190036110865761107f888a8486610bea565b9450611098565b60008981526003602052604090205494505b846000036110a557600194505b6040516322565a1560e11b8152600481018a9052602481018690526000906001600160a01b038a16906344acb42a90604401608060405180830381865afa1580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611118919061194e565b90508160000361115d5762093a8080600162093a80846040015161113c9190611904565b61114691906118d7565b6111509190611896565b61115a91906118b8565b91505b60045482106111a1576040518060a001604052806000815260200160008152602001600081526020016000815260200160001515815250965050505050505061041f565b828210156111ad578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b6032811015611390578984101561139057826040015184101580156111f75750858811155b156112bd57611207600189611904565b9750829150858811156112465760405180608001604052806000600f0b81526020016000600f0b8152602001600081526020016000815250925061137e565b6040516322565a1560e11b8152600481018d9052602481018990526001600160a01b038c16906344acb42a90604401608060405180830381865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b6919061194e565b925061137e565b60008260400151856112cf91906118d7565b905060006112f28460200151836112e691906119c3565b85516106d79190611a61565b600f0b9050801580156113045750878a115b15611310575050611390565b66038d7ea4c680088666038d7ea4c68000811061132f5761132f6118ee565b015460058766038d7ea4c68000811061134a5761134a6118ee565b015461135690836118b8565b6113609190611896565b61136a908a611904565b985061137962093a8087611904565b955050505b806113888161191c565b9150506111d2565b506040518060a001604052808781526020016113b88760018b6113b391906118d7565b611644565b81526020810194909452604084019590955250506001606090910152509695505050505050565b6000611434826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661090c9092919063ffffffff16565b8051909150156114b157808060200190518101906114529190611af9565b6114b15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610752565b505050565b606083156114c557508161041f565b8251156114d55782518084602001fd5b8160405162461bcd60e51b81526004016107529190611b1b565b600080600090506000846001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a9190611935565b905060005b608081101561163a578183101561163a576000600261157e8486611904565b611589906002611904565b6115939190611896565b604051638ad4c44760e01b8152600481018290529091506000906001600160a01b03891690638ad4c44790602401608060405180830381865afa1580156115de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611602919061194e565b90508681604001511161161757819450611625565b6116226001836118d7565b93505b505080806116329061191c565b91505061155f565b5090949350505050565b6000818310611653578161041f565b5090919050565b60006020828403121561166c57600080fd5b5035919050565b80356001600160a01b038116811461168a57600080fd5b919050565b600080600080608085870312156116a557600080fd5b6116ae85611673565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611707576117076116c8565b604052919050565b6000602080838503121561172257600080fd5b823567ffffffffffffffff8082111561173a57600080fd5b818501915085601f83011261174e57600080fd5b813581811115611760576117606116c8565b8060051b91506117718483016116de565b818152918301840191848101908884111561178b57600080fd5b938501935b838510156117a957843582529385019390850190611790565b98975050505050505050565b600080600080608085870312156117cb57600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156117fa57600080fd5b50508035926020909101359150565b80600f0b811461181857600080fd5b50565b6000806000806080858703121561183157600080fd5b8435935060208501359250604085013561184a81611809565b9150606085013561185a81611809565b939692955090935050565b60006020828403121561187757600080fd5b61041f82611673565b634e487b7160e01b600052601160045260246000fd5b6000826118b357634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156118d2576118d2611880565b500290565b6000828210156118e9576118e9611880565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111561191757611917611880565b500190565b60006001820161192e5761192e611880565b5060010190565b60006020828403121561194757600080fd5b5051919050565b60006080828403121561196057600080fd5b6040516080810181811067ffffffffffffffff82111715611983576119836116c8565b604052825161199181611809565b815260208301516119a181611809565b6020820152604083810151908201526060928301519281019290925250919050565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156119f3576119f3611880565b6f7fffffffffffffffffffffffffffffff196000851282811687830587121615611a1f57611a1f611880565b60008712925085820587128484161615611a3b57611a3b611880565b85850587128184161615611a5157611a51611880565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b031901831281151615611a8c57611a8c611880565b8160016001607f1b03018313811615611aa757611aa7611880565b5090039392505050565b60005b83811015611acc578181015183820152602001611ab4565b838111156109065750506000910152565b60008251611aef818460208701611ab1565b9190910192915050565b600060208284031215611b0b57600080fd5b8151801515811461041f57600080fd5b6020815260008251806020840152611b3a816040850160208701611ab1565b601f01601f1916919091016040019291505056fea264697066735822122071a1e3668dbc77df3ccf73c953817c85c51a07c01f580fbbac5192c7fe214df464736f6c634300080d00330000000000000000000000000841097f62a82c2fef8aa943a2f80b59773e5e02

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