编译器
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:CurveExchangeDepositor.sol
pragma solidity ^0.8.19;
import "src/base/interfaces/ICurvePool.sol";
import "src/base/depositor/DepositorV4.sol";
abstract contract CurveExchangeDepositor is DepositorV4 {
using SafeERC20 for IERC20;
address public pool;
event Deposited(address indexed caller, address indexed user, uint256 amount, bool stake);
error MIN_AMOUNT_NOT_MET();
constructor(
address _token,
address _locker,
address _minter,
address _gauge,
uint256 _maxLockDuration,
address _pool
) DepositorV4(_token, _locker, _minter, _gauge, _maxLockDuration) {
pool = _pool;
if (_pool != address(0)) {
IERC20(_token).safeApprove(_pool, type(uint256).max);
}
}
function deposit(uint256 _amount, uint256 _minAmount, bool _stake, address _user) public {
if (_amount == 0) revert AMOUNT_ZERO();
if (_user == address(0)) revert ADDRESS_ZERO();
if (_minAmount < _amount) revert MIN_AMOUNT_NOT_MET();
IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);
if (_stake && gauge != address(0)) {
_amount = _swap(_amount, _minAmount, address(this));
ILiquidityGauge(gauge).deposit(_amount, _user);
} else {
_amount = _swap(_amount, _minAmount, _user);
}
emit Deposited(msg.sender, _user, _amount, _stake);
}
function _swap(uint256 _amount, uint256 _minAmount, address _receiver) internal returns (uint256) {
return ICurvePool(pool).exchange(0, 1, _amount, _minAmount, _receiver);
}
function setPool(address _pool) external onlyGovernance {
pool = _pool;
if (_pool != address(0)) {
IERC20(token).safeApprove(_pool, type(uint256).max);
}
}
}
文件 3 的 13:DepositorV4.sol
pragma solidity ^0.8.19;
import "src/base/interfaces/ILocker.sol";
import "src/base/interfaces/ISdToken.sol";
import "src/base/interfaces/ITokenMinter.sol";
import "src/base/interfaces/ILiquidityGauge.sol";
import "openzeppelin-contracts/token/ERC20/IERC20.sol";
import "openzeppelin-contracts/token/ERC20/utils/SafeERC20.sol";
abstract contract DepositorV4 {
using SafeERC20 for IERC20;
uint256 public constant DENOMINATOR = 10_000;
uint256 public immutable MAX_LOCK_DURATION;
address public immutable token;
address public immutable locker;
address public immutable minter;
uint256 public lockIncentivePercent = 10;
uint256 public incentiveToken;
address public gauge;
address public governance;
address public futureGovernance;
event CreateLock(uint256 amount, uint256 duration);
event Deposited(address indexed caller, address indexed user, uint256 amount, bool lock, bool stake);
event IncentiveReceived(address indexed caller, uint256 amount);
event TokenLocked(address indexed user, uint256 amount);
event GovernanceChanged(address indexed newGovernance);
event SdTokenOperatorChanged(address indexed newSdToken);
event FeesChanged(uint256 newFee);
error GOVERNANCE();
error AMOUNT_ZERO();
error ADDRESS_ZERO();
modifier onlyGovernance() {
if (msg.sender != governance) revert GOVERNANCE();
_;
}
constructor(address _token, address _locker, address _minter, address _gauge, uint256 _maxLockDuration) {
governance = msg.sender;
token = _token;
gauge = _gauge;
minter = _minter;
locker = _locker;
MAX_LOCK_DURATION = _maxLockDuration;
if (gauge != address(0)) {
IERC20(minter).safeApprove(gauge, type(uint256).max);
}
}
function createLock(uint256 _amount) external virtual {
IERC20(token).safeTransferFrom(msg.sender, address(locker), _amount);
ILocker(locker).createLock(_amount, block.timestamp + MAX_LOCK_DURATION);
ITokenMinter(minter).mint(msg.sender, _amount);
emit CreateLock(_amount, block.timestamp + MAX_LOCK_DURATION);
}
function deposit(uint256 _amount, bool _lock, bool _stake, address _user) public {
if (_amount == 0) revert AMOUNT_ZERO();
if (_user == address(0)) revert ADDRESS_ZERO();
if (_lock) {
IERC20(token).safeTransferFrom(msg.sender, locker, _amount);
uint256 balance = IERC20(token).balanceOf(address(this));
if (balance != 0) {
IERC20(token).safeTransfer(locker, balance);
}
_lockToken(balance + _amount);
if (incentiveToken != 0) {
_amount += incentiveToken;
emit IncentiveReceived(msg.sender, incentiveToken);
incentiveToken = 0;
}
} else {
IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);
uint256 callIncentive = (_amount * lockIncentivePercent) / DENOMINATOR;
_amount -= callIncentive;
incentiveToken += callIncentive;
}
if (_stake && gauge != address(0)) {
ITokenMinter(minter).mint(address(this), _amount);
ILiquidityGauge(gauge).deposit(_amount, _user);
} else {
ITokenMinter(minter).mint(_user, _amount);
}
emit Deposited(msg.sender, _user, _amount, _lock, _stake);
}
function lockToken() external {
uint256 tokenBalance = IERC20(token).balanceOf(address(this));
if (tokenBalance != 0) {
IERC20(token).safeTransfer(locker, tokenBalance);
_lockToken(tokenBalance);
}
if (incentiveToken != 0) {
ITokenMinter(minter).mint(msg.sender, incentiveToken);
emit IncentiveReceived(msg.sender, incentiveToken);
incentiveToken = 0;
}
}
function _lockToken(uint256 _amount) internal virtual {
if (_amount != 0) {
ILocker(locker).increaseLock(_amount, block.timestamp + MAX_LOCK_DURATION);
emit TokenLocked(msg.sender, _amount);
}
}
function transferGovernance(address _governance) external onlyGovernance {
futureGovernance = _governance;
}
function acceptGovernance() external {
if (msg.sender != futureGovernance) revert GOVERNANCE();
governance = msg.sender;
emit GovernanceChanged(msg.sender);
}
function setSdTokenMinterOperator(address _minter) external onlyGovernance {
ISdToken(minter).setOperator(_minter);
emit SdTokenOperatorChanged(_minter);
}
function setGauge(address _gauge) external onlyGovernance {
gauge = _gauge;
if (_gauge != address(0)) {
IERC20(minter).safeApprove(gauge, type(uint256).max);
}
}
function setFees(uint256 _lockIncentive) external onlyGovernance {
if (_lockIncentive >= 0 && _lockIncentive <= 30) {
emit FeesChanged(lockIncentivePercent = _lockIncentive);
}
}
}
文件 4 的 13:ICurvePool.sol
pragma solidity ^0.8.7;
interface ICurvePool {
function add_liquidity(uint256[2] calldata amounts, uint256 min_mint_amount) external returns (uint256);
function exchange(int128 i, int128 j, uint256 _dx, uint256 _min_dy) external returns (uint256);
function exchange(int128 i, int128 j, uint256 _dx, uint256 _min_dy, address _receiver) external returns (uint256);
function get_dy(int128 i, int128 j, uint256 _dx) external view returns (uint256);
}
文件 5 的 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);
}
文件 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:ILiquidityGauge.sol
pragma solidity ^0.8.7;
interface ILiquidityGauge {
struct Reward {
address token;
address distributor;
uint256 period_finish;
uint256 rate;
uint256 last_update;
uint256 integral;
}
function deposit_reward_token(address _rewardToken, uint256 _amount) external;
function claim_rewards_for(address _user, address _recipient) external;
function working_balances(address _address) external view returns (uint256);
function deposit(uint256 _value, address _addr) external;
function reward_tokens(uint256 _i) external view returns (address);
function reward_data(address _tokenReward) external view returns (Reward memory);
function balanceOf(address) external returns (uint256);
function claimable_reward(address _user, address _reward_token) external view returns (uint256);
function claimable_tokens(address _user) external returns (uint256);
function user_checkpoint(address _user) external returns (bool);
function commit_transfer_ownership(address) external;
function claim_rewards() external;
function claim_rewards(address) external;
function claim_rewards(address, address) external;
function add_reward(address, address) external;
function set_claimer(address) external;
function admin() external view returns (address);
function future_admin() external view returns (address);
function set_reward_distributor(address _rewardToken, address _newDistrib) external;
function initialize(
address staking_token,
address admin,
address sdt,
address voting_escrow,
address veBoost_proxy,
address distributor
) external;
function totalSupply() external returns (uint256);
function withdraw(uint256 _value, bool _claimReward) external;
function accept_transfer_ownership() external;
function claimed_reward(address _addr, address _token) external view returns (uint256);
function set_rewards_receiver(address _receiver) external;
}
文件 8 的 13:ILocker.sol
pragma solidity ^0.8.7;
interface ILocker {
function createLock(uint256, uint256) external;
function claimAllRewards(address[] calldata _tokens, address _recipient) external;
function increaseAmount(uint256) external;
function increaseAmount(uint128) external;
function increaseUnlockTime(uint256) external;
function release() external;
function claimRewards(address, address) external;
function claimRewards(address, address, address) external;
function claimFXSRewards(address) external;
function claimFPISRewards(address) external;
function execute(address, uint256, bytes calldata) external returns (bool, bytes memory);
function setGovernance(address) external;
function voteGaugeWeight(address, uint256) external;
function setAngleDepositor(address) external;
function setDepositor(address) external;
function setFxsDepositor(address) external;
function setYFIDepositor(address) external;
function setYieldDistributor(address) external;
function setGaugeController(address) external;
function setAccumulator(address _accumulator) external;
function governance() external view returns (address);
function increaseLock(uint256 _value, uint256 _duration) external;
function release(address _recipient) external;
function setStrategy(address _strategy) external;
}
文件 9 的 13:ISdToken.sol
pragma solidity ^0.8.7;
interface ISdToken {
function setOperator(address _operator) external;
function balanceOf(address account) external view returns (uint256);
function operator() external view returns (address);
}
文件 10 的 13:ITokenMinter.sol
pragma solidity ^0.8.7;
interface ITokenMinter {
function mint(address, uint256) external;
function burn(address, uint256) external;
}
文件 11 的 13:IVeYFI.sol
pragma solidity ^0.8.7;
interface IVeYFI {
function modify_lock(uint256 amount, uint256 unlock_time, address user) external;
struct LockedBalance {
uint256 amount;
uint256 end;
}
function balanceOf(address account) external view returns (uint256);
function withdraw() external;
function locked(address) external view returns (LockedBalance memory);
}
文件 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:YFIDepositorV2.sol
pragma solidity 0.8.19;
import "src/base/interfaces/IVeYFI.sol";
import "src/base/extension/CurveExchangeDepositor.sol";
contract YFIDepositorV2 is CurveExchangeDepositor {
address public constant VE_YFI = 0x90c1f9220d90d3966FbeE24045EDd73E1d588aD5;
constructor(address _token, address _locker, address _minter, address _gauge, address _pool)
CurveExchangeDepositor(_token, _locker, _minter, _gauge, 4 * 370 days, _pool)
{}
function createLock(uint256 _amount) external override {}
function _lockToken(uint256 _amount) internal override {
if (_amount != 0) {
ILocker(locker).increaseAmount(_amount);
uint256 _unlockTime = block.timestamp + MAX_LOCK_DURATION;
IVeYFI.LockedBalance memory _lockedBalance = IVeYFI(VE_YFI).locked(address(locker));
bool _canIncrease = (_unlockTime / 1 weeks * 1 weeks) > _lockedBalance.end;
if (_canIncrease) {
ILocker(locker).increaseUnlockTime(_unlockTime);
}
emit TokenLocked(msg.sender, _amount);
}
}
}
{
"compilationTarget": {
"src/yearn/depositor/YFIDepositorV2.sol": "YFIDepositorV2"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/=lib/openzeppelin-contracts/",
":address-book/=lib/address-book/src/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
":openzeppelin/=lib/openzeppelin-contracts/contracts/",
":solady/=lib/solady/",
":solidity-examples/=lib/solidity-examples/contracts/",
":solmate/=lib/solmate/src/",
":utils/=lib/utils/"
]
}
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_locker","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_pool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ADDRESS_ZERO","type":"error"},{"inputs":[],"name":"AMOUNT_ZERO","type":"error"},{"inputs":[],"name":"GOVERNANCE","type":"error"},{"inputs":[],"name":"MIN_AMOUNT_NOT_MET","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"CreateLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"stake","type":"bool"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"lock","type":"bool"},{"indexed":false,"internalType":"bool","name":"stake","type":"bool"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"IncentiveReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newSdToken","type":"address"}],"name":"SdTokenOperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenLocked","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCK_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VE_YFI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minAmount","type":"uint256"},{"internalType":"bool","name":"_stake","type":"bool"},{"internalType":"address","name":"_user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_lock","type":"bool"},{"internalType":"bool","name":"_stake","type":"bool"},{"internalType":"address","name":"_user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"futureGovernance","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":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incentiveToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockIncentivePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockIncentive","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"setGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"setSdTokenMinterOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"}]