Contract 0x7780e1a8321bd58bbc76594db494c7bfe8e87040 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc61d555ea951dcd13b13a262948a8f2005a68bc19f8de46ba5840b5b44627fb8Claim All Reward...635082072023-06-03 1:46:296 hrs 14 mins ago0x329cfe850ff4cf637aa2353ef2d3672156e54d6c IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.026604601
0xd0768756918a8ef7bbd342f2bb43dc572d8f3edb1898482cf980e9e45485914aClaim All Reward...635030532023-06-02 22:59:539 hrs 1 min ago0xb7542735bcad39f7294f981ed0adfe887ca18225 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.029996427538
0x7f39129bd1d6f227fab784b6d1af86b3aa998972605a5ee0badb04fc01d0bf02Claim All Reward...635018342023-06-02 22:27:229 hrs 33 mins ago0x9945daf5dcd39c9a3556d27c16af343765e5630c IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.02558821062
0x8e2f08067d27be8ec8242c51e6d38050ad4beeeb16a5197991aa2d5f85526b55Claim All Reward...635014242023-06-02 22:15:279 hrs 45 mins ago0x6e868846b2182235c16fd122fcd44739e55a58e4 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.029609444
0x70eddaea2ce8bafd25484f8ddebe1c156a0021470d3abb93921a1ce88467427cClaim All Reward...634966272023-06-02 19:47:2612 hrs 13 mins ago0x139776871ee95f55d20b10d9ba5a0385451066cd IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.027268338818
0x3b8c51bc852adcd90c96a2cd62fcd797b6d965b4cfd2f415f652d013dca94053Claim All Reward...634965302023-06-02 19:43:3412 hrs 17 mins ago0x41c32b996b2cb71ca1974399e3523c72f78f286f IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.024914798542
0xae65d070df5587eaf09077f1b1e1099be3f5cad5d9e710007ec8858cde556a41Claim All Reward...634838402023-06-02 14:13:1917 hrs 47 mins ago0x35bade58a14fa55b575645d9f592b43b78673371 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.053432045
0x0573e93a85470968d02c6e184a839410465ee9ed7b82fc5e4f46efc7546471f0Claim All Reward...634802482023-06-02 12:34:2619 hrs 26 mins ago0x70ddf043d521aaea0ed98f39eac0183fdc9e3640 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.033191488378
0x9ad21b43788d46d8ae1996079c73e71d013906134ed448a8b39605d8936ce7bcClaim All Reward...634792392023-06-02 12:05:5019 hrs 55 mins ago0xbe3e933a363c715e18c2457b6a6d3e1eb1d8f385 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.038306285641
0x7c0bc89c2ac4349b45cdef79f10cb55f000555ec1f536ad68bc65d6b77176b1cClaim All Reward...634790962023-06-02 12:02:0919 hrs 59 mins ago0x2a318be0876a44e95fb9433359e2487914e1b42d IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.038066901795
0x09795e343efa341e1af5a1c28b3fa688a39b80cb52bd57500631436df148a33aClaim All Reward...634788602023-06-02 11:55:2520 hrs 5 mins ago0x25fff86014763c128d691417eb9ab4d7c37a74a0 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.030700831745
0x88cdf59a9e02d5d46b7b37e17a7042356949cb0da6338a09e193b7e7912e50dcClaim All Reward...634718752023-06-02 8:51:2323 hrs 9 mins ago0x068afbfe390a719fda63eb03f0f3558888d4a0fc IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.035995272438
0x894520825fd73596e53a7da76887d44fbda3f368c0565648eac8c82554f5518fClaim All Reward...634667512023-06-02 6:18:131 day 1 hr ago0xa63bca4aa47e42498889ab5185336fea54835c7e IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.030024817742
0x3697fc75a132c28abd29c87efb4998a929321a9c1e7fb026f6a35aaa5e1ba0b9Claim All Reward...634666582023-06-02 6:15:271 day 1 hr ago0xa63bca4aa47e42498889ab5185336fea54835c7e IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.045239425795
0x08d0f5be5c02ec4103b96fcbd4eeb6f28f9adf152db3dbab3838a02026aa0ed7Claim All Reward...634653562023-06-02 5:34:281 day 2 hrs agoIceBreak-R: Deployer IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.03216534627
0xdbd11e8594edcd1b33cb00bb4e7ec553929055ad0175da84dc9de643c9a2d204Claim All Reward...634650502023-06-02 5:22:501 day 2 hrs ago0x721700d0dc44058b8dc855840464489210ca1457 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.032431372476
0x840f481279b409472ee35784891d7da5f29c59d5535441a8c100d5a216d45f96Claim All Reward...634631762023-06-02 4:28:261 day 3 hrs ago0x055d875697ab3aa91ff64b16875b1ac4ea1a656f IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.033012637153
0x4e1c3f02f4fd8f9eaf2fec510dc899f9f9b8950d58afa6f36ae180b08e2fb0ffClaim All Reward...634627012023-06-02 4:12:461 day 3 hrs ago0xb4a3c2debfc033ee3399ad6adf0b4fc74db92baa IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.028022652
0x0558842ff9dbc973c1b9b1931fc7624f378d9f862f12374b2e73de83943633a2Claim All Reward...634604532023-06-02 3:04:581 day 4 hrs ago0x4652c0ca0792a923f5757ab65f1e14d33072a058 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.034912628
0xcf77ccc6299797bcf8eba8d1c01306b86a5650a99e4fc75651b39f444335e021Claim All Reward...634565062023-06-02 1:11:361 day 6 hrs ago0xa7132f36d56f88c42708f869e1980c4ff4bae892 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.04197868671
0x72176eb2abad9f21419fef06d91cb474a1c077f89bb4c7121b65f4faa23151e3Claim All Reward...634562222023-06-02 1:02:041 day 6 hrs ago0xcba1dd242207088042faec9a8adef88409b59fc1 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.036372477744
0xf5b89bc93a396d7ab7f6694341a61037fd0e91149c187da79003b6497114a300Claim All Reward...634544642023-06-02 0:08:221 day 7 hrs ago0x626e4c4bf9b150403d41f0841457d3bdf961b32f IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.041197323652
0x6db6e477e0a163f4bc8bc517245ea71ac7846c017808d9eca4c756f2d8e91da1Claim All Reward...634488702023-06-01 21:40:401 day 10 hrs ago0x5223c1c21c1894ee58ded4d09ccfa239a272af16 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.042978635
0x457729b33dd68e98d1c35c7e04cfdb340b8e128ad7df44841f194dc9016597f2Claim All Reward...634454322023-06-01 20:28:171 day 11 hrs ago0x1fac6eee2197c98d1ef0f166eccffa8632e9a279 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.03976577
0xbe3dc9d98a853665c92d7df7380752a8c7fc82d490079711611681c89b0d28c7Claim All Reward...634451092023-06-01 20:21:151 day 11 hrs ago0x1fac6eee2197c98d1ef0f166eccffa8632e9a279 IN  0x7780e1a8321bd58bbc76594db494c7bfe8e870400 FTM0.046260858
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0xad2ddc18abd9c2a64b03c8d9d8b70281ad77d5d2d2f2d694bf14f7594e7ef7e3324616242022-03-03 18:41:46456 days 13 hrs ago Granary: Deployer  Contract Creation0 FTM
[ Download CSV Export 
Loading

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

Contract Name:
Rewarder

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 10 of 14: Rewarder.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;

import {IERC20} from './IERC20.sol';
import {SafeERC20} from './SafeERC20.sol';
import {RewardsController} from './RewardsController.sol';

contract Rewarder is RewardsController {
  using SafeERC20 for IERC20;

  // reward => reward vault
  mapping(address => address) internal _rewardsVault;

  event RewardsVaultUpdated(address indexed vault);

  function setRewardsVault(address vault, address reward) external onlyOwner {
  	_rewardsVault[reward] = vault;
  	emit RewardsVaultUpdated(vault);
  }

  function getRewardsVault(address reward) external view returns (address) {
  	return _rewardsVault[reward];
  }

  function transferRewards(address to, address reward, uint256 amount) internal override returns (bool) {
    IERC20(reward).safeTransferFrom(_rewardsVault[reward], to, amount);
    return true;
  }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;

/**
 * @dev Collection of functions related to the address type
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
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
   * ====
   */
  function isContract(address account) internal view returns (bool) {
    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      codehash := extcodehash(account)
    }
    return (codehash != accountHash && codehash != 0x0);
  }

  /**
   * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
   * `recipient`, forwarding all available gas and reverting on errors.
   *
   * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
   * of certain opcodes, possibly making contracts go over the 2300 gas limit
   * imposed by `transfer`, making them unable to receive funds via
   * `transfer`. {sendValue} removes this limitation.
   *
   * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
   *
   * IMPORTANT: because control is transferred to `recipient`, care must be
   * taken to not create reentrancy vulnerabilities. Consider using
   * {ReentrancyGuard} or the
   * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
   */
  function sendValue(address payable recipient, uint256 amount) internal {
    require(address(this).balance >= amount, 'Address: insufficient balance');

    // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
    (bool success, ) = recipient.call{value: amount}('');
    require(success, 'Address: unable to send value, recipient may have reverted');
  }
}

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

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
  function _msgSender() internal view virtual returns (address payable) {
    return msg.sender;
  }

  function _msgData() internal view virtual returns (bytes memory) {
    this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
    return msg.data;
  }
}

File 3 of 14: DistributionTypes.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;

library DistributionTypes {
  struct RewardsConfigInput {
    uint88 emissionPerSecond;
    uint256 totalSupply;
    uint32 distributionEnd;
    address asset;
    address reward;
  }

  struct UserAssetInput {
    address underlyingAsset;
    uint256 userBalance;
    uint256 totalSupply;
  }
}

File 4 of 14: IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 * From https://github.com/OpenZeppelin/openzeppelin-contracts
 */
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 5 of 14: IERC20Detailed.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;

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

interface IERC20Detailed is IERC20 {
  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external view returns (uint8);
}

File 6 of 14: IRewardsController.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;

import {IRewardsDistributor} from './IRewardsDistributor.sol';
import {DistributionTypes} from './DistributionTypes.sol';

interface IRewardsController is IRewardsDistributor {
  event RewardsClaimed(
    address indexed user,
    address indexed reward,    
    address indexed to,
    address claimer,
    uint256 amount
  );

  event ClaimerSet(address indexed user, address indexed claimer);

  function setClaimer(address user, address claimer) external;

  function getClaimer(address user) external view returns (address);

  function configureAssets(DistributionTypes.RewardsConfigInput[] memory config) external;

  function handleAction(
    address asset,
    uint256 userBalance,
    uint256 totalSupply
  ) external;

  function claimRewards(
    address[] calldata assets,
    uint256 amount,
    address to,
    address reward
  ) external returns (uint256);

  function claimRewardsOnBehalf(
    address[] calldata assets,
    uint256 amount,
    address user,
    address to,
    address reward
  ) external returns (uint256);


  function claimRewardsToSelf(
    address[] calldata assets,
    uint256 amount,
    address reward
  ) external returns (uint256);

  function claimAllRewards(address[] calldata assets, address to)
    external
    returns (address[] memory rewardsList, uint256[] memory claimedAmounts);

  function claimAllRewardsOnBehalf(
    address[] calldata assets,
    address user,
    address to
  ) external returns (address[] memory rewardsList, uint256[] memory claimedAmounts);

  function claimAllRewardsToSelf(address[] calldata assets)
    external
    returns (address[] memory rewardsList, uint256[] memory claimedAmounts);
}

File 7 of 14: IRewardsDistributor.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;

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

interface IRewardsDistributor {
  event AssetConfigUpdated(
    address indexed asset,
    address indexed reward,
    uint256 emission,
    uint256 distributionEnd
  );
  event AssetIndexUpdated(address indexed asset, address indexed reward, uint256 index);
  event UserIndexUpdated(
    address indexed user,
    address indexed asset,
    address indexed reward,
    uint256 index
  );

  event RewardsAccrued(address indexed user, address indexed reward, uint256 amount);

  function setDistributionEnd(
    address asset,
    address reward,
    uint32 distributionEnd
  ) external;

  function getDistributionEnd(address asset, address reward) external view returns (uint256);

  function getUserAssetData(
    address user,
    address asset,
    address reward
  ) external view returns (uint256);

  function getRewardsData(address asset, address reward)
    external
    view
    returns (
      uint256,
      uint256,
      uint256,
      uint256
    );

  function getRewardsByAsset(address asset) external view returns (address[] memory);

  function getRewardTokens() external view returns (address[] memory);

  function getUserUnclaimedRewardsFromStorage(address user, address reward)
    external
    view
    returns (uint256);

  function getUserRewardsBalance(
    address[] calldata assets,
    address user,
    address reward
  ) external view returns (uint256);

  function getAllUserRewardsBalance(address[] calldata assets, address user)
    external
    view
    returns (address[] memory, uint256[] memory);

  function getAssetDecimals(address asset) external view returns (uint8);
}

File 8 of 14: IScaledBalanceToken.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.7.5;

interface IScaledBalanceToken {
  /**
   * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the
   * updated stored balance divided by the reserve's liquidity index at the moment of the update
   * @param user The user whose balance is calculated
   * @return The scaled balance of the user
   **/
  function scaledBalanceOf(address user) external view returns (uint256);

  /**
   * @dev Returns the scaled balance of the user and the scaled total supply.
   * @param user The address of the user
   * @return The scaled balance of the user
   * @return The scaled balance and the scaled total supply
   **/
  function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256);

  /**
   * @dev Returns the scaled total supply of the token. Represents sum(debt/index)
   * @return The scaled total supply
   **/
  function scaledTotalSupply() external view returns (uint256);
}

File 9 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;

import './Context.sol';

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
  address private _owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    address msgSender = _msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(_owner == _msgSender(), 'Ownable: caller is not the owner');
    _;
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions anymore. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby removing any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    emit OwnershipTransferred(_owner, address(0));
    _owner = address(0);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), 'Ownable: new owner is the zero address');
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

File 11 of 14: RewardsController.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;

import {IRewardsController} from './IRewardsController.sol';
import {RewardsDistributor} from './RewardsDistributor.sol';
import {IScaledBalanceToken} from './IScaledBalanceToken.sol';
import {DistributionTypes} from './DistributionTypes.sol';

abstract contract RewardsController is RewardsDistributor, IRewardsController {
	// user => authorized claimer
	mapping(address => address) internal _authorizedClaimers;

  modifier onlyAuthorizedClaimers(address claimer, address user) {
    require(_authorizedClaimers[user] == claimer, 'CLAIMER_UNAUTHORIZED');
    _;
  }

  function getClaimer(address user) external view override returns (address) {
    return _authorizedClaimers[user];
  }

  function setClaimer(address user, address caller) external override onlyOwner {
    _authorizedClaimers[user] = caller;
    emit ClaimerSet(user, caller);
  }

  function configureAssets(DistributionTypes.RewardsConfigInput[] memory config)
    external
    override
    onlyOwner
  {
    for (uint256 i = 0; i < config.length; i++) {
      config[i].totalSupply = IScaledBalanceToken(config[i].asset).scaledTotalSupply();
    }
    _configureAssets(config);
  }

  function handleAction(
    address user,
    uint256 totalSupply,
    uint256 userBalance
  ) external override {
    _updateUserRewardsPerAssetInternal(msg.sender, user, userBalance, totalSupply);
  }

	function claimRewards(
    address[] calldata assets,
    uint256 amount,
    address to,
    address reward
  ) external override returns (uint256) {
    require(to != address(0), 'INVALID_TO_ADDRESS');
    return _claimRewards(assets, amount, msg.sender, msg.sender, to, reward);
  }

  function claimRewardsOnBehalf(
    address[] calldata assets,
    uint256 amount,
    address user,
    address to,
    address reward
  ) external override onlyAuthorizedClaimers(msg.sender, user) returns (uint256) {
    require(user != address(0), 'INVALID_USER_ADDRESS');
    require(to != address(0), 'INVALID_TO_ADDRESS');
    return _claimRewards(assets, amount, msg.sender, user, to, reward);
  }

  function claimRewardsToSelf(
    address[] calldata assets,
    uint256 amount,
    address reward
  ) external override returns (uint256) {
    return _claimRewards(assets, amount, msg.sender, msg.sender, msg.sender, reward);
  }

  function claimAllRewards(address[] calldata assets, address to)
    external
    override
    returns (address[] memory rewardTokens, uint256[] memory claimedAmounts)
  {
    require(to != address(0), 'INVALID_TO_ADDRESS');
    return _claimAllRewards(assets, msg.sender, msg.sender, to);
  }

  function claimAllRewardsOnBehalf(
    address[] calldata assets,
    address user,
    address to
  )
    external
    override
    onlyAuthorizedClaimers(msg.sender, user)
    returns (address[] memory rewardTokens, uint256[] memory claimedAmounts)
  {
    require(user != address(0), 'INVALID_USER_ADDRESS');
    require(to != address(0), 'INVALID_TO_ADDRESS');
    return _claimAllRewards(assets, msg.sender, user, to);
  }

  function claimAllRewardsToSelf(address[] calldata assets)
    external
    override
    returns (address[] memory rewardTokens, uint256[] memory claimedAmounts)
  {
    return _claimAllRewards(assets, msg.sender, msg.sender, msg.sender);
  }

  function _getUserStake(address[] calldata assets, address user)
    internal
    view
    override
    returns (DistributionTypes.UserAssetInput[] memory userState)
  {
    userState = new DistributionTypes.UserAssetInput[](assets.length);
    for (uint256 i = 0; i < assets.length; i++) {
      userState[i].underlyingAsset = assets[i];
      (userState[i].userBalance, userState[i].totalSupply) = IScaledBalanceToken(assets[i])
        .getScaledUserBalanceAndSupply(user);
    }
    return userState;
  }

  function _claimRewards(
    address[] calldata assets,
    uint256 amount,
    address claimer,
    address user,
    address to,
    address reward
  ) internal returns (uint256) {
    if (amount == 0) {
      return 0;
    }
    uint256 unclaimedRewards = _usersUnclaimedRewards[user][reward];

    if (amount > unclaimedRewards) {
      _distributeRewards(user, _getUserStake(assets, user));
      unclaimedRewards = _usersUnclaimedRewards[user][reward];
    }

    if (unclaimedRewards == 0) {
      return 0;
    }

    uint256 amountToClaim = amount > unclaimedRewards ? unclaimedRewards : amount;
    _usersUnclaimedRewards[user][reward] = unclaimedRewards - amountToClaim; // Safe due to the previous line

    _transferRewards(to, reward, amountToClaim);
    emit RewardsClaimed(user, reward, to, claimer, amountToClaim);

    return amountToClaim;
  }

  function _claimAllRewards(
    address[] calldata assets,
    address claimer,
    address user,
    address to
  ) internal returns (address[] memory rewardTokens, uint256[] memory claimedAmounts) {
    _distributeRewards(user, _getUserStake(assets, user));

    rewardTokens = new address[](_rewardTokens.length);
    claimedAmounts = new uint256[](_rewardTokens.length);

    for (uint256 i = 0; i < _rewardTokens.length; i++) {
      address reward = _rewardTokens[i];
      uint256 rewardAmount = _usersUnclaimedRewards[user][reward];

      rewardTokens[i] = reward;
      claimedAmounts[i] = rewardAmount;

      if (rewardAmount != 0) {
        _usersUnclaimedRewards[user][reward] = 0;
        _transferRewards(to, reward, rewardAmount);
        emit RewardsClaimed(user, reward, to, claimer, rewardAmount);
      }
    }
    return (rewardTokens, claimedAmounts);
  }

  function _transferRewards(
    address to,
    address reward,
    uint256 amount
  ) internal {
    bool success = transferRewards(to, reward, amount);
    require(success == true, 'TRANSFER_ERROR');
  }

  function transferRewards(address to, address reward, uint256 amount) internal virtual returns (bool);
}

File 12 of 14: RewardsDistributor.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;
pragma experimental ABIEncoderV2;

import {IRewardsDistributor} from './IRewardsDistributor.sol';
import {IERC20Detailed} from './IERC20Detailed.sol';
import {DistributionTypes} from './DistributionTypes.sol';
import {Ownable} from './Ownable.sol';

abstract contract RewardsDistributor is IRewardsDistributor, Ownable {
	struct RewardData {
		uint88 emissionPerSecond;
		uint104 index;
		uint32 lastUpdateTimestamp;
		uint32 distributionEnd;
		mapping(address => uint256) usersIndex;
	}

	struct AssetData {
		// reward => rewardData
		mapping(address => RewardData) rewards;
		address[] availableRewards;
		uint8 decimals;
	}

	// incentivized asset => AssetData
	mapping(address => AssetData) internal _assets;

	// user => reward => unclaimed rewards
	mapping(address => mapping(address => uint256)) internal _usersUnclaimedRewards;

	// reward => isEnabled
	mapping(address => bool) internal _isRewardEnabled;

	address[] internal _rewardTokens;

  function getRewardsData(address asset, address reward)
    public
    view
    override
    returns (
      uint256,
      uint256,
      uint256,
      uint256
    )
  {
    return (
      _assets[asset].rewards[reward].index,
      _assets[asset].rewards[reward].emissionPerSecond,
      _assets[asset].rewards[reward].lastUpdateTimestamp,
      _assets[asset].rewards[reward].distributionEnd
    );
  }

  function getDistributionEnd(address asset, address reward)
    external
    view
    override
    returns (uint256)
  {
    return _assets[asset].rewards[reward].distributionEnd;
  }

  function getRewardsByAsset(address asset) external view override returns (address[] memory) {
    return _assets[asset].availableRewards;
  }

  function getRewardTokens() external view override returns (address[] memory) {
    return _rewardTokens;
  }

  function getUserAssetData(
    address user,
    address asset,
    address reward
  ) public view override returns (uint256) {
    return _assets[asset].rewards[reward].usersIndex[user];
  }

  function getUserUnclaimedRewardsFromStorage(address user, address reward)
    external
    view
    override
    returns (uint256)
  {
    return _usersUnclaimedRewards[user][reward];
  }

  function getUserRewardsBalance(
    address[] calldata assets,
    address user,
    address reward
  ) external view override returns (uint256) {
    return _getUserReward(user, reward, _getUserStake(assets, user));
  }

  function getAllUserRewardsBalance(address[] calldata assets, address user)
    external
    view
    override
    returns (address[] memory rewardTokens, uint256[] memory unclaimedAmounts)
  {
    return _getAllUserRewards(user, _getUserStake(assets, user));
  }

  function setDistributionEnd(
    address asset,
    address reward,
    uint32 distributionEnd
  ) external override onlyOwner {
    _assets[asset].rewards[reward].distributionEnd = distributionEnd;

    emit AssetConfigUpdated(
      asset,
      reward,
      _assets[asset].rewards[reward].emissionPerSecond,
      distributionEnd
    );
  }

  function _configureAssets(DistributionTypes.RewardsConfigInput[] memory rewardsInput)
    internal
  {
    for (uint256 i = 0; i < rewardsInput.length; i++) {
      _assets[rewardsInput[i].asset].decimals = IERC20Detailed(rewardsInput[i].asset).decimals();

      RewardData storage rewardConfig = _assets[rewardsInput[i].asset].rewards[
        rewardsInput[i].reward
      ];

      if (rewardConfig.lastUpdateTimestamp == 0) {
        _assets[rewardsInput[i].asset].availableRewards.push(rewardsInput[i].reward);
      }

      if (_isRewardEnabled[rewardsInput[i].reward] == false) {
        _isRewardEnabled[rewardsInput[i].reward] = true;
        _rewardTokens.push(rewardsInput[i].reward);
      }

      _updateAssetStateInternal(
        rewardsInput[i].asset,
        rewardsInput[i].reward,
        rewardConfig,
        rewardsInput[i].totalSupply,
        _assets[rewardsInput[i].asset].decimals
      );

      rewardConfig.emissionPerSecond = rewardsInput[i].emissionPerSecond;
      rewardConfig.distributionEnd = rewardsInput[i].distributionEnd;

      emit AssetConfigUpdated(
        rewardsInput[i].asset,
        rewardsInput[i].reward,
        rewardsInput[i].emissionPerSecond,
        rewardsInput[i].distributionEnd
      );
    }
  }

  function _updateAssetStateInternal(
    address asset,
    address reward,
    RewardData storage rewardConfig,
    uint256 totalSupply,
    uint8 decimals
  ) internal returns (uint256) {
    uint256 oldIndex = rewardConfig.index;

    if (block.timestamp == rewardConfig.lastUpdateTimestamp) {
      return oldIndex;
    }

    uint256 newIndex = _getAssetIndex(
      oldIndex,
      rewardConfig.emissionPerSecond,
      rewardConfig.lastUpdateTimestamp,
      rewardConfig.distributionEnd,
      totalSupply,
      decimals
    );

    if (newIndex != oldIndex) {
      require(newIndex <= type(uint104).max, 'Index overflow');
      rewardConfig.index = uint104(newIndex);
      rewardConfig.lastUpdateTimestamp = uint32(block.timestamp);
      emit AssetIndexUpdated(asset, reward, newIndex);
    } else {
      rewardConfig.lastUpdateTimestamp = uint32(block.timestamp);
    }

    return newIndex;
  }

  function _updateUserRewardsInternal(
    address user,
    address asset,
    address reward,
    uint256 userBalance,
    uint256 totalSupply
  ) internal returns (uint256) {
    RewardData storage rewardData = _assets[asset].rewards[reward];
    uint256 userIndex = rewardData.usersIndex[user];
    uint256 accruedRewards = 0;

    uint256 newIndex = _updateAssetStateInternal(
      asset,
      reward,
      rewardData,
      totalSupply,
      _assets[asset].decimals
    );

    if (userIndex != newIndex) {
      if (userBalance != 0) {
        accruedRewards = _getRewards(userBalance, newIndex, userIndex, _assets[asset].decimals);
      }

      rewardData.usersIndex[user] = newIndex;
      emit UserIndexUpdated(user, asset, reward, newIndex);
    }

    return accruedRewards;
  }

  function _updateUserRewardsPerAssetInternal(
    address asset,
    address user,
    uint256 userBalance,
    uint256 totalSupply
  ) internal {
    for (uint256 r = 0; r < _assets[asset].availableRewards.length; r++) {
      address reward = _assets[asset].availableRewards[r];
      uint256 accruedRewards = _updateUserRewardsInternal(
        user,
        asset,
        reward,
        userBalance,
        totalSupply
      );
      if (accruedRewards != 0) {
        _usersUnclaimedRewards[user][reward] += accruedRewards;

        emit RewardsAccrued(user, reward, accruedRewards);
      }
    }
  }

  function _distributeRewards(
    address user,
    DistributionTypes.UserAssetInput[] memory userState
  ) internal {
    for (uint256 i = 0; i < userState.length; i++) {
      _updateUserRewardsPerAssetInternal(
        userState[i].underlyingAsset,
        user,
        userState[i].userBalance,
        userState[i].totalSupply
      );
    }
  }

  function _getUserReward(
    address user,
    address reward,
    DistributionTypes.UserAssetInput[] memory userState
  ) internal view returns (uint256 unclaimedRewards) {
    // Add unrealized rewards
    for (uint256 i = 0; i < userState.length; i++) {
      if (userState[i].userBalance == 0) {
        continue;
      }
      unclaimedRewards += _getUnrealizedRewardsFromStake(user, reward, userState[i]);
    }

    return unclaimedRewards + _usersUnclaimedRewards[user][reward];
  }

  function _getAllUserRewards(
    address user,
    DistributionTypes.UserAssetInput[] memory userState
  ) internal view returns (address[] memory rewardTokens, uint256[] memory unclaimedRewards) {
    rewardTokens = new address[](_rewardTokens.length);
    unclaimedRewards = new uint256[](rewardTokens.length);

    for (uint256 y = 0; y < rewardTokens.length; y++) {
      rewardTokens[y] = _rewardTokens[y];
      unclaimedRewards[y] = _usersUnclaimedRewards[user][rewardTokens[y]];
    }

    for (uint256 i = 0; i < userState.length; i++) {
      if (userState[i].userBalance == 0) {
        continue;
      }
      for (uint256 r = 0; r < rewardTokens.length; r++) {
        unclaimedRewards[r] += _getUnrealizedRewardsFromStake(user, rewardTokens[r], userState[i]);
      }
    }
    return (rewardTokens, unclaimedRewards);
  }

  function _getUnrealizedRewardsFromStake(
    address user,
    address reward,
    DistributionTypes.UserAssetInput memory stake
  ) internal view returns (uint256) {
    RewardData storage rewardData = _assets[stake.underlyingAsset].rewards[reward];
    uint8 assetDecimals = _assets[stake.underlyingAsset].decimals;
    uint256 assetIndex = _getAssetIndex(
      rewardData.index,
      rewardData.emissionPerSecond,
      rewardData.lastUpdateTimestamp,
      rewardData.distributionEnd,
      stake.totalSupply,
      assetDecimals
    );

    return _getRewards(stake.userBalance, assetIndex, rewardData.usersIndex[user], assetDecimals);
  }

	function _getRewards(
    uint256 principalUserBalance,
    uint256 reserveIndex,
    uint256 userIndex,
    uint8 decimals
  ) internal pure returns (uint256) {
    return (principalUserBalance * (reserveIndex - userIndex)) / 10**decimals;
  }

  function _getAssetIndex(
    uint256 currentIndex,
    uint256 emissionPerSecond,
    uint128 lastUpdateTimestamp,
    uint256 distributionEnd,
    uint256 totalBalance,
    uint8 decimals
  ) internal view returns (uint256) {
    if (
      emissionPerSecond == 0 ||
      totalBalance == 0 ||
      lastUpdateTimestamp == block.timestamp ||
      lastUpdateTimestamp >= distributionEnd
    ) {
      return currentIndex;
    }

    uint256 currentTimestamp = block.timestamp > distributionEnd
      ? distributionEnd
      : block.timestamp;
    uint256 timeDelta = currentTimestamp - lastUpdateTimestamp;
    return (emissionPerSecond * timeDelta * (10**decimals)) / totalBalance + currentIndex;
  }

  function _getUserStake(address[] calldata assets, address user)
    internal
    view
    virtual
    returns (DistributionTypes.UserAssetInput[] memory userState);

  function getAssetDecimals(address asset) external view override returns (uint8) {
    return _assets[asset].decimals;
  }
}

File 13 of 14: SafeERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;

import {IERC20} from './IERC20.sol';
import {SafeMath} from './SafeMath.sol';
import {Address} from './Address.sol';

/**
 * @title SafeERC20
 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts
 * 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 SafeMath for uint256;
  using Address for address;

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

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

  function safeApprove(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    require(
      (value == 0) || (token.allowance(address(this), spender) == 0),
      'SafeERC20: approve from non-zero to non-zero allowance'
    );
    callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
  }

  function callOptionalReturn(IERC20 token, bytes memory data) private {
    require(address(token).isContract(), 'SafeERC20: call to non-contract');

    // solhint-disable-next-line avoid-low-level-calls
    (bool success, bytes memory returndata) = address(token).call(data);
    require(success, 'SafeERC20: low-level call failed');

    if (returndata.length > 0) {
      // Return data is optional
      // solhint-disable-next-line max-line-length
      require(abi.decode(returndata, (bool)), 'SafeERC20: ERC20 operation did not succeed');
    }
  }
}

File 14 of 14: SafeMath.sol
// SPDX-License-Identifier: agpl-3.0
pragma solidity ^0.7.5;

/**
 * @dev From https://github.com/OpenZeppelin/openzeppelin-contracts
 * 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;
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"emission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"distributionEnd","type":"uint256"}],"name":"AssetConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"AssetIndexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"ClaimerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"}],"name":"RewardsVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"reward","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"UserIndexUpdated","type":"event"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"claimAllRewards","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"claimAllRewardsOnBehalf","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"claimAllRewardsToSelf","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"claimedAmounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"claimRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"claimRewardsOnBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"reward","type":"address"}],"name":"claimRewardsToSelf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint88","name":"emissionPerSecond","type":"uint88"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint32","name":"distributionEnd","type":"uint32"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"internalType":"struct DistributionTypes.RewardsConfigInput[]","name":"config","type":"tuple[]"}],"name":"configureAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"user","type":"address"}],"name":"getAllUserRewardsBalance","outputs":[{"internalType":"address[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"unclaimedAmounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getAssetDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getClaimer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getDistributionEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"getRewardsByAsset","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getRewardsData","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reward","type":"address"}],"name":"getRewardsVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getUserAssetData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getUserRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"getUserUnclaimedRewardsFromStorage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"userBalance","type":"uint256"}],"name":"handleAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"setClaimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint32","name":"distributionEnd","type":"uint32"}],"name":"setDistributionEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"reward","type":"address"}],"name":"setRewardsVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600061001b61006a565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006e565b3390565b6128b78061007d6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637eff4ba8116100de578063bb492bf511610097578063c5a7b53811610071578063c5a7b53814610343578063c664493a14610356578063f2fde38b14610369578063f5cf673b1461037c57610173565b8063bb492bf514610315578063bf90f63a14610328578063c4f59f9b1461033b57610173565b80637eff4ba814610283578063866bc096146102a65780638da5cb5b146102b95780639efd6f72146102c15780639ff55db9146102e1578063af15ec5a1461030257610173565b80635077215511610130578063507721551461020257806357b89883146102155780636657732f1461022857806367eabbc914610248578063715018a61461026857806374d945ec1461027057610173565b80630b0db655146101785780631b839c771461018d578063236300dc146101b657806331873e2e146101c957806333028b99146101dc57806344fd1400146101ef575b600080fd5b61018b6101863660046124e3565b61038f565b005b6101a061019b3660046121e7565b6104aa565b6040516101ad919061279d565b60405180910390f35b6101a06101c43660046123fe565b6104e2565b61018b6101d7366004612294565b61052e565b6101a06101ea366004612469565b61053f565b61018b6101fd3660046121e7565b6105e6565b6101a0610210366004612219565b610695565b6101a06102233660046123af565b6106cf565b61023b6102363660046121c6565b6106e0565b6040516101ad919061265c565b61025b6102563660046121c6565b61075a565b6040516101ad919061262f565b61018b610778565b61025b61027e3660046121c6565b61081a565b6102966102913660046121e7565b610838565b6040516101ad94939291906127a6565b6101a06102b43660046121e7565b610897565b61025b6108c2565b6102d46102cf3660046121c6565b6108d1565b6040516101ad91906127e0565b6102f46102ef36600461234d565b6108f2565b6040516101ad92919061266f565b6101a061031036600461234d565b61099c565b6102f4610323366004612305565b6109b3565b6102f46103363660046122c6565b6109f5565b61023b610a11565b61018b61035136600461225b565b610a73565b6102f4610364366004612305565b610b5a565b61018b6103773660046121c6565b610b71565b61018b61038a3660046121e7565b610c69565b610397610d18565b6000546001600160a01b039081169116146103e7576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b60005b815181101561049d578181815181106103ff57fe5b6020026020010151606001516001600160a01b031663b1bf962d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561044357600080fd5b505afa158015610457573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047b9190612590565b82828151811061048757fe5b60209081029190910181015101526001016103ea565b506104a781610d1c565b50565b6001600160a01b039182166000908152600160209081526040808320939094168252919091522054600160e01b900463ffffffff1690565b60006001600160a01b0383166105135760405162461bcd60e51b815260040161050a9061271b565b60405180910390fd5b610522868686333388886111b9565b90505b95945050505050565b61053a338483856112ef565b505050565b6001600160a01b0380841660009081526005602052604081205490913391869116821461057e5760405162461bcd60e51b815260040161050a9061276f565b6001600160a01b0386166105a45760405162461bcd60e51b815260040161050a906126c5565b6001600160a01b0385166105ca5760405162461bcd60e51b815260040161050a9061271b565b6105d9898989338a8a8a6111b9565b9998505050505050505050565b6105ee610d18565b6000546001600160a01b0390811691161461063e576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b0381811660009081526006602052604080822080546001600160a01b0319169386169384179055517f28a48cbce43190d77247f342cf319b1607bff4ef716cf26b76cf7bb71baebaa59190a25050565b6001600160a01b03808316600090815260016020818152604080842086861685528252808420948816845293909101905220549392505050565b6000610525858585333333886111b9565b6001600160a01b03811660009081526001602081815260409283902090910180548351818402810184019094528084526060939283018282801561074d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161072f575b505050505090505b919050565b6001600160a01b039081166000908152600660205260409020541690565b610780610d18565b6000546001600160a01b039081169116146107d0576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b039081166000908152600560205260409020541690565b6001600160a01b0391821660009081526001602090815260408083209390941682529190915220546001600160681b03600160581b820416916001600160581b0382169163ffffffff600160c01b8204811692600160e01b9092041690565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000546001600160a01b031690565b6001600160a01b031660009081526001602052604090206002015460ff1690565b6001600160a01b038083166000908152600560205260409020546060918291339186911682146109345760405162461bcd60e51b815260040161050a9061276f565b6001600160a01b03861661095a5760405162461bcd60e51b815260040161050a906126c5565b6001600160a01b0385166109805760405162461bcd60e51b815260040161050a9061271b565b61098d88883389896113e0565b93509350505094509492505050565b600061052583836109ae8888886115bc565b611742565b6060806001600160a01b0383166109dc5760405162461bcd60e51b815260040161050a9061271b565b6109e985853333876113e0565b91509150935093915050565b606080610a0584843333336113e0565b915091505b9250929050565b60606004805480602002602001604051908101604052809291908181526020018280548015610a6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a4b575b5050505050905090565b610a7b610d18565b6000546001600160a01b03908116911614610acb576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b038381166000818152600160209081526040808320948716808452949091529081902080546001600160e01b0316600160e01b63ffffffff871602179081905590517fec44514a2743afadd78647150195ef92fec31e96087fa5cbbcd72e8d131d9a1c91610b4d916001600160581b039091169086906127c1565b60405180910390a3505050565b6060806109e983610b6c8787876115bc565b6117ce565b610b79610d18565b6000546001600160a01b03908116911614610bc9576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b038116610c0e5760405162461bcd60e51b81526004018080602001828103825260268152602001806128126026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b610c71610d18565b6000546001600160a01b03908116911614610cc1576040805162461bcd60e51b81526020600482018190526024820152600080516020612838833981519152604482015290519081900360640190fd5b6001600160a01b0382811660008181526005602052604080822080546001600160a01b0319169486169485179055517f4925eafc82d0c4d67889898eeed64b18488ab19811e61620f387026dec126a289190a35050565b3390565b60005b81518110156111b557818181518110610d3457fe5b6020026020010151606001516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7857600080fd5b505afa158015610d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db091906125cb565b60016000848481518110610dc057fe5b6020026020010151606001516001600160a01b03166001600160a01b0316815260200190815260200160002060020160006101000a81548160ff021916908360ff160217905550600060016000848481518110610e1957fe5b6020026020010151606001516001600160a01b03166001600160a01b031681526020019081526020016000206000016000848481518110610e5657fe5b602090810291909101810151608001516001600160a01b031682528101919091526040016000208054909150600160c01b900463ffffffff16610f1e5760016000848481518110610ea357fe5b6020026020010151606001516001600160a01b03166001600160a01b03168152602001908152602001600020600101838381518110610ede57fe5b6020908102919091018101516080015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b60036000848481518110610f2e57fe5b602090810291909101810151608001516001600160a01b031682528101919091526040016000205460ff1661100057600160036000858581518110610f6f57fe5b6020026020010151608001516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506004838381518110610fc057fe5b6020908102919091018101516080015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790555b61108f83838151811061100f57fe5b60200260200101516060015184848151811061102757fe5b6020026020010151608001518386868151811061104057fe5b6020026020010151602001516001600089898151811061105c57fe5b602090810291909101810151606001516001600160a01b031682528101919091526040016000206002015460ff166119d3565b5082828151811061109c57fe5b60209081029190910101515181546affffffffffffffffffffff19166001600160581b0390911617815582518390839081106110d457fe5b602090810291909101015160400151815463ffffffff909116600160e01b026001600160e01b03909116178155825183908390811061110f57fe5b6020026020010151608001516001600160a01b031683838151811061113057fe5b6020026020010151606001516001600160a01b03167fec44514a2743afadd78647150195ef92fec31e96087fa5cbbcd72e8d131d9a1c85858151811061117257fe5b60200260200101516000015186868151811061118a57fe5b6020026020010151604001516040516111a49291906127c1565b60405180910390a350600101610d1f565b5050565b6000856111c8575060006112e4565b6001600160a01b03808516600090815260026020908152604080832093861683529290522054808711156112325761120a856112058b8b896115bc565b611b1c565b506001600160a01b038085166000908152600260209081526040808320938616835292905220545b806112415760009150506112e4565b60008188116112505787611252565b815b6001600160a01b03808816600090815260026020908152604080832093891683529290522081840390559050611289858583611b81565b846001600160a01b0316846001600160a01b0316876001600160a01b03167fc052130bc4ef84580db505783484b067ea8b71b3bca78a7e12db7aea8658f0048a856040516112d8929190612643565b60405180910390a49150505b979650505050505050565b60005b6001600160a01b038516600090815260016020819052604090912001548110156113d9576001600160a01b038516600090815260016020819052604082200180548390811061133d57fe5b60009182526020822001546001600160a01b031691506113608688848888611bb8565b905080156113cf576001600160a01b0380871660008181526002602090815260408083209487168084529490915290819020805485019055517f68ac6b4d0eeedccf3df154188dfac62d18d2ac5eaac52ecd6e728e33ce75a1d4906113c690859061279d565b60405180910390a35b50506001016112f2565b5050505050565b6060806113f2846112058989886115bc565b6004546001600160401b038111801561140a57600080fd5b50604051908082528060200260200182016040528015611434578160200160208202803683370190505b506004549092506001600160401b038111801561145057600080fd5b5060405190808252806020026020018201604052801561147a578160200160208202803683370190505b50905060005b6004548110156115b15760006004828154811061149957fe5b60009182526020808320909101546001600160a01b0389811684526002835260408085209190921680855292529091205485519192509082908690859081106114de57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508084848151811061150b57fe5b602090810291909101015280156115a7576001600160a01b03808816600090815260026020908152604080832093861683529290529081205561154f868383611b81565b856001600160a01b0316826001600160a01b0316886001600160a01b03167fc052130bc4ef84580db505783484b067ea8b71b3bca78a7e12db7aea8658f0048b8560405161159e929190612643565b60405180910390a45b5050600101611480565b509550959350505050565b6060826001600160401b03811180156115d457600080fd5b5060405190808252806020026020018201604052801561160e57816020015b6115fb6120a0565b8152602001906001900390816115f35790505b50905060005b8381101561173a5784848281811061162857fe5b905060200201602081019061163d91906121c6565b82828151811061164957fe5b60209081029190910101516001600160a01b03909116905284848281811061166d57fe5b905060200201602081019061168291906121c6565b6001600160a01b0316630afbcdc9846040518263ffffffff1660e01b81526004016116ad919061262f565b604080518083038186803b1580156116c457600080fd5b505afa1580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc91906125a8565b83838151811061170857fe5b602002602001015160200184848151811061171f57fe5b60209081029190910101516040019190915252600101611614565b509392505050565b6000805b825181101561179f5782818151811061175b57fe5b6020026020010151602001516000141561177457611797565b611792858585848151811061178557fe5b6020026020010151611cbf565b820191505b600101611746565b506001600160a01b03808516600090815260026020908152604080832093871683529290522054019392505050565b60045460609081906001600160401b03811180156117eb57600080fd5b50604051908082528060200260200182016040528015611815578160200160208202803683370190505b50915081516001600160401b038111801561182f57600080fd5b50604051908082528060200260200182016040528015611859578160200160208202803683370190505b50905060005b825181101561193a576004818154811061187557fe5b9060005260206000200160009054906101000a90046001600160a01b031683828151811061189f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060026000866001600160a01b03166001600160a01b0316815260200190815260200160002060008483815181106118f257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061192757fe5b602090810291909101015260010161185f565b5060005b83518110156119cb5783818151811061195357fe5b6020026020010151602001516000141561196c576119c3565b60005b83518110156119c15761199c8685838151811061198857fe5b602002602001015187858151811061178557fe5b8382815181106119a857fe5b602090810291909101018051909101905260010161196f565b505b60010161193e565b509250929050565b8254600090600160581b81046001600160681b031690600160c01b900463ffffffff16421415611a04579050610525565b8454600090611a389083906001600160581b0381169063ffffffff600160c01b8204811691600160e01b9004168989611d81565b9050818114611af5576001600160681b03811115611a685760405162461bcd60e51b815260040161050a90612747565b85546cffffffffffffffffffffffffff60581b1916600160581b6001600160681b038316021763ffffffff60c01b1916600160c01b4263ffffffff16021786556040516001600160a01b0388811691908a16907f7ecfb468c92138c74e6034d3e9d76f99150e483bd53bcc43524ce7056698751f90611ae890859061279d565b60405180910390a36112e4565b855463ffffffff60c01b1916600160c01b4263ffffffff1602178655979650505050505050565b60005b815181101561053a57611b79828281518110611b3757fe5b60200260200101516000015184848481518110611b5057fe5b602002602001015160200151858581518110611b6857fe5b6020026020010151604001516112ef565b600101611b1f565b6000611b8e848484611e05565b9050600181151514611bb25760405162461bcd60e51b815260040161050a906126f3565b50505050565b6001600160a01b0380851660008181526001602081815260408084208987168552808352818520968c168552868401835290842054948452919052600201549092919083908190611c13908a908a9087908a9060ff166119d3565b9050808314611cb2578615611c53576001600160a01b038916600090815260016020526040902060020154611c509088908390869060ff16611e38565b91505b6001600160a01b03808b16600081815260018701602052604090819020849055518a8316928c1691907ff5674975ec2736b27b8d52ea7cafb8bc2761685f31f109e028e1498aa2b2f3e590611ca990869061279d565b60405180910390a45b5098975050505050505050565b80516001600160a01b03908116600090815260016020818152604080842087861685528252808420865190951684529190528082206002015483549185015192939260ff909116918491611d48916001600160681b03600160581b820416916001600160581b0382169163ffffffff600160c01b8204811692600160e01b909204169087611d81565b90506112e48560200151828560010160008b6001600160a01b03166001600160a01b031681526020019081526020016000205485611e38565b6000851580611d8e575082155b80611da1575042856001600160801b0316145b80611db5575083856001600160801b031610155b15611dc1575085611dfb565b6000844211611dd05742611dd2565b845b90506001600160801b0386168103888589830260ff8716600a0a0281611df457fe5b0401925050505b9695505050505050565b6001600160a01b038083166000818152600660205260408120549092611e2e9291168685611e57565b5060019392505050565b60008160ff16600a0a838503860281611e4d57fe5b0495945050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611bb2908590611ebe826001600160a01b0316612064565b611f0f576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611f4d5780518252601f199092019160209182019101611f2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611faf576040519150601f19603f3d011682016040523d82523d6000602084013e611fb4565b606091505b50915091508161200b576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611bb25780806020019051602081101561202757600080fd5b5051611bb25760405162461bcd60e51b815260040180806020018281038252602a815260200180612858602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061209857508115155b949350505050565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b80356001600160a01b038116811461075557600080fd5b60008083601f8401126120f2578182fd5b5081356001600160401b03811115612108578182fd5b6020830191508360208083028501011115610a0a57600080fd5b600060a08284031215612133578081fd5b60405160a081018181106001600160401b038211171561214f57fe5b60405290508082356001600160581b038116811461216c57600080fd5b815260208381013590820152612184604084016121b2565b6040820152612195606084016120ca565b60608201526121a6608084016120ca565b60808201525092915050565b803563ffffffff8116811461075557600080fd5b6000602082840312156121d7578081fd5b6121e0826120ca565b9392505050565b600080604083850312156121f9578081fd5b612202836120ca565b9150612210602084016120ca565b90509250929050565b60008060006060848603121561222d578081fd5b612236846120ca565b9250612244602085016120ca565b9150612252604085016120ca565b90509250925092565b60008060006060848603121561226f578283fd5b612278846120ca565b9250612286602085016120ca565b9150612252604085016121b2565b6000806000606084860312156122a8578283fd5b6122b1846120ca565b95602085013595506040909401359392505050565b600080602083850312156122d8578182fd5b82356001600160401b038111156122ed578283fd5b6122f9858286016120e1565b90969095509350505050565b600080600060408486031215612319578283fd5b83356001600160401b0381111561232e578384fd5b61233a868287016120e1565b90945092506122529050602085016120ca565b60008060008060608587031215612362578081fd5b84356001600160401b03811115612377578182fd5b612383878288016120e1565b90955093506123969050602086016120ca565b91506123a4604086016120ca565b905092959194509250565b600080600080606085870312156123c4578384fd5b84356001600160401b038111156123d9578485fd5b6123e5878288016120e1565b909550935050602085013591506123a4604086016120ca565b600080600080600060808688031215612415578081fd5b85356001600160401b0381111561242a578182fd5b612436888289016120e1565b9096509450506020860135925061244f604087016120ca565b915061245d606087016120ca565b90509295509295909350565b60008060008060008060a08789031215612481578384fd5b86356001600160401b03811115612496578485fd5b6124a289828a016120e1565b909750955050602087013593506124bb604088016120ca565b92506124c9606088016120ca565b91506124d7608088016120ca565b90509295509295509295565b600060208083850312156124f5578182fd5b82356001600160401b038082111561250b578384fd5b818501915085601f83011261251e578384fd5b81358181111561252a57fe5b61253784858302016127ee565b818152848101925083850160a0808402860187018a1015612556578788fd5b8795505b838610156125825761256c8a83612122565b855260019590950194938601939081019061255a565b509098975050505050505050565b6000602082840312156125a1578081fd5b5051919050565b600080604083850312156125ba578182fd5b505080516020909101519092909150565b6000602082840312156125dc578081fd5b815160ff811681146121e0578182fd5b6000815180845260208085019450808401835b838110156126245781516001600160a01b0316875295820195908201906001016125ff565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6000602082526121e060208301846125ec565b60006040825261268260408301856125ec565b828103602084810191909152845180835285820192820190845b818110156126b85784518352938301939183019160010161269c565b5090979650505050505050565b602080825260149082015273494e56414c49445f555345525f4144445245535360601b604082015260600190565b6020808252600e908201526d2a2920a729a322a92fa2a92927a960911b604082015260600190565b602080825260129082015271494e56414c49445f544f5f4144445245535360701b604082015260600190565b6020808252600e908201526d496e646578206f766572666c6f7760901b604082015260600190565b60208082526014908201527310d3105253515497d5539055551213d49256915160621b604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160581b0392909216825263ffffffff16602082015260400190565b60ff91909116815260200190565b6040518181016001600160401b038111828210171561280957fe5b60405291905056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220a69cb44741de9acd3fd0e3340945805e2f6f7c6f2823301d14c5fece170160c964736f6c63430007050033

Deployed ByteCode Sourcemap

230:677:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;946:300:10;;;;;;:::i;:::-;;:::i;:::-;;1418:182:11;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1454:285:10;;;;;;:::i;:::-;;:::i;1250:201::-;;;;;;:::i;:::-;;:::i;1743:403::-;;;;;;:::i;:::-;;:::i;440:150:9:-;;;;;;:::i;:::-;;:::i;1861:191:11:-;;;;;;:::i;:::-;;:::i;2150:230:10:-;;;;;;:::i;:::-;;:::i;1604:141:11:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;594:111:9:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1599:135:8:-;;;:::i;662:118:10:-;;;;;;:::i;:::-;;:::i;1009:405:11:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2056:187::-;;;;;;:::i;:::-;;:::i;1016:71:8:-;;;:::i;10131:121:11:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2680:426:10:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2247:220:11:-;;;;;;:::i;:::-;;:::i;2384:292:10:-;;;;;;:::i;:::-;;:::i;3110:241::-;;;;;;:::i;:::-;;:::i;1749:108:11:-;;;:::i;2737:344::-;;;;;;:::i;:::-;;:::i;2471:262::-;;;;;;:::i;:::-;;:::i;1873:226:8:-;;;;;;:::i;:::-;;:::i;784:158:10:-;;;;;;:::i;:::-;;:::i;946:300::-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;1078:9:10::1;1073:139;1097:6;:13;1093:1;:17;1073:139;;;1169:6;1176:1;1169:9;;;;;;;;;;;;;;:15;;;-1:-1:-1::0;;;;;1149:54:10::1;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1125:6;1132:1;1125:9;;;;;;;;;::::0;;::::1;::::0;;;;;;;:21:::1;:80:::0;1112:3:::1;;1073:139;;;;1217:24;1234:6;1217:16;:24::i;:::-;946:300:::0;:::o;1418:182:11:-;-1:-1:-1;;;;;1549:14:11;;;1525:7;1549:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;;:46;-1:-1:-1;;;1549:46:11;;;;;1418:182::o;1454:285:10:-;1594:7;-1:-1:-1;;;;;1617:16:10;;1609:47;;;;-1:-1:-1;;;1609:47:10;;;;;;;:::i;:::-;;;;;;;;;1669:65;1683:6;;1691;1699:10;1711;1723:2;1727:6;1669:13;:65::i;:::-;1662:72;;1454:285;;;;;;;;:::o;1250:201::-;1368:78;1403:10;1415:4;1421:11;1434;1368:34;:78::i;:::-;1250:201;;;:::o;1743:403::-;-1:-1:-1;;;;;585:25:10;;;1950:7;585:25;;;:19;:25;;;;;;1950:7;;1923:10;;1935:4;;585:25;:36;;577:69;;;;-1:-1:-1;;;577:69:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;1973:18:10;::::1;1965:51;;;;-1:-1:-1::0;;;1965:51:10::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2030:16:10;::::1;2022:47;;;;-1:-1:-1::0;;;2022:47:10::1;;;;;;;:::i;:::-;2082:59;2096:6;;2104;2112:10;2124:4;2130:2;2134:6;2082:13;:59::i;:::-;2075:66:::0;1743:403;-1:-1:-1;;;;;;;;;1743:403:10:o;440:150:9:-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;520:21:9;;::::1;;::::0;;;:13:::1;:21;::::0;;;;;:29;;-1:-1:-1;;;;;;520:29:9::1;::::0;;::::1;::::0;;::::1;::::0;;559:26;::::1;::::0;520:21;559:26:::1;440:150:::0;;:::o;1861:191:11:-;-1:-1:-1;;;;;2000:14:11;;;1978:7;2000:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;:47;;;;;:41;;;;:47;;;;1861:191;;;;;:::o;2150:230:10:-;2280:7;2302:73;2316:6;;2324;2332:10;2344;2356;2368:6;2302:13;:73::i;1604:141:11:-;-1:-1:-1;;;;;1709:14:11;;;;;;:7;:14;;;;;;;;;:31;;;1702:38;;;;;;;;;;;;;;;;;1678:16;;1702:38;;;1709:31;1702:38;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1702:38:11;;;;;;;;;;;;;;;;;;;;;;;1604:141;;;;:::o;594:111:9:-;-1:-1:-1;;;;;679:21:9;;;658:7;679:21;;;:13;:21;;;;;;;;594:111::o;1599:135:8:-;1212:12;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;1701:1:::1;1685:6:::0;;1664:40:::1;::::0;-1:-1:-1;;;;;1685:6:8;;::::1;::::0;1664:40:::1;::::0;1701:1;;1664:40:::1;1727:1;1710:19:::0;;-1:-1:-1;;;;;;1710:19:8::1;::::0;;1599:135::o;662:118:10:-;-1:-1:-1;;;;;750:25:10;;;728:7;750:25;;;:19;:25;;;;;;;;662:118::o;1009:405:11:-;-1:-1:-1;;;;;1199:14:11;;;1117:7;1199:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;;:36;-1:-1:-1;;;;;;;;1199:36:11;;;;-1:-1:-1;;;;;1243:48:11;;;1299:50;-1:-1:-1;;;1299:50:11;;;;;-1:-1:-1;;;1357:46:11;;;;;1009:405::o;2056:187::-;-1:-1:-1;;;;;2202:28:11;;;2178:7;2202:28;;;:22;:28;;;;;;;;:36;;;;;;;;;;;;;2056:187::o;1016:71:8:-;1054:7;1076:6;-1:-1:-1;;;;;1076:6:8;1016:71;:::o;10131:121:11:-;-1:-1:-1;;;;;10224:14:11;10204:5;10224:14;;;:7;:14;;;;;:23;;;;;;10131:121::o;2680:426:10:-;-1:-1:-1;;;;;585:25:10;;;;;;;:19;:25;;;;;;2866:29;;;;2835:10;;2847:4;;585:25;:36;;577:69;;;;-1:-1:-1;;;577:69:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;2946:18:10;::::1;2938:51;;;;-1:-1:-1::0;;;2938:51:10::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3003:16:10;::::1;2995:47;;;;-1:-1:-1::0;;;2995:47:10::1;;;;;;;:::i;:::-;3055:46;3072:6;;3080:10;3092:4;3098:2;3055:16;:46::i;:::-;3048:53;;;;2680:426:::0;;;;;;;;;:::o;2247:220:11:-;2383:7;2405:57;2420:4;2426:6;2434:27;2448:6;;2456:4;2434:13;:27::i;:::-;2405:14;:57::i;2384:292:10:-;2487:29;;-1:-1:-1;;;;;2567:16:10;;2559:47;;;;-1:-1:-1;;;2559:47:10;;;;;;;:::i;:::-;2619:52;2636:6;;2644:10;2656;2668:2;2619:16;:52::i;:::-;2612:59;;;;2384:292;;;;;;:::o;3110:241::-;3207:29;3238:31;3286:60;3303:6;;3311:10;3323;3335;3286:16;:60::i;:::-;3279:67;;;;3110:241;;;;;;:::o;1749:108:11:-;1808:16;1839:13;1832:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1832:20:11;;;;;;;;;;;;;;;;;;;;;;;1749:108;:::o;2737:344::-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;2870:14:11;;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;:30;;::::1;::::0;;;;;;;;;;;:64;;-1:-1:-1;;;;;2870:64:11::1;-1:-1:-1::0;;;2870:64:11::1;::::0;::::1;;;::::0;;;;2946:130;;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;2999:48:11;;::::1;::::0;2870:64;;2946:130:::1;:::i;:::-;;;;;;;;2737:344:::0;;;:::o;2471:262::-;2594:29;2625:33;2675:53;2694:4;2700:27;2714:6;;2722:4;2700:13;:27::i;:::-;2675:18;:53::i;1873:226:8:-;1212:12;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;1957:22:8;::::1;1949:73;;;;-1:-1:-1::0;;;1949:73:8::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2054:6;::::0;;2033:38:::1;::::0;-1:-1:-1;;;;;2033:38:8;;::::1;::::0;2054:6;::::1;::::0;2033:38:::1;::::0;::::1;2077:6;:17:::0;;-1:-1:-1;;;;;;2077:17:8::1;-1:-1:-1::0;;;;;2077:17:8;;;::::1;::::0;;;::::1;::::0;;1873:226::o;784:158:10:-;1212:12:8;:10;:12::i;:::-;1202:6;;-1:-1:-1;;;;;1202:6:8;;;:22;;;1194:67;;;;;-1:-1:-1;;;1194:67:8;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1194:67:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;868:25:10;;::::1;;::::0;;;:19:::1;:25;::::0;;;;;:34;;-1:-1:-1;;;;;;868:34:10::1;::::0;;::::1;::::0;;::::1;::::0;;913:24;::::1;::::0;868:25;913:24:::1;784:158:::0;;:::o;586:98:1:-;669:10;586:98;:::o;3085:1259:11:-;3197:9;3192:1148;3216:12;:19;3212:1;:23;3192:1148;;;3307:12;3320:1;3307:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3292:46:11;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3250:7;:30;3258:12;3271:1;3258:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3250:30:11;-1:-1:-1;;;;;3250:30:11;;;;;;;;;;;;:39;;;:90;;;;;;;;;;;;;;;;;;3349:31;3383:7;:30;3391:12;3404:1;3391:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3383:30:11;-1:-1:-1;;;;;3383:30:11;;;;;;;;;;;;:38;;:78;3431:12;3444:1;3431:15;;;;;;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;3383:78:11;;;;;;;;;;;-1:-1:-1;3383:78:11;3474:32;;3383:78;;-1:-1:-1;;;;3474:32:11;;;;3470:138;;3523:7;:30;3531:12;3544:1;3531:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3523:30:11;-1:-1:-1;;;;;3523:30:11;;;;;;;;;;;;:47;;3576:12;3589:1;3576:15;;;;;;;;;;;;;;;;;;;:22;;;3523:76;;;;;;;-1:-1:-1;3523:76:11;;;;;;;;;;-1:-1:-1;;;;;;3523:76:11;-1:-1:-1;;;;;3523:76:11;;;;;;;;;3470:138;3620:16;:40;3637:12;3650:1;3637:15;;;;;;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;3620:40:11;;;;;;;;;;;-1:-1:-1;3620:40:11;;;;3616:173;;3724:4;3681:16;:40;3698:12;3711:1;3698:15;;;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;3681:40:11;-1:-1:-1;;;;;3681:40:11;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;3738:13;3757:12;3770:1;3757:15;;;;;;;;;;;;;;;;;;;:22;;;3738:42;;;;;;;-1:-1:-1;3738:42:11;;;;;;;;;;-1:-1:-1;;;;;;3738:42:11;-1:-1:-1;;;;;3738:42:11;;;;;;;;;3616:173;3797:204;3832:12;3845:1;3832:15;;;;;;;;;;;;;;:21;;;3863:12;3876:1;3863:15;;;;;;;;;;;;;;:22;;;3895:12;3917;3930:1;3917:15;;;;;;;;;;;;;;:27;;;3954:7;:30;3962:12;3975:1;3962:15;;;;;;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;3954:30:11;;;;;;;;;;;-1:-1:-1;3954:30:11;:39;;;;;3797:25;:204::i;:::-;;4043:12;4056:1;4043:15;;;;;;;;;;;;;;;;;;:33;4010:66;;-1:-1:-1;;4010:66:11;-1:-1:-1;;;;;4010:66:11;;;;;;4115:15;;;;4128:1;;4115:15;;;;;;;;;;;;;;;;:31;;;4084:62;;;;;;-1:-1:-1;;;4084:62:11;-1:-1:-1;;;;;4084:62:11;;;;;;4219:15;;:12;;4232:1;;4219:15;;;;;;;;;;;;:22;;;-1:-1:-1;;;;;4160:173:11;4188:12;4201:1;4188:15;;;;;;;;;;;;;;:21;;;-1:-1:-1;;;;;4160:173:11;;4251:12;4264:1;4251:15;;;;;;;;;;;;;;:33;;;4294:12;4307:1;4294:15;;;;;;;;;;;;;;:31;;;4160:173;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;3237:3:11;;3192:1148;;;;3085:1259;:::o;3866:861:10:-;4037:7;4056:11;4052:40;;-1:-1:-1;4084:1:10;4077:8;;4052:40;-1:-1:-1;;;;;4124:28:10;;;4097:24;4124:28;;;:22;:28;;;;;;;;:36;;;;;;;;;;4171:25;;;4167:162;;;4206:53;4225:4;4231:27;4245:6;;4253:4;4231:13;:27::i;:::-;4206:18;:53::i;:::-;-1:-1:-1;;;;;;4286:28:10;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;;4167:162;4339:21;4335:50;;4377:1;4370:8;;;;;4335:50;4391:21;4424:16;4415:6;:25;:53;;4462:6;4415:53;;;4443:16;4415:53;-1:-1:-1;;;;;4474:28:10;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;4513:32;;;4474:71;;4391:77;-1:-1:-1;4585:43:10;4602:2;4503:6;4391:77;4585:16;:43::i;:::-;4668:2;-1:-1:-1;;;;;4639:56:10;4660:6;-1:-1:-1;;;;;4639:56:10;4654:4;-1:-1:-1;;;;;4639:56:10;;4672:7;4681:13;4639:56;;;;;;;:::i;:::-;;;;;;;;4709:13;-1:-1:-1;;3866:861:10;;;;;;;;;;:::o;6060:608:11:-;6215:9;6210:454;-1:-1:-1;;;;;6234:14:11;;;;;;:7;:14;;;;;;;;:31;:38;6230:42;;6210:454;;;-1:-1:-1;;;;;6304:14:11;;6287;6304;;;:7;:14;;;;;;;:31;:34;;6336:1;;6304:34;;;;;;;;;;;;;;;-1:-1:-1;;;;;6304:34:11;;-1:-1:-1;6371:121:11;6407:4;6421:5;6304:34;6452:11;6473;6371:26;:121::i;:::-;6346:146;-1:-1:-1;6504:19:11;;6500:158;;-1:-1:-1;;;;;6535:28:11;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;;;;;;:54;;;;;;6605:44;;;;;6575:14;;6605:44;:::i;:::-;;;;;;;;6500:158;-1:-1:-1;;6274:3:11;;6210:454;;;;6060:608;;;;:::o;4731:877:10:-;4865:29;4896:31;4935:53;4954:4;4960:27;4974:6;;4982:4;4960:13;:27::i;4935:53::-;5024:13;:20;-1:-1:-1;;;;;5010:35:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5010:35:10;-1:-1:-1;5082:13:10;:20;4995:50;;-1:-1:-1;;;;;;5068:35:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5068:35:10;;5051:52;;5115:9;5110:451;5134:13;:20;5130:24;;5110:451;;;5169:14;5186:13;5200:1;5186:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5233:28:10;;;;;:22;:28;;;;;;5186:16;;;;5233:36;;;;;;;;;5278:15;;5186:16;;-1:-1:-1;5233:36:10;5186:16;;5278:12;;5291:1;;5278:15;;;;;;;;;;;:24;-1:-1:-1;;;;;5278:24:10;;;-1:-1:-1;;;;;5278:24:10;;;;;5330:12;5310:14;5325:1;5310:17;;;;;;;;;;;;;;;;;:32;5355:17;;5351:204;;-1:-1:-1;;;;;5384:28:10;;;5423:1;5384:28;;;:22;:28;;;;;;;;:36;;;;;;;;;;;:40;5434:42;5451:2;5413:6;5463:12;5434:16;:42::i;:::-;5520:2;-1:-1:-1;;;;;5491:55:10;5512:6;-1:-1:-1;;;;;5491:55:10;5506:4;-1:-1:-1;;;;;5491:55:10;;5524:7;5533:12;5491:55;;;;;;;:::i;:::-;;;;;;;;5351:204;-1:-1:-1;;5156:3:10;;5110:451;;;;4731:877;;;;;;;;:::o;3355:507::-;3467:51;3579:6;-1:-1:-1;;;;;3540:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;3528:65;;3604:9;3599:237;3619:17;;;3599:237;;;3682:6;;3689:1;3682:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;3651;3661:1;3651:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3651:40:10;;;;;3774:6;;3781:1;3774:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3754:69:10;;3824:4;3754:75;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3700:9;3710:1;3700:12;;;;;;;;;;;;;;:24;;3726:9;3736:1;3726:12;;;;;;;;;;;;;;;;;;:24;;3699:130;;;;;3638:3;;3599:237;;;;3355:507;;;;;:::o;7026:490:11:-;7172:24;;7234:209;7258:9;:16;7254:1;:20;7234:209;;;7293:9;7303:1;7293:12;;;;;;;;;;;;;;:24;;;7321:1;7293:29;7289:62;;;7334:8;;7289:62;7378:58;7409:4;7415:6;7423:9;7433:1;7423:12;;;;;;;;;;;;;;7378:30;:58::i;:::-;7358:78;;;;7234:209;7276:3;;7234:209;;;-1:-1:-1;;;;;;7475:28:11;;;;;;;:22;:28;;;;;;;;:36;;;;;;;;;;7456:55;7026:490;;;;;:::o;7520:836::-;7751:13;:20;7650:29;;;;-1:-1:-1;;;;;7737:35:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7737:35:11;;7722:50;;7811:12;:19;-1:-1:-1;;;;;7797:34:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7797:34:11;;7778:53;;7843:9;7838:174;7862:12;:19;7858:1;:23;7838:174;;;7914:13;7928:1;7914:16;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7914:16:11;7896:12;7909:1;7896:15;;;;;;;;;;;;;:34;-1:-1:-1;;;;;7896:34:11;;;-1:-1:-1;;;;;7896:34:11;;;;;7960:22;:28;7983:4;-1:-1:-1;;;;;7960:28:11;-1:-1:-1;;;;;7960:28:11;;;;;;;;;;;;:45;7989:12;8002:1;7989:15;;;;;;;;;;;;;;-1:-1:-1;;;;;7960:45:11;-1:-1:-1;;;;;7960:45:11;;;;;;;;;;;;;7938:16;7955:1;7938:19;;;;;;;;;;;;;;;;;:67;7883:3;;7838:174;;;;8023:9;8018:289;8042:9;:16;8038:1;:20;8018:289;;;8077:9;8087:1;8077:12;;;;;;;;;;;;;;:24;;;8105:1;8077:29;8073:62;;;8118:8;;8073:62;8147:9;8142:159;8166:12;:19;8162:1;:23;8142:159;;;8225:67;8256:4;8262:12;8275:1;8262:15;;;;;;;;;;;;;;8279:9;8289:1;8279:12;;;;;;;8225:67;8202:16;8219:1;8202:19;;;;;;;;;;;;;;;;;:90;;;;;;;8187:3;;8142:159;;;;8018:289;8060:3;;8018:289;;;;7520:836;;;;;:::o;4348:910::-;4560:18;;4526:7;;-1:-1:-1;;;4560:18:11;;-1:-1:-1;;;;;4560:18:11;;-1:-1:-1;;;4608:32:11;;;;4589:15;:51;4585:87;;;4657:8;-1:-1:-1;4650:15:11;;4585:87;4735:30;;4678:16;;4697:185;;4719:8;;-1:-1:-1;;;;;4735:30:11;;;4773:32;-1:-1:-1;;;4773:32:11;;;;;-1:-1:-1;;;4813:28:11;;;4849:11;4868:8;4697:14;:185::i;:::-;4678:204;;4905:8;4893;:20;4889:343;;-1:-1:-1;;;;;4931:29:11;;;4923:56;;;;-1:-1:-1;;;4923:56:11;;;;;;;:::i;:::-;4987:38;;-1:-1:-1;;;;4987:38:11;-1:-1:-1;;;;;;;;4987:38:11;;;;-1:-1:-1;;;;5033:58:11;-1:-1:-1;;;5075:15:11;5033:58;;;;;;5104:42;;-1:-1:-1;;;;;5104:42:11;;;;;;;;;;;;4987:38;;5104:42;:::i;:::-;;;;;;;;4889:343;;;5167:58;;-1:-1:-1;;;;5167:58:11;-1:-1:-1;;;5209:15:11;5167:58;;;;;;5245:8;4348:910;-1:-1:-1;;;;;;;4348:910:11:o;6672:350::-;6799:9;6794:224;6818:9;:16;6814:1;:20;6794:224;;;6849:162;6893:9;6903:1;6893:12;;;;;;;;;;;;;;:28;;;6931:4;6945:9;6955:1;6945:12;;;;;;;;;;;;;;:24;;;6979:9;6989:1;6979:12;;;;;;;;;;;;;;:24;;;6849:34;:162::i;:::-;6836:3;;6794:224;;5612:204:10;5713:12;5728:35;5744:2;5748:6;5756;5728:15;:35::i;:::-;5713:50;-1:-1:-1;5788:4:10;5777:15;;;;5769:42;;;;-1:-1:-1;;;5769:42:10;;;;;;;:::i;:::-;5612:204;;;;:::o;5262:794:11:-;-1:-1:-1;;;;;5474:14:11;;;5427:7;5474:14;;;:7;:14;;;;;;;;:30;;;;;;;;;;;5530:27;;;;;:21;;;:27;;;;;;5712:14;;;;;;:23;;;5427:7;;5474:30;5530:27;5427:7;;;;5615:126;;5482:5;;5497:6;;5474:30;;5693:11;;5712:23;;5615:25;:126::i;:::-;5596:145;;5765:8;5752:9;:21;5748:276;;5787:16;;5783:128;;-1:-1:-1;;;;;5878:14:11;;;;;;:7;:14;;;;;:23;;;5832:70;;5844:11;;5857:8;;5867:9;;5878:23;;5832:11;:70::i;:::-;5815:87;;5783:128;-1:-1:-1;;;;;5919:27:11;;;;;;;:21;;;:27;;;;;;;:38;;;5970:47;;;;;;;;5919:27;5970:47;;;;5949:8;;5970:47;:::i;:::-;;;;;;;;5748:276;-1:-1:-1;6037:14:11;5262:794;-1:-1:-1;;;;;;;;5262:794:11:o;8360:646::-;8571:21;;-1:-1:-1;;;;;8563:30:11;;;8516:7;8563:30;;;:7;:30;;;;;;;;:46;;;;;;;;;;8645:21;;8637:30;;;;;;;;;;;:39;;;8725:16;;8857:17;;;;8516:7;;8563:46;8637:39;;;;;8516:7;;8703:198;;-1:-1:-1;;;;;;;;8725:16:11;;;;-1:-1:-1;;;;;8749:28:11;;;8785:30;-1:-1:-1;;;8785:30:11;;;;;-1:-1:-1;;;8823:26:11;;;;;8637:39;8703:14;:198::i;:::-;8682:219;;8915:86;8927:5;:17;;;8946:10;8958;:21;;:27;8980:4;-1:-1:-1;;;;;8958:27:11;-1:-1:-1;;;;;8958:27:11;;;;;;;;;;;;;8987:13;8915:11;:86::i;9257:702::-;9473:7;9499:22;;;:49;;-1:-1:-1;9531:17:11;;9499:49;:97;;;;9581:15;9558:19;-1:-1:-1;;;;;9558:38:11;;9499:97;:145;;;;9629:15;9606:19;-1:-1:-1;;;;;9606:38:11;;;9499:145;9488:197;;;-1:-1:-1;9666:12:11;9659:19;;9488:197;9691:24;9736:15;9718;:33;:81;;9784:15;9718:81;;;9760:15;9718:81;9691:108;-1:-1:-1;;;;;;9825:38:11;;;;9942:12;9927;9877:29;;;9910:12;;;:2;:12;9877:46;9927:12;9876:63;;;;;:78;9869:85;;;;9257:702;;;;;;;;;:::o;709:196:9:-;-1:-1:-1;;;;;849:21:9;;;805:4;849:21;;;:13;:21;;;;;;805:4;;817:66;;849:21;;872:2;876:6;817:31;:66::i;:::-;-1:-1:-1;896:4:9;709:196;;;;;:::o;9009:244:11:-;9160:7;9240:8;9236:12;;:2;:12;9222:9;9207:12;:24;9183:20;:49;9182:66;;;;;;;9009:244;-1:-1:-1;;;;;9009:244:11:o;965:216:12:-;1107:68;;;-1:-1:-1;;;;;1107:68:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1107:68:12;-1:-1:-1;;;1107:68:12;;;1081:95;;1100:5;;1617:27;1625:5;-1:-1:-1;;;;;1617:25:12;;:27::i;:::-;1609:71;;;;;-1:-1:-1;;;1609:71:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;1743:12;1757:23;1792:5;-1:-1:-1;;;;;1784:19:12;1804:4;1784:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1784:25:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1742:67;;;;1823:7;1815:52;;;;;-1:-1:-1;;;1815:52:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1878:17;;:21;1874:211;;2012:10;2001:30;;;;;;;;;;;;;;;-1:-1:-1;2001:30:12;1993:85;;;;-1:-1:-1;;;1993:85:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;743:586:0;803:4;1242:20;;1089:66;1281:23;;;;;;:42;;-1:-1:-1;1308:15:0;;;1281:42;1273:51;743:586;-1:-1:-1;;;;743:586:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:175:14:-;84:20;;-1:-1:-1;;;;;133:31:14;;123:42;;113:2;;179:1;176;169:12;194:404;;;327:3;320:4;312:6;308:17;304:27;294:2;;352:8;342;335:26;294:2;-1:-1:-1;382:20:14;;-1:-1:-1;;;;;414:30:14;;411:2;;;464:8;454;447:26;411:2;508:4;500:6;496:17;484:29;;571:3;564:4;556;548:6;544:17;536:6;532:30;528:41;525:50;522:2;;;588:1;585;578:12;603:827;;719:4;707:9;702:3;698:19;694:30;691:2;;;741:5;734;727:20;691:2;778;772:9;820:4;812:6;808:17;891:6;879:10;876:22;-1:-1:-1;;;;;843:10:14;840:34;837:62;834:2;;;902:9;834:2;929;922:22;962:6;-1:-1:-1;962:6:14;992:23;;-1:-1:-1;;;;;1046:38:14;;1034:51;;1024:2;;1099:1;1096;1089:12;1024:2;1112:23;;1196:2;1181:18;;;1168:32;1151:15;;;1144:57;1234:39;1269:2;1254:18;;1234:39;:::i;:::-;1229:2;1221:6;1217:15;1210:64;1307:40;1343:2;1332:9;1328:18;1307:40;:::i;:::-;1302:2;1294:6;1290:15;1283:65;1382:41;1418:3;1407:9;1403:19;1382:41;:::i;:::-;1376:3;1368:6;1364:16;1357:67;;681:749;;;;:::o;1435:165::-;1504:20;;1564:10;1553:22;;1543:33;;1533:2;;1590:1;1587;1580:12;1605:198;;1717:2;1705:9;1696:7;1692:23;1688:32;1685:2;;;1738:6;1730;1723:22;1685:2;1766:31;1787:9;1766:31;:::i;:::-;1756:41;1675:128;-1:-1:-1;;;1675:128:14:o;1808:274::-;;;1937:2;1925:9;1916:7;1912:23;1908:32;1905:2;;;1958:6;1950;1943:22;1905:2;1986:31;2007:9;1986:31;:::i;:::-;1976:41;;2036:40;2072:2;2061:9;2057:18;2036:40;:::i;:::-;2026:50;;1895:187;;;;;:::o;2087:350::-;;;;2233:2;2221:9;2212:7;2208:23;2204:32;2201:2;;;2254:6;2246;2239:22;2201:2;2282:31;2303:9;2282:31;:::i;:::-;2272:41;;2332:40;2368:2;2357:9;2353:18;2332:40;:::i;:::-;2322:50;;2391:40;2427:2;2416:9;2412:18;2391:40;:::i;:::-;2381:50;;2191:246;;;;;:::o;2442:348::-;;;;2587:2;2575:9;2566:7;2562:23;2558:32;2555:2;;;2608:6;2600;2593:22;2555:2;2636:31;2657:9;2636:31;:::i;:::-;2626:41;;2686:40;2722:2;2711:9;2707:18;2686:40;:::i;:::-;2676:50;;2745:39;2780:2;2769:9;2765:18;2745:39;:::i;2795:334::-;;;;2941:2;2929:9;2920:7;2916:23;2912:32;2909:2;;;2962:6;2954;2947:22;2909:2;2990:31;3011:9;2990:31;:::i;:::-;2980:41;3068:2;3053:18;;3040:32;;-1:-1:-1;3119:2:14;3104:18;;;3091:32;;2899:230;-1:-1:-1;;;2899:230:14:o;3134:463::-;;;3281:2;3269:9;3260:7;3256:23;3252:32;3249:2;;;3302:6;3294;3287:22;3249:2;3347:9;3334:23;-1:-1:-1;;;;;3372:6:14;3369:30;3366:2;;;3417:6;3409;3402:22;3366:2;3461:76;3529:7;3520:6;3509:9;3505:22;3461:76;:::i;:::-;3556:8;;3435:102;;-1:-1:-1;3239:358:14;-1:-1:-1;;;;3239:358:14:o;3602:539::-;;;;3766:2;3754:9;3745:7;3741:23;3737:32;3734:2;;;3787:6;3779;3772:22;3734:2;3832:9;3819:23;-1:-1:-1;;;;;3857:6:14;3854:30;3851:2;;;3902:6;3894;3887:22;3851:2;3946:76;4014:7;4005:6;3994:9;3990:22;3946:76;:::i;:::-;4041:8;;-1:-1:-1;3920:102:14;-1:-1:-1;4095:40:14;;-1:-1:-1;4131:2:14;4116:18;;4095:40;:::i;4146:615::-;;;;;4327:2;4315:9;4306:7;4302:23;4298:32;4295:2;;;4348:6;4340;4333:22;4295:2;4393:9;4380:23;-1:-1:-1;;;;;4418:6:14;4415:30;4412:2;;;4463:6;4455;4448:22;4412:2;4507:76;4575:7;4566:6;4555:9;4551:22;4507:76;:::i;:::-;4602:8;;-1:-1:-1;4481:102:14;-1:-1:-1;4656:40:14;;-1:-1:-1;4692:2:14;4677:18;;4656:40;:::i;:::-;4646:50;;4715:40;4751:2;4740:9;4736:18;4715:40;:::i;:::-;4705:50;;4285:476;;;;;;;:::o;4766:607::-;;;;;4947:2;4935:9;4926:7;4922:23;4918:32;4915:2;;;4968:6;4960;4953:22;4915:2;5013:9;5000:23;-1:-1:-1;;;;;5038:6:14;5035:30;5032:2;;;5083:6;5075;5068:22;5032:2;5127:76;5195:7;5186:6;5175:9;5171:22;5127:76;:::i;:::-;5222:8;;-1:-1:-1;5101:102:14;-1:-1:-1;;5304:2:14;5289:18;;5276:32;;-1:-1:-1;5327:40:14;5363:2;5348:18;;5327:40;:::i;5378:684::-;;;;;;5576:3;5564:9;5555:7;5551:23;5547:33;5544:2;;;5598:6;5590;5583:22;5544:2;5643:9;5630:23;-1:-1:-1;;;;;5668:6:14;5665:30;5662:2;;;5713:6;5705;5698:22;5662:2;5757:76;5825:7;5816:6;5805:9;5801:22;5757:76;:::i;:::-;5852:8;;-1:-1:-1;5731:102:14;-1:-1:-1;;5934:2:14;5919:18;;5906:32;;-1:-1:-1;5957:40:14;5993:2;5978:18;;5957:40;:::i;:::-;5947:50;;6016:40;6052:2;6041:9;6037:18;6016:40;:::i;:::-;6006:50;;5534:528;;;;;;;;:::o;6067:761::-;;;;;;;6282:3;6270:9;6261:7;6257:23;6253:33;6250:2;;;6304:6;6296;6289:22;6250:2;6349:9;6336:23;-1:-1:-1;;;;;6374:6:14;6371:30;6368:2;;;6419:6;6411;6404:22;6368:2;6463:76;6531:7;6522:6;6511:9;6507:22;6463:76;:::i;:::-;6558:8;;-1:-1:-1;6437:102:14;-1:-1:-1;;6640:2:14;6625:18;;6612:32;;-1:-1:-1;6663:40:14;6699:2;6684:18;;6663:40;:::i;:::-;6653:50;;6722:40;6758:2;6747:9;6743:18;6722:40;:::i;:::-;6712:50;;6781:41;6817:3;6806:9;6802:19;6781:41;:::i;:::-;6771:51;;6240:588;;;;;;;;:::o;6833:1099::-;;6983:2;7026;7014:9;7005:7;7001:23;6997:32;6994:2;;;7047:6;7039;7032:22;6994:2;7092:9;7079:23;-1:-1:-1;;;;;7162:2:14;7154:6;7151:14;7148:2;;;7183:6;7175;7168:22;7148:2;7226:6;7215:9;7211:22;7201:32;;7271:7;7264:4;7260:2;7256:13;7252:27;7242:2;;7298:6;7290;7283:22;7242:2;7343;7330:16;7369:2;7361:6;7358:14;7355:2;;;7375:9;7355:2;7406:40;7442:2;7437;7429:6;7425:15;7421:24;7406:40;:::i;:::-;7480:19;;;7515:12;;;;-1:-1:-1;7547:11:14;;;7577:4;7608:15;;;7600:24;;7596:33;;7593:46;-1:-1:-1;7590:2:14;;;7657:6;7649;7642:22;7590:2;7684:6;7675:15;;7699:203;7713:6;7710:1;7707:13;7699:203;;;7774:53;7819:7;7814:3;7774:53;:::i;:::-;7762:66;;7735:1;7728:9;;;;;7848:12;;;;7880;;;;7699:203;;;-1:-1:-1;7921:5:14;;6963:969;-1:-1:-1;;;;;;;;6963:969:14:o;7937:194::-;;8060:2;8048:9;8039:7;8035:23;8031:32;8028:2;;;8081:6;8073;8066:22;8028:2;-1:-1:-1;8109:16:14;;8018:113;-1:-1:-1;8018:113:14:o;8136:255::-;;;8276:2;8264:9;8255:7;8251:23;8247:32;8244:2;;;8297:6;8289;8282:22;8244:2;-1:-1:-1;;8325:16:14;;8381:2;8366:18;;;8360:25;8325:16;;8360:25;;-1:-1:-1;8234:157:14:o;8396:293::-;;8517:2;8505:9;8496:7;8492:23;8488:32;8485:2;;;8538:6;8530;8523:22;8485:2;8575:9;8569:16;8625:4;8618:5;8614:16;8607:5;8604:27;8594:2;;8650:6;8642;8635:22;8694:469;;8791:5;8785:12;8818:6;8813:3;8806:19;8844:4;8873:2;8868:3;8864:12;8857:19;;8910:2;8903:5;8899:14;8931:3;8943:195;8957:6;8954:1;8951:13;8943:195;;;9022:13;;-1:-1:-1;;;;;9018:39:14;9006:52;;9078:12;;;;9113:15;;;;9054:1;8972:9;8943:195;;;-1:-1:-1;9154:3:14;;8761:402;-1:-1:-1;;;;;8761:402:14:o;9168:203::-;-1:-1:-1;;;;;9332:32:14;;;;9314:51;;9302:2;9287:18;;9269:102::o;9376:274::-;-1:-1:-1;;;;;9568:32:14;;;;9550:51;;9632:2;9617:18;;9610:34;9538:2;9523:18;;9505:145::o;9655:267::-;;9834:2;9823:9;9816:21;9854:62;9912:2;9901:9;9897:18;9889:6;9854:62;:::i;9927:813::-;;10184:2;10173:9;10166:21;10210:62;10268:2;10257:9;10253:18;10245:6;10210:62;:::i;:::-;10329:22;;;10291:2;10309:18;;;10302:50;;;;10401:13;;10423:22;;;10499:15;;;;10461;;;10532:4;10545:169;10559:6;10556:1;10553:13;10545:169;;;10620:13;;10608:26;;10689:15;;;;10654:12;;;;10581:1;10574:9;10545:169;;;-1:-1:-1;10731:3:14;;10156:584;-1:-1:-1;;;;;;;10156:584:14:o;10745:344::-;10947:2;10929:21;;;10986:2;10966:18;;;10959:30;-1:-1:-1;;;11020:2:14;11005:18;;10998:50;11080:2;11065:18;;10919:170::o;11094:338::-;11296:2;11278:21;;;11335:2;11315:18;;;11308:30;-1:-1:-1;;;11369:2:14;11354:18;;11347:44;11423:2;11408:18;;11268:164::o;11437:342::-;11639:2;11621:21;;;11678:2;11658:18;;;11651:30;-1:-1:-1;;;11712:2:14;11697:18;;11690:48;11770:2;11755:18;;11611:168::o;11784:338::-;11986:2;11968:21;;;12025:2;12005:18;;;11998:30;-1:-1:-1;;;12059:2:14;12044:18;;12037:44;12113:2;12098:18;;11958:164::o;12127:344::-;12329:2;12311:21;;;12368:2;12348:18;;;12341:30;-1:-1:-1;;;12402:2:14;12387:18;;12380:50;12462:2;12447:18;;12301:170::o;12476:177::-;12622:25;;;12610:2;12595:18;;12577:76::o;12658:391::-;12889:25;;;12945:2;12930:18;;12923:34;;;;12988:2;12973:18;;12966:34;13031:2;13016:18;;13009:34;12876:3;12861:19;;12843:206::o;13054:294::-;-1:-1:-1;;;;;13244:37:14;;;;13226:56;;13330:10;13318:23;13313:2;13298:18;;13291:51;13214:2;13199:18;;13181:167::o;13353:184::-;13525:4;13513:17;;;;13495:36;;13483:2;13468:18;;13450:87::o;13542:242::-;13612:2;13606:9;13642:17;;;-1:-1:-1;;;;;13674:34:14;;13710:22;;;13671:62;13668:2;;;13736:9;13668:2;13763;13756:22;13586:198;;-1:-1:-1;13586:198:14:o

Swarm Source

ipfs://a69cb44741de9acd3fd0e3340945805e2f6f7c6f2823301d14c5fece170160c9
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.