Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RouterModuleClaim
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {IAccountant} from "@strategies/src/interfaces/IAccountant.sol";
import {IRewardVault} from "@strategies/src/interfaces/IRewardVault.sol";
import {RouterModuleBase} from "src/router/modules/RouterModuleBase.sol";
/// @title RouterModuleClaim
/// @notice Router module for claiming and harvesting rewards of Staking v2
contract RouterModuleClaim is RouterModuleBase {
string public constant name = type(RouterModuleClaim).name;
string public constant version = "1.0.0";
address public immutable ACCOUNTANT;
error ZeroAddress();
constructor(address accountant) RouterModuleBase() {
require(accountant != address(0), ZeroAddress());
ACCOUNTANT = accountant;
}
/// @notice Harvest rewards from the accountant contract to the caller
/// @param _gauges The array of gauges to harvest from
/// @param _harvestData The array of harvest data to harvest
function harvest(address[] calldata _gauges, bytes[] calldata _harvestData) external onlyDelegateCall {
IAccountant(ACCOUNTANT).harvest(_gauges, _harvestData, msg.sender);
}
/// @notice Harvest rewards from the accountant contract to the router for composition
/// @param _gauges The array of gauges to harvest from
/// @param _harvestData The array of harvest data to harvest
function harvestFor(address[] calldata _gauges, bytes[] calldata _harvestData) external onlyDelegateCall {
IAccountant(ACCOUNTANT).harvest(_gauges, _harvestData, address(this));
}
/// @notice Claim rewards from the reward vault to the caller
/// @param rewardVault The address of the reward vault to call
/// @param tokens The array of tokens to claim
/// @return amounts The array of amounts claimed for each token
function claim(address rewardVault, address[] calldata tokens)
external
onlyDelegateCall
returns (uint256[] memory amounts)
{
amounts = IRewardVault(rewardVault).claim(msg.sender, tokens, msg.sender);
}
/// @notice Claim rewards from the reward vault to the router for composition
/// @param rewardVault The address of the reward vault to call
/// @param tokens The array of tokens to claim
/// @return amounts The array of amounts claimed for each token
function claimFor(address rewardVault, address[] calldata tokens)
external
onlyDelegateCall
returns (uint256[] memory amounts)
{
amounts = IRewardVault(rewardVault).claim(msg.sender, tokens, address(this));
}
/// @notice Claim rewards from accountant contract to the caller
/// @param _gauges The array of gauges to claim from
/// @param harvestData The array of harvest data to claim
function claim(address[] calldata _gauges, bytes[] calldata harvestData) external onlyDelegateCall {
IAccountant(ACCOUNTANT).claim(_gauges, msg.sender, harvestData, msg.sender);
}
/// @notice Claim rewards from accountant contract to the router for composition
/// @param _gauges The array of gauges to claim from
/// @param harvestData The array of harvest data to claim
function claimFor(address[] calldata _gauges, bytes[] calldata harvestData) external onlyDelegateCall {
IAccountant(ACCOUNTANT).claim(_gauges, msg.sender, harvestData, address(this));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import {IStrategy} from "@interfaces/stake-dao/IStrategyV2.sol";
interface IAccountant {
function checkpoint(
address gauge,
address from,
address to,
uint128 amount,
IStrategy.PendingRewards calldata pendingRewards,
IStrategy.HarvestPolicy policy
) external;
function checkpoint(
address gauge,
address from,
address to,
uint128 amount,
IStrategy.PendingRewards calldata pendingRewards,
IStrategy.HarvestPolicy policy,
address referrer
) external;
function totalSupply(address asset) external view returns (uint128);
function balanceOf(address asset, address account) external view returns (uint128);
function claim(address[] calldata _gauges, bytes[] calldata harvestData) external;
function claim(address[] calldata _gauges, bytes[] calldata harvestData, address receiver) external;
function claim(address[] calldata _gauges, address account, bytes[] calldata harvestData, address receiver) external;
function claimProtocolFees() external;
function harvest(address[] calldata _gauges, bytes[] calldata _harvestData, address _receiver) external;
function REWARD_TOKEN() external view returns (address);
function getPendingRewards(address vault) external view returns (uint128);
function getPendingRewards(address vault, address account) external view returns (uint256);
function SCALING_FACTOR() external view returns (uint128);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
import {IAccountant} from "./IAccountant.sol";
import {IProtocolController} from "./IProtocolController.sol";
/// @title IRewardVault
/// @notice Interface for the RewardVault contract
interface IRewardVault is IERC4626 {
function addRewardToken(address rewardsToken, address distributor) external;
function depositRewards(address _rewardsToken, uint128 _amount) external;
function deposit(uint256 assets, address receiver, address referrer) external returns (uint256 shares);
function deposit(address account, address receiver, uint256 assets, address referrer)
external
returns (uint256 shares);
function claim(address[] calldata tokens, address receiver) external returns (uint256[] memory amounts);
function claim(address account, address[] calldata tokens, address receiver)
external
returns (uint256[] memory amounts);
function getRewardsDistributor(address token) external view returns (address);
function getLastUpdateTime(address token) external view returns (uint32);
function getPeriodFinish(address token) external view returns (uint32);
function getRewardRate(address token) external view returns (uint128);
function getRewardPerTokenStored(address token) external view returns (uint128);
function getRewardPerTokenPaid(address token, address account) external view returns (uint128);
function getClaimable(address token, address account) external view returns (uint128);
function getRewardTokens() external view returns (address[] memory);
function lastTimeRewardApplicable(address token) external view returns (uint256);
function rewardPerToken(address token) external view returns (uint128);
function earned(address account, address token) external view returns (uint128);
function isRewardToken(address rewardToken) external view returns (bool);
function resumeVault() external;
function gauge() external view returns (address);
function ACCOUNTANT() external view returns (IAccountant);
function checkpoint(address account) external;
function PROTOCOL_ID() external view returns (bytes4);
function PROTOCOL_CONTROLLER() external view returns (IProtocolController);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {IRouterModule} from "src/router/interfaces/IRouterModule.sol";
/// @title RouterModuleBase
/// @notice An abstract contract that serves as the base for all router modules
/// @dev Exposes the onlyDelegateCall modifier to restrict functions to be called only by delegatecall
abstract contract RouterModuleBase is IRouterModule {
address private immutable THIS;
error OnlyDelegateCall();
constructor() {
THIS = address(this);
}
modifier onlyDelegateCall() {
require(address(this) != THIS, OnlyDelegateCall());
_;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {IAllocator} from "./IAllocatorV2.sol";
interface IStrategy {
/// @notice The policy for harvesting rewards.
enum HarvestPolicy {
CHECKPOINT,
HARVEST
}
struct PendingRewards {
uint128 feeSubjectAmount;
uint128 totalAmount;
}
function deposit(IAllocator.Allocation calldata allocation, HarvestPolicy policy)
external
returns (PendingRewards memory pendingRewards);
function withdraw(IAllocator.Allocation calldata allocation, HarvestPolicy policy, address receiver)
external
returns (PendingRewards memory pendingRewards);
function balanceOf(address gauge) external view returns (uint256 balance);
function harvest(address gauge, bytes calldata extraData) external returns (PendingRewards memory pendingRewards);
function flush() external;
function shutdown(address gauge) external;
function rebalance(address gauge) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC4626.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../token/ERC20/IERC20.sol";
import {IERC20Metadata} from "../token/ERC20/extensions/IERC20Metadata.sol";
/**
* @dev Interface of the ERC-4626 "Tokenized Vault Standard", as defined in
* https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].
*/
interface IERC4626 is IERC20, IERC20Metadata {
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);
event Withdraw(
address indexed sender,
address indexed receiver,
address indexed owner,
uint256 assets,
uint256 shares
);
/**
* @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
*
* - MUST be an ERC-20 token contract.
* - MUST NOT revert.
*/
function asset() external view returns (address assetTokenAddress);
/**
* @dev Returns the total amount of the underlying asset that is “managed” by Vault.
*
* - SHOULD include any compounding that occurs from yield.
* - MUST be inclusive of any fees that are charged against assets in the Vault.
* - MUST NOT revert.
*/
function totalAssets() external view returns (uint256 totalManagedAssets);
/**
* @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal
* scenario where all the conditions are met.
*
* - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
* - MUST NOT show any variations depending on the caller.
* - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
* - MUST NOT revert.
*
* NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
* “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
* from.
*/
function convertToShares(uint256 assets) external view returns (uint256 shares);
/**
* @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal
* scenario where all the conditions are met.
*
* - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
* - MUST NOT show any variations depending on the caller.
* - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
* - MUST NOT revert.
*
* NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
* “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
* from.
*/
function convertToAssets(uint256 shares) external view returns (uint256 assets);
/**
* @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
* through a deposit call.
*
* - MUST return a limited value if receiver is subject to some deposit limit.
* - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
* - MUST NOT revert.
*/
function maxDeposit(address receiver) external view returns (uint256 maxAssets);
/**
* @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
* current on-chain conditions.
*
* - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
* call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
* in the same transaction.
* - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
* deposit would be accepted, regardless if the user has enough tokens approved, etc.
* - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
* - MUST NOT revert.
*
* NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
* share price or some other type of condition, meaning the depositor will lose assets by depositing.
*/
function previewDeposit(uint256 assets) external view returns (uint256 shares);
/**
* @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
*
* - MUST emit the Deposit event.
* - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
* deposit execution, and are accounted for during deposit.
* - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
* approving enough underlying tokens to the Vault contract, etc).
*
* NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
*/
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
/**
* @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
* - MUST return a limited value if receiver is subject to some mint limit.
* - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
* - MUST NOT revert.
*/
function maxMint(address receiver) external view returns (uint256 maxShares);
/**
* @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
* current on-chain conditions.
*
* - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
* in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
* same transaction.
* - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
* would be accepted, regardless if the user has enough tokens approved, etc.
* - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
* - MUST NOT revert.
*
* NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
* share price or some other type of condition, meaning the depositor will lose assets by minting.
*/
function previewMint(uint256 shares) external view returns (uint256 assets);
/**
* @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
*
* - MUST emit the Deposit event.
* - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
* execution, and are accounted for during mint.
* - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
* approving enough underlying tokens to the Vault contract, etc).
*
* NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
*/
function mint(uint256 shares, address receiver) external returns (uint256 assets);
/**
* @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
* Vault, through a withdraw call.
*
* - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
* - MUST NOT revert.
*/
function maxWithdraw(address owner) external view returns (uint256 maxAssets);
/**
* @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
* given current on-chain conditions.
*
* - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
* call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
* called
* in the same transaction.
* - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
* the withdrawal would be accepted, regardless if the user has enough shares, etc.
* - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
* - MUST NOT revert.
*
* NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
* share price or some other type of condition, meaning the depositor will lose assets by depositing.
*/
function previewWithdraw(uint256 assets) external view returns (uint256 shares);
/**
* @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.
*
* - MUST emit the Withdraw event.
* - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
* withdraw execution, and are accounted for during withdraw.
* - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
* not having enough shares, etc).
*
* Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
* Those methods should be performed separately.
*/
function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);
/**
* @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
* through a redeem call.
*
* - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
* - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
* - MUST NOT revert.
*/
function maxRedeem(address owner) external view returns (uint256 maxShares);
/**
* @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
* given current on-chain conditions.
*
* - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
* in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
* same transaction.
* - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
* redemption would be accepted, regardless if the user has enough shares, etc.
* - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
* - MUST NOT revert.
*
* NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
* share price or some other type of condition, meaning the depositor will lose assets by redeeming.
*/
function previewRedeem(uint256 shares) external view returns (uint256 assets);
/**
* @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.
*
* - MUST emit the Withdraw event.
* - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
* redeem execution, and are accounted for during redeem.
* - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
* not having enough shares, etc).
*
* NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
* Those methods should be performed separately.
*/
function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
}/// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
interface IProtocolController {
function vault(address) external view returns (address);
function asset(address) external view returns (address);
function rewardReceiver(address) external view returns (address);
function allowed(address, address, bytes4 selector) external view returns (bool);
function permissionSetters(address) external view returns (bool);
function isRegistrar(address) external view returns (bool);
function locker(bytes4 protocolId) external view returns (address);
function gateway(bytes4 protocolId) external view returns (address);
function strategy(bytes4 protocolId) external view returns (address);
function allocator(bytes4 protocolId) external view returns (address);
function accountant(bytes4 protocolId) external view returns (address);
function feeReceiver(bytes4 protocolId) external view returns (address);
function factory(bytes4 protocolId) external view returns (address);
function isPaused(bytes4) external view returns (bool);
function isShutdown(address) external view returns (bool);
function registerVault(address _gauge, address _vault, address _asset, address _rewardReceiver, bytes4 _protocolId)
external;
function setValidAllocationTarget(address _gauge, address _target) external;
function removeValidAllocationTarget(address _gauge, address _target) external;
function isValidAllocationTarget(address _gauge, address _target) external view returns (bool);
function pause(bytes4 protocolId) external;
function unpause(bytes4 protocolId) external;
function shutdown(address _gauge) external;
function unshutdown(address _gauge) external;
function setPermissionSetter(address _setter, bool _allowed) external;
function setPermission(address _contract, address _caller, bytes4 _selector, bool _allowed) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
interface IRouterModule {
function name() external view returns (string memory name);
function version() external view returns (string memory version);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
interface IAllocator {
struct Allocation {
address asset;
address gauge;
address[] targets;
uint256[] amounts;
}
function getDepositAllocation(address asset, address gauge, uint256 amount)
external
view
returns (Allocation memory);
function getWithdrawalAllocation(address asset, address gauge, uint256 amount)
external
view
returns (Allocation memory);
function getRebalancedAllocation(address asset, address gauge, uint256 amount)
external
view
returns (Allocation memory);
function getAllocationTargets(address gauge) external view returns (address[] memory);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}{
"remappings": [
"forge-std/=node_modules/forge-std/",
"@shared/=node_modules/@stake-dao/shared/",
"@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
"@interfaces/=node_modules/@stake-dao/interfaces/src/interfaces/",
"@address-book/=node_modules/@stake-dao/address-book/",
"@strategies/=node_modules/@stake-dao/strategies/",
"@lockers/=node_modules/@stake-dao/lockers/",
"@safe/=node_modules/@stake-dao/strategies/node_modules/@safe-global/safe-smart-account/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"accountant","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyDelegateCall","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ACCOUNTANT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rewardVault","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"claim","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"bytes[]","name":"harvestData","type":"bytes[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"bytes[]","name":"harvestData","type":"bytes[]"}],"name":"claimFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rewardVault","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"claimFor","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"bytes[]","name":"_harvestData","type":"bytes[]"}],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gauges","type":"address[]"},{"internalType":"bytes[]","name":"_harvestData","type":"bytes[]"}],"name":"harvestFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c060405234801561000f575f5ffd5b50604051610b1d380380610b1d83398101604081905261002e9161006a565b306080526001600160a01b0381166100595760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b031660a052610097565b5f6020828403121561007a575f5ffd5b81516001600160a01b0381168114610090575f5ffd5b9392505050565b60805160a051610a266100f75f395f81816101180152818161021e01528181610434015281816104d1015261057001525f81816101c80152818161029c01528181610363015281816103de0152818161047b015261051a0152610a265ff3fe608060405234801561000f575f5ffd5b5060043610610090575f3560e01c80638e2eba09116100635780638e2eba091461015257806394ec36a7146101725780639a06d97614610185578063ef933df014610198578063fb7d3700146101ab575f5ffd5b806306fdde031461009457806333cbb6d9146100da57806354fd4d50146100ef5780638b9d294014610113575b5f5ffd5b6100c460405180604001604052601181528060200170526f757465724d6f64756c65436c61696d60781b81525081565b6040516100d191906105ad565b60405180910390f35b6100ed6100e836600461062a565b6101be565b005b6100c4604051806040016040528060058152602001640312e302e360dc1b81525081565b61013a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100d1565b6101656101603660046106b1565b610290565b6040516100d19190610700565b6101656101803660046106b1565b610357565b6100ed61019336600461062a565b6103d4565b6100ed6101a636600461062a565b610471565b6100ed6101b936600461062a565b610510565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361020757604051633c64f99360e21b815260040160405180910390fd5b604051637427cc1b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e84f98369061025d90879087903390889088903090600401610845565b5f604051808303815f87803b158015610274575f5ffd5b505af1158015610286573d5f5f3e3d5ffd5b5050505050505050565b60606001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036102db57604051633c64f99360e21b815260040160405180910390fd5b60405163027f859160e41b81526001600160a01b038516906327f859109061030d903390879087908390600401610896565b5f604051808303815f875af1158015610328573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261034f91908101906108e7565b949350505050565b60606001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036103a257604051633c64f99360e21b815260040160405180910390fd5b60405163027f859160e41b81526001600160a01b038516906327f859109061030d903390879087903090600401610896565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361041d57604051633c64f99360e21b815260040160405180910390fd5b6040516323e524f160e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638f9493c49061025d90879087908790879033906004016109af565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104ba57604051633c64f99360e21b815260040160405180910390fd5b604051637427cc1b60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e84f98369061025d90879087903390889088908390600401610845565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361055957604051633c64f99360e21b815260040160405180910390fd5b6040516323e524f160e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638f9493c49061025d90879087908790879030906004016109af565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126105f2575f5ffd5b50813567ffffffffffffffff811115610609575f5ffd5b6020830191508360208260051b8501011115610623575f5ffd5b9250929050565b5f5f5f5f6040858703121561063d575f5ffd5b843567ffffffffffffffff811115610653575f5ffd5b61065f878288016105e2565b909550935050602085013567ffffffffffffffff81111561067e575f5ffd5b61068a878288016105e2565b95989497509550505050565b80356001600160a01b03811681146106ac575f5ffd5b919050565b5f5f5f604084860312156106c3575f5ffd5b6106cc84610696565b9250602084013567ffffffffffffffff8111156106e7575f5ffd5b6106f3868287016105e2565b9497909650939450505050565b602080825282518282018190525f918401906040840190835b81811015610737578351835260209384019390920191600101610719565b509095945050505050565b8183526020830192505f815f5b8481101561077e576001600160a01b0361076883610696565b168652602095860195919091019060010161074f565b5093949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208501945060208460051b820101835f5b8681101561083957838303601f19018852813536879003601e190181126107ec575f5ffd5b860160208101903567ffffffffffffffff811115610808575f5ffd5b803603821315610816575f5ffd5b610821858284610788565b60209a8b019a909550939093019250506001016107c7565b50909695505050505050565b608081525f61085860808301888a610742565b6001600160a01b0387166020840152828103604084015261087a8186886107b0565b91505060018060a01b0383166060830152979650505050505050565b6001600160a01b03851681526060602082018190525f906108ba9083018587610742565b905060018060a01b038316604083015295945050505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156108f7575f5ffd5b815167ffffffffffffffff81111561090d575f5ffd5b8201601f8101841361091d575f5ffd5b805167ffffffffffffffff811115610937576109376108d3565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715610964576109646108d3565b604052918252602081840181019290810187841115610981575f5ffd5b6020850194505b838510156109a457845180825260209586019590935001610988565b509695505050505050565b606081525f6109c2606083018789610742565b82810360208401526109d58186886107b0565b91505060018060a01b0383166040830152969550505050505056fea2646970667358221220c3e55775f82cf64cffb13969c7e4e94b2667173c11ed245951be50711a185ff164736f6c634300081c003300000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce0
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610090575f3560e01c80638e2eba09116100635780638e2eba091461015257806394ec36a7146101725780639a06d97614610185578063ef933df014610198578063fb7d3700146101ab575f5ffd5b806306fdde031461009457806333cbb6d9146100da57806354fd4d50146100ef5780638b9d294014610113575b5f5ffd5b6100c460405180604001604052601181528060200170526f757465724d6f64756c65436c61696d60781b81525081565b6040516100d191906105ad565b60405180910390f35b6100ed6100e836600461062a565b6101be565b005b6100c4604051806040016040528060058152602001640312e302e360dc1b81525081565b61013a7f00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce081565b6040516001600160a01b0390911681526020016100d1565b6101656101603660046106b1565b610290565b6040516100d19190610700565b6101656101803660046106b1565b610357565b6100ed61019336600461062a565b6103d4565b6100ed6101a636600461062a565b610471565b6100ed6101b936600461062a565b610510565b6001600160a01b037f0000000000000000000000001c23b547b54edef64ed9a47a0843296f0dbf31bb16300361020757604051633c64f99360e21b815260040160405180910390fd5b604051637427cc1b60e11b81526001600160a01b037f00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce0169063e84f98369061025d90879087903390889088903090600401610845565b5f604051808303815f87803b158015610274575f5ffd5b505af1158015610286573d5f5f3e3d5ffd5b5050505050505050565b60606001600160a01b037f0000000000000000000000001c23b547b54edef64ed9a47a0843296f0dbf31bb1630036102db57604051633c64f99360e21b815260040160405180910390fd5b60405163027f859160e41b81526001600160a01b038516906327f859109061030d903390879087908390600401610896565b5f604051808303815f875af1158015610328573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261034f91908101906108e7565b949350505050565b60606001600160a01b037f0000000000000000000000001c23b547b54edef64ed9a47a0843296f0dbf31bb1630036103a257604051633c64f99360e21b815260040160405180910390fd5b60405163027f859160e41b81526001600160a01b038516906327f859109061030d903390879087903090600401610896565b6001600160a01b037f0000000000000000000000001c23b547b54edef64ed9a47a0843296f0dbf31bb16300361041d57604051633c64f99360e21b815260040160405180910390fd5b6040516323e524f160e21b81526001600160a01b037f00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce01690638f9493c49061025d90879087908790879033906004016109af565b6001600160a01b037f0000000000000000000000001c23b547b54edef64ed9a47a0843296f0dbf31bb1630036104ba57604051633c64f99360e21b815260040160405180910390fd5b604051637427cc1b60e11b81526001600160a01b037f00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce0169063e84f98369061025d90879087903390889088908390600401610845565b6001600160a01b037f0000000000000000000000001c23b547b54edef64ed9a47a0843296f0dbf31bb16300361055957604051633c64f99360e21b815260040160405180910390fd5b6040516323e524f160e21b81526001600160a01b037f00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce01690638f9493c49061025d90879087908790879030906004016109af565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126105f2575f5ffd5b50813567ffffffffffffffff811115610609575f5ffd5b6020830191508360208260051b8501011115610623575f5ffd5b9250929050565b5f5f5f5f6040858703121561063d575f5ffd5b843567ffffffffffffffff811115610653575f5ffd5b61065f878288016105e2565b909550935050602085013567ffffffffffffffff81111561067e575f5ffd5b61068a878288016105e2565b95989497509550505050565b80356001600160a01b03811681146106ac575f5ffd5b919050565b5f5f5f604084860312156106c3575f5ffd5b6106cc84610696565b9250602084013567ffffffffffffffff8111156106e7575f5ffd5b6106f3868287016105e2565b9497909650939450505050565b602080825282518282018190525f918401906040840190835b81811015610737578351835260209384019390920191600101610719565b509095945050505050565b8183526020830192505f815f5b8481101561077e576001600160a01b0361076883610696565b168652602095860195919091019060010161074f565b5093949350505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208501945060208460051b820101835f5b8681101561083957838303601f19018852813536879003601e190181126107ec575f5ffd5b860160208101903567ffffffffffffffff811115610808575f5ffd5b803603821315610816575f5ffd5b610821858284610788565b60209a8b019a909550939093019250506001016107c7565b50909695505050505050565b608081525f61085860808301888a610742565b6001600160a01b0387166020840152828103604084015261087a8186886107b0565b91505060018060a01b0383166060830152979650505050505050565b6001600160a01b03851681526060602082018190525f906108ba9083018587610742565b905060018060a01b038316604083015295945050505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156108f7575f5ffd5b815167ffffffffffffffff81111561090d575f5ffd5b8201601f8101841361091d575f5ffd5b805167ffffffffffffffff811115610937576109376108d3565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715610964576109646108d3565b604052918252602081840181019290810187841115610981575f5ffd5b6020850194505b838510156109a457845180825260209586019590935001610988565b509695505050505050565b606081525f6109c2606083018789610742565b82810360208401526109d58186886107b0565b91505060018060a01b0383166040830152969550505050505056fea2646970667358221220c3e55775f82cf64cffb13969c7e4e94b2667173c11ed245951be50711a185ff164736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce0
-----Decoded View---------------
Arg [0] : accountant (address): 0x93b4B9bd266fFA8AF68e39EDFa8cFe2A62011Ce0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000093b4b9bd266ffa8af68e39edfa8cfe2a62011ce0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.