Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 790 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint And Stake | 15780970 | 1150 days ago | IN | 0 ETH | 0.00988015 | ||||
| Transfer Ownersh... | 15482506 | 1193 days ago | IN | 0 ETH | 0.00029359 | ||||
| Mint And Stake | 15398799 | 1207 days ago | IN | 0 ETH | 0.00433167 | ||||
| Mint And Stake | 15376691 | 1210 days ago | IN | 0 ETH | 0.0031147 | ||||
| Mint And Stake | 15108530 | 1252 days ago | IN | 0 ETH | 0.00372018 | ||||
| Mint And Stake | 15040727 | 1263 days ago | IN | 0 ETH | 0.0258232 | ||||
| Mint And Stake | 14988213 | 1273 days ago | IN | 0 ETH | 0.0074283 | ||||
| Mint And Stake | 14932246 | 1282 days ago | IN | 0 ETH | 0.01858676 | ||||
| Mint And Stake | 14932246 | 1282 days ago | IN | 0 ETH | 0.01894788 | ||||
| Mint And Stake | 14885090 | 1290 days ago | IN | 0 ETH | 0.01655284 | ||||
| Mint And Stake | 14819880 | 1301 days ago | IN | 0 ETH | 0.00469477 | ||||
| Mint And Stake | 14797197 | 1305 days ago | IN | 0 ETH | 0.00673295 | ||||
| Mint Multi And S... | 14794828 | 1305 days ago | IN | 0 ETH | 0.0081663 | ||||
| Mint And Stake | 14782870 | 1307 days ago | IN | 0 ETH | 0.00647952 | ||||
| Mint And Stake | 14777988 | 1308 days ago | IN | 0 ETH | 0.00607773 | ||||
| Mint And Stake | 14755844 | 1311 days ago | IN | 0 ETH | 0.06693169 | ||||
| Mint And Stake | 14736789 | 1314 days ago | IN | 0 ETH | 0.01864019 | ||||
| Mint And Stake | 14502578 | 1351 days ago | IN | 0 ETH | 0.04557863 | ||||
| Mint Multi And S... | 14467994 | 1356 days ago | IN | 0 ETH | 0.01155013 | ||||
| Mint And Stake | 14287543 | 1384 days ago | IN | 0 ETH | 0.0067924 | ||||
| Mint And Stake | 14202955 | 1397 days ago | IN | 0 ETH | 0.01412112 | ||||
| Mint And Stake | 14184868 | 1400 days ago | IN | 0 ETH | 0.01667754 | ||||
| Mint And Stake | 14179170 | 1401 days ago | IN | 0 ETH | 0.04439974 | ||||
| Mint And Stake | 14172085 | 1402 days ago | IN | 0 ETH | 0.03157494 | ||||
| Mint And Stake | 14157913 | 1404 days ago | IN | 0 ETH | 0.03032032 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FeederWrapper
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-04-13
*/
pragma solidity 0.8.2;
interface ISavingsContractV2 {
// DEPRECATED but still backwards compatible
function redeem(uint256 _amount) external returns (uint256 massetReturned);
function creditBalances(address) external view returns (uint256); // V1 & V2 (use balanceOf)
// --------------------------------------------
function depositInterest(uint256 _amount) external; // V1 & V2
function depositSavings(uint256 _amount) external returns (uint256 creditsIssued); // V1 & V2
function depositSavings(uint256 _amount, address _beneficiary)
external
returns (uint256 creditsIssued); // V2
function redeemCredits(uint256 _amount) external returns (uint256 underlyingReturned); // V2
function redeemUnderlying(uint256 _amount) external returns (uint256 creditsBurned); // V2
function exchangeRate() external view returns (uint256); // V1 & V2
function balanceOfUnderlying(address _user) external view returns (uint256 balance); // V2
function underlyingToCredits(uint256 _credits) external view returns (uint256 underlying); // V2
function creditsToUnderlying(uint256 _underlying) external view returns (uint256 credits); // V2
}
struct BassetPersonal {
// Address of the bAsset
address addr;
// Address of the bAsset
address integrator;
// An ERC20 can charge transfer fee, for example USDT, DGX tokens.
bool hasTxFee; // takes a byte in storage
// Status of the bAsset
BassetStatus status;
}
struct BassetData {
// 1 Basset * ratio / ratioScale == x Masset (relative value)
// If ratio == 10e8 then 1 bAsset = 10 mAssets
// A ratio is divised as 10^(18-tokenDecimals) * measurementMultiple(relative value of 1 base unit)
uint128 ratio;
// Amount of the Basset that is held in Collateral
uint128 vaultBalance;
}
abstract contract IMasset {
// Mint
function mint(
address _input,
uint256 _inputQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 mintOutput);
function mintMulti(
address[] calldata _inputs,
uint256[] calldata _inputQuantities,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 mintOutput);
function getMintOutput(address _input, uint256 _inputQuantity)
external
view
virtual
returns (uint256 mintOutput);
function getMintMultiOutput(address[] calldata _inputs, uint256[] calldata _inputQuantities)
external
view
virtual
returns (uint256 mintOutput);
// Swaps
function swap(
address _input,
address _output,
uint256 _inputQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 swapOutput);
function getSwapOutput(
address _input,
address _output,
uint256 _inputQuantity
) external view virtual returns (uint256 swapOutput);
// Redemption
function redeem(
address _output,
uint256 _mAssetQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 outputQuantity);
function redeemMasset(
uint256 _mAssetQuantity,
uint256[] calldata _minOutputQuantities,
address _recipient
) external virtual returns (uint256[] memory outputQuantities);
function redeemExactBassets(
address[] calldata _outputs,
uint256[] calldata _outputQuantities,
uint256 _maxMassetQuantity,
address _recipient
) external virtual returns (uint256 mAssetRedeemed);
function getRedeemOutput(address _output, uint256 _mAssetQuantity)
external
view
virtual
returns (uint256 bAssetOutput);
function getRedeemExactBassetsOutput(
address[] calldata _outputs,
uint256[] calldata _outputQuantities
) external view virtual returns (uint256 mAssetAmount);
// Views
function getBasket() external view virtual returns (bool, bool);
function getBasset(address _token)
external
view
virtual
returns (BassetPersonal memory personal, BassetData memory data);
function getBassets()
external
view
virtual
returns (BassetPersonal[] memory personal, BassetData[] memory data);
function bAssetIndexes(address) external view virtual returns (uint8);
// SavingsManager
function collectInterest() external virtual returns (uint256 swapFeesGained, uint256 newSupply);
function collectPlatformInterest()
external
virtual
returns (uint256 mintAmount, uint256 newSupply);
// Admin
function setCacheSize(uint256 _cacheSize) external virtual;
function upgradeForgeValidator(address _newForgeValidator) external virtual;
function setFees(uint256 _swapFee, uint256 _redemptionFee) external virtual;
function setTransferFeesFlag(address _bAsset, bool _flag) external virtual;
function migrateBassets(address[] calldata _bAssets, address _newIntegration) external virtual;
}
// Status of the Basset - has it broken its peg?
enum BassetStatus {
Default,
Normal,
BrokenBelowPeg,
BrokenAbovePeg,
Blacklisted,
Liquidating,
Liquidated,
Failed
}
struct BasketState {
bool undergoingRecol;
bool failed;
}
struct InvariantConfig {
uint256 a;
WeightLimits limits;
}
struct WeightLimits {
uint128 min;
uint128 max;
}
struct FeederConfig {
uint256 supply;
uint256 a;
WeightLimits limits;
}
struct AmpData {
uint64 initialA;
uint64 targetA;
uint64 rampStartTime;
uint64 rampEndTime;
}
struct FeederData {
uint256 swapFee;
uint256 redemptionFee;
uint256 govFee;
uint256 pendingFees;
uint256 cacheSize;
BassetPersonal[] bAssetPersonal;
BassetData[] bAssetData;
AmpData ampData;
WeightLimits weightLimits;
}
struct AssetData {
uint8 idx;
uint256 amt;
BassetPersonal personal;
}
struct Asset {
uint8 idx;
address addr;
bool exists;
}
abstract contract IFeederPool {
// Mint
function mint(
address _input,
uint256 _inputQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 mintOutput);
function mintMulti(
address[] calldata _inputs,
uint256[] calldata _inputQuantities,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 mintOutput);
function getMintOutput(address _input, uint256 _inputQuantity)
external
view
virtual
returns (uint256 mintOutput);
function getMintMultiOutput(address[] calldata _inputs, uint256[] calldata _inputQuantities)
external
view
virtual
returns (uint256 mintOutput);
// Swaps
function swap(
address _input,
address _output,
uint256 _inputQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 swapOutput);
function getSwapOutput(
address _input,
address _output,
uint256 _inputQuantity
) external view virtual returns (uint256 swapOutput);
// Redemption
function redeem(
address _output,
uint256 _fpTokenQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 outputQuantity);
function redeemProportionately(
uint256 _fpTokenQuantity,
uint256[] calldata _minOutputQuantities,
address _recipient
) external virtual returns (uint256[] memory outputQuantities);
function redeemExactBassets(
address[] calldata _outputs,
uint256[] calldata _outputQuantities,
uint256 _maxMassetQuantity,
address _recipient
) external virtual returns (uint256 mAssetRedeemed);
function getRedeemOutput(address _output, uint256 _fpTokenQuantity)
external
view
virtual
returns (uint256 bAssetOutput);
function getRedeemExactBassetsOutput(
address[] calldata _outputs,
uint256[] calldata _outputQuantities
) external view virtual returns (uint256 mAssetAmount);
// Views
function mAsset() external view virtual returns (address);
function getPrice() public view virtual returns (uint256 price, uint256 k);
function getConfig() external view virtual returns (FeederConfig memory config);
function getBasset(address _token)
external
view
virtual
returns (BassetPersonal memory personal, BassetData memory data);
function getBassets()
external
view
virtual
returns (BassetPersonal[] memory personal, BassetData[] memory data);
// SavingsManager
function collectPlatformInterest()
external
virtual
returns (uint256 mintAmount, uint256 newSupply);
function collectPendingFees() external virtual;
}
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);
}
interface IBoostedVaultWithLockup {
/**
* @dev Stakes a given amount of the StakingToken for the sender
* @param _amount Units of StakingToken
*/
function stake(uint256 _amount) external;
/**
* @dev Stakes a given amount of the StakingToken for a given beneficiary
* @param _beneficiary Staked tokens are credited to this address
* @param _amount Units of StakingToken
*/
function stake(address _beneficiary, uint256 _amount) external;
/**
* @dev Withdraws stake from pool and claims any unlocked rewards.
* Note, this function is costly - the args for _claimRewards
* should be determined off chain and then passed to other fn
*/
function exit() external;
/**
* @dev Withdraws stake from pool and claims any unlocked rewards.
* @param _first Index of the first array element to claim
* @param _last Index of the last array element to claim
*/
function exit(uint256 _first, uint256 _last) external;
/**
* @dev Withdraws given stake amount from the pool
* @param _amount Units of the staked token to withdraw
*/
function withdraw(uint256 _amount) external;
/**
* @dev Claims only the tokens that have been immediately unlocked, not including
* those that are in the lockers.
*/
function claimReward() external;
/**
* @dev Claims all unlocked rewards for sender.
* Note, this function is costly - the args for _claimRewards
* should be determined off chain and then passed to other fn
*/
function claimRewards() external;
/**
* @dev Claims all unlocked rewards for sender. Both immediately unlocked
* rewards and also locked rewards past their time lock.
* @param _first Index of the first array element to claim
* @param _last Index of the last array element to claim
*/
function claimRewards(uint256 _first, uint256 _last) external;
/**
* @dev Pokes a given account to reset the boost
*/
function pokeBoost(address _account) external;
/**
* @dev Gets the last applicable timestamp for this reward period
*/
function lastTimeRewardApplicable() external view returns (uint256);
/**
* @dev Calculates the amount of unclaimed rewards per token since last update,
* and sums with stored to give the new cumulative reward per token
* @return 'Reward' per staked token
*/
function rewardPerToken() external view returns (uint256);
/**
* @dev Returned the units of IMMEDIATELY claimable rewards a user has to receive. Note - this
* does NOT include the majority of rewards which will be locked up.
* @param _account User address
* @return Total reward amount earned
*/
function earned(address _account) external view returns (uint256);
/**
* @dev Calculates all unclaimed reward data, finding both immediately unlocked rewards
* and those that have passed their time lock.
* @param _account User address
* @return amount Total units of unclaimed rewards
* @return first Index of the first userReward that has unlocked
* @return last Index of the last userReward that has unlocked
*/
function unclaimedRewards(address _account)
external
view
returns (
uint256 amount,
uint256 first,
uint256 last
);
}
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
/**
* @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);
}
}
}
}
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));
}
/**
* @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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
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");
uint256 newAllowance = oldAllowance - value;
_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");
}
}
}
// FLOWS
// 0 - fAsset/mAsset/mpAsset -> FeederPool BoostedVault
// 1 - fAssets/mAssets/mpAssets -> FeederPool BoostedVault
contract FeederWrapper is Ownable {
using SafeERC20 for IERC20;
/**
* @dev 0. fAsset/mAsset/mpAsset -> FeederPool BoostedVault
* @param _feeder FeederPool address
* @param _vault BoostedVault address (with stakingToken of `_feeder`)
* @param _input Input address; fAsset, mAsset or mpAsset
* @param _inputQuantity Quantity of input sent
* @param _minOutputQuantity Min amount of fpToken to be minted and staked
*/
function mintAndStake(
address _feeder,
address _vault,
address _input,
uint256 _inputQuantity,
uint256 _minOutputQuantity
) external {
// 0. Transfer the asset here
IERC20(_input).safeTransferFrom(msg.sender, address(this), _inputQuantity);
// 1. Mint the fpToken and transfer here
uint256 fpTokenAmt =
IFeederPool(_feeder).mint(_input, _inputQuantity, _minOutputQuantity, address(this));
// 2. Stake the fpToken in the BoostedVault on behalf of sender
IBoostedVaultWithLockup(_vault).stake(msg.sender, fpTokenAmt);
}
/**
* @dev 1. fAssets/mAssets/mpAssets -> FeederPool BoostedVault
* @param _feeder FeederPool address
* @param _vault BoostedVault address (with stakingToken of `_feeder`)
* @param _inputs Input addresses; fAsset, mAsset or mpAsset
* @param _inputQuantities Quantity of input sent
* @param _minOutputQuantity Min amount of fpToken to be minted and staked
*/
function mintMultiAndStake(
address _feeder,
address _vault,
address[] calldata _inputs,
uint256[] calldata _inputQuantities,
uint256 _minOutputQuantity
) external {
require(_inputs.length == _inputQuantities.length, "Mismatching inputs");
// 0. Transfer the assets here
for (uint256 i = 0; i < _inputs.length; i++) {
IERC20(_inputs[i]).safeTransferFrom(msg.sender, address(this), _inputQuantities[i]);
}
// 1. Mint the fpToken and transfer here
uint256 fpTokenAmt =
IFeederPool(_feeder).mintMulti(
_inputs,
_inputQuantities,
_minOutputQuantity,
address(this)
);
// 2. Stake the fpToken in the BoostedVault on behalf of sender
IBoostedVaultWithLockup(_vault).stake(msg.sender, fpTokenAmt);
}
/**
* @dev Approve vault and multiple assets
*/
function approve(
address _feeder,
address _vault,
address[] calldata _assets
) external onlyOwner {
_approve(_feeder, _vault);
_approve(_assets, _feeder);
}
/**
* @dev Approve one token/spender
*/
function approve(address _token, address _spender) external onlyOwner {
_approve(_token, _spender);
}
/**
* @dev Approve multiple tokens/one spender
*/
function approve(address[] calldata _tokens, address _spender) external onlyOwner {
_approve(_tokens, _spender);
}
function _approve(address _token, address _spender) internal {
require(_spender != address(0), "Invalid spender");
require(_token != address(0), "Invalid token");
IERC20(_token).safeApprove(_spender, 2**256 - 1);
}
function _approve(address[] calldata _tokens, address _spender) internal {
require(_spender != address(0), "Invalid spender");
for (uint256 i = 0; i < _tokens.length; i++) {
require(_tokens[i] != address(0), "Invalid token");
IERC20(_tokens[i]).safeApprove(_spender, 2**256 - 1);
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_feeder","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address[]","name":"_assets","type":"address[]"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"address","name":"_spender","type":"address"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeder","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint256","name":"_inputQuantity","type":"uint256"},{"internalType":"uint256","name":"_minOutputQuantity","type":"uint256"}],"name":"mintAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeder","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address[]","name":"_inputs","type":"address[]"},{"internalType":"uint256[]","name":"_inputQuantities","type":"uint256[]"},{"internalType":"uint256","name":"_minOutputQuantity","type":"uint256"}],"name":"mintMultiAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350611001806100616000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638da5cb5b1161005b5780638da5cb5b146100d057806392a34f72146100ef578063e48da54114610102578063f2fde38b1461011557610088565b80634ec181851461008d57806364202c9f146100a2578063715018a6146100b55780637e5465ba146100bd575b600080fd5b6100a061009b366004610ce4565b610128565b005b6100a06100b0366004610dda565b610176565b6100a06101b0565b6100a06100cb366004610c5e565b610224565b600054604080516001600160a01b039092168252519081900360200190f35b6100a06100fd366004610c90565b61025c565b6100a0610110366004610d43565b61036f565b6100a0610123366004610c44565b61053b565b6000546001600160a01b0316331461015b5760405162461bcd60e51b815260040161015290610f43565b60405180910390fd5b6101658484610625565b6101708282866106c9565b50505050565b6000546001600160a01b031633146101a05760405162461bcd60e51b815260040161015290610f43565b6101ab8383836106c9565b505050565b6000546001600160a01b031633146101da5760405162461bcd60e51b815260040161015290610f43565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461024e5760405162461bcd60e51b815260040161015290610f43565b6102588282610625565b5050565b6102716001600160a01b0384163330856107f8565b604051637ba5ff4760e11b81526001600160a01b03848116600483015260248201849052604482018390523060648301526000919087169063f74bfe8e90608401602060405180830381600087803b1580156102cc57600080fd5b505af11580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103049190610e4c565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0386169063adc9772e90604401600060405180830381600087803b15801561034f57600080fd5b505af1158015610363573d6000803e3d6000fd5b50505050505050505050565b8382146103b35760405162461bcd60e51b81526020600482015260126024820152714d69736d61746368696e6720696e7075747360701b6044820152606401610152565b60005b848110156104425761043033308686858181106103e357634e487b7160e01b600052603260045260246000fd5b9050602002013589898681811061040a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061041f9190610c44565b6001600160a01b03169291906107f8565b8061043a81610fa4565b9150506103b6565b50604051632bca42f560e21b81526000906001600160a01b0389169063af290bd49061047c90899089908990899089903090600401610e80565b602060405180830381600087803b15801561049657600080fd5b505af11580156104aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ce9190610e4c565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0388169063adc9772e90604401600060405180830381600087803b15801561051957600080fd5b505af115801561052d573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b031633146105655760405162461bcd60e51b815260040161015290610f43565b6001600160a01b0381166105ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610152565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661066d5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b6001600160a01b0382166106b35760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6102586001600160a01b03831682600019610863565b6001600160a01b0381166107115760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b60005b8281101561017057600084848381811061073e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107539190610c44565b6001600160a01b0316141561079a5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6107e6826000198686858181106107c157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107d69190610c44565b6001600160a01b03169190610863565b806107f081610fa4565b915050610714565b6040516001600160a01b03808516602483015283166044820152606481018290526101709085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610987565b8015806108ec5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156108b257600080fd5b505afa1580156108c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea9190610e4c565b155b6109575760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610152565b6040516001600160a01b0383166024820152604481018290526101ab90849063095ea7b360e01b9060640161082c565b60006109dc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610a599092919063ffffffff16565b8051909150156101ab57808060200190518101906109fa9190610e2c565b6101ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610152565b6060610a688484600085610a72565b90505b9392505050565b606082471015610ad35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610152565b610adc85610ba1565b610b285760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b600080866001600160a01b03168587604051610b449190610e64565b60006040518083038185875af1925050503d8060008114610b81576040519150601f19603f3d011682016040523d82523d6000602084013e610b86565b606091505b5091509150610b96828286610bab565b979650505050505050565b803b15155b919050565b60608315610bba575081610a6b565b825115610bca5782518084602001fd5b8160405162461bcd60e51b81526004016101529190610f10565b80356001600160a01b0381168114610ba657600080fd5b60008083601f840112610c0c578182fd5b50813567ffffffffffffffff811115610c23578182fd5b6020830191508360208083028501011115610c3d57600080fd5b9250929050565b600060208284031215610c55578081fd5b610a6b82610be4565b60008060408385031215610c70578081fd5b610c7983610be4565b9150610c8760208401610be4565b90509250929050565b600080600080600060a08688031215610ca7578081fd5b610cb086610be4565b9450610cbe60208701610be4565b9350610ccc60408701610be4565b94979396509394606081013594506080013592915050565b60008060008060608587031215610cf9578384fd5b610d0285610be4565b9350610d1060208601610be4565b9250604085013567ffffffffffffffff811115610d2b578283fd5b610d3787828801610bfb565b95989497509550505050565b600080600080600080600060a0888a031215610d5d578182fd5b610d6688610be4565b9650610d7460208901610be4565b9550604088013567ffffffffffffffff80821115610d90578384fd5b610d9c8b838c01610bfb565b909750955060608a0135915080821115610db4578384fd5b50610dc18a828b01610bfb565b989b979a50959894979596608090950135949350505050565b600080600060408486031215610dee578283fd5b833567ffffffffffffffff811115610e04578384fd5b610e1086828701610bfb565b9094509250610e23905060208501610be4565b90509250925092565b600060208284031215610e3d578081fd5b81518015158114610a6b578182fd5b600060208284031215610e5d578081fd5b5051919050565b60008251610e76818460208701610f78565b9190910192915050565b6080808252810186905260008760a08301825b89811015610ec1576001600160a01b03610eac84610be4565b16825260209283019290910190600101610e93565b5083810360208501528681526001600160fb1b03871115610ee0578283fd5b602087029150818860208301370160200190815260408201849052610b9660608301846001600160a01b03169052565b6000602082528251806020840152610f2f816040850160208701610f78565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60005b83811015610f93578181015183820152602001610f7b565b838111156101705750506000910152565b6000600019821415610fc457634e487b7160e01b81526011600452602481fd5b506001019056fea2646970667358221220cb4ea13fcdba425ea4c4c6e0c997fa778322db1a3d28735c5197863e6049d6f064736f6c63430008020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638da5cb5b1161005b5780638da5cb5b146100d057806392a34f72146100ef578063e48da54114610102578063f2fde38b1461011557610088565b80634ec181851461008d57806364202c9f146100a2578063715018a6146100b55780637e5465ba146100bd575b600080fd5b6100a061009b366004610ce4565b610128565b005b6100a06100b0366004610dda565b610176565b6100a06101b0565b6100a06100cb366004610c5e565b610224565b600054604080516001600160a01b039092168252519081900360200190f35b6100a06100fd366004610c90565b61025c565b6100a0610110366004610d43565b61036f565b6100a0610123366004610c44565b61053b565b6000546001600160a01b0316331461015b5760405162461bcd60e51b815260040161015290610f43565b60405180910390fd5b6101658484610625565b6101708282866106c9565b50505050565b6000546001600160a01b031633146101a05760405162461bcd60e51b815260040161015290610f43565b6101ab8383836106c9565b505050565b6000546001600160a01b031633146101da5760405162461bcd60e51b815260040161015290610f43565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461024e5760405162461bcd60e51b815260040161015290610f43565b6102588282610625565b5050565b6102716001600160a01b0384163330856107f8565b604051637ba5ff4760e11b81526001600160a01b03848116600483015260248201849052604482018390523060648301526000919087169063f74bfe8e90608401602060405180830381600087803b1580156102cc57600080fd5b505af11580156102e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103049190610e4c565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0386169063adc9772e90604401600060405180830381600087803b15801561034f57600080fd5b505af1158015610363573d6000803e3d6000fd5b50505050505050505050565b8382146103b35760405162461bcd60e51b81526020600482015260126024820152714d69736d61746368696e6720696e7075747360701b6044820152606401610152565b60005b848110156104425761043033308686858181106103e357634e487b7160e01b600052603260045260246000fd5b9050602002013589898681811061040a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061041f9190610c44565b6001600160a01b03169291906107f8565b8061043a81610fa4565b9150506103b6565b50604051632bca42f560e21b81526000906001600160a01b0389169063af290bd49061047c90899089908990899089903090600401610e80565b602060405180830381600087803b15801561049657600080fd5b505af11580156104aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ce9190610e4c565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0388169063adc9772e90604401600060405180830381600087803b15801561051957600080fd5b505af115801561052d573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b031633146105655760405162461bcd60e51b815260040161015290610f43565b6001600160a01b0381166105ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610152565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661066d5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b6001600160a01b0382166106b35760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6102586001600160a01b03831682600019610863565b6001600160a01b0381166107115760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b60005b8281101561017057600084848381811061073e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107539190610c44565b6001600160a01b0316141561079a5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6107e6826000198686858181106107c157634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107d69190610c44565b6001600160a01b03169190610863565b806107f081610fa4565b915050610714565b6040516001600160a01b03808516602483015283166044820152606481018290526101709085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610987565b8015806108ec5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156108b257600080fd5b505afa1580156108c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ea9190610e4c565b155b6109575760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610152565b6040516001600160a01b0383166024820152604481018290526101ab90849063095ea7b360e01b9060640161082c565b60006109dc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610a599092919063ffffffff16565b8051909150156101ab57808060200190518101906109fa9190610e2c565b6101ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610152565b6060610a688484600085610a72565b90505b9392505050565b606082471015610ad35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610152565b610adc85610ba1565b610b285760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b600080866001600160a01b03168587604051610b449190610e64565b60006040518083038185875af1925050503d8060008114610b81576040519150601f19603f3d011682016040523d82523d6000602084013e610b86565b606091505b5091509150610b96828286610bab565b979650505050505050565b803b15155b919050565b60608315610bba575081610a6b565b825115610bca5782518084602001fd5b8160405162461bcd60e51b81526004016101529190610f10565b80356001600160a01b0381168114610ba657600080fd5b60008083601f840112610c0c578182fd5b50813567ffffffffffffffff811115610c23578182fd5b6020830191508360208083028501011115610c3d57600080fd5b9250929050565b600060208284031215610c55578081fd5b610a6b82610be4565b60008060408385031215610c70578081fd5b610c7983610be4565b9150610c8760208401610be4565b90509250929050565b600080600080600060a08688031215610ca7578081fd5b610cb086610be4565b9450610cbe60208701610be4565b9350610ccc60408701610be4565b94979396509394606081013594506080013592915050565b60008060008060608587031215610cf9578384fd5b610d0285610be4565b9350610d1060208601610be4565b9250604085013567ffffffffffffffff811115610d2b578283fd5b610d3787828801610bfb565b95989497509550505050565b600080600080600080600060a0888a031215610d5d578182fd5b610d6688610be4565b9650610d7460208901610be4565b9550604088013567ffffffffffffffff80821115610d90578384fd5b610d9c8b838c01610bfb565b909750955060608a0135915080821115610db4578384fd5b50610dc18a828b01610bfb565b989b979a50959894979596608090950135949350505050565b600080600060408486031215610dee578283fd5b833567ffffffffffffffff811115610e04578384fd5b610e1086828701610bfb565b9094509250610e23905060208501610be4565b90509250925092565b600060208284031215610e3d578081fd5b81518015158114610a6b578182fd5b600060208284031215610e5d578081fd5b5051919050565b60008251610e76818460208701610f78565b9190910192915050565b6080808252810186905260008760a08301825b89811015610ec1576001600160a01b03610eac84610be4565b16825260209283019290910190600101610e93565b5083810360208501528681526001600160fb1b03871115610ee0578283fd5b602087029150818860208301370160200190815260408201849052610b9660608301846001600160a01b03169052565b6000602082528251806020840152610f2f816040850160208701610f78565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60005b83811015610f93578181015183820152602001610f7b565b838111156101705750506000910152565b6000600019821415610fc457634e487b7160e01b81526011600452602481fd5b506001019056fea2646970667358221220cb4ea13fcdba425ea4c4c6e0c997fa778322db1a3d28735c5197863e6049d6f064736f6c63430008020033
Deployed Bytecode Sourcemap
29662:3825:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32286:212;;;;;;:::i;:::-;;:::i;:::-;;32753:128;;;;;;:::i;:::-;;:::i;17701:148::-;;;:::i;32563:115::-;;;;;;:::i;:::-;;:::i;17050:87::-;17096:7;17123:6;17050:87;;;-1:-1:-1;;;;;17123:6:0;;;4765:51:1;;17050:87:0;;;;;4753:2:1;17050:87:0;;;30184:644;;;;;;:::i;:::-;;:::i;31282:931::-;;;;;;:::i;:::-;;:::i;18004:244::-;;;;;;:::i;:::-;;:::i;32286:212::-;17096:7;17123:6;-1:-1:-1;;;;;17123:6:0;16281:10;17270:23;17262:68;;;;-1:-1:-1;;;17262:68:0;;;;;;;:::i;:::-;;;;;;;;;32428:25:::1;32437:7;32446:6;32428:8;:25::i;:::-;32464:26;32473:7;;32482;32464:8;:26::i;:::-;32286:212:::0;;;;:::o;32753:128::-;17096:7;17123:6;-1:-1:-1;;;;;17123:6:0;16281:10;17270:23;17262:68;;;;-1:-1:-1;;;17262:68:0;;;;;;;:::i;:::-;32846:27:::1;32855:7;;32864:8;32846;:27::i;:::-;32753:128:::0;;;:::o;17701:148::-;17096:7;17123:6;-1:-1:-1;;;;;17123:6:0;16281:10;17270:23;17262:68;;;;-1:-1:-1;;;17262:68:0;;;;;;;:::i;:::-;17808:1:::1;17792:6:::0;;17771:40:::1;::::0;-1:-1:-1;;;;;17792:6:0;;::::1;::::0;17771:40:::1;::::0;17808:1;;17771:40:::1;17839:1;17822:19:::0;;-1:-1:-1;;;;;;17822:19:0::1;::::0;;17701:148::o;32563:115::-;17096:7;17123:6;-1:-1:-1;;;;;17123:6:0;16281:10;17270:23;17262:68;;;;-1:-1:-1;;;17262:68:0;;;;;;;:::i;:::-;32644:26:::1;32653:6;32661:8;32644;:26::i;:::-;32563:115:::0;;:::o;30184:644::-;30418:74;-1:-1:-1;;;;;30418:31:0;;30450:10;30470:4;30477:14;30418:31;:74::i;:::-;30589:84;;-1:-1:-1;;;30589:84:0;;-1:-1:-1;;;;;6082:15:1;;;30589:84:0;;;6064:34:1;6114:18;;;6107:34;;;6157:18;;;6150:34;;;30667:4:0;6200:18:1;;;6193:43;30555:18:0;;30589:25;;;;;;5998:19:1;;30589:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30759:61;;-1:-1:-1;;;30759:61:0;;30797:10;30759:61;;;5690:51:1;5757:18;;;5750:34;;;30555:118:0;;-1:-1:-1;;;;;;30759:37:0;;;;;5663:18:1;;30759:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30184:644;;;;;;:::o;31282:931::-;31515:41;;;31507:72;;;;-1:-1:-1;;;31507:72:0;;9922:2:1;31507:72:0;;;9904:21:1;9961:2;9941:18;;;9934:30;-1:-1:-1;;;9980:18:1;;;9973:48;10038:18;;31507:72:0;9894:168:1;31507:72:0;31637:9;31632:155;31652:18;;;31632:155;;;31692:83;31728:10;31748:4;31755:16;;31772:1;31755:19;;;;;-1:-1:-1;;;31755:19:0;;;;;;;;;;;;;;;31699:7;;31707:1;31699:10;;;;;-1:-1:-1;;;31699:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31692:35:0;;:83;;:35;:83::i;:::-;31672:3;;;;:::i;:::-;;;;31632:155;;;-1:-1:-1;31883:175:0;;-1:-1:-1;;;31883:175:0;;31849:18;;-1:-1:-1;;;;;31883:30:0;;;;;:175;;31932:7;;;;31958:16;;;;31993:18;;32038:4;;31883:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32144:61;;-1:-1:-1;;;32144:61:0;;32182:10;32144:61;;;5690:51:1;5757:18;;;5750:34;;;31849:209:0;;-1:-1:-1;;;;;;32144:37:0;;;;;5663:18:1;;32144:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31282:931;;;;;;;;:::o;18004:244::-;17096:7;17123:6;-1:-1:-1;;;;;17123:6:0;16281:10;17270:23;17262:68;;;;-1:-1:-1;;;17262:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18093:22:0;::::1;18085:73;;;::::0;-1:-1:-1;;;18085:73:0;;8047:2:1;18085:73:0::1;::::0;::::1;8029:21:1::0;8086:2;8066:18;;;8059:30;8125:34;8105:18;;;8098:62;-1:-1:-1;;;8176:18:1;;;8169:36;8222:19;;18085:73:0::1;8019:228:1::0;18085:73:0::1;18195:6;::::0;;18174:38:::1;::::0;-1:-1:-1;;;;;18174:38:0;;::::1;::::0;18195:6;::::1;::::0;18174:38:::1;::::0;::::1;18223:6;:17:::0;;-1:-1:-1;;;;;;18223:17:0::1;-1:-1:-1::0;;;;;18223:17:0;;;::::1;::::0;;;::::1;::::0;;18004:244::o;32889:246::-;-1:-1:-1;;;;;32969:22:0;;32961:50;;;;-1:-1:-1;;;32961:50:0;;11103:2:1;32961:50:0;;;11085:21:1;11142:2;11122:18;;;11115:30;-1:-1:-1;;;11161:18:1;;;11154:45;11216:18;;32961:50:0;11075:165:1;32961:50:0;-1:-1:-1;;;;;33030:20:0;;33022:46;;;;-1:-1:-1;;;33022:46:0;;8861:2:1;33022:46:0;;;8843:21:1;8900:2;8880:18;;;8873:30;-1:-1:-1;;;8919:18:1;;;8912:43;8972:18;;33022:46:0;8833:163:1;33022:46:0;33079:48;-1:-1:-1;;;;;33079:26:0;;33106:8;-1:-1:-1;;33079:26:0;:48::i;33143:341::-;-1:-1:-1;;;;;33235:22:0;;33227:50;;;;-1:-1:-1;;;33227:50:0;;11103:2:1;33227:50:0;;;11085:21:1;11142:2;11122:18;;;11115:30;-1:-1:-1;;;11161:18:1;;;11154:45;11216:18;;33227:50:0;11075:165:1;33227:50:0;33293:9;33288:189;33308:18;;;33288:189;;;33378:1;33356:7;;33364:1;33356:10;;;;;-1:-1:-1;;;33356:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33356:24:0;;;33348:50;;;;-1:-1:-1;;;33348:50:0;;8861:2:1;33348:50:0;;;8843:21:1;8900:2;8880:18;;;8873:30;-1:-1:-1;;;8919:18:1;;;8912:43;8972:18;;33348:50:0;8833:163:1;33348:50:0;33413:52;33444:8;-1:-1:-1;;33420:7:0;;33428:1;33420:10;;;;;-1:-1:-1;;;33420:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33413:30:0;;:52;:30;:52::i;:::-;33328:3;;;;:::i;:::-;;;;33288:189;;26515:205;26643:68;;-1:-1:-1;;;;;5394:15:1;;;26643:68:0;;;5376:34:1;5446:15;;5426:18;;;5419:43;5478:18;;;5471:34;;;26616:96:0;;26636:5;;-1:-1:-1;;;26666:27:0;5311:18:1;;26643:68:0;;;;-1:-1:-1;;26643:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26643:68:0;-1:-1:-1;;;;;;26643:68:0;;;;;;;;;;26616:19;:96::i;26989:622::-;27359:10;;;27358:62;;-1:-1:-1;27375:39:0;;-1:-1:-1;;;27375:39:0;;27399:4;27375:39;;;5039:34:1;-1:-1:-1;;;;;5109:15:1;;;5089:18;;;5082:43;27375:15:0;;;;;4974:18:1;;27375:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27358:62;27350:152;;;;-1:-1:-1;;;27350:152:0;;10680:2:1;27350:152:0;;;10662:21:1;10719:2;10699:18;;;10692:30;10758:34;10738:18;;;10731:62;-1:-1:-1;;;10809:18:1;;;10802:52;10871:19;;27350:152:0;10652:244:1;27350:152:0;27540:62;;-1:-1:-1;;;;;5708:32:1;;27540:62:0;;;5690:51:1;5757:18;;;5750:34;;;27513:90:0;;27533:5;;-1:-1:-1;;;27563:22:0;5663:18:1;;27540:62:0;5645:145:1;28764:761:0;29188:23;29214:69;29242:4;29214:69;;;;;;;;;;;;;;;;;29222:5;-1:-1:-1;;;;;29214:27:0;;;:69;;;;;:::i;:::-;29298:17;;29188:95;;-1:-1:-1;29298:21:0;29294:224;;29440:10;29429:30;;;;;;;;;;;;:::i;:::-;29421:85;;;;-1:-1:-1;;;29421:85:0;;10269:2:1;29421:85:0;;;10251:21:1;10308:2;10288:18;;;10281:30;10347:34;10327:18;;;10320:62;-1:-1:-1;;;10398:18:1;;;10391:40;10448:19;;29421:85:0;10241:232:1;21930:195:0;22033:12;22065:52;22087:6;22095:4;22101:1;22104:12;22065:21;:52::i;:::-;22058:59;;21930:195;;;;;;:::o;22982:530::-;23109:12;23167:5;23142:21;:30;;23134:81;;;;-1:-1:-1;;;23134:81:0;;8454:2:1;23134:81:0;;;8436:21:1;8493:2;8473:18;;;8466:30;8532:34;8512:18;;;8505:62;-1:-1:-1;;;8583:18:1;;;8576:36;8629:19;;23134:81:0;8426:228:1;23134:81:0;23234:18;23245:6;23234:10;:18::i;:::-;23226:60;;;;-1:-1:-1;;;23226:60:0;;9564:2:1;23226:60:0;;;9546:21:1;9603:2;9583:18;;;9576:30;9642:31;9622:18;;;9615:59;9691:18;;23226:60:0;9536:179:1;23226:60:0;23360:12;23374:23;23401:6;-1:-1:-1;;;;;23401:11:0;23421:5;23429:4;23401:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23359:75;;;;23452:52;23470:7;23479:10;23491:12;23452:17;:52::i;:::-;23445:59;22982:530;-1:-1:-1;;;;;;;22982:530:0:o;19012:422::-;19379:20;;19418:8;;19012:422;;;;:::o;25522:742::-;25637:12;25666:7;25662:595;;;-1:-1:-1;25697:10:0;25690:17;;25662:595;25811:17;;:21;25807:439;;26074:10;26068:17;26135:15;26122:10;26118:2;26114:19;26107:44;26022:148;26217:12;26210:20;;-1:-1:-1;;;26210:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:398;;;319:3;312:4;304:6;300:17;296:27;286:2;;344:8;334;327:26;286:2;-1:-1:-1;374:20:1;;417:18;406:30;;403:2;;;456:8;446;439:26;403:2;500:4;492:6;488:17;476:29;;563:3;556:4;548;540:6;536:17;528:6;524:30;520:41;517:50;514:2;;;580:1;577;570:12;514:2;276:314;;;;;:::o;595:196::-;;707:2;695:9;686:7;682:23;678:32;675:2;;;728:6;720;713:22;675:2;756:29;775:9;756:29;:::i;796:270::-;;;925:2;913:9;904:7;900:23;896:32;893:2;;;946:6;938;931:22;893:2;974:29;993:9;974:29;:::i;:::-;964:39;;1022:38;1056:2;1045:9;1041:18;1022:38;:::i;:::-;1012:48;;883:183;;;;;:::o;1071:482::-;;;;;;1251:3;1239:9;1230:7;1226:23;1222:33;1219:2;;;1273:6;1265;1258:22;1219:2;1301:29;1320:9;1301:29;:::i;:::-;1291:39;;1349:38;1383:2;1372:9;1368:18;1349:38;:::i;:::-;1339:48;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1209:344;;;;-1:-1:-1;1396:48:1;;1491:2;1476:18;;1463:32;;-1:-1:-1;1542:3:1;1527:19;1514:33;;1209:344;-1:-1:-1;;1209:344:1:o;1558:605::-;;;;;1739:2;1727:9;1718:7;1714:23;1710:32;1707:2;;;1760:6;1752;1745:22;1707:2;1788:29;1807:9;1788:29;:::i;:::-;1778:39;;1836:38;1870:2;1859:9;1855:18;1836:38;:::i;:::-;1826:48;;1925:2;1914:9;1910:18;1897:32;1952:18;1944:6;1941:30;1938:2;;;1989:6;1981;1974:22;1938:2;2033:70;2095:7;2086:6;2075:9;2071:22;2033:70;:::i;:::-;1697:466;;;;-1:-1:-1;2122:8:1;-1:-1:-1;;;;1697:466:1:o;2168:1021::-;;;;;;;;2418:3;2406:9;2397:7;2393:23;2389:33;2386:2;;;2440:6;2432;2425:22;2386:2;2468:29;2487:9;2468:29;:::i;:::-;2458:39;;2516:38;2550:2;2539:9;2535:18;2516:38;:::i;:::-;2506:48;;2605:2;2594:9;2590:18;2577:32;2628:18;2669:2;2661:6;2658:14;2655:2;;;2690:6;2682;2675:22;2655:2;2734:70;2796:7;2787:6;2776:9;2772:22;2734:70;:::i;:::-;2823:8;;-1:-1:-1;2708:96:1;-1:-1:-1;2911:2:1;2896:18;;2883:32;;-1:-1:-1;2927:16:1;;;2924:2;;;2961:6;2953;2946:22;2924:2;;3005:72;3069:7;3058:8;3047:9;3043:24;3005:72;:::i;:::-;2376:813;;;;-1:-1:-1;2376:813:1;;;;;;3178:3;3163:19;;;3150:33;;2376:813;-1:-1:-1;;;;2376:813:1:o;3194:531::-;;;;3358:2;3346:9;3337:7;3333:23;3329:32;3326:2;;;3379:6;3371;3364:22;3326:2;3424:9;3411:23;3457:18;3449:6;3446:30;3443:2;;;3494:6;3486;3479:22;3443:2;3538:70;3600:7;3591:6;3580:9;3576:22;3538:70;:::i;:::-;3627:8;;-1:-1:-1;3512:96:1;-1:-1:-1;3681:38:1;;-1:-1:-1;3715:2:1;3700:18;;3681:38;:::i;:::-;3671:48;;3316:409;;;;;:::o;3730:297::-;;3850:2;3838:9;3829:7;3825:23;3821:32;3818:2;;;3871:6;3863;3856:22;3818:2;3908:9;3902:16;3961:5;3954:13;3947:21;3940:5;3937:32;3927:2;;3988:6;3980;3973:22;4032:194;;4155:2;4143:9;4134:7;4130:23;4126:32;4123:2;;;4176:6;4168;4161:22;4123:2;-1:-1:-1;4204:16:1;;4113:113;-1:-1:-1;4113:113:1:o;4340:274::-;;4507:6;4501:13;4523:53;4569:6;4564:3;4557:4;4549:6;4545:17;4523:53;:::i;:::-;4592:16;;;;;4477:137;-1:-1:-1;;4477:137:1:o;6247:1205::-;6591:3;6604:22;;;6576:19;;6661:22;;;6247:1205;6741:6;6714:3;6699:19;;6247:1205;6778:235;6792:6;6789:1;6786:13;6778:235;;;-1:-1:-1;;;;;6857:26:1;6876:6;6857:26;:::i;:::-;6853:52;6841:65;;6929:4;6988:15;;;;6953:12;;;;6814:1;6807:9;6778:235;;;-1:-1:-1;7051:19:1;;;7044:4;7029:20;;7022:49;7080:19;;;-1:-1:-1;;;;;7111:31:1;;7108:2;;;7158:4;7152;7145:18;7108:2;7200:4;7192:6;7188:17;7174:31;;7251:6;7243;7236:4;7231:3;7227:14;7214:44;7281:16;7299:4;7277:27;7313:16;;;7379:2;7364:18;;7357:34;;;7400:46;7442:2;7427:18;;7419:6;-1:-1:-1;;;;;4297:31:1;4285:44;;4275:60;7457:383;;7606:2;7595:9;7588:21;7638:6;7632:13;7681:6;7676:2;7665:9;7661:18;7654:34;7697:66;7756:6;7751:2;7740:9;7736:18;7731:2;7723:6;7719:15;7697:66;:::i;:::-;7824:2;7803:15;-1:-1:-1;;7799:29:1;7784:45;;;;7831:2;7780:54;;7578:262;-1:-1:-1;;7578:262:1:o;9001:356::-;9203:2;9185:21;;;9222:18;;;9215:30;9281:34;9276:2;9261:18;;9254:62;9348:2;9333:18;;9175:182::o;11245:258::-;11317:1;11327:113;11341:6;11338:1;11335:13;11327:113;;;11417:11;;;11411:18;11398:11;;;11391:39;11363:2;11356:10;11327:113;;;11458:6;11455:1;11452:13;11449:2;;;-1:-1:-1;;11493:1:1;11475:16;;11468:27;11298:205::o;11508:236::-;;-1:-1:-1;;11568:17:1;;11565:2;;;-1:-1:-1;;;11608:33:1;;11664:4;11661:1;11654:15;11694:4;11615:3;11682:17;11565:2;-1:-1:-1;11736:1:1;11725:13;;11555:189::o
Swarm Source
ipfs://cb4ea13fcdba425ea4c4c6e0c997fa778322db1a3d28735c5197863e6049d6f0
Loading...
Loading
Loading...
Loading
OVERVIEW
Wrapper contract for mStable's Feeder PoolsMultichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.