ETH Price: $2,392.37 (-3.45%)

Contract

0x1B544Befd7a51D5CDb40F79eEF5205f16A63Cd98
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040167963552023-03-10 7:47:11572 days ago1678434431IN
 Create: ConcentratorHarvesterFacet
0 ETH0.0131338321.32725509

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ConcentratorHarvesterFacet

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

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

pragma solidity ^0.7.6;
pragma abicoder v2;

import "../../concentrator/interfaces/IAladdinCompounder.sol";
import "../../concentrator/interfaces/IConcentratorGeneralVault.sol";

import "../libraries/LibConcentratorHarvester.sol";

// solhint-disable not-rely-on-time

contract ConcentratorHarvesterFacet {
  /// @notice Return the minimum amount CTR should be locked.
  function minLockCTR() external view returns (uint256) {
    return LibConcentratorHarvester.harvesterStorage().minLockCTR;
  }

  /// @notice Return the minimum number of seconds that veCTR should be locked.
  function minLockDuration() external view returns (uint256) {
    return LibConcentratorHarvester.harvesterStorage().minLockDuration;
  }

  /// @notice Return whether the account is whitelisted.
  /// @param _account The address of account to query.
  function isWhitelist(address _account) external view returns (bool) {
    LibConcentratorHarvester.HarvesterStorage storage hs = LibConcentratorHarvester.harvesterStorage();
    return hs.whitelist[_account];
  }

  /// @notice Return whether the account is blacklisted.
  /// @param _account The address of account to query.
  function isBlacklist(address _account) external view returns (bool) {
    LibConcentratorHarvester.HarvesterStorage storage hs = LibConcentratorHarvester.harvesterStorage();
    return hs.blacklist[_account];
  }

  /// @notice Return whether the account can do harvest.
  /// @param _account The address of account to query.
  function hasPermission(address _account) external view returns (bool) {
    ICurveVoteEscrow.LockedBalance memory _locked = ICurveVoteEscrow(LibConcentratorHarvester.veCTR).locked(_account);
    LibConcentratorHarvester.HarvesterStorage storage hs = LibConcentratorHarvester.harvesterStorage();

    // check whether is blacklisted
    if (hs.blacklist[_account]) return false;

    // check whether is whitelisted
    if (hs.whitelist[_account] || hs.minLockCTR == 0) return true;

    // check veCTR locking
    return uint128(_locked.amount) >= hs.minLockCTR && _locked.end >= hs.minLockDuration + block.timestamp;
  }

  /// @notice Harvest pending rewards from concentrator vault.
  /// @param _vault The address of concentrator vault contract.
  /// @param _pid The pool id to harvest.
  /// @param _minOut The minimum amount of rewards should get.
  function harvestConcentratorVault(
    address _vault,
    uint256 _pid,
    uint256 _minOut
  ) external {
    LibConcentratorHarvester.enforceHasPermission();

    IConcentratorGeneralVault(_vault).harvest(_pid, msg.sender, _minOut);
  }

  /// @notice Harvest pending rewards from AladdinCompounder contract.
  /// @param _compounder The address of AladdinCompounder contract.
  /// @param _minAssets The minimum amount of underlying assets should be harvested.
  function harvestConcentratorCompounder(address _compounder, uint256 _minAssets) external {
    LibConcentratorHarvester.enforceHasPermission();

    IAladdinCompounder(_compounder).harvest(msg.sender, _minAssets);
  }

  /// @notice Update the harvester permission parameters.
  /// @param _minLockCTR The minimum amount CTR should be locked.
  /// @param _minLockDuration The minimum number of seconds that veCTR should be locked.
  function updatePermission(uint128 _minLockCTR, uint128 _minLockDuration) external {
    LibConcentratorHarvester.enforceIsContractOwner();
    LibConcentratorHarvester.updatePermission(_minLockCTR, _minLockDuration);
  }

  /// @notice Update the whitelist status of account.
  /// @param _account The address to update.
  /// @param _status The status to update.
  function updateWhitelist(address _account, bool _status) external {
    LibConcentratorHarvester.enforceIsContractOwner();
    LibConcentratorHarvester.updateWhitelist(_account, _status);
  }

  /// @notice Update the blacklist status of account.
  /// @param _account The address to update.
  /// @param _status The status to update.
  function updateBlacklist(address _account, bool _status) external {
    LibConcentratorHarvester.enforceIsContractOwner();
    LibConcentratorHarvester.updateBlacklist(_account, _status);
  }
}

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

pragma solidity ^0.7.6;
pragma abicoder v2;

import "../../interfaces/ICurveVoteEscrow.sol";

// solhint-disable const-name-snakecase
// solhint-disable no-inline-assembly
// solhint-disable not-rely-on-time

library LibConcentratorHarvester {
  /*************
   * Constants *
   *************/

  /// @dev The storage slot for default diamond storage.
  bytes32 private constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");

  /// @dev The storage slot for harvester storage.
  bytes32 private constant HARVESTER_STORAGE_POSITION = keccak256("diamond.harvester.concentrator.storage");

  /// @dev The address of veCTR contract.
  address internal constant veCTR = 0xe4C09928d834cd58D233CD77B5af3545484B4968;

  /***********
   * Structs *
   ***********/

  struct FacetAddressAndSelectorPosition {
    address facetAddress;
    uint16 selectorPosition;
  }

  struct DiamondStorage {
    // function selector => facet address and selector position in selectors array
    mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition;
    bytes4[] selectors;
    mapping(bytes4 => bool) supportedInterfaces;
    // owner of the contract
    address contractOwner;
  }

  struct HarvesterStorage {
    uint128 minLockCTR;
    uint128 minLockDuration;
    mapping(address => bool) whitelist;
    mapping(address => bool) blacklist;
  }

  /**********************
   * Internal Functions *
   **********************/

  function diamondStorage() private pure returns (DiamondStorage storage ds) {
    bytes32 position = DIAMOND_STORAGE_POSITION;
    assembly {
      ds.slot := position
    }
  }

  function harvesterStorage() internal pure returns (HarvesterStorage storage hs) {
    bytes32 position = HARVESTER_STORAGE_POSITION;
    assembly {
      hs.slot := position
    }
  }

  function updatePermission(uint128 _minLockCTR, uint128 _minLockDuration) internal {
    HarvesterStorage storage hs = harvesterStorage();

    hs.minLockCTR = _minLockCTR;
    hs.minLockDuration = _minLockDuration;
  }

  function updateWhitelist(address _account, bool _status) internal {
    HarvesterStorage storage hs = harvesterStorage();

    hs.whitelist[_account] = _status;
  }

  function updateBlacklist(address _account, bool _status) internal {
    HarvesterStorage storage hs = harvesterStorage();

    hs.blacklist[_account] = _status;
  }

  function enforceIsContractOwner() internal view {
    require(msg.sender == diamondStorage().contractOwner, "only owner");
  }

  function enforceHasPermission() internal view {
    ICurveVoteEscrow.LockedBalance memory _locked = ICurveVoteEscrow(veCTR).locked(msg.sender);
    HarvesterStorage storage hs = harvesterStorage();

    // check whether is blacklisted
    require(!hs.blacklist[msg.sender], "account blacklisted");

    // check whether is whitelisted
    if (hs.whitelist[msg.sender] || hs.minLockCTR == 0) return;

    // check veCTR locking
    require(uint128(_locked.amount) >= hs.minLockCTR, "insufficient lock amount");
    require(_locked.end >= hs.minLockDuration + block.timestamp, "insufficient lock duration");
  }
}

File 3 of 5 : IConcentratorGeneralVault.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;

interface IConcentratorGeneralVault {
  /// @notice Emitted when someone change allowance.
  /// @param pid The pool id.
  /// @param owner The address of the owner.
  /// @param spender The address of the spender.
  /// @param value The new value of allowance.
  event Approval(uint256 indexed pid, address indexed owner, address indexed spender, uint256 value);

  /// @notice Emitted when someone deposits asset into this contract.
  /// @param pid The pool id.
  /// @param sender The address who sends underlying asset.
  /// @param recipient The address who will receive the pool shares.
  /// @param assetsIn The amount of asset deposited.
  /// @param sharesOut The amounf of pool shares received.
  event Deposit(
    uint256 indexed pid,
    address indexed sender,
    address indexed recipient,
    uint256 assetsIn,
    uint256 sharesOut
  );

  /// @notice Emitted when someone withdraws asset from this contract.
  /// @param pid The pool id.
  /// @param sender The address who call the function.
  /// @param owner The address who owns the assets.
  /// @param recipient The address who will receive the assets.
  /// @param assetsOut The amount of asset withdrawn.
  /// @param sharesIn The amounf of pool shares to withdraw.
  event Withdraw(
    uint256 indexed pid,
    address indexed sender,
    address indexed owner,
    address recipient,
    uint256 sharesIn,
    uint256 assetsOut
  );

  /// @notice Emitted when someone claim rewards from this contract.
  /// @param pid The pool id.
  /// @param sender The address who call the function.
  /// @param recipient The address who will receive the rewards;
  /// @param rewards The amount of reward received.
  event Claim(uint256 indexed pid, address indexed sender, address indexed recipient, uint256 rewards);

  /// @notice Emitted when someone harvests rewards.
  /// @param pid The pool id.
  /// @param caller The address who call the function.
  /// @param recipient The address of account to recieve the harvest bounty.
  /// @param rewards The total amount of rewards harvested.
  /// @param platformFee The amount of harvested assets as platform fee.
  /// @param harvestBounty The amount of harvested assets as harvest bounty.
  event Harvest(
    uint256 indexed pid,
    address indexed caller,
    address indexed recipient,
    uint256 rewards,
    uint256 platformFee,
    uint256 harvestBounty
  );

  /// @notice The address of reward token.
  function rewardToken() external view returns (address);

  /// @notice Return the amount of pending rewards for specific pool.
  /// @param pid The pool id.
  /// @param account The address of user.
  function pendingReward(uint256 pid, address account) external view returns (uint256);

  /// @notice Return the amount of pending AladdinCRV rewards for all pool.
  /// @param account The address of user.
  function pendingRewardAll(address account) external view returns (uint256);

  /// @notice Return the user share for specific user.
  /// @param pid The pool id to query.
  /// @param account The address of user.
  function getUserShare(uint256 pid, address account) external view returns (uint256);

  /// @notice Return the address of underlying token.
  /// @param pid The pool id to query.
  function underlying(uint256 pid) external view returns (address);

  /// @notice Return the total underlying token deposited.
  /// @param pid The pool id to query.
  function getTotalUnderlying(uint256 pid) external view returns (uint256);

  /// @notice Return the total pool share deposited.
  /// @param pid The pool id to query.
  function getTotalShare(uint256 pid) external view returns (uint256);

  /// @notice Returns the remaining number of shares that `spender` will be allowed to spend on behalf of `owner`.
  /// @param pid The pool id to query.
  /// @param owner The address of the owner.
  /// @param spender The address of the spender.
  function allowance(
    uint256 pid,
    address owner,
    address spender
  ) external view returns (uint256);

  /// @notice Sets `amount` as the allowance of `spender` over the caller's share.
  /// @param pid The pool id to query.
  /// @param spender The address of the spender.
  /// @param amount The amount of allowance.
  function approve(
    uint256 pid,
    address spender,
    uint256 amount
  ) external;

  /// @notice Deposit some token to specific pool for someone.
  /// @param pid The pool id.
  /// @param recipient The address of recipient who will recieve the token.
  /// @param assets The amount of token to deposit. -1 means deposit all.
  /// @return share The amount of share after deposit.
  function deposit(
    uint256 pid,
    address recipient,
    uint256 assets
  ) external returns (uint256 share);

  /// @notice Withdraw some token from specific pool and zap to token.
  /// @param pid The pool id.
  /// @param shares The share of token want to withdraw. -1 means withdraw all.
  /// @param recipient The address of account who will receive the assets.
  /// @param owner The address of user to withdraw from.
  /// @return assets The amount of token sent to recipient.
  function withdraw(
    uint256 pid,
    uint256 shares,
    address recipient,
    address owner
  ) external returns (uint256 assets);

  /// @notice claim pending rewards from specific pool.
  /// @param pid The pool id.
  /// @param recipient The address of account who will receive the rewards.
  /// @param minOut The minimum amount of pending reward to receive.
  /// @param claimAsToken The address of token to claim as. Use address(0) if claim as ETH
  /// @return claimed The amount of reward sent to the recipient.
  function claim(
    uint256 pid,
    address recipient,
    uint256 minOut,
    address claimAsToken
  ) external returns (uint256 claimed);

  /// @notice claim pending rewards from multiple pools.
  /// @param pids The list of pool id to claim.
  /// @param recipient The address of account who will receive the rewards.
  /// @param minOut The minimum amount of pending reward to receive.
  /// @param claimAsToken The address of token to claim as. Use address(0) if claim as ETH
  /// @return claimed The amount of reward sent to the recipient.
  function claimMulti(
    uint256[] memory pids,
    address recipient,
    uint256 minOut,
    address claimAsToken
  ) external returns (uint256 claimed);

  /// @notice claim pending rewards from all pools.
  /// @param recipient The address of account who will receive the rewards.
  /// @param minOut The minimum amount of pending reward to receive.
  /// @param claimAsToken The address of token to claim as. Use address(0) if claim as ETH
  /// @return claimed The amount of reward sent to the recipient.
  function claimAll(
    uint256 minOut,
    address recipient,
    address claimAsToken
  ) external returns (uint256 claimed);

  /// @notice Harvest the pending reward and convert to aCRV.
  /// @param pid The pool id.
  /// @param recipient The address of account to receive harvest bounty.
  /// @param minOut The minimum amount of cvxCRV should get.
  /// @return harvested The amount of cvxCRV harvested after zapping all other tokens to it.
  function harvest(
    uint256 pid,
    address recipient,
    uint256 minOut
  ) external returns (uint256 harvested);
}

File 4 of 5 : IAladdinCompounder.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;

/// @title IAladdinCompounder
/// @notice The interface for AladdinCompounder like aCRV, aFXS, and is also EIP4646 compatible.
interface IAladdinCompounder {
  /// @notice Emitted when someone deposits asset into this contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param sender The address who sends underlying asset.
  /// @param owner The address who will receive the pool shares.
  /// @param assets The amount of asset deposited.
  /// @param shares The amounf of pool shares received.
  event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);

  /// @notice Emitted when someone withdraws asset from this contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param sender The address who call the function.
  /// @param receiver The address who will receive the assets.
  /// @param owner The address who owns the assets.
  /// @param assets The amount of asset withdrawn.
  /// @param shares The amounf of pool shares to withdraw.
  event Withdraw(
    address indexed sender,
    address indexed receiver,
    address indexed owner,
    uint256 assets,
    uint256 shares
  );

  /// @notice Emitted when someone harvests rewards.
  /// @param caller The address who call the function.
  /// @param recipient The address of account to recieve the harvest bounty.
  /// @param assets The total amount of underlying asset harvested.
  /// @param platformFee The amount of harvested assets as platform fee.
  /// @param harvestBounty The amount of harvested assets as harvest bounty.
  event Harvest(
    address indexed caller,
    address indexed recipient,
    uint256 assets,
    uint256 platformFee,
    uint256 harvestBounty
  );

  /// @notice Return the address of underlying assert.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  function asset() external view returns (address assetTokenAddress);

  /// @notice Return the total amount of underlying assert mananged by the contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  function totalAssets() external view returns (uint256 totalManagedAssets);

  /// @notice Return the amount of pool shares given the amount of asset.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param assets The amount of asset to convert.
  function convertToShares(uint256 assets) external view returns (uint256 shares);

  /// @notice Return the amount of asset given the amount of pool share.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param assets The amount of pool shares to convert.
  function convertToAssets(uint256 shares) external view returns (uint256 assets);

  /// @notice Return the maximum amount of asset that the user can deposit.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param receiver The address of user to receive the pool share.
  function maxDeposit(address receiver) external view returns (uint256 maxAssets);

  /// @notice Return the amount of pool shares will receive, if perform a deposit.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param assets The amount of asset to deposit.
  function previewDeposit(uint256 assets) external view returns (uint256 shares);

  /// @notice Deposit assets into this contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param assets The amount of asset to deposit.
  /// @param receiver The address of account who will receive the pool share.
  /// @return shares The amount of pool shares received.
  function deposit(uint256 assets, address receiver) external returns (uint256 shares);

  /// @notice Return the maximum amount of pool shares that the user can mint.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param receiver The address of user to receive the pool share.
  function maxMint(address receiver) external view returns (uint256 maxShares);

  /// @notice Return the amount of assets needed, if perform a mint.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param shares The amount of pool shares to mint.
  function previewMint(uint256 shares) external view returns (uint256 assets);

  /// @notice Mint pool shares from this contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param shares The amount of pool shares to mint.
  /// @param receiver The address of account who will receive the pool share.
  /// @return assets The amount of assets deposited to the contract.
  function mint(uint256 shares, address receiver) external returns (uint256 assets);

  /// @notice Return the maximum amount of assets that the user can withdraw.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param owner The address of user to withdraw from.
  function maxWithdraw(address owner) external view returns (uint256 maxAssets);

  /// @notice Return the amount of shares needed, if perform a withdraw.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param assets The amount of assets to withdraw.
  function previewWithdraw(uint256 assets) external view returns (uint256 shares);

  /// @notice Withdraw assets from this contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param assets The amount of assets to withdraw.
  /// @param receiver The address of account who will receive the assets.
  /// @param owner The address of user to withdraw from.
  /// @return shares The amount of pool shares burned.
  function withdraw(
    uint256 assets,
    address receiver,
    address owner
  ) external returns (uint256 shares);

  /// @notice Return the maximum amount of pool shares that the user can redeem.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param owner The address of user to redeem from.
  function maxRedeem(address owner) external view returns (uint256 maxShares);

  /// @notice Return the amount of assets to be received, if perform a redeem.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param shares The amount of pool shares to redeem.
  function previewRedeem(uint256 shares) external view returns (uint256 assets);

  /// @notice Redeem assets from this contract.
  /// @dev See https://eips.ethereum.org/EIPS/eip-4626
  /// @param shares The amount of pool shares to burn.
  /// @param receiver The address of account who will receive the assets.
  /// @param owner The address of user to withdraw from.
  /// @return assets The amount of assets withdrawn.
  function redeem(
    uint256 shares,
    address receiver,
    address owner
  ) external returns (uint256 assets);

  /// @notice Harvest rewards and convert to underlying asset.
  /// @param recipient The address of account to recieve the harvest bounty.
  /// @param minAssets The minimum amount of underlying asset harvested.
  /// @return assets The total amount of underlying asset harvested.
  function harvest(address recipient, uint256 minAssets) external returns (uint256 assets);
}

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

pragma solidity ^0.7.6;
pragma abicoder v2;

// solhint-disable func-name-mixedcase
// solhint-disable var-name-mixedcase

interface ICurveVoteEscrow {
  struct LockedBalance {
    int128 amount;
    uint256 end;
  }

  /// @notice Deposit `_value` tokens for `msg.sender` and lock until `_unlock_time`
  /// @param _value Amount to deposit
  /// @param _unlock_time Epoch time when tokens unlock, rounded down to whole weeks
  function create_lock(uint256 _value, uint256 _unlock_time) external;

  /// @notice Deposit `_value` additional tokens for `msg.sender` without modifying the unlock time
  /// @param _value Amount of tokens to deposit and add to the lock
  function increase_amount(uint256 _value) external;

  /// @notice Extend the unlock time for `msg.sender` to `_unlock_time`
  /// @param _unlock_time New epoch time for unlocking
  function increase_unlock_time(uint256 _unlock_time) external;

  /// @notice Withdraw all tokens for `msg.sender`
  /// @dev Only possible if the lock has expired
  function withdraw() external;

  /// @notice Get timestamp when `_addr`'s lock finishes
  /// @param _addr User wallet
  /// @return Epoch time of the lock end
  function locked__end(address _addr) external view returns (uint256);

  function locked(address _addr) external view returns (LockedBalance memory);
}

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":"_compounder","type":"address"},{"internalType":"uint256","name":"_minAssets","type":"uint256"}],"name":"harvestConcentratorCompounder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"}],"name":"harvestConcentratorVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockCTR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_minLockCTR","type":"uint128"},{"internalType":"uint128","name":"_minLockDuration","type":"uint128"}],"name":"updatePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50610a2e806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806397128e001161006657806397128e001461011a578063c683630d1461012d578063c76b4ae214610140578063c7f884c614610155578063d6a298e9146101685761009e565b806304117561146100a35780630d392cd9146100b85780630f45b177146100cb578063333e99db146100de5780639155e08314610107575b600080fd5b6100b66100b13660046107dd565b610170565b005b6100b66100c63660046107a3565b6101fd565b6100b66100d936600461088f565b610213565b6100f16100ec366004610782565b610225565b6040516100fe9190610906565b60405180910390f35b6100b66101153660046107a3565b610258565b6100f1610128366004610782565b61026a565b6100f161013b366004610782565b6103b5565b6101486103e7565b6040516100fe91906109d0565b6100b6610163366004610806565b610400565b610148610490565b6101786104b0565b60405163018ee9b760e01b81526001600160a01b0383169063018ee9b7906101a690339085906004016108ed565b602060405180830381600087803b1580156101c057600080fd5b505af11580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f891906108c1565b505050565b610205610623565b61020f8282610656565b5050565b61021b610623565b61020f8282610690565b6000806102306106d2565b6001600160a01b03841660009081526002909101602052604090205460ff169150505b919050565b610260610623565b61020f82826106f6565b60405163cbf9fe5f60e01b8152600090819073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906102a69086906004016108d9565b604080518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f59190610838565b905060006103016106d2565b6001600160a01b038516600090815260028201602052604090205490915060ff161561033257600092505050610253565b6001600160a01b038416600090815260018201602052604090205460ff1680610363575080546001600160801b0316155b1561037357600192505050610253565b805482516001600160801b039182169116108015906103ad5750805460208301516001600160801b03600160801b90920491909116420111155b949350505050565b6000806103c06106d2565b6001600160a01b03841660009081526001909101602052604090205460ff16915050919050565b60006103f16106d2565b546001600160801b0316905090565b6104086104b0565b60405163391c963560e21b81526001600160a01b0384169063e47258d490610438908590339086906004016109d9565b602060405180830381600087803b15801561045257600080fd5b505af1158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a91906108c1565b50505050565b600061049a6106d2565b54600160801b90046001600160801b0316919050565b60405163cbf9fe5f60e01b815260009073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906104ea9033906004016108d9565b604080518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190610838565b905060006105456106d2565b33600090815260028201602052604090205490915060ff16156105835760405162461bcd60e51b815260040161057a90610911565b60405180910390fd5b33600090815260018201602052604090205460ff16806105ab575080546001600160801b0316155b156105b7575050610621565b805482516001600160801b03918216911610156105e65760405162461bcd60e51b815260040161057a9061093e565b805460208301516001600160801b03600160801b909204919091164201111561020f5760405162461bcd60e51b815260040161057a90610975565b565b61062b610730565b600301546001600160a01b031633146106215760405162461bcd60e51b815260040161057a906109ac565b60006106606106d2565b6001600160a01b039390931660009081526001909301602052506040909120805460ff1916911515919091179055565b600061069a6106d2565b80546001600160801b03938416600160801b029484166fffffffffffffffffffffffffffffffff199091161790921692909217905550565b7f7b3d7c6d072f5ba80c1b8069e5afa5580d5083ebf8116656029468cd718daac790565b60006107006106d2565b6001600160a01b039390931660009081526002909301602052506040909120805460ff1916911515919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90565b80356001600160a01b038116811461025357600080fd5b80356001600160801b038116811461025357600080fd5b600060208284031215610793578081fd5b61079c82610754565b9392505050565b600080604083850312156107b5578081fd5b6107be83610754565b9150602083013580151581146107d2578182fd5b809150509250929050565b600080604083850312156107ef578182fd5b6107f883610754565b946020939093013593505050565b60008060006060848603121561081a578081fd5b61082384610754565b95602085013595506040909401359392505050565b600060408284031215610849578081fd5b6040516040810181811067ffffffffffffffff8211171561086657fe5b6040528251600f81900b811461087a578283fd5b81526020928301519281019290925250919050565b600080604083850312156108a1578182fd5b6108aa8361076b565b91506108b86020840161076b565b90509250929050565b6000602082840312156108d2578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601390820152721858d8dbdd5b9d08189b1858dadb1a5cdd1959606a1b604082015260600190565b60208082526018908201527f696e73756666696369656e74206c6f636b20616d6f756e740000000000000000604082015260600190565b6020808252601a908201527f696e73756666696369656e74206c6f636b206475726174696f6e000000000000604082015260600190565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b90815260200190565b9283526001600160a01b0391909116602083015260408201526060019056fea26469706673582212202d9fa60d941e48f139142513aa954581ab18055b43dafd73afc20649991cddbf64736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806397128e001161006657806397128e001461011a578063c683630d1461012d578063c76b4ae214610140578063c7f884c614610155578063d6a298e9146101685761009e565b806304117561146100a35780630d392cd9146100b85780630f45b177146100cb578063333e99db146100de5780639155e08314610107575b600080fd5b6100b66100b13660046107dd565b610170565b005b6100b66100c63660046107a3565b6101fd565b6100b66100d936600461088f565b610213565b6100f16100ec366004610782565b610225565b6040516100fe9190610906565b60405180910390f35b6100b66101153660046107a3565b610258565b6100f1610128366004610782565b61026a565b6100f161013b366004610782565b6103b5565b6101486103e7565b6040516100fe91906109d0565b6100b6610163366004610806565b610400565b610148610490565b6101786104b0565b60405163018ee9b760e01b81526001600160a01b0383169063018ee9b7906101a690339085906004016108ed565b602060405180830381600087803b1580156101c057600080fd5b505af11580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f891906108c1565b505050565b610205610623565b61020f8282610656565b5050565b61021b610623565b61020f8282610690565b6000806102306106d2565b6001600160a01b03841660009081526002909101602052604090205460ff169150505b919050565b610260610623565b61020f82826106f6565b60405163cbf9fe5f60e01b8152600090819073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906102a69086906004016108d9565b604080518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f59190610838565b905060006103016106d2565b6001600160a01b038516600090815260028201602052604090205490915060ff161561033257600092505050610253565b6001600160a01b038416600090815260018201602052604090205460ff1680610363575080546001600160801b0316155b1561037357600192505050610253565b805482516001600160801b039182169116108015906103ad5750805460208301516001600160801b03600160801b90920491909116420111155b949350505050565b6000806103c06106d2565b6001600160a01b03841660009081526001909101602052604090205460ff16915050919050565b60006103f16106d2565b546001600160801b0316905090565b6104086104b0565b60405163391c963560e21b81526001600160a01b0384169063e47258d490610438908590339086906004016109d9565b602060405180830381600087803b15801561045257600080fd5b505af1158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a91906108c1565b50505050565b600061049a6106d2565b54600160801b90046001600160801b0316919050565b60405163cbf9fe5f60e01b815260009073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906104ea9033906004016108d9565b604080518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190610838565b905060006105456106d2565b33600090815260028201602052604090205490915060ff16156105835760405162461bcd60e51b815260040161057a90610911565b60405180910390fd5b33600090815260018201602052604090205460ff16806105ab575080546001600160801b0316155b156105b7575050610621565b805482516001600160801b03918216911610156105e65760405162461bcd60e51b815260040161057a9061093e565b805460208301516001600160801b03600160801b909204919091164201111561020f5760405162461bcd60e51b815260040161057a90610975565b565b61062b610730565b600301546001600160a01b031633146106215760405162461bcd60e51b815260040161057a906109ac565b60006106606106d2565b6001600160a01b039390931660009081526001909301602052506040909120805460ff1916911515919091179055565b600061069a6106d2565b80546001600160801b03938416600160801b029484166fffffffffffffffffffffffffffffffff199091161790921692909217905550565b7f7b3d7c6d072f5ba80c1b8069e5afa5580d5083ebf8116656029468cd718daac790565b60006107006106d2565b6001600160a01b039390931660009081526002909301602052506040909120805460ff1916911515919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90565b80356001600160a01b038116811461025357600080fd5b80356001600160801b038116811461025357600080fd5b600060208284031215610793578081fd5b61079c82610754565b9392505050565b600080604083850312156107b5578081fd5b6107be83610754565b9150602083013580151581146107d2578182fd5b809150509250929050565b600080604083850312156107ef578182fd5b6107f883610754565b946020939093013593505050565b60008060006060848603121561081a578081fd5b61082384610754565b95602085013595506040909401359392505050565b600060408284031215610849578081fd5b6040516040810181811067ffffffffffffffff8211171561086657fe5b6040528251600f81900b811461087a578283fd5b81526020928301519281019290925250919050565b600080604083850312156108a1578182fd5b6108aa8361076b565b91506108b86020840161076b565b90509250929050565b6000602082840312156108d2578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601390820152721858d8dbdd5b9d08189b1858dadb1a5cdd1959606a1b604082015260600190565b60208082526018908201527f696e73756666696369656e74206c6f636b20616d6f756e740000000000000000604082015260600190565b6020808252601a908201527f696e73756666696369656e74206c6f636b206475726174696f6e000000000000604082015260600190565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b90815260200190565b9283526001600160a01b0391909116602083015260408201526060019056fea26469706673582212202d9fa60d941e48f139142513aa954581ab18055b43dafd73afc20649991cddbf64736f6c63430007060033

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.