Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12451570 | 1267 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ExtraRewardStashV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-27 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUtil { /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } } contract ReentrancyGuard { uint256 private _guardCounter; constructor () internal { _guardCounter = 1; } modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call"); } } interface ICurveGauge { function deposit(uint256) external; function balanceOf(address) external view returns (uint256); function withdraw(uint256) external; function claim_rewards() external; function reward_tokens(uint256) external view returns(address);//v2 function rewarded_token() external view returns(address);//v1 } interface ICurveVoteEscrow { function create_lock(uint256, uint256) external; function increase_amount(uint256) external; function increase_unlock_time(uint256) external; function withdraw() external; function smart_wallet_checker() external view returns (address); } interface IWalletChecker { function check(address) external view returns (bool); } interface IVoting{ function vote(uint256, bool, bool) external; //voteId, support, executeIfDecided function getVote(uint256) external view returns(bool,bool,uint64,uint64,uint64,uint64,uint256,uint256,uint256,bytes memory); function vote_for_gauge_weights(address,uint256) external; } interface IMinter{ function mint(address) external; } interface IRegistry{ function get_registry() external view returns(address); function get_address(uint256 _id) external view returns(address); function gauge_controller() external view returns(address); function get_lp_token(address) external view returns(address); function get_gauges(address) external view returns(address[10] memory,uint128[10] memory); } interface IStaker{ function deposit(address, address) external; function withdraw(address) external; function withdraw(address, address, uint256) external; function withdrawAll(address, address) external; function createLock(uint256, uint256) external; function increaseAmount(uint256) external; function increaseTime(uint256) external; function release() external; function claimCrv(address) external returns (uint256); function claimRewards(address) external; function claimFees(address,address) external; function setStashAccess(address, bool) external; function vote(uint256,address,bool) external; function voteGaugeWeight(address,uint256) external; function balanceOfPool(address) external view returns (uint256); function operator() external view returns (address); function execute(address _to, uint256 _value, bytes calldata _data) external returns (bool, bytes memory); } interface IRewards{ function stake(address, uint256) external; function stakeFor(address, uint256) external; function withdraw(address, uint256) external; function exit(address) external; function getReward(address) external; function queueNewRewards(uint256) external; function notifyRewardAmount(uint256) external; function addExtraReward(address) external; function stakingToken() external returns (address); } interface IStash{ function stashRewards() external returns (bool); function processStash() external returns (bool); function claimRewards() external returns (bool); } interface IFeeDistro{ function claim() external; function token() external view returns(address); } interface ITokenMinter{ function mint(address,uint256) external; function burn(address,uint256) external; } interface IDeposit{ function isShutdown() external view returns(bool); function balanceOf(address _account) external view returns(uint256); function totalSupply() external view returns(uint256); function poolInfo(uint256) external view returns(address,address,address,address,address, bool); function rewardClaimed(uint256,address,uint256) external; function withdrawTo(uint256,uint256,address) external; function claimRewards(uint256,address) external returns(bool); function rewardArbitrator() external returns(address); } interface ICrvDeposit{ function deposit(uint256, bool) external; function lockIncentive() external view returns(uint256); } interface IRewardFactory{ function setAccess(address,bool) external; function CreateCrvRewards(uint256,address) external returns(address); function CreateTokenRewards(address,address,address) external returns(address); function activeRewardCount(address) external view returns(uint256); function addActiveReward(address,uint256) external returns(bool); function removeActiveReward(address,uint256) external returns(bool); } interface IStashFactory{ function CreateStash(uint256,address,address,uint256) external returns(address); } interface ITokenFactory{ function CreateDepositToken(address) external returns(address); } interface IPools{ function addPool(address _lptoken, address _gauge, uint256 _stashVersion) external returns(bool); function shutdownPool(uint256 _pid) external returns(bool); function poolInfo(uint256) external view returns(address,address,address,address,address,bool); function poolLength() external view returns (uint256); function gaugeMap(address) external view returns(bool); function setPoolManager(address _poolM) external; } interface IVestedEscrow{ function fund(address[] calldata _recipient, uint256[] calldata _amount) external returns(bool); } // File: @openzeppelin\contracts\math\SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin\contracts\token\ERC20\IERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin\contracts\utils\Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin\contracts\token\ERC20\SafeERC20.sol pragma solidity >=0.6.0 <0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts\ExtraRewardStashV2.sol contract ExtraRewardStashV2 { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; address public constant crv = address(0xD533a949740bb3306d119CC777fa900bA034cd52); uint256 private constant maxRewards = 8; uint256 private constant WEEK = 7 * 86400; uint256 public immutable pid; address public immutable operator; address public immutable staker; address public immutable gauge; address public immutable rewardFactory; mapping(address => uint256) public historicalRewards; struct TokenInfo { address token; address rewardAddress; uint256 lastActiveTime; } uint256 public tokenCount; TokenInfo[maxRewards] public tokenInfo; constructor(uint256 _pid, address _operator, address _staker, address _gauge, address _rFactory) public { pid = _pid; operator = _operator; staker = _staker; gauge = _gauge; rewardFactory = _rFactory; } function getName() external pure returns (string memory) { return "ExtraRewardStashV2"; } //try claiming if there are reward tokens registered function claimRewards() external returns (bool) { require(msg.sender == operator, "!authorized"); //this is updateable in v2 gauges now so must check each time. checkForNewRewardTokens(); uint256 length = tokenCount; if(length > 0){ //get previous balances of all tokens uint256[] memory balances = new uint256[](length); for(uint256 i=0; i < length; i++){ balances[i] = IERC20(tokenInfo[i].token).balanceOf(staker); } //claim rewards on gauge for staker //booster will call for future proofing (cant assume anyone will always be able to call) IDeposit(operator).claimRewards(pid,gauge); for(uint256 i=0; i < length; i++){ address token = tokenInfo[i].token; uint256 newbalance = IERC20(token).balanceOf(staker); //stash if balance increased if(newbalance > balances[i]){ IStaker(staker).withdraw(token); tokenInfo[i].lastActiveTime = block.timestamp; //make sure this pool is in active list, IRewardFactory(rewardFactory).addActiveReward(token,pid); //check if other stashes are also active, and if so, send to arbitrator //do this here because processStash will have tokens from the arbitrator uint256 activeCount = IRewardFactory(rewardFactory).activeRewardCount(token); if(activeCount > 1){ //send to arbitrator address arb = IDeposit(operator).rewardArbitrator(); if(arb != address(0)){ IERC20(token).safeTransfer(arb, newbalance); } } }else{ //check if this reward has been inactive too long if(block.timestamp > tokenInfo[i].lastActiveTime + WEEK){ //set as inactive IRewardFactory(rewardFactory).removeActiveReward(token,pid); }else{ //edge case around reward ending periods if(newbalance > 0){ // - recently active pool // - rewards claimed to staker contract via a deposit/withdraw(or someone manually calling on the gauge) // - rewards ended before the deposit, thus deposit took the last available tokens // - thus claimRewards doesnt see any new rewards, but there are rewards on the staker contract // - i think its safe to assume claim will be called within the timeframe, or else these rewards // will be unretrievable until some pool starts rewards again //claim the tokens IStaker(staker).withdraw(token); uint256 activeCount = IRewardFactory(rewardFactory).activeRewardCount(token); if(activeCount > 1){ //send to arbitrator address arb = IDeposit(operator).rewardArbitrator(); if(arb != address(0)){ IERC20(token).safeTransfer(arb, newbalance); } } } } } } } return true; } //check if gauge rewards have changed function checkForNewRewardTokens() internal { for(uint256 i = 0; i < maxRewards; i++){ address token = ICurveGauge(gauge).reward_tokens(i); if (token == address(0)) { for (uint256 x = i; x < tokenCount; x++) { IRewardFactory(rewardFactory).removeActiveReward(tokenInfo[x].token,pid); } if (i != tokenCount) { tokenCount = i; } break; } setToken(i, token); } } //replace a token on token list function setToken(uint256 _tid, address _token) internal { TokenInfo storage t = tokenInfo[_tid]; address currentToken = t.token; if(currentToken != _token){ //set old as inactive IRewardFactory(rewardFactory).removeActiveReward(currentToken,pid); //set token address t.token = _token; //create new reward contract (,,,address mainRewardContract,,) = IDeposit(operator).poolInfo(pid); address rewardContract = IRewardFactory(rewardFactory).CreateTokenRewards( _token, mainRewardContract, address(this)); t.rewardAddress = rewardContract; t.lastActiveTime = 0; //do not set as active yet, wait for first earmark } } //pull assigned tokens from staker to stash function stashRewards() external returns(bool){ require(msg.sender == operator, "!authorized"); //after depositing/withdrawing, extra incentive tokens are transfered to the staking contract //need to pull them off and stash here. for(uint i=0; i < tokenCount; i++){ TokenInfo storage t = tokenInfo[i]; address token = t.token; if(token == address(0)) continue; //only stash if rewards are active if(block.timestamp <= t.lastActiveTime + WEEK){ uint256 before = IERC20(token).balanceOf(address(this)); IStaker(staker).withdraw(token); //check for multiple pools claiming same token uint256 activeCount = IRewardFactory(rewardFactory).activeRewardCount(token); if(activeCount > 1){ //take difference of before/after(only send new tokens) uint256 amount = IERC20(token).balanceOf(address(this)); amount = amount.sub(before); //send to arbitrator address arb = IDeposit(operator).rewardArbitrator(); if(arb != address(0)){ IERC20(token).safeTransfer(arb, amount); } } } } return true; } //send all extra rewards to their reward contracts function processStash() external returns(bool){ require(msg.sender == operator, "!authorized"); for(uint i=0; i < tokenCount; i++){ TokenInfo storage t = tokenInfo[i]; address token = t.token; if(token == address(0)) continue; uint256 amount = IERC20(token).balanceOf(address(this)); if (amount > 0) { historicalRewards[token] = historicalRewards[token].add(amount); if(token == crv){ //if crv, send back to booster to distribute IERC20(token).safeTransfer(operator, amount); continue; } //add to reward contract address rewards = t.rewardAddress; if(rewards == address(0)) continue; IERC20(token).safeTransfer(rewards, amount); IRewards(rewards).queueNewRewards(amount); } } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_staker","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_rFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"claimRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crv","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"historicalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processStash","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stashRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"rewardAddress","type":"address"},{"internalType":"uint256","name":"lastActiveTime","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61012060405234801561001157600080fd5b50604051611cb8380380611cb8833981810160405260a081101561003457600080fd5b50805160208201516040830151606080850151608095860151949095526001600160601b031992811b831660a05290811b821660c05292831b811660e052911b166101005260805160a05160601c60c05160601c60e05160601c6101005160601c611b5e61015a6000398061027e528061069b528061078152806108d75280610a2f5280610ddf5280611350528061159f528061176352508061048b5280610c0052806112a4525080610399528061055452806105fb52806109a65280610bbe5280610d795250806102ad528061043b52806108025280610ad55280610b9a5280610c2f5280610f0e5280610fde528061116452806116b852508061046a52806106cb5280610907528061127252806113b652806115cf528061168d5250611b5e6000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639f181b5e1161008c578063ca8b017611610066578063ca8b0176146101d3578063cb00aa73146101db578063cc33c87514610201578063f106845414610248576100cf565b80639f181b5e146101a9578063a6f19c84146101c3578063b87bd481146101cb576100cf565b806317d7de7c146100d4578063245e4bf014610151578063372500ab14610175578063570ca735146101915780635ebaf1db146101995780636a4874a1146101a1575b600080fd5b6100dc610250565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101165781810151838201526020016100fe565b50505050905090810190601f1680156101435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61015961027c565b604080516001600160a01b039092168252519081900360200190f35b61017d6102a0565b604080519115158252519081900360200190f35b610159610b98565b610159610bbc565b610159610be0565b6101b1610bf8565b60408051918252519081900360200190f35b610159610bfe565b61017d610c22565b61017d610fd1565b6101b1600480360360208110156101f157600080fd5b50356001600160a01b031661122d565b61021e6004803603602081101561021757600080fd5b503561123f565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b6101b1611270565b60408051808201909152601281527122bc3a3930a932bbb0b93229ba30b9b42b1960711b602082015290565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461030d576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b610315611294565b6001548015610b905760608167ffffffffffffffff8111801561033757600080fd5b50604051908082528060200260200182016040528015610361578160200160208202803683370190505b50905060005b82811015610438576002816008811061037c57fe5b6003020154604080516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156103eb57600080fd5b505afa1580156103ff573d6000803e3d6000fd5b505050506040513d602081101561041557600080fd5b5051825183908390811061042557fe5b6020908102919091010152600101610367565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636c7b69cb7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040180838152602001826001600160a01b0316815260200192505050602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d602081101561051a57600080fd5b50600090505b82811015610b8d5760006002826008811061053757fe5b6003020154604080516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152915191909216925060009183916370a0823191602480820192602092909190829003018186803b1580156105ad57600080fd5b505afa1580156105c1573d6000803e3d6000fd5b505050506040513d60208110156105d757600080fd5b505184519091508490849081106105ea57fe5b60200260200101518111156108b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166351cff8d9836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561066857600080fd5b505af115801561067c573d6000803e3d6000fd5b50505050426002846008811061068e57fe5b60030201600201819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b7f927b1837f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050506040513d602081101561075a57600080fd5b505060408051630d5843f760e01b81526001600160a01b03848116600483015291516000927f00000000000000000000000000000000000000000000000000000000000000001691630d5843f7916024808301926020929190829003018186803b1580156107c757600080fd5b505afa1580156107db573d6000803e3d6000fd5b505050506040513d60208110156107f157600080fd5b5051905060018111156108ae5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663043b684a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561085b57600080fd5b505af115801561086f573d6000803e3d6000fd5b505050506040513d602081101561088557600080fd5b505190506001600160a01b038116156108ac576108ac6001600160a01b038516828561145c565b505b50610b83565b62093a80600284600881106108c557fe5b60030201600201540142111561099e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef9126ad837f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561096c57600080fd5b505af1158015610980573d6000803e3d6000fd5b505050506040513d602081101561099657600080fd5b50610b839050565b8015610b83577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166351cff8d9836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630d5843f7846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a9a57600080fd5b505afa158015610aae573d6000803e3d6000fd5b505050506040513d6020811015610ac457600080fd5b505190506001811115610b815760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663043b684a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b505050506040513d6020811015610b5857600080fd5b505190506001600160a01b03811615610b7f57610b7f6001600160a01b038516828561145c565b505b505b5050600101610520565b50505b600191505090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b73d533a949740bb3306d119cc777fa900ba034cd5281565b60015481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c8f576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b60005b600154811015610fc957600060028260088110610cab57fe5b6003020180549091506001600160a01b031680610cc9575050610fc1565b62093a808260020154014211610fbe576000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d2857600080fd5b505afa158015610d3c573d6000803e3d6000fd5b505050506040513d6020811015610d5257600080fd5b5051604080516351cff8d960e01b81526001600160a01b03858116600483015291519293507f0000000000000000000000000000000000000000000000000000000000000000909116916351cff8d99160248082019260009290919082900301818387803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630d5843f7846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e4a57600080fd5b505afa158015610e5e573d6000803e3d6000fd5b505050506040513d6020811015610e7457600080fd5b505190506001811115610fbb576000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ed057600080fd5b505afa158015610ee4573d6000803e3d6000fd5b505050506040513d6020811015610efa57600080fd5b50519050610f0881846114b3565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663043b684a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b505190506001600160a01b03811615610fb857610fb86001600160a01b038616828461145c565b50505b50505b50505b600101610c92565b506001905090565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461103e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b60005b600154811015610fc95760006002826008811061105a57fe5b6003020180549091506001600160a01b031680611078575050611225565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156110c757600080fd5b505afa1580156110db573d6000803e3d6000fd5b505050506040513d60208110156110f157600080fd5b505190508015611221576001600160a01b03821660009081526020819052604090205461111e9082611510565b6001600160a01b03831660008181526020819052604090209190915573d533a949740bb3306d119cc777fa900ba034cd521415611191576111896001600160a01b0383167f00000000000000000000000000000000000000000000000000000000000000008361145c565b505050611225565b60018301546001600160a01b0316806111ad5750505050611225565b6111c16001600160a01b038416828461145c565b806001600160a01b031663590a41f5836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561120757600080fd5b505af115801561121b573d6000803e3d6000fd5b50505050505b5050505b600101611041565b60006020819052908152604090205481565b6002816008811061124c57fe5b60030201805460018201546002909201546001600160a01b03918216935091169083565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005b60088110156114595760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166354c49fe9836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561130657600080fd5b505afa15801561131a573d6000803e3d6000fd5b505050506040513d602081101561133057600080fd5b505190506001600160a01b03811661144657815b600154811015611430577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef9126ad6002836008811061138a57fe5b6003020154604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301527f000000000000000000000000000000000000000000000000000000000000000060248301525160448083019260209291908290030181600087803b1580156113fc57600080fd5b505af1158015611410573d6000803e3d6000fd5b505050506040513d602081101561142657600080fd5b5050600101611344565b5060015482146114405760018290555b50611459565b6114508282611571565b50600101611297565b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114ae90849061180a565b505050565b60008282111561150a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561156a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006002836008811061158057fe5b6003020180549091506001600160a01b039081169083168114611804577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef9126ad827f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b505081546001600160a01b0319166001600160a01b0384811691909117835560408051631526fe2760e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015290516000927f00000000000000000000000000000000000000000000000000000000000000001691631526fe279160248083019260c0929190829003018186803b1580156116fe57600080fd5b505afa158015611712573d6000803e3d6000fd5b505050506040513d60c081101561172857600080fd5b506060015160408051637c6b091760e11b81526001600160a01b038781166004830152808416602483015230604483015291519293506000927f00000000000000000000000000000000000000000000000000000000000000009092169163f8d6122e9160648082019260209290919082900301818787803b1580156117ad57600080fd5b505af11580156117c1573d6000803e3d6000fd5b505050506040513d60208110156117d757600080fd5b50516001850180546001600160a01b0319166001600160a01b039092169190911790555050600060028301555b50505050565b606061185f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118bb9092919063ffffffff16565b8051909150156114ae5780806020019051602081101561187e57600080fd5b50516114ae5760405162461bcd60e51b815260040180806020018281038252602a815260200180611aff602a913960400191505060405180910390fd5b60606118ca84846000856118d2565b949350505050565b6060824710156119135760405162461bcd60e51b8152600401808060200182810382526026815260200180611ad96026913960400191505060405180910390fd5b61191c85611a2e565b61196d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119ac5780518252601f19909201916020918201910161198d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a0e576040519150601f19603f3d011682016040523d82523d6000602084013e611a13565b606091505b5091509150611a23828286611a34565b979650505050505050565b3b151590565b60608315611a4357508161156a565b825115611a535782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a9d578181015183820152602001611a85565b50505050905090810190601f168015611aca5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c0095100d744468d2b71ef33fec4990219fcd72842896f9d255e307a76429d6f64736f6c634300060c00330000000000000000000000000000000000000000000000000000000000000019000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad80000000000000000000000000182b723a58739a9c974cfdb385ceadb237453c28000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639f181b5e1161008c578063ca8b017611610066578063ca8b0176146101d3578063cb00aa73146101db578063cc33c87514610201578063f106845414610248576100cf565b80639f181b5e146101a9578063a6f19c84146101c3578063b87bd481146101cb576100cf565b806317d7de7c146100d4578063245e4bf014610151578063372500ab14610175578063570ca735146101915780635ebaf1db146101995780636a4874a1146101a1575b600080fd5b6100dc610250565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101165781810151838201526020016100fe565b50505050905090810190601f1680156101435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61015961027c565b604080516001600160a01b039092168252519081900360200190f35b61017d6102a0565b604080519115158252519081900360200190f35b610159610b98565b610159610bbc565b610159610be0565b6101b1610bf8565b60408051918252519081900360200190f35b610159610bfe565b61017d610c22565b61017d610fd1565b6101b1600480360360208110156101f157600080fd5b50356001600160a01b031661122d565b61021e6004803603602081101561021757600080fd5b503561123f565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b6101b1611270565b60408051808201909152601281527122bc3a3930a932bbb0b93229ba30b9b42b1960711b602082015290565b7f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d81565b6000336001600160a01b037f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31161461030d576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b610315611294565b6001548015610b905760608167ffffffffffffffff8111801561033757600080fd5b50604051908082528060200260200182016040528015610361578160200160208202803683370190505b50905060005b82811015610438576002816008811061037c57fe5b6003020154604080516370a0823160e01b81526001600160a01b037f000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad8081166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156103eb57600080fd5b505afa1580156103ff573d6000803e3d6000fd5b505050506040513d602081101561041557600080fd5b5051825183908390811061042557fe5b6020908102919091010152600101610367565b507f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b0316636c7b69cb7f00000000000000000000000000000000000000000000000000000000000000197f000000000000000000000000182b723a58739a9c974cfdb385ceadb237453c286040518363ffffffff1660e01b815260040180838152602001826001600160a01b0316815260200192505050602060405180830381600087803b1580156104f057600080fd5b505af1158015610504573d6000803e3d6000fd5b505050506040513d602081101561051a57600080fd5b50600090505b82811015610b8d5760006002826008811061053757fe5b6003020154604080516370a0823160e01b81526001600160a01b037f000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad8081166004830152915191909216925060009183916370a0823191602480820192602092909190829003018186803b1580156105ad57600080fd5b505afa1580156105c1573d6000803e3d6000fd5b505050506040513d60208110156105d757600080fd5b505184519091508490849081106105ea57fe5b60200260200101518111156108b4577f000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad806001600160a01b03166351cff8d9836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b15801561066857600080fd5b505af115801561067c573d6000803e3d6000fd5b50505050426002846008811061068e57fe5b60030201600201819055507f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d6001600160a01b031663b7f927b1837f00000000000000000000000000000000000000000000000000000000000000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050506040513d602081101561075a57600080fd5b505060408051630d5843f760e01b81526001600160a01b03848116600483015291516000927f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d1691630d5843f7916024808301926020929190829003018186803b1580156107c757600080fd5b505afa1580156107db573d6000803e3d6000fd5b505050506040513d60208110156107f157600080fd5b5051905060018111156108ae5760007f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b031663043b684a6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561085b57600080fd5b505af115801561086f573d6000803e3d6000fd5b505050506040513d602081101561088557600080fd5b505190506001600160a01b038116156108ac576108ac6001600160a01b038516828561145c565b505b50610b83565b62093a80600284600881106108c557fe5b60030201600201540142111561099e577f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d6001600160a01b031663ef9126ad837f00000000000000000000000000000000000000000000000000000000000000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561096c57600080fd5b505af1158015610980573d6000803e3d6000fd5b505050506040513d602081101561099657600080fd5b50610b839050565b8015610b83577f000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad806001600160a01b03166351cff8d9836040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b5050505060007f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d6001600160a01b0316630d5843f7846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a9a57600080fd5b505afa158015610aae573d6000803e3d6000fd5b505050506040513d6020811015610ac457600080fd5b505190506001811115610b815760007f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b031663043b684a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b505050506040513d6020811015610b5857600080fd5b505190506001600160a01b03811615610b7f57610b7f6001600160a01b038516828561145c565b505b505b5050600101610520565b50505b600191505090565b7f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae3181565b7f000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad8081565b73d533a949740bb3306d119cc777fa900ba034cd5281565b60015481565b7f000000000000000000000000182b723a58739a9c974cfdb385ceadb237453c2881565b6000336001600160a01b037f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae311614610c8f576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b60005b600154811015610fc957600060028260088110610cab57fe5b6003020180549091506001600160a01b031680610cc9575050610fc1565b62093a808260020154014211610fbe576000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d2857600080fd5b505afa158015610d3c573d6000803e3d6000fd5b505050506040513d6020811015610d5257600080fd5b5051604080516351cff8d960e01b81526001600160a01b03858116600483015291519293507f000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad80909116916351cff8d99160248082019260009290919082900301818387803b158015610dc357600080fd5b505af1158015610dd7573d6000803e3d6000fd5b5050505060007f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d6001600160a01b0316630d5843f7846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e4a57600080fd5b505afa158015610e5e573d6000803e3d6000fd5b505050506040513d6020811015610e7457600080fd5b505190506001811115610fbb576000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ed057600080fd5b505afa158015610ee4573d6000803e3d6000fd5b505050506040513d6020811015610efa57600080fd5b50519050610f0881846114b3565b905060007f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae316001600160a01b031663043b684a6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f6757600080fd5b505af1158015610f7b573d6000803e3d6000fd5b505050506040513d6020811015610f9157600080fd5b505190506001600160a01b03811615610fb857610fb86001600160a01b038616828461145c565b50505b50505b50505b600101610c92565b506001905090565b6000336001600160a01b037f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31161461103e576040805162461bcd60e51b815260206004820152600b60248201526a08585d5d1a1bdc9a5e995960aa1b604482015290519081900360640190fd5b60005b600154811015610fc95760006002826008811061105a57fe5b6003020180549091506001600160a01b031680611078575050611225565b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156110c757600080fd5b505afa1580156110db573d6000803e3d6000fd5b505050506040513d60208110156110f157600080fd5b505190508015611221576001600160a01b03821660009081526020819052604090205461111e9082611510565b6001600160a01b03831660008181526020819052604090209190915573d533a949740bb3306d119cc777fa900ba034cd521415611191576111896001600160a01b0383167f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae318361145c565b505050611225565b60018301546001600160a01b0316806111ad5750505050611225565b6111c16001600160a01b038416828461145c565b806001600160a01b031663590a41f5836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561120757600080fd5b505af115801561121b573d6000803e3d6000fd5b50505050505b5050505b600101611041565b60006020819052908152604090205481565b6002816008811061124c57fe5b60030201805460018201546002909201546001600160a01b03918216935091169083565b7f000000000000000000000000000000000000000000000000000000000000001981565b60005b60088110156114595760007f000000000000000000000000182b723a58739a9c974cfdb385ceadb237453c286001600160a01b03166354c49fe9836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561130657600080fd5b505afa15801561131a573d6000803e3d6000fd5b505050506040513d602081101561133057600080fd5b505190506001600160a01b03811661144657815b600154811015611430577f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d6001600160a01b031663ef9126ad6002836008811061138a57fe5b6003020154604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301527f000000000000000000000000000000000000000000000000000000000000001960248301525160448083019260209291908290030181600087803b1580156113fc57600080fd5b505af1158015611410573d6000803e3d6000fd5b505050506040513d602081101561142657600080fd5b5050600101611344565b5060015482146114405760018290555b50611459565b6114508282611571565b50600101611297565b50565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526114ae90849061180a565b505050565b60008282111561150a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561156a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006002836008811061158057fe5b6003020180549091506001600160a01b039081169083168114611804577f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d6001600160a01b031663ef9126ad827f00000000000000000000000000000000000000000000000000000000000000196040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561163457600080fd5b505af1158015611648573d6000803e3d6000fd5b505050506040513d602081101561165e57600080fd5b505081546001600160a01b0319166001600160a01b0384811691909117835560408051631526fe2760e01b81527f0000000000000000000000000000000000000000000000000000000000000019600482015290516000927f000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae311691631526fe279160248083019260c0929190829003018186803b1580156116fe57600080fd5b505afa158015611712573d6000803e3d6000fd5b505050506040513d60c081101561172857600080fd5b506060015160408051637c6b091760e11b81526001600160a01b038781166004830152808416602483015230604483015291519293506000927f000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d9092169163f8d6122e9160648082019260209290919082900301818787803b1580156117ad57600080fd5b505af11580156117c1573d6000803e3d6000fd5b505050506040513d60208110156117d757600080fd5b50516001850180546001600160a01b0319166001600160a01b039092169190911790555050600060028301555b50505050565b606061185f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118bb9092919063ffffffff16565b8051909150156114ae5780806020019051602081101561187e57600080fd5b50516114ae5760405162461bcd60e51b815260040180806020018281038252602a815260200180611aff602a913960400191505060405180910390fd5b60606118ca84846000856118d2565b949350505050565b6060824710156119135760405162461bcd60e51b8152600401808060200182810382526026815260200180611ad96026913960400191505060405180910390fd5b61191c85611a2e565b61196d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106119ac5780518252601f19909201916020918201910161198d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611a0e576040519150601f19603f3d011682016040523d82523d6000602084013e611a13565b606091505b5091509150611a23828286611a34565b979650505050505050565b3b151590565b60608315611a4357508161156a565b825115611a535782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611a9d578181015183820152602001611a85565b50505050905090810190601f168015611aca5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c0095100d744468d2b71ef33fec4990219fcd72842896f9d255e307a76429d6f64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad80000000000000000000000000182b723a58739a9c974cfdb385ceadb237453c28000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d
-----Decoded View---------------
Arg [0] : _pid (uint256): 25
Arg [1] : _operator (address): 0xF403C135812408BFbE8713b5A23a04b3D48AAE31
Arg [2] : _staker (address): 0x989AEb4d175e16225E39E87d0D97A3360524AD80
Arg [3] : _gauge (address): 0x182B723a58739a9c974cFDB385ceaDb237453c28
Arg [4] : _rFactory (address): 0xEdCCB35798fae4925718A43cc608aE136208aa8D
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [1] : 000000000000000000000000f403c135812408bfbe8713b5a23a04b3d48aae31
Arg [2] : 000000000000000000000000989aeb4d175e16225e39e87d0d97a3360524ad80
Arg [3] : 000000000000000000000000182b723a58739a9c974cfdb385ceadb237453c28
Arg [4] : 000000000000000000000000edccb35798fae4925718a43cc608ae136208aa8d
Deployed Bytecode Sourcemap
28110:9014:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29149:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28579:38;;;:::i;:::-;;;;-1:-1:-1;;;;;28579:38:0;;;;;;;;;;;;;;29318:3735;;;:::i;:::-;;;;;;;;;;;;;;;;;;28464:33;;;:::i;28504:31::-;;;:::i;28245:81::-;;;:::i;28810:25::-;;;:::i;:::-;;;;;;;;;;;;;;;;28542:30;;;:::i;34616:1430::-;;;:::i;36110:1009::-;;;:::i;28629:52::-;;;;;;;;;;;;;;;;-1:-1:-1;28629:52:0;-1:-1:-1;;;;;28629:52:0;;:::i;28842:38::-;;;;;;;;;;;;;;;;-1:-1:-1;28842:38:0;;:::i;:::-;;;;-1:-1:-1;;;;;28842:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28429:28;;;:::i;29149:103::-;29217:27;;;;;;;;;;;;-1:-1:-1;;;29217:27:0;;;;29149:103;:::o;28579:38::-;;;:::o;29318:3735::-;29360:4;29385:10;-1:-1:-1;;;;;29399:8:0;29385:22;;29377:46;;;;;-1:-1:-1;;;29377:46:0;;;;;;;;;;;;-1:-1:-1;;;29377:46:0;;;;;;;;;;;;;;;29508:25;:23;:25::i;:::-;29563:10;;29587;;29584:3440;;29664:25;29706:6;29692:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29692:21:0;;29664:49;;29732:9;29728:126;29749:6;29745:1;:10;29728:126;;;29801:9;29811:1;29801:12;;;;;;;;;;:18;29794:44;;;-1:-1:-1;;;29794:44:0;;-1:-1:-1;;;;;29831:6:0;29794:44;;;;;;;;29801:18;;;;;29794:36;;:44;;;;;;;;;;;;;;29801:18;29794:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29794:44:0;29780:11;;:8;;29789:1;;29780:11;;;;;;;;;;;;;;;:58;29757:3;;29728:126;;;;30028:8;-1:-1:-1;;;;;30019:31:0;;30051:3;30055:5;30019:42;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30019:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30082:9:0;;-1:-1:-1;30078:2935:0;30099:6;30095:1;:10;30078:2935;;;30130:13;30146:9;30156:1;30146:12;;;;;;;;;;:18;30204:31;;;-1:-1:-1;;;30204:31:0;;-1:-1:-1;;;;;30228:6:0;30204:31;;;;;;;;30146:18;;;;;-1:-1:-1;;;30146:18:0;;30204:23;;:31;;;;;;;;;;;;;;;30146:18;30204:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30204:31:0;30316:11;;30204:31;;-1:-1:-1;30316:8:0;;30325:1;;30316:11;;;;;;;;;;;;30303:10;:24;30300:2698;;;30359:6;-1:-1:-1;;;;;30351:24:0;;30376:5;30351:31;;;;;;;;;;;;;-1:-1:-1;;;;;30351:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30435:15;30405:9;30415:1;30405:12;;;;;;;;;;:27;;:45;;;;30552:13;-1:-1:-1;;;;;30537:45:0;;30583:5;30589:3;30537:56;;;;;;;;;;;;;-1:-1:-1;;;;;30537:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30829:54:0;;;-1:-1:-1;;;30829:54:0;;-1:-1:-1;;;;;30829:54:0;;;;;;;;;30807:19;;30844:13;30829:47;;;;:54;;;;;30537:56;;30829:54;;;;;;;:47;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30829:54:0;;-1:-1:-1;30923:1:0;30909:15;;30906:316;;;30998:11;31021:8;-1:-1:-1;;;;;31012:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31012:37:0;;-1:-1:-1;;;;;;31079:17:0;;;31076:123;;31128:43;-1:-1:-1;;;;;31128:26:0;;31155:3;31160:10;31128:26;:43::i;:::-;30906:316;;30300:2698;;;;28411:9;31362;31372:1;31362:12;;;;;;;;;;:27;;;:34;31344:15;:52;31341:1638;;;31482:13;-1:-1:-1;;;;;31467:48:0;;31516:5;31522:3;31467:59;;;;;;;;;;;;;-1:-1:-1;;;;;31467:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31341:1638:0;;-1:-1:-1;31341:1638:0;;31650:14;;31647:1309;;32402:6;-1:-1:-1;;;;;32394:24:0;;32419:5;32394:31;;;;;;;;;;;;;-1:-1:-1;;;;;32394:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32458:19;32495:13;-1:-1:-1;;;;;32480:47:0;;32528:5;32480:54;;;;;;;;;;;;;-1:-1:-1;;;;;32480:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32480:54:0;;-1:-1:-1;32582:1:0;32568:15;;32565:364;;;32673:11;32696:8;-1:-1:-1;;;;;32687:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32687:37:0;;-1:-1:-1;;;;;;32762:17:0;;;32759:139;;32819:43;-1:-1:-1;;;;;32819:26:0;;32846:3;32851:10;32819:26;:43::i;:::-;32565:364;;31647:1309;;-1:-1:-1;;30107:3:0;;30078:2935;;;;29584:3440;;33041:4;33034:11;;;29318:3735;:::o;28464:33::-;;;:::o;28504:31::-;;;:::o;28245:81::-;28283:42;28245:81;:::o;28810:25::-;;;;:::o;28542:30::-;;;:::o;34616:1430::-;34657:4;34681:10;-1:-1:-1;;;;;34695:8:0;34681:22;;34673:46;;;;;-1:-1:-1;;;34673:46:0;;;;;;;;;;;;-1:-1:-1;;;34673:46:0;;;;;;;;;;;;;;;34888:6;34884:1133;34902:10;;34898:1;:14;34884:1133;;;34933:19;34955:9;34965:1;34955:12;;;;;;;;;;34998:7;;34955:12;;-1:-1:-1;;;;;;34998:7:0;35023:19;35020:32;;35044:8;;;;35020:32;28411:9;35151:1;:16;;;:23;35132:15;:42;35129:877;;35194:14;35218:5;-1:-1:-1;;;;;35211:23:0;;35243:4;35211:38;;;;;;;;;;;;;-1:-1:-1;;;;;35211:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35211:38:0;35268:31;;;-1:-1:-1;;;35268:31:0;;-1:-1:-1;;;;;35268:31:0;;;;;;;;;35211:38;;-1:-1:-1;35276:6:0;35268:24;;;;;;:31;;;;;-1:-1:-1;;35268:31:0;;;;;;;;-1:-1:-1;35268:24:0;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35401:19;35438:13;-1:-1:-1;;;;;35423:47:0;;35471:5;35423:54;;;;;;;;;;;;;-1:-1:-1;;;;;35423:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35423:54:0;;-1:-1:-1;35513:1:0;35499:15;;35496:495;;;35615:14;35639:5;-1:-1:-1;;;;;35632:23:0;;35664:4;35632:38;;;;;;;;;;;;;-1:-1:-1;;;;;35632:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35632:38:0;;-1:-1:-1;35702:18:0;35632:38;35713:6;35702:10;:18::i;:::-;35693:27;;35787:11;35810:8;-1:-1:-1;;;;;35801:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35801:37:0;;-1:-1:-1;;;;;;35864:17:0;;;35861:111;;35909:39;-1:-1:-1;;;;;35909:26:0;;35936:3;35941:6;35909:26;:39::i;:::-;35496:495;;;35129:877;;;34884:1133;;;34914:3;;34884:1133;;;;36034:4;36027:11;;34616:1430;:::o;36110:1009::-;36151:4;36175:10;-1:-1:-1;;;;;36189:8:0;36175:22;;36167:46;;;;;-1:-1:-1;;;36167:46:0;;;;;;;;;;;;-1:-1:-1;;;36167:46:0;;;;;;;;;;;;;;;36230:6;36226:864;36244:10;;36240:1;:14;36226:864;;;36275:19;36297:9;36307:1;36297:12;;;;;;;;;;36340:7;;36297:12;;-1:-1:-1;;;;;;36340:7:0;36365:19;36362:32;;36386:8;;;;36362:32;36423:14;36447:5;-1:-1:-1;;;;;36440:23:0;;36472:4;36440:38;;;;;;;;;;;;;-1:-1:-1;;;;;36440:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36440:38:0;;-1:-1:-1;36497:10:0;;36493:586;;-1:-1:-1;;;;;36555:24:0;;:17;:24;;;;;;;;;;;:36;;36584:6;36555:28;:36::i;:::-;-1:-1:-1;;;;;36528:24:0;;:17;:24;;;;;;;;;;:63;;;;28283:42;36613:12;36610:200;;;36715:44;-1:-1:-1;;;;;36715:26:0;;36742:8;36752:6;36715:26;:44::i;:::-;36782:8;;;;;36610:200;36882:15;;;;-1:-1:-1;;;;;36882:15:0;36916:21;36913:34;;36939:8;;;;;;36913:34;36963:43;-1:-1:-1;;;;;36963:26:0;;36990:7;36999:6;36963:26;:43::i;:::-;37031:7;-1:-1:-1;;;;;37022:33:0;;37056:6;37022:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36493:586;;36226:864;;;;36256:3;;36226:864;;28629:52;;;;;;;;;;;;;;:::o;28842:38::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28842:38:0;;;;-1:-1:-1;28842:38:0;;;;:::o;28429:28::-;;;:::o;33109:561::-;33168:9;33164:499;28371:1;33183;:14;33164:499;;;33218:13;33246:5;-1:-1:-1;;;;;33234:32:0;;33267:1;33234:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33234:35:0;;-1:-1:-1;;;;;;33288:19:0;;33284:335;;33345:1;33328:156;33352:10;;33348:1;:14;33328:156;;;33407:13;-1:-1:-1;;;;;33392:48:0;;33441:9;33451:1;33441:12;;;;;;;;;;:18;33392:72;;;-1:-1:-1;;;;;;33392:72:0;;;;;;;-1:-1:-1;;;;;33441:18:0;;;33392:72;;;;33460:3;33392:72;;;;;;;;;;;;;;;;;;;33441:18;33392:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33364:3:0;;33328:156;;;;33511:10;;33506:1;:15;33502:78;;33546:10;:14;;;33502:78;33598:5;;;33284:335;33633:18;33642:1;33645:5;33633:8;:18::i;:::-;-1:-1:-1;33199:3:0;;33164:499;;;;33109:561::o;24992:177::-;25102:58;;;-1:-1:-1;;;;;25102:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25102:58:0;-1:-1:-1;;;25102:58:0;;;25075:86;;25095:5;;25075:19;:86::i;:::-;24992:177;;;:::o;9293:158::-;9351:7;9384:1;9379;:6;;9371:49;;;;;-1:-1:-1;;;9371:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9438:5:0;;;9293:158::o;8831:179::-;8889:7;8921:5;;;8945:6;;;;8937:46;;;;;-1:-1:-1;;;8937:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9001:1;8831:179;-1:-1:-1;;;8831:179:0:o;33715:844::-;33783:19;33805:9;33815:4;33805:15;;;;;;;;;;33854:7;;33805:15;;-1:-1:-1;;;;;;33854:7:0;;;;33875:22;;;;33872:680;;33963:13;-1:-1:-1;;;;;33948:48:0;;33997:12;34010:3;33948:66;;;;;;;;;;;;;-1:-1:-1;;;;;33948:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34064:16:0;;-1:-1:-1;;;;;;34064:16:0;-1:-1:-1;;;;;34064:16:0;;;;;;;;;34179:32;;;-1:-1:-1;;;34179:32:0;;34207:3;34179:32;;;;;;-1:-1:-1;;34188:8:0;34179:27;;;;:32;;;;;;;;;;;;;;:27;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34179:32:0;;;;34251:143;;-1:-1:-1;;;34251:143:0;;-1:-1:-1;;;;;34251:143:0;;;;;;;;;;;;;;34388:4;34251:143;;;;;;34179:32;;-1:-1:-1;;;34266:13:0;34251:48;;;;;;:143;;;;;34179:32;;34251:143;;;;;;;;-1:-1:-1;34251:48:0;:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34251:143:0;34409:15;;;:32;;-1:-1:-1;;;;;;34409:32:0;-1:-1:-1;;;;;34409:32:0;;;;;;;;;-1:-1:-1;;;34456:16:0;;;:20;33872:680;33715:844;;;;:::o;27297:761::-;27721:23;27747:69;27775:4;27747:69;;;;;;;;;;;;;;;;;27755:5;-1:-1:-1;;;;;27747:27:0;;;:69;;;;;:::i;:::-;27831:17;;27721:95;;-1:-1:-1;27831:21:0;27827:224;;27973:10;27962:30;;;;;;;;;;;;;;;-1:-1:-1;27962:30:0;27954:85;;;;-1:-1:-1;;;27954:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19993:195;20096:12;20128:52;20150:6;20158:4;20164:1;20167:12;20128:21;:52::i;:::-;20121:59;19993:195;-1:-1:-1;;;;19993:195:0:o;21045:530::-;21172:12;21230:5;21205:21;:30;;21197:81;;;;-1:-1:-1;;;21197:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21297:18;21308:6;21297:10;:18::i;:::-;21289:60;;;;;-1:-1:-1;;;21289:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21423:12;21437:23;21464:6;-1:-1:-1;;;;;21464:11:0;21484:5;21492:4;21464:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21464:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21422:75;;;;21515:52;21533:7;21542:10;21554:12;21515:17;:52::i;:::-;21508:59;21045:530;-1:-1:-1;;;;;;;21045:530:0:o;17075:422::-;17442:20;17481:8;;;17075:422::o;23585:742::-;23700:12;23729:7;23725:595;;;-1:-1:-1;23760:10:0;23753:17;;23725:595;23874:17;;:21;23870:439;;24137:10;24131:17;24198:15;24185:10;24181:2;24177:19;24170:44;24085:148;24280:12;24273:20;;-1:-1:-1;;;24273:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://c0095100d744468d2b71ef33fec4990219fcd72842896f9d255e307a76429d6f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.