Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ConcentratorHarvesterFacet
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "../../concentrator/interfaces/IAladdinCompounder.sol";
import "../../concentrator/interfaces/IConcentratorGeneralVault.sol";
import "../libraries/LibConcentratorHarvester.sol";
// solhint-disable not-rely-on-time
contract ConcentratorHarvesterFacet {
/// @notice Return the minimum amount CTR should be locked.
function minLockCTR() external view returns (uint256) {
return LibConcentratorHarvester.harvesterStorage().minLockCTR;
}
/// @notice Return the minimum number of seconds that veCTR should be locked.
function minLockDuration() external view returns (uint256) {
return LibConcentratorHarvester.harvesterStorage().minLockDuration;
}
/// @notice Return whether the account is whitelisted.
/// @param _account The address of account to query.
function isWhitelist(address _account) external view returns (bool) {
LibConcentratorHarvester.HarvesterStorage storage hs = LibConcentratorHarvester.harvesterStorage();
return hs.whitelist[_account];
}
/// @notice Return whether the account is blacklisted.
/// @param _account The address of account to query.
function isBlacklist(address _account) external view returns (bool) {
LibConcentratorHarvester.HarvesterStorage storage hs = LibConcentratorHarvester.harvesterStorage();
return hs.blacklist[_account];
}
/// @notice Return whether the account can do harvest.
/// @param _account The address of account to query.
function hasPermission(address _account) external view returns (bool) {
ICurveVoteEscrow.LockedBalance memory _locked = ICurveVoteEscrow(LibConcentratorHarvester.veCTR).locked(_account);
LibConcentratorHarvester.HarvesterStorage storage hs = LibConcentratorHarvester.harvesterStorage();
// check whether is blacklisted
if (hs.blacklist[_account]) return false;
// check whether is whitelisted
if (hs.whitelist[_account] || hs.minLockCTR == 0) return true;
// check veCTR locking
return uint128(_locked.amount) >= hs.minLockCTR && _locked.end >= hs.minLockDuration + block.timestamp;
}
/// @notice Harvest pending rewards from concentrator vault.
/// @param _vault The address of concentrator vault contract.
/// @param _pid The pool id to harvest.
/// @param _minOut The minimum amount of rewards should get.
function harvestConcentratorVault(
address _vault,
uint256 _pid,
uint256 _minOut
) external {
LibConcentratorHarvester.enforceHasPermission();
IConcentratorGeneralVault(_vault).harvest(_pid, msg.sender, _minOut);
}
/// @notice Harvest pending rewards from AladdinCompounder contract.
/// @param _compounder The address of AladdinCompounder contract.
/// @param _minAssets The minimum amount of underlying assets should be harvested.
function harvestConcentratorCompounder(address _compounder, uint256 _minAssets) external {
LibConcentratorHarvester.enforceHasPermission();
IAladdinCompounder(_compounder).harvest(msg.sender, _minAssets);
}
/// @notice Update the harvester permission parameters.
/// @param _minLockCTR The minimum amount CTR should be locked.
/// @param _minLockDuration The minimum number of seconds that veCTR should be locked.
function updatePermission(uint128 _minLockCTR, uint128 _minLockDuration) external {
LibConcentratorHarvester.enforceIsContractOwner();
LibConcentratorHarvester.updatePermission(_minLockCTR, _minLockDuration);
}
/// @notice Update the whitelist status of account.
/// @param _account The address to update.
/// @param _status The status to update.
function updateWhitelist(address _account, bool _status) external {
LibConcentratorHarvester.enforceIsContractOwner();
LibConcentratorHarvester.updateWhitelist(_account, _status);
}
/// @notice Update the blacklist status of account.
/// @param _account The address to update.
/// @param _status The status to update.
function updateBlacklist(address _account, bool _status) external {
LibConcentratorHarvester.enforceIsContractOwner();
LibConcentratorHarvester.updateBlacklist(_account, _status);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "../../interfaces/ICurveVoteEscrow.sol";
// solhint-disable const-name-snakecase
// solhint-disable no-inline-assembly
// solhint-disable not-rely-on-time
library LibConcentratorHarvester {
/*************
* Constants *
*************/
/// @dev The storage slot for default diamond storage.
bytes32 private constant DIAMOND_STORAGE_POSITION = keccak256("diamond.standard.diamond.storage");
/// @dev The storage slot for harvester storage.
bytes32 private constant HARVESTER_STORAGE_POSITION = keccak256("diamond.harvester.concentrator.storage");
/// @dev The address of veCTR contract.
address internal constant veCTR = 0xe4C09928d834cd58D233CD77B5af3545484B4968;
/***********
* Structs *
***********/
struct FacetAddressAndSelectorPosition {
address facetAddress;
uint16 selectorPosition;
}
struct DiamondStorage {
// function selector => facet address and selector position in selectors array
mapping(bytes4 => FacetAddressAndSelectorPosition) facetAddressAndSelectorPosition;
bytes4[] selectors;
mapping(bytes4 => bool) supportedInterfaces;
// owner of the contract
address contractOwner;
}
struct HarvesterStorage {
uint128 minLockCTR;
uint128 minLockDuration;
mapping(address => bool) whitelist;
mapping(address => bool) blacklist;
}
/**********************
* Internal Functions *
**********************/
function diamondStorage() private pure returns (DiamondStorage storage ds) {
bytes32 position = DIAMOND_STORAGE_POSITION;
assembly {
ds.slot := position
}
}
function harvesterStorage() internal pure returns (HarvesterStorage storage hs) {
bytes32 position = HARVESTER_STORAGE_POSITION;
assembly {
hs.slot := position
}
}
function updatePermission(uint128 _minLockCTR, uint128 _minLockDuration) internal {
HarvesterStorage storage hs = harvesterStorage();
hs.minLockCTR = _minLockCTR;
hs.minLockDuration = _minLockDuration;
}
function updateWhitelist(address _account, bool _status) internal {
HarvesterStorage storage hs = harvesterStorage();
hs.whitelist[_account] = _status;
}
function updateBlacklist(address _account, bool _status) internal {
HarvesterStorage storage hs = harvesterStorage();
hs.blacklist[_account] = _status;
}
function enforceIsContractOwner() internal view {
require(msg.sender == diamondStorage().contractOwner, "only owner");
}
function enforceHasPermission() internal view {
ICurveVoteEscrow.LockedBalance memory _locked = ICurveVoteEscrow(veCTR).locked(msg.sender);
HarvesterStorage storage hs = harvesterStorage();
// check whether is blacklisted
require(!hs.blacklist[msg.sender], "account blacklisted");
// check whether is whitelisted
if (hs.whitelist[msg.sender] || hs.minLockCTR == 0) return;
// check veCTR locking
require(uint128(_locked.amount) >= hs.minLockCTR, "insufficient lock amount");
require(_locked.end >= hs.minLockDuration + block.timestamp, "insufficient lock duration");
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
interface IConcentratorGeneralVault {
/// @notice Emitted when someone change allowance.
/// @param pid The pool id.
/// @param owner The address of the owner.
/// @param spender The address of the spender.
/// @param value The new value of allowance.
event Approval(uint256 indexed pid, address indexed owner, address indexed spender, uint256 value);
/// @notice Emitted when someone deposits asset into this contract.
/// @param pid The pool id.
/// @param sender The address who sends underlying asset.
/// @param recipient The address who will receive the pool shares.
/// @param assetsIn The amount of asset deposited.
/// @param sharesOut The amounf of pool shares received.
event Deposit(
uint256 indexed pid,
address indexed sender,
address indexed recipient,
uint256 assetsIn,
uint256 sharesOut
);
/// @notice Emitted when someone withdraws asset from this contract.
/// @param pid The pool id.
/// @param sender The address who call the function.
/// @param owner The address who owns the assets.
/// @param recipient The address who will receive the assets.
/// @param assetsOut The amount of asset withdrawn.
/// @param sharesIn The amounf of pool shares to withdraw.
event Withdraw(
uint256 indexed pid,
address indexed sender,
address indexed owner,
address recipient,
uint256 sharesIn,
uint256 assetsOut
);
/// @notice Emitted when someone claim rewards from this contract.
/// @param pid The pool id.
/// @param sender The address who call the function.
/// @param recipient The address who will receive the rewards;
/// @param rewards The amount of reward received.
event Claim(uint256 indexed pid, address indexed sender, address indexed recipient, uint256 rewards);
/// @notice Emitted when someone harvests rewards.
/// @param pid The pool id.
/// @param caller The address who call the function.
/// @param recipient The address of account to recieve the harvest bounty.
/// @param rewards The total amount of rewards harvested.
/// @param platformFee The amount of harvested assets as platform fee.
/// @param harvestBounty The amount of harvested assets as harvest bounty.
event Harvest(
uint256 indexed pid,
address indexed caller,
address indexed recipient,
uint256 rewards,
uint256 platformFee,
uint256 harvestBounty
);
/// @notice The address of reward token.
function rewardToken() external view returns (address);
/// @notice Return the amount of pending rewards for specific pool.
/// @param pid The pool id.
/// @param account The address of user.
function pendingReward(uint256 pid, address account) external view returns (uint256);
/// @notice Return the amount of pending AladdinCRV rewards for all pool.
/// @param account The address of user.
function pendingRewardAll(address account) external view returns (uint256);
/// @notice Return the user share for specific user.
/// @param pid The pool id to query.
/// @param account The address of user.
function getUserShare(uint256 pid, address account) external view returns (uint256);
/// @notice Return the address of underlying token.
/// @param pid The pool id to query.
function underlying(uint256 pid) external view returns (address);
/// @notice Return the total underlying token deposited.
/// @param pid The pool id to query.
function getTotalUnderlying(uint256 pid) external view returns (uint256);
/// @notice Return the total pool share deposited.
/// @param pid The pool id to query.
function getTotalShare(uint256 pid) external view returns (uint256);
/// @notice Returns the remaining number of shares that `spender` will be allowed to spend on behalf of `owner`.
/// @param pid The pool id to query.
/// @param owner The address of the owner.
/// @param spender The address of the spender.
function allowance(
uint256 pid,
address owner,
address spender
) external view returns (uint256);
/// @notice Sets `amount` as the allowance of `spender` over the caller's share.
/// @param pid The pool id to query.
/// @param spender The address of the spender.
/// @param amount The amount of allowance.
function approve(
uint256 pid,
address spender,
uint256 amount
) external;
/// @notice Deposit some token to specific pool for someone.
/// @param pid The pool id.
/// @param recipient The address of recipient who will recieve the token.
/// @param assets The amount of token to deposit. -1 means deposit all.
/// @return share The amount of share after deposit.
function deposit(
uint256 pid,
address recipient,
uint256 assets
) external returns (uint256 share);
/// @notice Withdraw some token from specific pool and zap to token.
/// @param pid The pool id.
/// @param shares The share of token want to withdraw. -1 means withdraw all.
/// @param recipient The address of account who will receive the assets.
/// @param owner The address of user to withdraw from.
/// @return assets The amount of token sent to recipient.
function withdraw(
uint256 pid,
uint256 shares,
address recipient,
address owner
) external returns (uint256 assets);
/// @notice claim pending rewards from specific pool.
/// @param pid The pool id.
/// @param recipient The address of account who will receive the rewards.
/// @param minOut The minimum amount of pending reward to receive.
/// @param claimAsToken The address of token to claim as. Use address(0) if claim as ETH
/// @return claimed The amount of reward sent to the recipient.
function claim(
uint256 pid,
address recipient,
uint256 minOut,
address claimAsToken
) external returns (uint256 claimed);
/// @notice claim pending rewards from multiple pools.
/// @param pids The list of pool id to claim.
/// @param recipient The address of account who will receive the rewards.
/// @param minOut The minimum amount of pending reward to receive.
/// @param claimAsToken The address of token to claim as. Use address(0) if claim as ETH
/// @return claimed The amount of reward sent to the recipient.
function claimMulti(
uint256[] memory pids,
address recipient,
uint256 minOut,
address claimAsToken
) external returns (uint256 claimed);
/// @notice claim pending rewards from all pools.
/// @param recipient The address of account who will receive the rewards.
/// @param minOut The minimum amount of pending reward to receive.
/// @param claimAsToken The address of token to claim as. Use address(0) if claim as ETH
/// @return claimed The amount of reward sent to the recipient.
function claimAll(
uint256 minOut,
address recipient,
address claimAsToken
) external returns (uint256 claimed);
/// @notice Harvest the pending reward and convert to aCRV.
/// @param pid The pool id.
/// @param recipient The address of account to receive harvest bounty.
/// @param minOut The minimum amount of cvxCRV should get.
/// @return harvested The amount of cvxCRV harvested after zapping all other tokens to it.
function harvest(
uint256 pid,
address recipient,
uint256 minOut
) external returns (uint256 harvested);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
/// @title IAladdinCompounder
/// @notice The interface for AladdinCompounder like aCRV, aFXS, and is also EIP4646 compatible.
interface IAladdinCompounder {
/// @notice Emitted when someone deposits asset into this contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param sender The address who sends underlying asset.
/// @param owner The address who will receive the pool shares.
/// @param assets The amount of asset deposited.
/// @param shares The amounf of pool shares received.
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
/// @notice Emitted when someone withdraws asset from this contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param sender The address who call the function.
/// @param receiver The address who will receive the assets.
/// @param owner The address who owns the assets.
/// @param assets The amount of asset withdrawn.
/// @param shares The amounf of pool shares to withdraw.
event Withdraw(
address indexed sender,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 shares
);
/// @notice Emitted when someone harvests rewards.
/// @param caller The address who call the function.
/// @param recipient The address of account to recieve the harvest bounty.
/// @param assets The total amount of underlying asset harvested.
/// @param platformFee The amount of harvested assets as platform fee.
/// @param harvestBounty The amount of harvested assets as harvest bounty.
event Harvest(
address indexed caller,
address indexed recipient,
uint256 assets,
uint256 platformFee,
uint256 harvestBounty
);
/// @notice Return the address of underlying assert.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
function asset() external view returns (address assetTokenAddress);
/// @notice Return the total amount of underlying assert mananged by the contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
function totalAssets() external view returns (uint256 totalManagedAssets);
/// @notice Return the amount of pool shares given the amount of asset.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param assets The amount of asset to convert.
function convertToShares(uint256 assets) external view returns (uint256 shares);
/// @notice Return the amount of asset given the amount of pool share.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param assets The amount of pool shares to convert.
function convertToAssets(uint256 shares) external view returns (uint256 assets);
/// @notice Return the maximum amount of asset that the user can deposit.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param receiver The address of user to receive the pool share.
function maxDeposit(address receiver) external view returns (uint256 maxAssets);
/// @notice Return the amount of pool shares will receive, if perform a deposit.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param assets The amount of asset to deposit.
function previewDeposit(uint256 assets) external view returns (uint256 shares);
/// @notice Deposit assets into this contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param assets The amount of asset to deposit.
/// @param receiver The address of account who will receive the pool share.
/// @return shares The amount of pool shares received.
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
/// @notice Return the maximum amount of pool shares that the user can mint.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param receiver The address of user to receive the pool share.
function maxMint(address receiver) external view returns (uint256 maxShares);
/// @notice Return the amount of assets needed, if perform a mint.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param shares The amount of pool shares to mint.
function previewMint(uint256 shares) external view returns (uint256 assets);
/// @notice Mint pool shares from this contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param shares The amount of pool shares to mint.
/// @param receiver The address of account who will receive the pool share.
/// @return assets The amount of assets deposited to the contract.
function mint(uint256 shares, address receiver) external returns (uint256 assets);
/// @notice Return the maximum amount of assets that the user can withdraw.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param owner The address of user to withdraw from.
function maxWithdraw(address owner) external view returns (uint256 maxAssets);
/// @notice Return the amount of shares needed, if perform a withdraw.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param assets The amount of assets to withdraw.
function previewWithdraw(uint256 assets) external view returns (uint256 shares);
/// @notice Withdraw assets from this contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param assets The amount of assets to withdraw.
/// @param receiver The address of account who will receive the assets.
/// @param owner The address of user to withdraw from.
/// @return shares The amount of pool shares burned.
function withdraw(
uint256 assets,
address receiver,
address owner
) external returns (uint256 shares);
/// @notice Return the maximum amount of pool shares that the user can redeem.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param owner The address of user to redeem from.
function maxRedeem(address owner) external view returns (uint256 maxShares);
/// @notice Return the amount of assets to be received, if perform a redeem.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param shares The amount of pool shares to redeem.
function previewRedeem(uint256 shares) external view returns (uint256 assets);
/// @notice Redeem assets from this contract.
/// @dev See https://eips.ethereum.org/EIPS/eip-4626
/// @param shares The amount of pool shares to burn.
/// @param receiver The address of account who will receive the assets.
/// @param owner The address of user to withdraw from.
/// @return assets The amount of assets withdrawn.
function redeem(
uint256 shares,
address receiver,
address owner
) external returns (uint256 assets);
/// @notice Harvest rewards and convert to underlying asset.
/// @param recipient The address of account to recieve the harvest bounty.
/// @param minAssets The minimum amount of underlying asset harvested.
/// @return assets The total amount of underlying asset harvested.
function harvest(address recipient, uint256 minAssets) external returns (uint256 assets);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
// solhint-disable func-name-mixedcase
// solhint-disable var-name-mixedcase
interface ICurveVoteEscrow {
struct LockedBalance {
int128 amount;
uint256 end;
}
/// @notice Deposit `_value` tokens for `msg.sender` and lock until `_unlock_time`
/// @param _value Amount to deposit
/// @param _unlock_time Epoch time when tokens unlock, rounded down to whole weeks
function create_lock(uint256 _value, uint256 _unlock_time) external;
/// @notice Deposit `_value` additional tokens for `msg.sender` without modifying the unlock time
/// @param _value Amount of tokens to deposit and add to the lock
function increase_amount(uint256 _value) external;
/// @notice Extend the unlock time for `msg.sender` to `_unlock_time`
/// @param _unlock_time New epoch time for unlocking
function increase_unlock_time(uint256 _unlock_time) external;
/// @notice Withdraw all tokens for `msg.sender`
/// @dev Only possible if the lock has expired
function withdraw() external;
/// @notice Get timestamp when `_addr`'s lock finishes
/// @param _addr User wallet
/// @return Epoch time of the lock end
function locked__end(address _addr) external view returns (uint256);
function locked(address _addr) external view returns (LockedBalance memory);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_compounder","type":"address"},{"internalType":"uint256","name":"_minAssets","type":"uint256"}],"name":"harvestConcentratorCompounder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"}],"name":"harvestConcentratorVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"hasPermission","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockCTR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_minLockCTR","type":"uint128"},{"internalType":"uint128","name":"_minLockDuration","type":"uint128"}],"name":"updatePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50610a2e806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806397128e001161006657806397128e001461011a578063c683630d1461012d578063c76b4ae214610140578063c7f884c614610155578063d6a298e9146101685761009e565b806304117561146100a35780630d392cd9146100b85780630f45b177146100cb578063333e99db146100de5780639155e08314610107575b600080fd5b6100b66100b13660046107dd565b610170565b005b6100b66100c63660046107a3565b6101fd565b6100b66100d936600461088f565b610213565b6100f16100ec366004610782565b610225565b6040516100fe9190610906565b60405180910390f35b6100b66101153660046107a3565b610258565b6100f1610128366004610782565b61026a565b6100f161013b366004610782565b6103b5565b6101486103e7565b6040516100fe91906109d0565b6100b6610163366004610806565b610400565b610148610490565b6101786104b0565b60405163018ee9b760e01b81526001600160a01b0383169063018ee9b7906101a690339085906004016108ed565b602060405180830381600087803b1580156101c057600080fd5b505af11580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f891906108c1565b505050565b610205610623565b61020f8282610656565b5050565b61021b610623565b61020f8282610690565b6000806102306106d2565b6001600160a01b03841660009081526002909101602052604090205460ff169150505b919050565b610260610623565b61020f82826106f6565b60405163cbf9fe5f60e01b8152600090819073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906102a69086906004016108d9565b604080518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f59190610838565b905060006103016106d2565b6001600160a01b038516600090815260028201602052604090205490915060ff161561033257600092505050610253565b6001600160a01b038416600090815260018201602052604090205460ff1680610363575080546001600160801b0316155b1561037357600192505050610253565b805482516001600160801b039182169116108015906103ad5750805460208301516001600160801b03600160801b90920491909116420111155b949350505050565b6000806103c06106d2565b6001600160a01b03841660009081526001909101602052604090205460ff16915050919050565b60006103f16106d2565b546001600160801b0316905090565b6104086104b0565b60405163391c963560e21b81526001600160a01b0384169063e47258d490610438908590339086906004016109d9565b602060405180830381600087803b15801561045257600080fd5b505af1158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a91906108c1565b50505050565b600061049a6106d2565b54600160801b90046001600160801b0316919050565b60405163cbf9fe5f60e01b815260009073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906104ea9033906004016108d9565b604080518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190610838565b905060006105456106d2565b33600090815260028201602052604090205490915060ff16156105835760405162461bcd60e51b815260040161057a90610911565b60405180910390fd5b33600090815260018201602052604090205460ff16806105ab575080546001600160801b0316155b156105b7575050610621565b805482516001600160801b03918216911610156105e65760405162461bcd60e51b815260040161057a9061093e565b805460208301516001600160801b03600160801b909204919091164201111561020f5760405162461bcd60e51b815260040161057a90610975565b565b61062b610730565b600301546001600160a01b031633146106215760405162461bcd60e51b815260040161057a906109ac565b60006106606106d2565b6001600160a01b039390931660009081526001909301602052506040909120805460ff1916911515919091179055565b600061069a6106d2565b80546001600160801b03938416600160801b029484166fffffffffffffffffffffffffffffffff199091161790921692909217905550565b7f7b3d7c6d072f5ba80c1b8069e5afa5580d5083ebf8116656029468cd718daac790565b60006107006106d2565b6001600160a01b039390931660009081526002909301602052506040909120805460ff1916911515919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90565b80356001600160a01b038116811461025357600080fd5b80356001600160801b038116811461025357600080fd5b600060208284031215610793578081fd5b61079c82610754565b9392505050565b600080604083850312156107b5578081fd5b6107be83610754565b9150602083013580151581146107d2578182fd5b809150509250929050565b600080604083850312156107ef578182fd5b6107f883610754565b946020939093013593505050565b60008060006060848603121561081a578081fd5b61082384610754565b95602085013595506040909401359392505050565b600060408284031215610849578081fd5b6040516040810181811067ffffffffffffffff8211171561086657fe5b6040528251600f81900b811461087a578283fd5b81526020928301519281019290925250919050565b600080604083850312156108a1578182fd5b6108aa8361076b565b91506108b86020840161076b565b90509250929050565b6000602082840312156108d2578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601390820152721858d8dbdd5b9d08189b1858dadb1a5cdd1959606a1b604082015260600190565b60208082526018908201527f696e73756666696369656e74206c6f636b20616d6f756e740000000000000000604082015260600190565b6020808252601a908201527f696e73756666696369656e74206c6f636b206475726174696f6e000000000000604082015260600190565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b90815260200190565b9283526001600160a01b0391909116602083015260408201526060019056fea26469706673582212202d9fa60d941e48f139142513aa954581ab18055b43dafd73afc20649991cddbf64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c806397128e001161006657806397128e001461011a578063c683630d1461012d578063c76b4ae214610140578063c7f884c614610155578063d6a298e9146101685761009e565b806304117561146100a35780630d392cd9146100b85780630f45b177146100cb578063333e99db146100de5780639155e08314610107575b600080fd5b6100b66100b13660046107dd565b610170565b005b6100b66100c63660046107a3565b6101fd565b6100b66100d936600461088f565b610213565b6100f16100ec366004610782565b610225565b6040516100fe9190610906565b60405180910390f35b6100b66101153660046107a3565b610258565b6100f1610128366004610782565b61026a565b6100f161013b366004610782565b6103b5565b6101486103e7565b6040516100fe91906109d0565b6100b6610163366004610806565b610400565b610148610490565b6101786104b0565b60405163018ee9b760e01b81526001600160a01b0383169063018ee9b7906101a690339085906004016108ed565b602060405180830381600087803b1580156101c057600080fd5b505af11580156101d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f891906108c1565b505050565b610205610623565b61020f8282610656565b5050565b61021b610623565b61020f8282610690565b6000806102306106d2565b6001600160a01b03841660009081526002909101602052604090205460ff169150505b919050565b610260610623565b61020f82826106f6565b60405163cbf9fe5f60e01b8152600090819073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906102a69086906004016108d9565b604080518083038186803b1580156102bd57600080fd5b505afa1580156102d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f59190610838565b905060006103016106d2565b6001600160a01b038516600090815260028201602052604090205490915060ff161561033257600092505050610253565b6001600160a01b038416600090815260018201602052604090205460ff1680610363575080546001600160801b0316155b1561037357600192505050610253565b805482516001600160801b039182169116108015906103ad5750805460208301516001600160801b03600160801b90920491909116420111155b949350505050565b6000806103c06106d2565b6001600160a01b03841660009081526001909101602052604090205460ff16915050919050565b60006103f16106d2565b546001600160801b0316905090565b6104086104b0565b60405163391c963560e21b81526001600160a01b0384169063e47258d490610438908590339086906004016109d9565b602060405180830381600087803b15801561045257600080fd5b505af1158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a91906108c1565b50505050565b600061049a6106d2565b54600160801b90046001600160801b0316919050565b60405163cbf9fe5f60e01b815260009073e4c09928d834cd58d233cd77b5af3545484b49689063cbf9fe5f906104ea9033906004016108d9565b604080518083038186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105399190610838565b905060006105456106d2565b33600090815260028201602052604090205490915060ff16156105835760405162461bcd60e51b815260040161057a90610911565b60405180910390fd5b33600090815260018201602052604090205460ff16806105ab575080546001600160801b0316155b156105b7575050610621565b805482516001600160801b03918216911610156105e65760405162461bcd60e51b815260040161057a9061093e565b805460208301516001600160801b03600160801b909204919091164201111561020f5760405162461bcd60e51b815260040161057a90610975565b565b61062b610730565b600301546001600160a01b031633146106215760405162461bcd60e51b815260040161057a906109ac565b60006106606106d2565b6001600160a01b039390931660009081526001909301602052506040909120805460ff1916911515919091179055565b600061069a6106d2565b80546001600160801b03938416600160801b029484166fffffffffffffffffffffffffffffffff199091161790921692909217905550565b7f7b3d7c6d072f5ba80c1b8069e5afa5580d5083ebf8116656029468cd718daac790565b60006107006106d2565b6001600160a01b039390931660009081526002909301602052506040909120805460ff1916911515919091179055565b7fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90565b80356001600160a01b038116811461025357600080fd5b80356001600160801b038116811461025357600080fd5b600060208284031215610793578081fd5b61079c82610754565b9392505050565b600080604083850312156107b5578081fd5b6107be83610754565b9150602083013580151581146107d2578182fd5b809150509250929050565b600080604083850312156107ef578182fd5b6107f883610754565b946020939093013593505050565b60008060006060848603121561081a578081fd5b61082384610754565b95602085013595506040909401359392505050565b600060408284031215610849578081fd5b6040516040810181811067ffffffffffffffff8211171561086657fe5b6040528251600f81900b811461087a578283fd5b81526020928301519281019290925250919050565b600080604083850312156108a1578182fd5b6108aa8361076b565b91506108b86020840161076b565b90509250929050565b6000602082840312156108d2578081fd5b5051919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6020808252601390820152721858d8dbdd5b9d08189b1858dadb1a5cdd1959606a1b604082015260600190565b60208082526018908201527f696e73756666696369656e74206c6f636b20616d6f756e740000000000000000604082015260600190565b6020808252601a908201527f696e73756666696369656e74206c6f636b206475726174696f6e000000000000604082015260600190565b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b90815260200190565b9283526001600160a01b0391909116602083015260408201526060019056fea26469706673582212202d9fa60d941e48f139142513aa954581ab18055b43dafd73afc20649991cddbf64736f6c63430007060033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.