Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 224 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Mint And Stake | 12224560 | 1783 days ago | IN | 0 ETH | 0.02674775 | ||||
| Mint And Stake | 12222453 | 1783 days ago | IN | 0 ETH | 0.01952458 | ||||
| Mint Multi And S... | 12221681 | 1784 days ago | IN | 0 ETH | 0.02190962 | ||||
| Mint And Stake | 12220084 | 1784 days ago | IN | 0 ETH | 0.02958867 | ||||
| Mint And Stake | 12219700 | 1784 days ago | IN | 0 ETH | 0.03934084 | ||||
| Mint And Stake | 12218578 | 1784 days ago | IN | 0 ETH | 0.02857575 | ||||
| Mint And Stake | 12217471 | 1784 days ago | IN | 0 ETH | 0.02918023 | ||||
| Mint And Stake | 12217119 | 1784 days ago | IN | 0 ETH | 0.02776312 | ||||
| Mint And Stake | 12216953 | 1784 days ago | IN | 0 ETH | 0.02692856 | ||||
| Mint And Stake | 12214710 | 1785 days ago | IN | 0 ETH | 0.03239893 | ||||
| Mint And Stake | 12214211 | 1785 days ago | IN | 0 ETH | 0.03362161 | ||||
| Mint And Stake | 12213127 | 1785 days ago | IN | 0 ETH | 0.03096838 | ||||
| Mint And Stake | 12212513 | 1785 days ago | IN | 0 ETH | 0.03542102 | ||||
| Mint Multi And S... | 12211977 | 1785 days ago | IN | 0 ETH | 0.03397702 | ||||
| Mint And Stake | 12211331 | 1785 days ago | IN | 0 ETH | 0.02613931 | ||||
| Mint And Stake | 12210785 | 1785 days ago | IN | 0 ETH | 0.03417509 | ||||
| Mint And Stake | 12209757 | 1785 days ago | IN | 0 ETH | 0.03597473 | ||||
| Mint And Stake | 12207376 | 1786 days ago | IN | 0 ETH | 0.07209513 | ||||
| Mint And Stake | 12206949 | 1786 days ago | IN | 0 ETH | 0.05316544 | ||||
| Mint And Stake | 12205525 | 1786 days ago | IN | 0 ETH | 0.03479274 | ||||
| Mint And Stake | 12205510 | 1786 days ago | IN | 0 ETH | 0.02437236 | ||||
| Mint Multi And S... | 12204472 | 1786 days ago | IN | 0 ETH | 0.04439896 | ||||
| Mint And Stake | 12203950 | 1786 days ago | IN | 0 ETH | 0.03579414 | ||||
| Mint And Stake | 12203761 | 1786 days ago | IN | 0 ETH | 0.06516808 | ||||
| Mint And Stake | 12203586 | 1786 days ago | IN | 0 ETH | 0.03323205 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
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-03-31
*/
pragma solidity 0.8.2;
// SPDX-License-Identifier: AGPL-3.0-or-later
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 _mAssetQuantity,
uint256 _minOutputQuantity,
address _recipient
) external virtual returns (uint256 outputQuantity);
function redeemProportionately(
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 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);
}
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).transferFrom(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]).transferFrom(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 asset
*/
function approve(address _feeder, address _asset) external onlyOwner {
_approve(_asset, _feeder);
}
/**
* @dev Approve multiple assets
*/
function approve(address _feeder, address[] calldata _assets) external onlyOwner {
_approve(_assets, _feeder);
}
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":"_assets","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":"_assets","type":"address[]"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeder","type":"address"},{"internalType":"address","name":"_asset","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
608060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350611091806100616000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80638da5cb5b1161005b5780638da5cb5b146100d057806392a34f72146100ef578063e48da54114610102578063f2fde38b1461011557610088565b806343c249c51461008d5780634ec18185146100a2578063715018a6146100b55780637e5465ba146100bd575b600080fd5b6100a061009b366004610e6b565b610128565b005b6100a06100b0366004610d75565b61016b565b6100a06101b0565b6100a06100cb366004610cef565b610224565b600054604080516001600160a01b039092168252519081900360200190f35b6100a06100fd366004610d21565b61025c565b6100a0610110366004610dd4565b6103e1565b6100a0610123366004610cd5565b610630565b6000546001600160a01b0316331461015b5760405162461bcd60e51b815260040161015290610fd3565b60405180910390fd5b61016682828561071a565b505050565b6000546001600160a01b031633146101955760405162461bcd60e51b815260040161015290610fd3565b61019f8484610849565b6101aa82828661071a565b50505050565b6000546001600160a01b031633146101da5760405162461bcd60e51b815260040161015290610fd3565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461024e5760405162461bcd60e51b815260040161015290610fd3565b6102588183610849565b5050565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd90606401602060405180830381600087803b1580156102aa57600080fd5b505af11580156102be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e29190610ebc565b50604051637ba5ff4760e11b81526001600160a01b03848116600483015260248201849052604482018390523060648301526000919087169063f74bfe8e90608401602060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103769190610edc565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0386169063adc9772e90604401600060405180830381600087803b1580156103c157600080fd5b505af11580156103d5573d6000803e3d6000fd5b50505050505050505050565b8382146104255760405162461bcd60e51b81526020600482015260126024820152714d69736d61746368696e6720696e7075747360701b6044820152606401610152565b60005b848110156105375785858281811061045057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104659190610cd5565b6001600160a01b03166323b872dd333087878681811061049557634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401602060405180830381600087803b1580156104ec57600080fd5b505af1158015610500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105249190610ebc565b508061052f81611034565b915050610428565b50604051632bca42f560e21b81526000906001600160a01b0389169063af290bd49061057190899089908990899089903090600401610f10565b602060405180830381600087803b15801561058b57600080fd5b505af115801561059f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c39190610edc565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0388169063adc9772e90604401600060405180830381600087803b15801561060e57600080fd5b505af1158015610622573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b0316331461065a5760405162461bcd60e51b815260040161015290610fd3565b6001600160a01b0381166106bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610152565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166107625760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b60005b828110156101aa57600084848381811061078f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107a49190610cd5565b6001600160a01b031614156107eb5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6108378260001986868581811061081257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108279190610cd5565b6001600160a01b031691906108e9565b8061084181611034565b915050610765565b6001600160a01b0381166108915760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b6001600160a01b0382166108d75760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6102586001600160a01b038316826000195b8015806109725750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109709190610edc565b155b6109dd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610152565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663095ea7b360e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261016692869291600091610a6d918516908490610aea565b8051909150156101665780806020019051810190610a8b9190610ebc565b6101665760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610152565b6060610af98484600085610b03565b90505b9392505050565b606082471015610b645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610152565b610b6d85610c32565b610bb95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b600080866001600160a01b03168587604051610bd59190610ef4565b60006040518083038185875af1925050503d8060008114610c12576040519150601f19603f3d011682016040523d82523d6000602084013e610c17565b606091505b5091509150610c27828286610c3c565b979650505050505050565b803b15155b919050565b60608315610c4b575081610afc565b825115610c5b5782518084602001fd5b8160405162461bcd60e51b81526004016101529190610fa0565b80356001600160a01b0381168114610c3757600080fd5b60008083601f840112610c9d578182fd5b50813567ffffffffffffffff811115610cb4578182fd5b6020830191508360208083028501011115610cce57600080fd5b9250929050565b600060208284031215610ce6578081fd5b610afc82610c75565b60008060408385031215610d01578081fd5b610d0a83610c75565b9150610d1860208401610c75565b90509250929050565b600080600080600060a08688031215610d38578081fd5b610d4186610c75565b9450610d4f60208701610c75565b9350610d5d60408701610c75565b94979396509394606081013594506080013592915050565b60008060008060608587031215610d8a578384fd5b610d9385610c75565b9350610da160208601610c75565b9250604085013567ffffffffffffffff811115610dbc578283fd5b610dc887828801610c8c565b95989497509550505050565b600080600080600080600060a0888a031215610dee578182fd5b610df788610c75565b9650610e0560208901610c75565b9550604088013567ffffffffffffffff80821115610e21578384fd5b610e2d8b838c01610c8c565b909750955060608a0135915080821115610e45578384fd5b50610e528a828b01610c8c565b989b979a50959894979596608090950135949350505050565b600080600060408486031215610e7f578283fd5b610e8884610c75565b9250602084013567ffffffffffffffff811115610ea3578283fd5b610eaf86828701610c8c565b9497909650939450505050565b600060208284031215610ecd578081fd5b81518015158114610afc578182fd5b600060208284031215610eed578081fd5b5051919050565b60008251610f06818460208701611008565b9190910192915050565b6080808252810186905260008760a08301825b89811015610f51576001600160a01b03610f3c84610c75565b16825260209283019290910190600101610f23565b5083810360208501528681526001600160fb1b03871115610f70578283fd5b602087029150818860208301370160200190815260408201849052610c2760608301846001600160a01b03169052565b6000602082528251806020840152610fbf816040850160208701611008565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60005b8381101561102357818101518382015260200161100b565b838111156101aa5750506000910152565b600060001982141561105457634e487b7160e01b81526011600452602481fd5b506001019056fea2646970667358221220303fcdc023cd9cef7f47fa98473ccf9e72f9c2389526e715a3d3940aad9a151864736f6c63430008020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100885760003560e01c80638da5cb5b1161005b5780638da5cb5b146100d057806392a34f72146100ef578063e48da54114610102578063f2fde38b1461011557610088565b806343c249c51461008d5780634ec18185146100a2578063715018a6146100b55780637e5465ba146100bd575b600080fd5b6100a061009b366004610e6b565b610128565b005b6100a06100b0366004610d75565b61016b565b6100a06101b0565b6100a06100cb366004610cef565b610224565b600054604080516001600160a01b039092168252519081900360200190f35b6100a06100fd366004610d21565b61025c565b6100a0610110366004610dd4565b6103e1565b6100a0610123366004610cd5565b610630565b6000546001600160a01b0316331461015b5760405162461bcd60e51b815260040161015290610fd3565b60405180910390fd5b61016682828561071a565b505050565b6000546001600160a01b031633146101955760405162461bcd60e51b815260040161015290610fd3565b61019f8484610849565b6101aa82828661071a565b50505050565b6000546001600160a01b031633146101da5760405162461bcd60e51b815260040161015290610fd3565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461024e5760405162461bcd60e51b815260040161015290610fd3565b6102588183610849565b5050565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd90606401602060405180830381600087803b1580156102aa57600080fd5b505af11580156102be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102e29190610ebc565b50604051637ba5ff4760e11b81526001600160a01b03848116600483015260248201849052604482018390523060648301526000919087169063f74bfe8e90608401602060405180830381600087803b15801561033e57600080fd5b505af1158015610352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103769190610edc565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0386169063adc9772e90604401600060405180830381600087803b1580156103c157600080fd5b505af11580156103d5573d6000803e3d6000fd5b50505050505050505050565b8382146104255760405162461bcd60e51b81526020600482015260126024820152714d69736d61746368696e6720696e7075747360701b6044820152606401610152565b60005b848110156105375785858281811061045057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104659190610cd5565b6001600160a01b03166323b872dd333087878681811061049557634e487b7160e01b600052603260045260246000fd5b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401602060405180830381600087803b1580156104ec57600080fd5b505af1158015610500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105249190610ebc565b508061052f81611034565b915050610428565b50604051632bca42f560e21b81526000906001600160a01b0389169063af290bd49061057190899089908990899089903090600401610f10565b602060405180830381600087803b15801561058b57600080fd5b505af115801561059f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c39190610edc565b6040516356e4bb9760e11b8152336004820152602481018290529091506001600160a01b0388169063adc9772e90604401600060405180830381600087803b15801561060e57600080fd5b505af1158015610622573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b0316331461065a5760405162461bcd60e51b815260040161015290610fd3565b6001600160a01b0381166106bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610152565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166107625760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b60005b828110156101aa57600084848381811061078f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107a49190610cd5565b6001600160a01b031614156107eb5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6108378260001986868581811061081257634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108279190610cd5565b6001600160a01b031691906108e9565b8061084181611034565b915050610765565b6001600160a01b0381166108915760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b832b73232b960891b6044820152606401610152565b6001600160a01b0382166108d75760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610152565b6102586001600160a01b038316826000195b8015806109725750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109709190610edc565b155b6109dd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610152565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663095ea7b360e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261016692869291600091610a6d918516908490610aea565b8051909150156101665780806020019051810190610a8b9190610ebc565b6101665760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610152565b6060610af98484600085610b03565b90505b9392505050565b606082471015610b645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610152565b610b6d85610c32565b610bb95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610152565b600080866001600160a01b03168587604051610bd59190610ef4565b60006040518083038185875af1925050503d8060008114610c12576040519150601f19603f3d011682016040523d82523d6000602084013e610c17565b606091505b5091509150610c27828286610c3c565b979650505050505050565b803b15155b919050565b60608315610c4b575081610afc565b825115610c5b5782518084602001fd5b8160405162461bcd60e51b81526004016101529190610fa0565b80356001600160a01b0381168114610c3757600080fd5b60008083601f840112610c9d578182fd5b50813567ffffffffffffffff811115610cb4578182fd5b6020830191508360208083028501011115610cce57600080fd5b9250929050565b600060208284031215610ce6578081fd5b610afc82610c75565b60008060408385031215610d01578081fd5b610d0a83610c75565b9150610d1860208401610c75565b90509250929050565b600080600080600060a08688031215610d38578081fd5b610d4186610c75565b9450610d4f60208701610c75565b9350610d5d60408701610c75565b94979396509394606081013594506080013592915050565b60008060008060608587031215610d8a578384fd5b610d9385610c75565b9350610da160208601610c75565b9250604085013567ffffffffffffffff811115610dbc578283fd5b610dc887828801610c8c565b95989497509550505050565b600080600080600080600060a0888a031215610dee578182fd5b610df788610c75565b9650610e0560208901610c75565b9550604088013567ffffffffffffffff80821115610e21578384fd5b610e2d8b838c01610c8c565b909750955060608a0135915080821115610e45578384fd5b50610e528a828b01610c8c565b989b979a50959894979596608090950135949350505050565b600080600060408486031215610e7f578283fd5b610e8884610c75565b9250602084013567ffffffffffffffff811115610ea3578283fd5b610eaf86828701610c8c565b9497909650939450505050565b600060208284031215610ecd578081fd5b81518015158114610afc578182fd5b600060208284031215610eed578081fd5b5051919050565b60008251610f06818460208701611008565b9190910192915050565b6080808252810186905260008760a08301825b89811015610f51576001600160a01b03610f3c84610c75565b16825260209283019290910190600101610f23565b5083810360208501528681526001600160fb1b03871115610f70578283fd5b602087029150818860208301370160200190815260408201849052610c2760608301846001600160a01b03169052565b6000602082528251806020840152610fbf816040850160208701611008565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60005b8381101561102357818101518382015260200161100b565b838111156101aa5750506000910152565b600060001982141561105457634e487b7160e01b81526011600452602481fd5b506001019056fea2646970667358221220303fcdc023cd9cef7f47fa98473ccf9e72f9c2389526e715a3d3940aad9a151864736f6c63430008020033
Deployed Bytecode Sourcemap
29583:3793:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32644:126;;;;;;:::i;:::-;;:::i;:::-;;32199:212;;;;;;:::i;:::-;;:::i;17622:148::-;;;:::i;32468:113::-;;;;;;:::i;:::-;;:::i;16971:87::-;17017:7;17044:6;16971:87;;;-1:-1:-1;;;;;17044:6:0;;;4765:51:1;;16971:87:0;;;;;4753:2:1;16971:87:0;;;30105:640;;;;;;:::i;:::-;;:::i;31199:927::-;;;;;;:::i;:::-;;:::i;17925:244::-;;;;;;:::i;:::-;;:::i;32644:126::-;17017:7;17044:6;-1:-1:-1;;;;;17044:6:0;16202:10;17191:23;17183:68;;;;-1:-1:-1;;;17183:68:0;;;;;;;:::i;:::-;;;;;;;;;32736:26:::1;32745:7;;32754;32736:8;:26::i;:::-;32644:126:::0;;;:::o;32199:212::-;17017:7;17044:6;-1:-1:-1;;;;;17044:6:0;16202:10;17191:23;17183:68;;;;-1:-1:-1;;;17183:68:0;;;;;;;:::i;:::-;32341:25:::1;32350:7;32359:6;32341:8;:25::i;:::-;32377:26;32386:7;;32395;32377:8;:26::i;:::-;32199:212:::0;;;;:::o;17622:148::-;17017:7;17044:6;-1:-1:-1;;;;;17044:6:0;16202:10;17191:23;17183:68;;;;-1:-1:-1;;;17183:68:0;;;;;;;:::i;:::-;17729:1:::1;17713:6:::0;;17692:40:::1;::::0;-1:-1:-1;;;;;17713:6:0;;::::1;::::0;17692:40:::1;::::0;17729:1;;17692:40:::1;17760:1;17743:19:::0;;-1:-1:-1;;;;;;17743:19:0::1;::::0;;17622:148::o;32468:113::-;17017:7;17044:6;-1:-1:-1;;;;;17044:6:0;16202:10;17191:23;17183:68;;;;-1:-1:-1;;;17183:68:0;;;;;;;:::i;:::-;32548:25:::1;32557:6;32565:7;32548:8;:25::i;:::-;32468:113:::0;;:::o;30105:640::-;30339:70;;-1:-1:-1;;;30339:70:0;;30367:10;30339:70;;;5376:34:1;30387:4:0;5426:18:1;;;5419:43;5478:18;;;5471:34;;;-1:-1:-1;;;;;30339:27:0;;;;;5311:18:1;;30339:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;30506:84:0;;-1:-1:-1;;;30506:84:0;;-1:-1:-1;;;;;6082:15:1;;;30506:84:0;;;6064:34:1;6114:18;;;6107:34;;;6157:18;;;6150:34;;;30584:4:0;6200:18:1;;;6193:43;30472:18:0;;30506:25;;;;;;5998:19:1;;30506:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30676:61;;-1:-1:-1;;;30676:61:0;;30714:10;30676:61;;;5690:51:1;5757:18;;;5750:34;;;30472:118:0;;-1:-1:-1;;;;;;30676:37:0;;;;;5663:18:1;;30676:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30105:640;;;;;;:::o;31199:927::-;31432:41;;;31424:72;;;;-1:-1:-1;;;31424:72:0;;9922:2:1;31424:72:0;;;9904:21:1;9961:2;9941:18;;;9934:30;-1:-1:-1;;;9980:18:1;;;9973:48;10038:18;;31424:72:0;9894:168:1;31424:72:0;31554:9;31549:151;31569:18;;;31549:151;;;31616:7;;31624:1;31616:10;;;;;-1:-1:-1;;;31616:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31609:31:0;;31641:10;31661:4;31668:16;;31685:1;31668:19;;;;;-1:-1:-1;;;31668:19:0;;;;;;;;;31609:79;;-1:-1:-1;;;;;;31609:79:0;;;;;;;-1:-1:-1;;;;;5394:15:1;;;31609:79:0;;;5376:34:1;5446:15;;;;5426:18;;;5419:43;-1:-1:-1;31668:19:0;;;;;;5478:18:1;;;5471:34;5311:18;;31609:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;31589:3:0;;;;:::i;:::-;;;;31549:151;;;-1:-1:-1;31796:175:0;;-1:-1:-1;;;31796:175:0;;31762:18;;-1:-1:-1;;;;;31796:30:0;;;;;:175;;31845:7;;;;31871:16;;;;31906:18;;31951:4;;31796:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32057:61;;-1:-1:-1;;;32057:61:0;;32095:10;32057:61;;;5690:51:1;5757:18;;;5750:34;;;31762:209:0;;-1:-1:-1;;;;;;32057:37:0;;;;;5663:18:1;;32057:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31199:927;;;;;;;;:::o;17925:244::-;17017:7;17044:6;-1:-1:-1;;;;;17044:6:0;16202:10;17191:23;17183:68;;;;-1:-1:-1;;;17183:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18014:22:0;::::1;18006:73;;;::::0;-1:-1:-1;;;18006:73:0;;8047:2:1;18006: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;;18006:73:0::1;8019:228:1::0;18006:73:0::1;18116:6;::::0;;18095:38:::1;::::0;-1:-1:-1;;;;;18095:38:0;;::::1;::::0;18116:6;::::1;::::0;18095:38:::1;::::0;::::1;18144:6;:17:::0;;-1:-1:-1;;;;;;18144:17:0::1;-1:-1:-1::0;;;;;18144:17:0;;;::::1;::::0;;;::::1;::::0;;17925:244::o;33032:341::-;-1:-1:-1;;;;;33124:22:0;;33116:50;;;;-1:-1:-1;;;33116:50:0;;11103:2:1;33116:50:0;;;11085:21:1;11142:2;11122:18;;;11115:30;-1:-1:-1;;;11161:18:1;;;11154:45;11216:18;;33116:50:0;11075:165:1;33116:50:0;33182:9;33177:189;33197:18;;;33177:189;;;33267:1;33245:7;;33253:1;33245:10;;;;;-1:-1:-1;;;33245:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33245:24:0;;;33237:50;;;;-1:-1:-1;;;33237:50:0;;8861:2:1;33237:50:0;;;8843:21:1;8900:2;8880:18;;;8873:30;-1:-1:-1;;;8919:18:1;;;8912:43;8972:18;;33237:50:0;8833:163:1;33237:50:0;33302:52;33333:8;-1:-1:-1;;33309:7:0;;33317:1;33309:10;;;;;-1:-1:-1;;;33309:10:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33302:30:0;;:52;:30;:52::i;:::-;33217:3;;;;:::i;:::-;;;;33177:189;;32778:246;-1:-1:-1;;;;;32858:22:0;;32850:50;;;;-1:-1:-1;;;32850:50:0;;11103:2:1;32850:50:0;;;11085:21:1;11142:2;11122:18;;;11115:30;-1:-1:-1;;;11161:18:1;;;11154:45;11216:18;;32850:50:0;11075:165:1;32850:50:0;-1:-1:-1;;;;;32919:20:0;;32911:46;;;;-1:-1:-1;;;32911:46:0;;8861:2:1;32911:46:0;;;8843:21:1;8900:2;8880:18;;;8873:30;-1:-1:-1;;;8919:18:1;;;8912:43;8972:18;;32911:46:0;8833:163:1;32911:46:0;32968:48;-1:-1:-1;;;;;32968:26:0;;32995:8;-1:-1:-1;;26910:622:0;27280:10;;;27279:62;;-1:-1:-1;27296:39:0;;-1:-1:-1;;;27296:39:0;;27320:4;27296:39;;;5039:34:1;-1:-1:-1;;;;;5109:15:1;;;5089:18;;;5082:43;27296:15:0;;;;;4974:18:1;;27296:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;27279:62;27271:152;;;;-1:-1:-1;;;27271:152:0;;10680:2:1;27271: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;;27271:152:0;10652:244:1;27271:152:0;27461:62;;;-1:-1:-1;;;;;5708:32:1;;;27461:62:0;;;5690:51:1;5757:18;;;;5750:34;;;27461:62:0;;;;;;;;;;5663:18:1;;;;27461:62:0;;;;;;;;-1:-1:-1;;;;;27461:62:0;-1:-1:-1;;;27461:62:0;;;29135:69;;;;;;;;;;;;;;;;27434:90;;27454:5;;27461:62;-1:-1:-1;;29135:69:0;;:27;;;27461:62;;29135:27;:69::i;:::-;29219:17;;29109:95;;-1:-1:-1;29219:21:0;29215:224;;29361:10;29350:30;;;;;;;;;;;;:::i;:::-;29342:85;;;;-1:-1:-1;;;29342:85:0;;10269:2:1;29342: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;;29342:85:0;10241:232:1;21851:195:0;21954:12;21986:52;22008:6;22016:4;22022:1;22025:12;21986:21;:52::i;:::-;21979:59;;21851:195;;;;;;:::o;22903:530::-;23030:12;23088:5;23063:21;:30;;23055:81;;;;-1:-1:-1;;;23055:81:0;;8454:2:1;23055: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;;23055:81:0;8426:228:1;23055:81:0;23155:18;23166:6;23155:10;:18::i;:::-;23147:60;;;;-1:-1:-1;;;23147:60:0;;9564:2:1;23147:60:0;;;9546:21:1;9603:2;9583:18;;;9576:30;9642:31;9622:18;;;9615:59;9691:18;;23147:60:0;9536:179:1;23147:60:0;23281:12;23295:23;23322:6;-1:-1:-1;;;;;23322:11:0;23342:5;23350:4;23322:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23280:75;;;;23373:52;23391:7;23400:10;23412:12;23373:17;:52::i;:::-;23366:59;22903:530;-1:-1:-1;;;;;;;22903:530:0:o;18933:422::-;19300:20;;19339:8;;18933:422;;;;:::o;25443:742::-;25558:12;25587:7;25583:595;;;-1:-1:-1;25618:10:0;25611:17;;25583:595;25732:17;;:21;25728:439;;25995:10;25989:17;26056:15;26043:10;26039:2;26035:19;26028:44;25943:148;26138:12;26131:20;;-1:-1:-1;;;26131: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;3407:29;3426:9;3407:29;:::i;:::-;3397:39;;3487:2;3476:9;3472:18;3459:32;3514:18;3506:6;3503:30;3500:2;;;3551:6;3543;3536:22;3500:2;3595:70;3657:7;3648:6;3637:9;3633:22;3595:70;:::i;:::-;3316:409;;3684:8;;-1:-1:-1;3569:96:1;;-1:-1:-1;;;;3316:409:1: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://303fcdc023cd9cef7f47fa98473ccf9e72f9c2389526e715a3d3940aad9a1518
Loading...
Loading
Loading...
Loading
OVERVIEW
Wrapper contract to facilitate tracking of staked balances and applying a MTA boost.Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.