编译器
0.8.19+commit.7dd6d404
文件 1 的 13:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 13:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 3 的 13:IBribe.sol
pragma solidity 0.8.19;
interface IBribe {
function getReward(address account) external;
function notifyRewardAmount(address token, uint amount) external;
function _deposit(uint amount, address account) external;
function _withdraw(uint amount, address account) external;
function addReward(address rewardToken) external;
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
function rewardPerToken(address reward) external view returns (uint);
function getRewardForDuration(address reward) external view returns (uint);
function left(address reward) external view returns (uint);
function earned(address account, address reward) external view returns (uint);
function getRewardTokens() external view returns (address[] memory);
function DURATION() external view returns (uint);
function isRewardToken(address token) external view returns (bool);
}
文件 4 的 13:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 5 的 13:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 6 的 13:IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 7 的 13:IGauge.sol
pragma solidity 0.8.19;
interface IGauge {
function getReward(address account) external;
function notifyRewardAmount(address token, uint amount) external;
function _deposit(address account, uint256 amount) external;
function _withdraw(address account, uint256 amount) external;
function addReward(address rewardToken) external;
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
function rewardPerToken(address reward) external view returns (uint);
function getRewardForDuration(address reward) external view returns (uint);
function earned(address account, address reward) external view returns (uint);
function left(address token) external view returns (uint);
}
文件 8 的 13:IVoter.sol
pragma solidity 0.8.19;
interface IVoter {
function distribute(address _gauge) external;
function emitDeposit(address account, uint amount) external;
function emitWithdraw(address account, uint amount) external;
function notifyRewardAmount(uint amount) external;
function OTOKEN() external view returns (address);
function plugins(uint256 index) external view returns (address);
function getPlugins() external view returns (address[] memory);
function gauges(address pool) external view returns (address);
function bribes(address pool) external view returns (address);
function isAlive(address gauge) external view returns (bool);
function usedWeights(address account) external view returns (uint256);
function weights(address pool) external view returns (uint256);
function totalWeight() external view returns (uint256);
function votes(address account, address pool) external view returns (uint256);
function lastVoted(address account) external view returns (uint256);
function minter() external view returns (address);
}
文件 9 的 13:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 10 的 13:Plugin.sol
pragma solidity 0.8.19;
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "contracts/interfaces/IGauge.sol";
import "contracts/interfaces/IBribe.sol";
import "contracts/interfaces/IVoter.sol";
abstract contract Plugin is ReentrancyGuard {
using SafeERC20 for IERC20Metadata;
IERC20Metadata private immutable underlying;
address private immutable OTOKEN;
address private immutable voter;
address private gauge;
address private bribe;
string private protocol;
address[] private tokensInUnderlying;
address[] private bribeTokens;
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
error Plugin__InvalidZeroInput();
error Plugin__NotAuthorizedVoter();
event Plugin__Deposited(address indexed account, uint256 amount);
event Plugin__Withdrawn(address indexed account, uint256 amount);
event Plugin__ClaimedAnDistributed();
modifier nonZeroInput(uint256 _amount) {
if (_amount == 0) revert Plugin__InvalidZeroInput();
_;
}
modifier onlyVoter() {
if (msg.sender != voter) revert Plugin__NotAuthorizedVoter();
_;
}
constructor(
address _underlying,
address _voter,
address[] memory _tokensInUnderlying,
address[] memory _bribeTokens,
string memory _protocol
) {
underlying = IERC20Metadata(_underlying);
voter = _voter;
tokensInUnderlying = _tokensInUnderlying;
bribeTokens = _bribeTokens;
protocol = _protocol;
OTOKEN = IVoter(_voter).OTOKEN();
}
function depositFor(address account, uint256 amount)
public
virtual
nonReentrant
nonZeroInput(amount)
{
_totalSupply = _totalSupply + amount;
_balances[account] = _balances[account] + amount;
emit Plugin__Deposited(account, amount);
underlying.safeTransferFrom(msg.sender, address(this), amount);
IGauge(gauge)._deposit(account, amount);
}
function withdrawTo(address account, uint256 amount)
public
virtual
nonReentrant
nonZeroInput(amount)
{
_totalSupply = _totalSupply - amount;
_balances[msg.sender] = _balances[msg.sender] - amount;
emit Plugin__Withdrawn(msg.sender, amount);
IGauge(gauge)._withdraw(msg.sender, amount);
underlying.safeTransfer(account, amount);
}
function claimAndDistribute() public virtual nonReentrant {
emit Plugin__ClaimedAnDistributed();
}
function setGauge(address _gauge) external onlyVoter {
gauge = _gauge;
}
function setBribe(address _bribe) external onlyVoter {
bribe = _bribe;
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function getUnderlyingName() public view virtual returns (string memory) {
return underlying.name();
}
function getUnderlyingSymbol() public view virtual returns (string memory) {
return underlying.symbol();
}
function getUnderlyingAddress() public view virtual returns (address) {
return address(underlying);
}
function getUnderlyingDecimals() public view virtual returns (uint8) {
return underlying.decimals();
}
function getProtocol() public view virtual returns (string memory) {
return protocol;
}
function getVoter() public view returns (address) {
return voter;
}
function getGauge() public view returns (address) {
return gauge;
}
function getBribe() public view returns (address) {
return bribe;
}
function getTokensInUnderlying() public view virtual returns (address[] memory) {
return tokensInUnderlying;
}
function getBribeTokens() public view returns (address[] memory) {
return bribeTokens;
}
}
文件 11 的 13:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
文件 12 的 13:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
文件 13 的 13:VelociGaugePluginFactory.sol
pragma solidity 0.8.19;
import "@openzeppelin/contracts/access/Ownable.sol";
import 'contracts/Plugin.sol';
interface IVelociLP {
function tokens() external view returns (address, address);
}
interface IRouter {
function isPair(address _pool) external view returns (bool);
}
interface IVelociVoter {
function gauges(address _lpToken) external view returns (address);
}
interface IPluginFactory {
function VOTER() external view returns (address);
function BVM() external view returns (address);
function OBVM() external view returns (address);
}
interface IVelociGauge {
function rewardsListLength() external view returns (uint256);
function rewards(uint256 _index) external view returns (address);
function deposit(uint256 _amount, uint256 _tokenId) external;
function withdraw(uint256 _amount) external;
function getReward(address _account, address[] memory _tokens) external;
}
contract VelociGaugePlugin is Plugin {
using SafeERC20 for IERC20;
address public immutable pluginFactory;
address public immutable velociGauge;
address[] public velociGaugeRewards;
string public symbol;
error Plugin__NotFactory();
constructor(
address _underlying,
address _velociGauge,
address _pluginFactory,
address[] memory _tokensInUnderlying,
address[] memory _bribeTokens,
address[] memory _velociGaugeRewards,
string memory _protocol,
string memory _symbol
)
Plugin(
_underlying,
IPluginFactory(_pluginFactory).VOTER(),
_tokensInUnderlying,
_bribeTokens,
_protocol
)
{
pluginFactory = _pluginFactory;
velociGauge = _velociGauge;
velociGaugeRewards = _velociGaugeRewards;
symbol = _symbol;
}
function claimAndDistribute()
public
override
{
super.claimAndDistribute();
IVelociGauge(velociGauge).getReward(address(this), velociGaugeRewards);
address bribe = getBribe();
uint256 duration = IBribe(bribe).DURATION();
for (uint i = 0; i < velociGaugeRewards.length; i++) {
address token = (velociGaugeRewards[i] == IPluginFactory(pluginFactory).BVM() ? IPluginFactory(pluginFactory).OBVM() : velociGaugeRewards[i]);
uint256 balance = IERC20(token).balanceOf(address(this));
if (balance > duration && token != getUnderlyingAddress()) {
IERC20(token).safeApprove(bribe, 0);
IERC20(token).safeApprove(bribe, balance);
IBribe(bribe).notifyRewardAmount(token, balance);
}
}
}
function depositFor(address account, uint256 amount)
public
override
{
super.depositFor(account, amount);
IERC20(getUnderlyingAddress()).safeApprove(velociGauge, 0);
IERC20(getUnderlyingAddress()).safeApprove(velociGauge, amount);
IVelociGauge(velociGauge).deposit(amount, 0);
}
function withdrawTo(address account, uint256 amount)
public
override
{
IVelociGauge(velociGauge).withdraw(amount);
super.withdrawTo(account, amount);
}
function setGaugeRewards(address[] memory _gaugeRewards) external {
if (msg.sender != pluginFactory) revert Plugin__NotFactory();
velociGaugeRewards = _gaugeRewards;
}
function getUnderlyingName() public view override returns (string memory) {
return symbol;
}
function getUnderlyingSymbol() public view override returns (string memory) {
return symbol;
}
}
contract VelociGaugePluginFactory is Ownable {
address public constant BVM = 0xd386a121991E51Eab5e3433Bf5B1cF4C8884b47a;
address public constant OBVM = 0x762eb51D2e779EeEc9B239FFB0B2eC8262848f3E;
address public constant ROUTER = 0xE11b93B61f6291d35c5a2beA0A9fF169080160cF;
address public constant VELOCI_VOTER = 0xab9B68c9e53c94D7c0949FB909E80e4a29F9134A;
string public constant PROTOCOL = 'Velocimeter';
address public immutable VOTER;
address public last_plugin;
error PluginFactory__NotPair();
error PluginFactory__InvalidGauge();
event Plugin__PluginCreated(address plugin);
constructor(address _VOTER) {
VOTER = _VOTER;
}
function createPlugin(
address _lpToken,
address[] memory _gaugeRewards,
string memory _symbol
) external returns (address) {
if (!IRouter(ROUTER).isPair(_lpToken)) revert PluginFactory__NotPair();
if (IVelociVoter(VELOCI_VOTER).gauges(_lpToken) == address(0)) revert PluginFactory__InvalidGauge();
(address token0, address token1) = IVelociLP(_lpToken).tokens();
address[] memory tokensInUnderlying = new address[](2);
tokensInUnderlying[0] = token0;
tokensInUnderlying[1] = token1;
address[] memory _bribeTokens = new address[](_gaugeRewards.length);
for (uint i = 0; i < _gaugeRewards.length; i++) {
_bribeTokens[i] = (_gaugeRewards[i] == BVM ? OBVM : _gaugeRewards[i]);
}
VelociGaugePlugin lastPlugin = new VelociGaugePlugin(
_lpToken,
IVelociVoter(VELOCI_VOTER).gauges(_lpToken),
address(this),
tokensInUnderlying,
_bribeTokens,
_gaugeRewards,
PROTOCOL,
_symbol
);
last_plugin = address(lastPlugin);
emit Plugin__PluginCreated(last_plugin);
return last_plugin;
}
function setGaugeRewards(address _plugin, address[] memory _gaugeRewards) external onlyOwner {
VelociGaugePlugin(_plugin).setGaugeRewards(_gaugeRewards);
}
}
{
"compilationTarget": {
"contracts/plugins/base/VelociGaugePluginFactory.sol": "VelociGaugePlugin"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_velociGauge","type":"address"},{"internalType":"address","name":"_pluginFactory","type":"address"},{"internalType":"address[]","name":"_tokensInUnderlying","type":"address[]"},{"internalType":"address[]","name":"_bribeTokens","type":"address[]"},{"internalType":"address[]","name":"_velociGaugeRewards","type":"address[]"},{"internalType":"string","name":"_protocol","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Plugin__InvalidZeroInput","type":"error"},{"inputs":[],"name":"Plugin__NotAuthorizedVoter","type":"error"},{"inputs":[],"name":"Plugin__NotFactory","type":"error"},{"anonymous":false,"inputs":[],"name":"Plugin__ClaimedAnDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Plugin__Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Plugin__Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAndDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBribe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBribeTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProtocol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokensInUnderlying","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUnderlyingSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pluginFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bribe","type":"address"}],"name":"setBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"setGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_gaugeRewards","type":"address[]"}],"name":"setGaugeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"velociGauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"velociGaugeRewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]