Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 12725101 | 1267 days ago | IN | 0 ETH | 0.00040666 | ||||
Set Reward Rate | 12695045 | 1272 days ago | IN | 0 ETH | 0.00109994 | ||||
Set Reward Rate | 12650067 | 1279 days ago | IN | 0 ETH | 0.00219988 | ||||
Set Reward Rate | 12626939 | 1282 days ago | IN | 0 ETH | 0.00219988 | ||||
Set Reward Rate | 12588709 | 1288 days ago | IN | 0 ETH | 0.00294676 | ||||
Add | 12566277 | 1292 days ago | IN | 0 ETH | 0.0033082 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ALCXRewarder
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; import "./interfaces/sushi/IRewarder.sol"; import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol"; import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol"; import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol"; import "./MasterChefV2.sol"; /// @author @0xKeno contract ALCXRewarder is IRewarder, BoringOwnable{ using BoringMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; IERC20 private immutable rewardToken; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of SUSHI entitled to the user. struct UserInfo { uint256 amount; uint256 rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of SUSHI to distribute per block. struct PoolInfo { uint128 accSushiPerShare; uint64 lastRewardBlock; uint64 allocPoint; } /// @notice Info of each pool. mapping (uint256 => PoolInfo) public poolInfo; uint256[] public poolIds; /// @notice Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 totalAllocPoint; uint256 public tokenPerBlock; uint256 private constant ACC_TOKEN_PRECISION = 1e12; address private immutable MASTERCHEF_V2; event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event LogPoolAddition(uint256 indexed pid, uint256 allocPoint); event LogSetPool(uint256 indexed pid, uint256 allocPoint); event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare); event LogInit(); event RewardRateUpdated(uint256 oldRate, uint256 newRate); constructor (IERC20 _rewardToken, uint256 _tokenPerBlock, address _MASTERCHEF_V2) public { rewardToken = _rewardToken; tokenPerBlock = _tokenPerBlock; MASTERCHEF_V2 = _MASTERCHEF_V2; } function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][_user]; uint256 pending; if (user.amount > 0) { pending = (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub( user.rewardDebt ); rewardToken.safeTransfer(to, pending); } user.amount = lpToken; user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION; emit LogOnReward(_user, pid, pending, to); } function pendingTokens(uint256 pid, address user, uint256) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) { IERC20[] memory _rewardTokens = new IERC20[](1); _rewardTokens[0] = (rewardToken); uint256[] memory _rewardAmounts = new uint256[](1); _rewardAmounts[0] = pendingToken(pid, user); return (_rewardTokens, _rewardAmounts); } modifier onlyMCV2 { require( msg.sender == MASTERCHEF_V2, "Only MCV2 can call this function." ); _; } /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint256 pools) { pools = poolIds.length; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _pid Pid on MCV2 function add(uint256 allocPoint, uint256 _pid) public onlyOwner { require(poolInfo[_pid].lastRewardBlock == 0, "Pool already exists"); uint256 lastRewardBlock = block.number; totalAllocPoint = totalAllocPoint.add(allocPoint); poolInfo[_pid] = PoolInfo({ allocPoint: allocPoint.to64(), lastRewardBlock: lastRewardBlock.to64(), accSushiPerShare: 0 }); poolIds.push(_pid); emit LogPoolAddition(_pid, allocPoint); } /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. function set(uint256 _pid, uint256 _allocPoint) public onlyOwner { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint.to64(); emit LogSetPool(_pid, _allocPoint); } /// @notice View function to see pending Token /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending SUSHI reward for a given user. function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSushiPerShare = pool.accSushiPerShare; uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint; accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply); } pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt); } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) public { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; require(pool.lastRewardBlock != 0, "Pool does not exist"); if (block.number > pool.lastRewardBlock) { uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2); if (lpSupply > 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint; pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128()); } pool.lastRewardBlock = block.number.to64(); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare); } } /// @dev Sets the distribution reward rate. This will also update all of the pools. /// @param _tokenPerBlock The number of tokens to distribute per block function setRewardRate(uint256 _tokenPerBlock, uint256[] calldata _pids) external onlyOwner { massUpdatePools(_pids); uint256 oldRate = tokenPerBlock; tokenPerBlock = _tokenPerBlock; emit RewardRateUpdated(oldRate, _tokenPerBlock); } }
pragma solidity 0.6.12; import "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol"; interface IRewarder { using BoringERC20 for IERC20; function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.12; import "../interfaces/IERC20.sol"; library BoringERC20 { function safeSymbol(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeName(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } function safeTransfer(IERC20 token, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; // a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math) library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");} function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");} function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath64 { function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath32 { function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");} }
// SPDX-License-Identifier: MIT // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto // T1 - T4: OK contract BoringOwnableData { // V1 - V5: OK address public owner; // V1 - V5: OK address public pendingOwner; } // T1 - T4: OK contract BoringOwnable is BoringOwnableData { // E1: OK event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } // F1 - F9: OK // C1 - C21: OK function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } // F1 - F9: OK // C1 - C21: OK function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } // M1 - M5: OK // C1 - C21: OK modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; import "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol"; import "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol"; import "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol"; import "./libraries/math/SignedSafeMath.sol"; import "./interfaces/sushi/IRewarder.sol"; import "./interfaces/sushi/IMasterChef.sol"; interface IMigratorChef { // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. function migrate(IERC20 token) external returns (IERC20); } /// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block. /// It is the only address with minting rights for SUSHI. /// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token /// that is deposited into the MasterChef V1 (MCV1) contract. /// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives. contract MasterChefV2 is BoringOwnable { using BoringMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; using SignedSafeMath for int256; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of SUSHI entitled to the user. struct UserInfo { uint256 amount; int256 rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of SUSHI to distribute per block. struct PoolInfo { uint128 accSushiPerShare; uint64 lastRewardBlock; uint64 allocPoint; } /// @notice Address of MCV1 contract. IMasterChef public immutable MASTER_CHEF; /// @notice Address of SUSHI contract. IERC20 public immutable SUSHI; /// @notice The index of MCV2 master pool in MCV1. uint256 public immutable MASTER_PID; // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; /// @notice Info of each MCV2 pool. PoolInfo[] public poolInfo; /// @notice Address of the LP token for each MCV2 pool. IERC20[] public lpToken; /// @notice Address of each `IRewarder` contract in MCV2. IRewarder[] public rewarder; /// @notice Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20; uint256 private constant ACC_SUSHI_PRECISION = 1e12; event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder); event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite); event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare); event LogInit(); /// @param _MASTER_CHEF The SushiSwap MCV1 contract address. /// @param _sushi The SUSHI token contract address. /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract. constructor( IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID ) public { MASTER_CHEF = _MASTER_CHEF; SUSHI = _sushi; MASTER_PID = _MASTER_PID; } /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI. /// Any balance of transaction sender in `dummyToken` is transferred. /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives. /// @param dummyToken The address of the ERC-20 token to deposit into MCV1. function init(IERC20 dummyToken) external { uint256 balance = dummyToken.balanceOf(msg.sender); require(balance != 0, "MasterChefV2: Balance must exceed 0"); dummyToken.safeTransferFrom(msg.sender, address(this), balance); dummyToken.approve(address(MASTER_CHEF), balance); MASTER_CHEF.deposit(MASTER_PID, balance); emit LogInit(); } /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint256 pools) { pools = poolInfo.length; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. /// @param _rewarder Address of the rewarder delegate. function add( uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder ) public onlyOwner { uint256 lastRewardBlock = block.number; totalAllocPoint = totalAllocPoint.add(allocPoint); lpToken.push(_lpToken); rewarder.push(_rewarder); poolInfo.push( PoolInfo({ allocPoint: allocPoint.to64(), lastRewardBlock: lastRewardBlock.to64(), accSushiPerShare: 0 }) ); emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder); } /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _rewarder Address of the rewarder delegate. /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored. function set( uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite ) public onlyOwner { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint.to64(); if (overwrite) { rewarder[_pid] = _rewarder; } emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite); } /// @notice Set the `migrator` contract. Can only be called by the owner. /// @param _migrator The contract address to set. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } /// @notice Migrate LP token to another LP contract through the `migrator` contract. /// @param _pid The index of the pool. See `poolInfo`. function migrate(uint256 _pid) public { require(address(migrator) != address(0), "MasterChefV2: no migrator set"); IERC20 _lpToken = lpToken[_pid]; uint256 bal = _lpToken.balanceOf(address(this)); _lpToken.approve(address(migrator), bal); IERC20 newLpToken = migrator.migrate(_lpToken); require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match"); lpToken[_pid] = newLpToken; } /// @notice View function to see pending SUSHI on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending SUSHI reward for a given user. function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSushiPerShare = pool.accSushiPerShare; uint256 lpSupply = lpToken[_pid].balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint; accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply); } pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256(); } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) external { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Calculates and returns the `amount` of SUSHI per block. function sushiPerBlock() public view returns (uint256 amount) { amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK).mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint(); } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.number > pool.lastRewardBlock) { uint256 lpSupply = lpToken[pid].balanceOf(address(this)); if (lpSupply > 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint; pool.accSushiPerShare = pool.accSushiPerShare.add( (sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128() ); } pool.lastRewardBlock = block.number.to64(); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare); } } /// @notice Deposit LP tokens to MCV2 for SUSHI allocation. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to deposit. /// @param to The receiver of `amount` deposit benefit. function deposit( uint256 pid, uint256 amount, address to ) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][to]; // Effects user.amount = user.amount.add(amount); user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION)); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, to, to, 0, user.amount); } lpToken[pid].safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, pid, amount, to); } /// @notice Withdraw LP tokens from MCV2. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens. function withdraw( uint256 pid, uint256 amount, address to ) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // Effects user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION)); user.amount = user.amount.sub(amount); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); } /// @notice Harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of SUSHI rewards. function harvest(uint256 pid, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION); uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedSushi; // Interactions if (_pendingSushi != 0) { SUSHI.safeTransfer(to, _pendingSushi); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount); } emit Harvest(msg.sender, pid, _pendingSushi); } /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens and SUSHI rewards. function withdrawAndHarvest( uint256 pid, uint256 amount, address to ) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION); uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION)); user.amount = user.amount.sub(amount); // Interactions SUSHI.safeTransfer(to, _pendingSushi); IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingSushi); } /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract. function harvestFromMasterChef() public { MASTER_CHEF.deposit(MASTER_PID, 0); } /// @notice Withdraw without caring about rewards. EMERGENCY ONLY. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of the LP tokens. function emergencyWithdraw(uint256 pid, address to) public { UserInfo storage user = userInfo[pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, 0, 0); } // Note: transfer can fail or succeed if `amount` is zero. lpToken[pid].safeTransfer(to, amount); emit EmergencyWithdraw(msg.sender, pid, amount, to); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); // EIP 2612 function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; }
// SPDX-License-Identifier: UNLICENSED // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // solhint-disable avoid-low-level-calls import "./libraries/BoringERC20.sol"; // T1 - T4: OK contract BaseBoringBatchable { function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } // F3 - F9: OK // F1: External is ok here because this is the batch function, adding it to a batch makes no sense // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value // C1 - C21: OK // C3: The length of the loop is fully under user control, so can't be exploited // C7: Delegatecall is only used on the same contract, so it's safe function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) { // Interactions successes = new bool[](calls.length); results = new bytes[](calls.length); for (uint256 i = 0; i < calls.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(calls[i]); require(success || !revertOnFail, _getRevertMsg(result)); successes[i] = success; results[i] = result; } } } // T1 - T4: OK contract BoringBatchable is BaseBoringBatchable { // F1 - F9: OK // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert) // if part of a batch this could be used to grief once as the second call would not need the permit // C1 - C21: OK function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { // Interactions // X1 - X5 token.permit(from, to, amount, deadline, v, r, s); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; library SignedSafeMath { int256 private constant _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // 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; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed 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(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } function toUInt256(int256 a) internal pure returns (uint256) { require(a >= 0, "Integer < 0"); return uint256(a); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; pragma experimental ABIEncoderV2; import { BoringERC20, IERC20 } from "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol"; interface IMasterChef { using BoringERC20 for IERC20; struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block. uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs. uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below. } function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory); function totalAllocPoint() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_tokenPerBlock","type":"uint256"},{"internalType":"address","name":"_MASTERCHEF_V2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"LogInit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"LogOnReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"LogPoolAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"LogSetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accSushiPerShare","type":"uint256"}],"name":"LogUpdatePool","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":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"lpToken","type":"uint256"}],"name":"onSushiReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingToken","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingTokens","outputs":[{"internalType":"contract IERC20[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"rewardAmounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accSushiPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPerBlock","type":"uint256"},{"internalType":"uint256[]","name":"_pids","type":"uint256[]"}],"name":"setRewardRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint128","name":"accSushiPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardBlock","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct ALCXRewarder.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162001faf38038062001faf833981016040819052620000349162000099565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606093841b811660805260069290925590911b1660a052620000f9565b600080600060608486031215620000ae578283fd5b8351620000bb81620000e0565b602085015160408601519194509250620000d581620000e0565b809150509250925092565b6001600160a01b0381168114620000f657600080fd5b50565b60805160601c60a05160601c611e736200013c600039806106b052806107525280610ab55280610b57528061107f52508061116d52806113485250611e736000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806357a5b58c116100b25780638da5cb5b116100815780639a1d589c116100665780639a1d589c1461024d578063d63b3c4914610260578063e30c3978146102815761011b565b80638da5cb5b1461021757806393f1a40b1461022c5761011b565b806357a5b58c146101cb57806369883b4e146101de578063771602f7146101f15780638bf63742146102045761011b565b80634198709a116100ee5780634198709a1461018857806348e43af4146101905780634e71e0c8146101a357806351eb05a6146101ab5761011b565b8063078dfbe714610120578063081e3eda146101355780631526fe27146101535780631ab06ee514610175575b600080fd5b61013361012e366004611752565b610289565b005b61013d61041d565b60405161014a9190611dbf565b60405180910390f35b61016661016136600461181b565b610423565b60405161014a93929190611d8b565b61013361018336600461194c565b610486565b61013d6105c9565b61013d61019e36600461184b565b6105cf565b6101336108bf565b6101be6101b936600461181b565b6109a5565b60405161014a9190611d48565b6101336101d936600461179c565b610dc4565b61013d6101ec36600461181b565b610dfa565b6101336101ff36600461194c565b610e18565b61013361021236600461187a565b611067565b61021f61123d565b60405161014a91906119ae565b61023f61023a36600461184b565b611259565b60405161014a929190611dc8565b61013361025b366004611902565b61127d565b61027361026e3660046118cb565b611320565b60405161014a9291906119f5565b61021f6113ec565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b60405180910390fd5b81156103d75773ffffffffffffffffffffffffffffffffffffffff831615158061030a5750805b610340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611b94565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600180549091169055610418565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60035490565b6002602052600090815260409020546fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b60008281526002602052604090205460055461052491839161051e917801000000000000000000000000000000000000000000000000900467ffffffffffffffff16611408565b9061144b565b60055561053081611488565b60008381526002602052604090819020805467ffffffffffffffff9390931678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c906105bd908490611dbf565b60405180910390a25050565b60065481565b60006105d96116e9565b506000838152600260209081526040808320815160608101835290546fffffffffffffffffffffffffffffffff808216835267ffffffffffffffff7001000000000000000000000000000000008304811684870152780100000000000000000000000000000000000000000000000090920490911682840152878552600480855283862073ffffffffffffffffffffffffffffffffffffffff808a1688529552838620835194517f78ed5d1f00000000000000000000000000000000000000000000000000000000815293969095949092169391927f0000000000000000000000000000000000000000000000000000000000000000909216916378ed5d1f916106e5918b9101611dbf565b60206040518083038186803b1580156106fd57600080fd5b505afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073591906117ff565b73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161078d91906119ae565b60206040518083038186803b1580156107a557600080fd5b505afa1580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd9190611833565b9050836020015167ffffffffffffffff16431180156107fb57508015155b15610889576000610823856020015167ffffffffffffffff164361140890919063ffffffff16565b90506000600554610857876040015167ffffffffffffffff16610851600654866114d090919063ffffffff16565b906114d0565b8161085e57fe5b049050610884836108748364e8d4a510006114d0565b8161087b57fe5b8691900461144b565b935050505b600183015483546108b4919064e8d4a51000906108a690866114d0565b816108ad57fe5b0490611408565b979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611ca5565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b6109ad6116e9565b50600081815260026020908152604091829020825160608101845290546fffffffffffffffffffffffffffffffff8116825267ffffffffffffffff7001000000000000000000000000000000008204811693830184905278010000000000000000000000000000000000000000000000009091041692810192909252610a5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611bcb565b806020015167ffffffffffffffff16431115610dbf576040517f78ed5d1f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906378ed5d1f90610aea908690600401611dbf565b60206040518083038186803b158015610b0257600080fd5b505afa158015610b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3a91906117ff565b73ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401610b9291906119ae565b60206040518083038186803b158015610baa57600080fd5b505afa158015610bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be29190611833565b90508015610c99576000610c0d836020015167ffffffffffffffff164361140890919063ffffffff16565b90506000600554610c3b856040015167ffffffffffffffff16610851600654866114d090919063ffffffff16565b81610c4257fe5b049050610c82610c6884610c5b8464e8d4a510006114d0565b81610c6257fe5b04611521565b85516fffffffffffffffffffffffffffffffff169061156d565b6fffffffffffffffffffffffffffffffff16845250505b610ca243611488565b67ffffffffffffffff908116602084810191825260008681526002909152604090819020855181549351838801517fffffffffffffffffffffffffffffffff000000000000000000000000000000009095166fffffffffffffffffffffffffffffffff8316177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000828816021777ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000095909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610db59290918691611dd6565b60405180910390a2505b919050565b8060005b81811015610df457610deb848483818110610ddf57fe5b905060200201356109a5565b50600101610dc8565b50505050565b60038181548110610e0757fe5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b600081815260026020526040902054700100000000000000000000000000000000900467ffffffffffffffff1615610ecd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611ac9565b6005544390610edc908461144b565b60055560408051606081019091526000815260208101610efb83611488565b67ffffffffffffffff168152602001610f1385611488565b67ffffffffffffffff9081169091526000848152600260209081526040808320855181549387015196830151861678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff97909616700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c819061105a908690611dbf565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611b37565b6110de6116e9565b6110e7866109a5565b600087815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845290915281208054929350911561119457600182015483518354611151929164e8d4a51000916108a6916fffffffffffffffffffffffffffffffff166114d0565b905061119473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001687836115bf565b838255825164e8d4a51000906111bd9086906fffffffffffffffffffffffffffffffff166114d0565b816111c457fe5b0482600101819055508573ffffffffffffffffffffffffffffffffffffffff16888873ffffffffffffffffffffffffffffffffffffffff167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b8460405161122b9190611dbf565b60405180910390a45050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60046020908152600092835260408084209091529082529020805460019091015482565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b6112d88282610dc4565b60068054908490556040517fc390a98ace15a7bb6bab611eedfdbb2685043b241a869420043cdfb23ccfee50906113129083908790611dc8565b60405180910390a150505050565b60408051600180825281830190925260609182918291602080830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061137457fe5b73ffffffffffffffffffffffffffffffffffffffff92909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090506113c887876105cf565b816000815181106113d557fe5b602090810291909101015290969095509350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b80820382811115611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611a92565b92915050565b81810181811015611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c39565b600067ffffffffffffffff8211156114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611cda565b5090565b60008115806114eb575050808202828282816114e857fe5b04145b611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611d11565b60006fffffffffffffffffffffffffffffffff8211156114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c02565b8181016fffffffffffffffffffffffffffffffff8083169082161015611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c39565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016115f29291906119cf565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116409190611975565b6000604051808303816000865af19150503d806000811461167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b50915091508180156116ac5750805115806116ac5750808060200190518101906116ac91906117dc565b6116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611b00565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b60008083601f84011261171a578182fd5b50813567ffffffffffffffff811115611731578182fd5b602083019150836020808302850101111561174b57600080fd5b9250929050565b600080600060608486031215611766578283fd5b833561177181611e0a565b9250602084013561178181611e2f565b9150604084013561179181611e2f565b809150509250925092565b600080602083850312156117ae578182fd5b823567ffffffffffffffff8111156117c4578283fd5b6117d085828601611709565b90969095509350505050565b6000602082840312156117ed578081fd5b81516117f881611e2f565b9392505050565b600060208284031215611810578081fd5b81516117f881611e0a565b60006020828403121561182c578081fd5b5035919050565b600060208284031215611844578081fd5b5051919050565b6000806040838503121561185d578182fd5b82359150602083013561186f81611e0a565b809150509250929050565b600080600080600060a08688031215611891578081fd5b8535945060208601356118a381611e0a565b935060408601356118b381611e0a565b94979396509394606081013594506080013592915050565b6000806000606084860312156118df578283fd5b8335925060208401356118f181611e0a565b929592945050506040919091013590565b600080600060408486031215611916578283fd5b83359250602084013567ffffffffffffffff811115611933578283fd5b61193f86828701611709565b9497909650939450505050565b6000806040838503121561195e578182fd5b50508035926020909101359150565b815260200190565b60008251815b81811015611995576020818601810151858301520161197b565b818111156119a35782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015611a4457815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611a12565b50505083810382850152808551611a5b8184611dbf565b91508387019250845b81811015611a8557611a7783855161196d565b938501939250600101611a64565b5090979650505050505050565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b60208082526013908201527f506f6f6c20616c72656164792065786973747300000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e60408201527f2e00000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526013908201527f506f6f6c20646f6573206e6f7420657869737400000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516fffffffffffffffffffffffffffffffff16815260208083015167ffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6fffffffffffffffffffffffffffffffff93909316835267ffffffffffffffff918216602084015216604082015260600190565b90815260200190565b918252602082015260400190565b67ffffffffffffffff93909316835260208301919091526fffffffffffffffffffffffffffffffff16604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff81168114611e2c57600080fd5b50565b8015158114611e2c57600080fdfea26469706673582212207a34db399a077a70dbcdb7ded0a4232114e849e00d58b60a634c07bc847282e664736f6c634300060c0033000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061011b5760003560e01c806357a5b58c116100b25780638da5cb5b116100815780639a1d589c116100665780639a1d589c1461024d578063d63b3c4914610260578063e30c3978146102815761011b565b80638da5cb5b1461021757806393f1a40b1461022c5761011b565b806357a5b58c146101cb57806369883b4e146101de578063771602f7146101f15780638bf63742146102045761011b565b80634198709a116100ee5780634198709a1461018857806348e43af4146101905780634e71e0c8146101a357806351eb05a6146101ab5761011b565b8063078dfbe714610120578063081e3eda146101355780631526fe27146101535780631ab06ee514610175575b600080fd5b61013361012e366004611752565b610289565b005b61013d61041d565b60405161014a9190611dbf565b60405180910390f35b61016661016136600461181b565b610423565b60405161014a93929190611d8b565b61013361018336600461194c565b610486565b61013d6105c9565b61013d61019e36600461184b565b6105cf565b6101336108bf565b6101be6101b936600461181b565b6109a5565b60405161014a9190611d48565b6101336101d936600461179c565b610dc4565b61013d6101ec36600461181b565b610dfa565b6101336101ff36600461194c565b610e18565b61013361021236600461187a565b611067565b61021f61123d565b60405161014a91906119ae565b61023f61023a36600461184b565b611259565b60405161014a929190611dc8565b61013361025b366004611902565b61127d565b61027361026e3660046118cb565b611320565b60405161014a9291906119f5565b61021f6113ec565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b60405180910390fd5b81156103d75773ffffffffffffffffffffffffffffffffffffffff831615158061030a5750805b610340576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611b94565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff85167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600180549091169055610418565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85161790555b505050565b60035490565b6002602052600090815260409020546fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b60008281526002602052604090205460055461052491839161051e917801000000000000000000000000000000000000000000000000900467ffffffffffffffff16611408565b9061144b565b60055561053081611488565b60008381526002602052604090819020805467ffffffffffffffff9390931678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c906105bd908490611dbf565b60405180910390a25050565b60065481565b60006105d96116e9565b506000838152600260209081526040808320815160608101835290546fffffffffffffffffffffffffffffffff808216835267ffffffffffffffff7001000000000000000000000000000000008304811684870152780100000000000000000000000000000000000000000000000090920490911682840152878552600480855283862073ffffffffffffffffffffffffffffffffffffffff808a1688529552838620835194517f78ed5d1f00000000000000000000000000000000000000000000000000000000815293969095949092169391927f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d909216916378ed5d1f916106e5918b9101611dbf565b60206040518083038186803b1580156106fd57600080fd5b505afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073591906117ff565b73ffffffffffffffffffffffffffffffffffffffff166370a082317f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d6040518263ffffffff1660e01b815260040161078d91906119ae565b60206040518083038186803b1580156107a557600080fd5b505afa1580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd9190611833565b9050836020015167ffffffffffffffff16431180156107fb57508015155b15610889576000610823856020015167ffffffffffffffff164361140890919063ffffffff16565b90506000600554610857876040015167ffffffffffffffff16610851600654866114d090919063ffffffff16565b906114d0565b8161085e57fe5b049050610884836108748364e8d4a510006114d0565b8161087b57fe5b8691900461144b565b935050505b600183015483546108b4919064e8d4a51000906108a690866114d0565b816108ad57fe5b0490611408565b979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff16338114610911576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611ca5565b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179055600180549091169055565b6109ad6116e9565b50600081815260026020908152604091829020825160608101845290546fffffffffffffffffffffffffffffffff8116825267ffffffffffffffff7001000000000000000000000000000000008204811693830184905278010000000000000000000000000000000000000000000000009091041692810192909252610a5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611bcb565b806020015167ffffffffffffffff16431115610dbf576040517f78ed5d1f00000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d16906378ed5d1f90610aea908690600401611dbf565b60206040518083038186803b158015610b0257600080fd5b505afa158015610b16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3a91906117ff565b73ffffffffffffffffffffffffffffffffffffffff166370a082317f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d6040518263ffffffff1660e01b8152600401610b9291906119ae565b60206040518083038186803b158015610baa57600080fd5b505afa158015610bbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be29190611833565b90508015610c99576000610c0d836020015167ffffffffffffffff164361140890919063ffffffff16565b90506000600554610c3b856040015167ffffffffffffffff16610851600654866114d090919063ffffffff16565b81610c4257fe5b049050610c82610c6884610c5b8464e8d4a510006114d0565b81610c6257fe5b04611521565b85516fffffffffffffffffffffffffffffffff169061156d565b6fffffffffffffffffffffffffffffffff16845250505b610ca243611488565b67ffffffffffffffff908116602084810191825260008681526002909152604090819020855181549351838801517fffffffffffffffffffffffffffffffff000000000000000000000000000000009095166fffffffffffffffffffffffffffffffff8316177fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000828816021777ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000095909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610db59290918691611dd6565b60405180910390a2505b919050565b8060005b81811015610df457610deb848483818110610ddf57fe5b905060200201356109a5565b50600101610dc8565b50505050565b60038181548110610e0757fe5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b600081815260026020526040902054700100000000000000000000000000000000900467ffffffffffffffff1615610ecd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611ac9565b6005544390610edc908461144b565b60055560408051606081019091526000815260208101610efb83611488565b67ffffffffffffffff168152602001610f1385611488565b67ffffffffffffffff9081169091526000848152600260209081526040808320855181549387015196830151861678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff97909616700100000000000000000000000000000000027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c819061105a908690611dbf565b60405180910390a2505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611b37565b6110de6116e9565b6110e7866109a5565b600087815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845290915281208054929350911561119457600182015483518354611151929164e8d4a51000916108a6916fffffffffffffffffffffffffffffffff166114d0565b905061119473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df1687836115bf565b838255825164e8d4a51000906111bd9086906fffffffffffffffffffffffffffffffff166114d0565b816111c457fe5b0482600101819055508573ffffffffffffffffffffffffffffffffffffffff16888873ffffffffffffffffffffffffffffffffffffffff167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b8460405161122b9190611dbf565b60405180910390a45050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60046020908152600092835260408084209091529082529020805460019091015482565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c70565b6112d88282610dc4565b60068054908490556040517fc390a98ace15a7bb6bab611eedfdbb2685043b241a869420043cdfb23ccfee50906113129083908790611dc8565b60405180910390a150505050565b60408051600180825281830190925260609182918291602080830190803683370190505090507f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df8160008151811061137457fe5b73ffffffffffffffffffffffffffffffffffffffff92909216602092830291909101909101526040805160018082528183019092526060918160200160208202803683370190505090506113c887876105cf565b816000815181106113d557fe5b602090810291909101015290969095509350505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b80820382811115611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611a92565b92915050565b81810181811015611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c39565b600067ffffffffffffffff8211156114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611cda565b5090565b60008115806114eb575050808202828282816114e857fe5b04145b611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611d11565b60006fffffffffffffffffffffffffffffffff8211156114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c02565b8181016fffffffffffffffffffffffffffffffff8083169082161015611445576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611c39565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016115f29291906119cf565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516116409190611975565b6000604051808303816000865af19150503d806000811461167d576040519150601f19603f3d011682016040523d82523d6000602084013e611682565b606091505b50915091508180156116ac5750805115806116ac5750808060200190518101906116ac91906117dc565b6116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102da90611b00565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b60008083601f84011261171a578182fd5b50813567ffffffffffffffff811115611731578182fd5b602083019150836020808302850101111561174b57600080fd5b9250929050565b600080600060608486031215611766578283fd5b833561177181611e0a565b9250602084013561178181611e2f565b9150604084013561179181611e2f565b809150509250925092565b600080602083850312156117ae578182fd5b823567ffffffffffffffff8111156117c4578283fd5b6117d085828601611709565b90969095509350505050565b6000602082840312156117ed578081fd5b81516117f881611e2f565b9392505050565b600060208284031215611810578081fd5b81516117f881611e0a565b60006020828403121561182c578081fd5b5035919050565b600060208284031215611844578081fd5b5051919050565b6000806040838503121561185d578182fd5b82359150602083013561186f81611e0a565b809150509250929050565b600080600080600060a08688031215611891578081fd5b8535945060208601356118a381611e0a565b935060408601356118b381611e0a565b94979396509394606081013594506080013592915050565b6000806000606084860312156118df578283fd5b8335925060208401356118f181611e0a565b929592945050506040919091013590565b600080600060408486031215611916578283fd5b83359250602084013567ffffffffffffffff811115611933578283fd5b61193f86828701611709565b9497909650939450505050565b6000806040838503121561195e578182fd5b50508035926020909101359150565b815260200190565b60008251815b81811015611995576020818601810151858301520161197b565b818111156119a35782828501525b509190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015611a4457815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611a12565b50505083810382850152808551611a5b8184611dbf565b91508387019250845b81811015611a8557611a7783855161196d565b938501939250600101611a64565b5090979650505050505050565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b60208082526013908201527f506f6f6c20616c72656164792065786973747300000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e60408201527f2e00000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526015908201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604082015260600190565b60208082526013908201527f506f6f6c20646f6573206e6f7420657869737400000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516fffffffffffffffffffffffffffffffff16815260208083015167ffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6fffffffffffffffffffffffffffffffff93909316835267ffffffffffffffff918216602084015216604082015260600190565b90815260200190565b918252602082015260400190565b67ffffffffffffffff93909316835260208301919091526fffffffffffffffffffffffffffffffff16604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff81168114611e2c57600080fd5b50565b8015158114611e2c57600080fdfea26469706673582212207a34db399a077a70dbcdb7ded0a4232114e849e00d58b60a634c07bc847282e664736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF
Arg [1] : _tokenPerBlock (uint256): 0
Arg [2] : _MASTERCHEF_V2 (address): 0xEF0881eC094552b2e128Cf945EF17a6752B4Ec5d
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 000000000000000000000000ef0881ec094552b2e128cf945ef17a6752b4ec5d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $25.69 | 33,278.5109 | $854,924.94 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.