Source Code
Latest 25 from a total of 31 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Deposit | 30828034 | 11 days ago | IN | 0 FRAX | 0.00001111 | ||||
| Deposit | 28445445 | 66 days ago | IN | 0 FRAX | 0.00001413 | ||||
| Deposit | 25233486 | 140 days ago | IN | 0 FRAX | 0.0000115 | ||||
| Deposit | 24509932 | 157 days ago | IN | 0 FRAX | 0.00001417 | ||||
| Deposit | 23959775 | 170 days ago | IN | 0 FRAX | 0.00007418 | ||||
| Deposit | 23433010 | 182 days ago | IN | 0 FRAX | 0.00001827 | ||||
| Deposit | 23124726 | 189 days ago | IN | 0 FRAX | 0.00005065 | ||||
| Deposit | 21062028 | 237 days ago | IN | 0 FRAX | 0.00001207 | ||||
| Deposit | 21061123 | 237 days ago | IN | 0 FRAX | 0.00000769 | ||||
| Deposit | 20866573 | 241 days ago | IN | 0 FRAX | 0.00000533 | ||||
| Deposit | 20511254 | 250 days ago | IN | 0 FRAX | 0.00000007 | ||||
| Deposit | 19851008 | 265 days ago | IN | 0 FRAX | 0.00000006 | ||||
| Deposit | 19661491 | 269 days ago | IN | 0 FRAX | 0.00000045 | ||||
| Deposit | 19639735 | 270 days ago | IN | 0 FRAX | 0.00000069 | ||||
| Deposit | 18883197 | 287 days ago | IN | 0 FRAX | 0.00000076 | ||||
| Deposit | 18483938 | 297 days ago | IN | 0 FRAX | 0.00000057 | ||||
| Deposit | 18403283 | 298 days ago | IN | 0 FRAX | 0.00000076 | ||||
| Deposit | 16271243 | 348 days ago | IN | 0 FRAX | 0.00000076 | ||||
| Deposit | 14201525 | 396 days ago | IN | 0 FRAX | 0.00000095 | ||||
| Deposit | 14083659 | 398 days ago | IN | 0 FRAX | 0.00000156 | ||||
| Deposit | 13429996 | 414 days ago | IN | 0 FRAX | 0.00000198 | ||||
| Deposit | 10159305 | 489 days ago | IN | 0 FRAX | 0.00000307 | ||||
| Deposit | 10099039 | 491 days ago | IN | 0 FRAX | 0.00000149 | ||||
| Deposit | 9871951 | 496 days ago | IN | 0 FRAX | 0.00000089 | ||||
| Deposit | 7162569 | 559 days ago | IN | 0 FRAX | 0.00000184 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 30828034 | 11 days ago | 0 FRAX | |||||
| 30828034 | 11 days ago | 0 FRAX | |||||
| 30828034 | 11 days ago | 0 FRAX | |||||
| 30828034 | 11 days ago | 0 FRAX | |||||
| 30828034 | 11 days ago | 0 FRAX | |||||
| 28445445 | 66 days ago | 0 FRAX | |||||
| 28445445 | 66 days ago | 0 FRAX | |||||
| 28445445 | 66 days ago | 0 FRAX | |||||
| 28445445 | 66 days ago | 0 FRAX | |||||
| 28445445 | 66 days ago | 0 FRAX | |||||
| 25233486 | 140 days ago | 0 FRAX | |||||
| 25233486 | 140 days ago | 0 FRAX | |||||
| 25233486 | 140 days ago | 0 FRAX | |||||
| 25233486 | 140 days ago | 0 FRAX | |||||
| 25233486 | 140 days ago | 0 FRAX | |||||
| 24509932 | 157 days ago | 0 FRAX | |||||
| 24509932 | 157 days ago | 0 FRAX | |||||
| 24509932 | 157 days ago | 0 FRAX | |||||
| 24509932 | 157 days ago | 0 FRAX | |||||
| 24509932 | 157 days ago | 0 FRAX | |||||
| 23959775 | 170 days ago | 0 FRAX | |||||
| 23959775 | 170 days ago | 0 FRAX | |||||
| 23959775 | 170 days ago | 0 FRAX | |||||
| 23959775 | 170 days ago | 0 FRAX | |||||
| 23959775 | 170 days ago | 0 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FXSDepositorFraxtal
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-05-24
*/
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.19;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the 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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
}
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
/**
* @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
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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");
(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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
interface ILiquidityGauge {
struct Reward {
address token;
address distributor;
// solhint-disable-next-line
uint256 period_finish;
uint256 rate;
// solhint-disable-next-line
uint256 last_update;
uint256 integral;
}
// solhint-disable-next-line
function deposit_reward_token(address _rewardToken, uint256 _amount) external;
// solhint-disable-next-line
function claim_rewards_for(address _user, address _recipient) external;
// solhint-disable-next-line
function working_balances(address _address) external view returns (uint256);
// solhint-disable-next-line
function deposit(uint256 _value, address _addr) external;
// solhint-disable-next-line
function reward_tokens(uint256 _i) external view returns (address);
// solhint-disable-next-line
function reward_data(address _tokenReward) external view returns (Reward memory);
function balanceOf(address) external returns (uint256);
// solhint-disable-next-line
function claimable_reward(address _user, address _reward_token) external view returns (uint256);
// solhint-disable-next-line
function claimable_tokens(address _user) external returns (uint256);
// solhint-disable-next-line
function user_checkpoint(address _user) external returns (bool);
// solhint-disable-next-line
function commit_transfer_ownership(address) external;
// solhint-disable-next-line
function claim_rewards() external;
// solhint-disable-next-line
function claim_rewards(address) external;
// solhint-disable-next-line
function claim_rewards(address, address) external;
// solhint-disable-next-line
function add_reward(address, address) external;
// solhint-disable-next-line
function set_claimer(address) external;
function admin() external view returns (address);
function future_admin() external view returns (address);
// solhint-disable-next-line
function set_reward_distributor(address _rewardToken, address _newDistrib) external;
function initialize(
// solhint-disable-next-line
address staking_token,
address admin,
address sdt,
// solhint-disable-next-line
address voting_escrow,
// solhint-disable-next-line
address veBoost_proxy,
address distributor
) external;
function totalSupply() external returns (uint256);
function withdraw(uint256 _value, bool _claimReward) external;
// solhint-disable-next-line
function accept_transfer_ownership() external;
// solhint-disable-next-line
function claimed_reward(address _addr, address _token) external view returns (uint256);
// solhint-disable-next-line
function set_rewards_receiver(address _receiver) external;
}
interface ILocker {
function createLock(uint256, uint256) external;
function claimAllRewards(address[] calldata _tokens, address _recipient) external;
function increaseAmount(uint256) external;
function increaseAmount(uint128) external;
function increaseUnlockTime(uint256) external;
function release() external;
function claimRewards(address, address) external;
function claimRewards(address, address, address) external;
function claimFXSRewards(address) external;
function claimFPISRewards(address) external;
function execute(address, uint256, bytes calldata) external returns (bool, bytes memory);
function setGovernance(address) external;
function voteGaugeWeight(address, uint256) external;
function setAngleDepositor(address) external;
function setDepositor(address) external;
function setFxsDepositor(address) external;
function setYFIDepositor(address) external;
function setYieldDistributor(address) external;
function setGaugeController(address) external;
function setAccumulator(address _accumulator) external;
function governance() external view returns (address);
function increaseLock(uint256 _value, uint256 _duration) external;
function release(address _recipient) external;
}
interface ISdToken {
function balanceOf(address account) external view returns (uint256);
function burn(address _to, uint256 _amount) external;
function mint(address _to, uint256 _amount) external;
function operator() external view returns (address);
function setOperator(address _operator) external;
}
interface ISdTokenOperator {
function sdToken() external view returns (address);
}
interface ITokenMinter {
function mint(address, uint256) external;
function burn(address, uint256) external;
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
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'
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));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to
* 0 before setting it to a non-zero value.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @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");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @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).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// 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 cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
/// @title Depositor
/// @notice Contract that accepts tokens and locks them in the Locker, minting sdToken in return
/// @dev Adapted for veCRV like Locker.
/// @author StakeDAO
/// @custom:contact [email protected]
abstract contract DepositorV4 {
using SafeERC20 for IERC20;
/// @notice Denominator for fixed point math.
uint256 public constant DENOMINATOR = 10_000;
/// @notice Maximum lock duration.
uint256 public immutable MAX_LOCK_DURATION;
/// @notice Address of the token to be locked.
address public immutable token;
/// @notice Address of the locker contract.
address public immutable locker;
/// @notice Address of the sdToken minter contract.
address public minter;
/// @notice Fee percent to users who spend gas to increase lock.
uint256 public lockIncentivePercent = 10;
/// @notice Incentive accrued in token to users who spend gas to increase lock.
uint256 public incentiveToken;
/// @notice Gauge to deposit sdToken into.
address public gauge;
/// @notice Address of the governance.
address public governance;
/// @notice Address of the future governance contract.
address public futureGovernance;
////////////////////////////////////////////////////////////////
/// --- EVENTS & ERRORS
///////////////////////////////////////////////////////////////
/// @notice Event emitted when a lock is created.
/// @param amount Amount of tokens locked.
/// @param duration Duration of the lock.
event CreateLock(uint256 amount, uint256 duration);
/// @notice Event emitted when tokens are deposited.
/// @param caller Address of the caller.
/// @param user Address of the user.
/// @param amount Amount of tokens deposited.
/// @param lock Whether the tokens are locked.
/// @param stake Whether the sdToken is staked in the gauge.
event Deposited(address indexed caller, address indexed user, uint256 amount, bool lock, bool stake);
/// @notice Event emitted when incentive tokens are received.
/// @param caller Address of the caller.
/// @param amount Amount of tokens received.
event IncentiveReceived(address indexed caller, uint256 amount);
/// @notice Event emitted when tokens are locked.
/// @param user Address of the user.
/// @param amount Amount of tokens locked.
event TokenLocked(address indexed user, uint256 amount);
/// @notice Event emitted when governance is changed.
/// @param newGovernance Address of the new governance.
event GovernanceChanged(address indexed newGovernance);
/// @notice Event emitted when the sdToken Operator is changed.
event SdTokenOperatorChanged(address indexed newSdToken);
/// @notice Event emitted Incentive percent is changed.
event FeesChanged(uint256 newFee);
/// @notice Throws if caller is not the governance.
error GOVERNANCE();
/// @notice Throws if the deposit amount is zero.
error AMOUNT_ZERO();
/// @notice Throws if the address is zero.
error ADDRESS_ZERO();
////////////////////////////////////////////////////////////////
/// --- MODIFIERS
///////////////////////////////////////////////////////////////
modifier onlyGovernance() {
if (msg.sender != governance) revert GOVERNANCE();
_;
}
constructor(address _token, address _locker, address _minter, address _gauge, uint256 _maxLockDuration) {
governance = msg.sender;
token = _token;
gauge = _gauge;
minter = _minter;
locker = _locker;
MAX_LOCK_DURATION = _maxLockDuration;
/// Approve sdToken to gauge.
if (gauge != address(0)) {
IERC20(minter).safeApprove(gauge, type(uint256).max);
}
}
////////////////////////////////////////////////////////////////
/// --- DEPOSIT & LOCK
///////////////////////////////////////////////////////////////
/// @notice Initiate a lock in the Locker contract.
/// @param _amount Amount of tokens to lock.
function createLock(uint256 _amount) external virtual {
/// Transfer tokens to this contract
IERC20(token).safeTransferFrom(msg.sender, address(locker), _amount);
/// Can be called only once.
ILocker(locker).createLock(_amount, block.timestamp + MAX_LOCK_DURATION);
/// Mint sdToken to msg.sender.
ITokenMinter(minter).mint(msg.sender, _amount);
emit CreateLock(_amount, block.timestamp + MAX_LOCK_DURATION);
}
/// @notice Deposit tokens, and receive sdToken or sdTokenGauge in return.
/// @param _amount Amount of tokens to deposit.
/// @param _lock Whether to lock the tokens in the locker contract.
/// @param _stake Whether to stake the sdToken in the gauge.
/// @param _user Address of the user to receive the sdToken.
/// @dev If the lock is true, the tokens are directly sent to the locker and increase the lock amount as veToken.
/// If the lock is false, the tokens are sent to this contract until someone locks them. A small percent of the deposit
/// is used to incentivize users to lock the tokens.
/// If the stake is true, the sdToken is staked in the gauge that distributes rewards. If the stake is false, the sdToken
/// is sent to the user.
function deposit(uint256 _amount, bool _lock, bool _stake, address _user) public {
if (_amount == 0) revert AMOUNT_ZERO();
if (_user == address(0)) revert ADDRESS_ZERO();
/// If _lock is true, lock tokens in the locker contract.
if (_lock) {
/// Transfer tokens to this contract
IERC20(token).safeTransferFrom(msg.sender, locker, _amount);
/// Transfer the balance
uint256 balance = IERC20(token).balanceOf(address(this));
if (balance != 0) {
IERC20(token).safeTransfer(locker, balance);
}
/// Lock the amount sent + balance of the contract.
_lockToken(balance + _amount);
/// If an incentive is available, add it to the amount.
if (incentiveToken != 0) {
_amount += incentiveToken;
emit IncentiveReceived(msg.sender, incentiveToken);
incentiveToken = 0;
}
} else {
/// Transfer tokens to the locker contract and lock them.
IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);
/// Compute call incentive and add to incentiveToken
uint256 callIncentive = (_amount * lockIncentivePercent) / DENOMINATOR;
/// Subtract call incentive from _amount
_amount -= callIncentive;
/// Add call incentive to incentiveToken
incentiveToken += callIncentive;
}
// Mint sdtoken to the user if the gauge is not set
if (_stake && gauge != address(0)) {
/// Mint sdToken to this contract.
ITokenMinter(minter).mint(address(this), _amount);
/// Deposit sdToken into gauge for _user.
ILiquidityGauge(gauge).deposit(_amount, _user);
} else {
/// Mint sdToken to _user.
ITokenMinter(minter).mint(_user, _amount);
}
emit Deposited(msg.sender, _user, _amount, _lock, _stake);
}
/// @notice Lock tokens held by the contract
/// @dev The contract must have Token to lock
function lockToken() external {
uint256 tokenBalance = IERC20(token).balanceOf(address(this));
if (tokenBalance != 0) {
/// Transfer tokens to the locker contract and lock them.
IERC20(token).safeTransfer(locker, tokenBalance);
_lockToken(tokenBalance);
}
/// If there is incentive available give it to the user calling lockToken.
if (incentiveToken != 0) {
/// Mint incentiveToken to msg.sender.
ITokenMinter(minter).mint(msg.sender, incentiveToken);
emit IncentiveReceived(msg.sender, incentiveToken);
/// Reset incentiveToken.
incentiveToken = 0;
}
}
/// @notice Locks the tokens held by the contract
/// @dev The contract must have tokens to lock
function _lockToken(uint256 _amount) internal virtual {
// If there is Token available in the contract transfer it to the locker
if (_amount != 0) {
/// Increase the lock.
ILocker(locker).increaseLock(_amount, block.timestamp + MAX_LOCK_DURATION);
emit TokenLocked(msg.sender, _amount);
}
}
////////////////////////////////////////////////////////////////
/// --- GOVERNANCE PARAMETERS
///////////////////////////////////////////////////////////////
/// @notice Transfer the governance to a new address.
/// @param _governance Address of the new governance.
function transferGovernance(address _governance) external onlyGovernance {
futureGovernance = _governance;
}
/// @notice Accept the governance transfer.
function acceptGovernance() external {
if (msg.sender != futureGovernance) revert GOVERNANCE();
governance = msg.sender;
emit GovernanceChanged(msg.sender);
}
/// @notice Set the new operator for minting sdToken
/// @param _minter operator minter address
function setSdTokenMinterOperator(address _minter) external virtual onlyGovernance {
ISdToken(minter).setOperator(_minter);
emit SdTokenOperatorChanged(_minter);
}
/// @notice Set the gauge to deposit sdToken
/// @param _gauge gauge address
function setGauge(address _gauge) external virtual onlyGovernance {
gauge = _gauge;
if (_gauge != address(0)) {
/// Approve sdToken to gauge.
IERC20(minter).safeApprove(gauge, type(uint256).max);
}
}
/// @notice Set the percentage of the lock incentive
/// @param _lockIncentive Percentage of the lock incentive
function setFees(uint256 _lockIncentive) external onlyGovernance {
if (_lockIncentive >= 0 && _lockIncentive <= 30) {
emit FeesChanged(lockIncentivePercent = _lockIncentive);
}
}
}
/// @title Depositor
/// @notice Contract that accepts tokens and locks them in the Locker, minting sdToken in return
/// @author StakeDAO
/// @custom:contact [email protected]
contract FXSDepositorFraxtal is DepositorV4 {
using SafeERC20 for IERC20;
/// @notice Throwed when a low level call fails
error CallFailed();
//////////////////////////////////////////////////////
/// --- CONSTRUCTOR
//////////////////////////////////////////////////////
/// @notice Constructor
/// @param _token Address of the token
/// @param _minter Address of the minter (on fraxtal it is the main operator)
/// @param _gauge Address of the sdToken gauge
/// @param _mainOperator Address of the main operator (the minter)
/// @param _delegationRegistry Address of the fraxtal delegation registry
/// @param _initialDelegate Address of the delegate that receives network reward
constructor(
address _token,
address _locker,
address _minter,
address _gauge,
address _mainOperator,
address _delegationRegistry,
address _initialDelegate
) DepositorV4(_token, _locker, _minter, _gauge, 4 * 365 days) {
// Custom code for Fraxtal
// set _initialDelegate as delegate
(bool success,) =
_delegationRegistry.call(abi.encodeWithSignature("setDelegationForSelf(address)", _initialDelegate));
if (!success) revert CallFailed();
// disable self managing delegation
(success,) = _delegationRegistry.call(abi.encodeWithSignature("disableSelfManagingDelegations()"));
if (!success) revert CallFailed();
// set the minter as main operator
minter = _mainOperator;
}
/// @notice Set the gauge to deposit sdToken
/// @param _gauge gauge address
function setGauge(address _gauge) external override onlyGovernance {
gauge = _gauge;
if (_gauge != address(0)) {
/// Approve sdToken to gauge.
IERC20(ISdTokenOperator(minter).sdToken()).safeApprove(gauge, type(uint256).max);
}
}
/// @notice Set the operator for sdToken (leave it empty because on fraxtal the depositor is not the sdToken's operator)
function setSdTokenMinterOperator(address) external override onlyGovernance {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_locker","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_mainOperator","type":"address"},{"internalType":"address","name":"_delegationRegistry","type":"address"},{"internalType":"address","name":"_initialDelegate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ADDRESS_ZERO","type":"error"},{"inputs":[],"name":"AMOUNT_ZERO","type":"error"},{"inputs":[],"name":"CallFailed","type":"error"},{"inputs":[],"name":"GOVERNANCE","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"CreateLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"lock","type":"bool"},{"indexed":false,"internalType":"bool","name":"stake","type":"bool"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"IncentiveReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newSdToken","type":"address"}],"name":"SdTokenOperatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenLocked","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LOCK_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_lock","type":"bool"},{"internalType":"bool","name":"_stake","type":"bool"},{"internalType":"address","name":"_user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"futureGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incentiveToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockIncentivePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockIncentive","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"}],"name":"setGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"setSdTokenMinterOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60e0604052600a6001553480156200001657600080fd5b5060405162001bcb38038062001bcb833981016040819052620000399162000638565b60048054336001600160a01b0319918216179091556001600160a01b0388811660a0526003805483168783169081179091556000805490931688831617909255871660c052630784ce00608081905288918891889188919015620000b857600354600054620000b8916001600160a01b03918216911660001962000250565b50506040516001600160a01b0385811660248301526000945086169250604401905060408051601f198184030181529181526020820180516001600160e01b03166302b8a21d60e01b17905251620001119190620006f3565b6000604051808303816000865af19150503d806000811462000150576040519150601f19603f3d011682016040523d82523d6000602084013e62000155565b606091505b50509050806200017857604051633204506f60e01b815260040160405180910390fd5b60408051600481526024810182526020810180516001600160e01b03166325ce9a3760e01b17905290516001600160a01b03851691620001b891620006f3565b6000604051808303816000865af19150503d8060008114620001f7576040519150601f19603f3d011682016040523d82523d6000602084013e620001fc565b606091505b505080915050806200022157604051633204506f60e01b815260040160405180910390fd5b5050600080546001600160a01b0319166001600160a01b039390931692909217909155506200078b9350505050565b801580620002ce5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015620002a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cc919062000711565b155b620003465760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200039e918591620003a316565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620003f2906001600160a01b03851690849062000477565b9050805160001480620004165750808060200190518101906200041691906200072b565b6200039e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200033d565b606062000488848460008562000490565b949350505050565b606082471015620004f35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200033d565b600080866001600160a01b03168587604051620005119190620006f3565b60006040518083038185875af1925050503d806000811462000550576040519150601f19603f3d011682016040523d82523d6000602084013e62000555565b606091505b509092509050620005698783838762000574565b979650505050505050565b60608315620005e8578251600003620005e0576001600160a01b0385163b620005e05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200033d565b508162000488565b620004888383815115620005ff5781518083602001fd5b8060405162461bcd60e51b81526004016200033d919062000756565b80516001600160a01b03811681146200063357600080fd5b919050565b600080600080600080600060e0888a0312156200065457600080fd5b6200065f886200061b565b96506200066f602089016200061b565b95506200067f604089016200061b565b94506200068f606089016200061b565b93506200069f608089016200061b565b9250620006af60a089016200061b565b9150620006bf60c089016200061b565b905092959891949750929550565b60005b83811015620006ea578181015183820152602001620006d0565b50506000910152565b6000825162000707818460208701620006cd565b9190910192915050565b6000602082840312156200072457600080fd5b5051919050565b6000602082840312156200073e57600080fd5b815180151581146200074f57600080fd5b9392505050565b602081526000825180602084015262000777816040850160208701620006cd565b601f01601f19169190910160400192915050565b60805160a05160c0516113a06200082b6000396000818161024a01528181610548015281816106a40152818161078b01528181610ac701528181610af60152610df50152600081816102840152818161049e0152818161052601528181610681015281816106e101528181610769015281816108370152610aa401526000818161016d01528181610b2101528181610c240152610e2001526113a06000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063918f8674116100a2578063d0f492f711610071578063d0f492f71461021f578063d38bfff414610232578063d7b96d4e14610245578063f7d9d0c41461026c578063fc0c546a1461027f57600080fd5b8063918f8674146101f2578063a6f19c84146101fb578063b7fa1ba71461020e578063bca7a9e21461021757600080fd5b806355a68ed3116100e957806355a68ed31461019d5780635aa6e675146101b0578063601aff12146101c3578063638126f8146101d65780638070c503146101df57600080fd5b8063075461721461011b578063238efcbc1461014b5780633d18678e146101555780634f1bfc9e14610168575b600080fd5b60005461012e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101536102a6565b005b610153610163366004611176565b610311565b61018f7f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610142565b6101536101ab3660046111a4565b610381565b60045461012e906001600160a01b031681565b6101536101d13660046111a4565b61045b565b61018f60025481565b60055461012e906001600160a01b031681565b61018f61271081565b60035461012e906001600160a01b031681565b61018f60015481565b610153610486565b61015361022d3660046111d6565b610626565b6101536102403660046111a4565b610a4a565b61012e7f000000000000000000000000000000000000000000000000000000000000000081565b61015361027a366004611176565b610a97565b61012e7f000000000000000000000000000000000000000000000000000000000000000081565b6005546001600160a01b031633146102d1576040516305189e0d60e21b815260040160405180910390fd5b600480546001600160a01b031916339081179091556040517fa6a85f15b976d399f39ad43e515e75910bac714bc55eeff6131fb90780d6f74690600090a2565b6004546001600160a01b0316331461033c576040516305189e0d60e21b815260040160405180910390fd5b601e811161037e5760018190556040518181527f3dda580d2b9d92da338ef46ec718e7b1dd0a2c505e3df4aa8d40360192a0f822906020015b60405180910390a15b50565b6004546001600160a01b031633146103ac576040516305189e0d60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091551561037e576003546000546040805163776c23fb60e01b8152905161037e936001600160a01b03908116936000199391169163776c23fb916004808201926020929091908290030181865afa158015610427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044b9190611229565b6001600160a01b03169190610c63565b6004546001600160a01b0316331461037e576040516305189e0d60e21b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105119190611246565b905080156105765761056d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610db5565b61057681610de5565b6002541561037e576000546002546040516340c10f1960e01b815233600482015260248101919091526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156105ce57600080fd5b505af11580156105e2573d6000803e3d6000fd5b50506002546040519081523392507f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d63915060200160405180910390a2600060025550565b83600003610647576040516301f4d90760e41b815260040160405180910390fd5b6001600160a01b03811661066e576040516366e7950960e01b815260040160405180910390fd5b821561082a576106c96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f000000000000000000000000000000000000000000000000000000000000000087610ed3565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190611246565b905080156107b0576107b06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610db5565b6107c26107bd8683611275565b610de5565b60025415610824576002546107d79086611275565b9450336001600160a01b03167f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d6360025460405161081691815260200190565b60405180910390a260006002555b506108a3565b61085f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087610ed3565b600061271060015486610872919061128e565b61087c91906112a5565b905061088881866112c7565b9450806002600082825461089c9190611275565b9091555050505b8180156108ba57506003546001600160a01b031615155b1561098e576000546040516340c10f1960e01b8152306004820152602481018690526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561090b57600080fd5b505af115801561091f573d6000803e3d6000fd5b5050600354604051636e553f6560e01b8152600481018890526001600160a01b0385811660248301529091169250636e553f659150604401600060405180830381600087803b15801561097157600080fd5b505af1158015610985573d6000803e3d6000fd5b505050506109f5565b6000546040516340c10f1960e01b81526001600160a01b03838116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b1580156109dc57600080fd5b505af11580156109f0573d6000803e3d6000fd5b505050505b6040805185815284151560208201528315158183015290516001600160a01b0383169133917f1652dc46c7c8f691f8e51f9897515fc24cbd8cafd7eb97f620fe1635399d8c769181900360600190a350505050565b6004546001600160a01b03163314610a75576040516305189e0d60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b610aec6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f000000000000000000000000000000000000000000000000000000000000000084610ed3565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663b52c05fe82610b467f000000000000000000000000000000000000000000000000000000000000000042611275565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b50506000546040516340c10f1960e01b8152336004820152602481018590526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b505050507fd297715049e243e1bd6e98f7fd4da4dce0544c26f4ddf14b24b617743ba06e28817f000000000000000000000000000000000000000000000000000000000000000042610c4e9190611275565b60408051928352602083019190915201610375565b801580610cdd5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015610cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdb9190611246565b155b610d4d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084015b60405180910390fd5b6040516001600160a01b038316602482015260448101829052610db090849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610f11565b505050565b6040516001600160a01b038316602482015260448101829052610db090849063a9059cbb60e01b90606401610d79565b801561037e576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635e70a6dc82610e457f000000000000000000000000000000000000000000000000000000000000000042611275565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b50506040518381523392507ff9626bca62c59d77fa45a204dc096874ee066a5c5e124aa9ce6c438dbdf7387a915060200160405180910390a250565b6040516001600160a01b0380851660248301528316604482015260648101829052610f0b9085906323b872dd60e01b90608401610d79565b50505050565b6000610f66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610fe69092919063ffffffff16565b9050805160001480610f87575080806020019051810190610f8791906112da565b610db05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d44565b6060610ff58484600085610ffd565b949350505050565b60608247101561105e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d44565b600080866001600160a01b0316858760405161107a919061131b565b60006040518083038185875af1925050503d80600081146110b7576040519150601f19603f3d011682016040523d82523d6000602084013e6110bc565b606091505b50915091506110cd878383876110d8565b979650505050505050565b60608315611147578251600003611140576001600160a01b0385163b6111405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d44565b5081610ff5565b610ff5838381511561115c5781518083602001fd5b8060405162461bcd60e51b8152600401610d449190611337565b60006020828403121561118857600080fd5b5035919050565b6001600160a01b038116811461037e57600080fd5b6000602082840312156111b657600080fd5b81356111c18161118f565b9392505050565b801515811461037e57600080fd5b600080600080608085870312156111ec57600080fd5b8435935060208501356111fe816111c8565b9250604085013561120e816111c8565b9150606085013561121e8161118f565b939692955090935050565b60006020828403121561123b57600080fd5b81516111c18161118f565b60006020828403121561125857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156112885761128861125f565b92915050565b80820281158282048414176112885761128861125f565b6000826112c257634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156112885761128861125f565b6000602082840312156112ec57600080fd5b81516111c1816111c8565b60005b838110156113125781810151838201526020016112fa565b50506000910152565b6000825161132d8184602087016112f7565b9190910192915050565b60208152600082518060208401526113568160408501602087016112f7565b601f01601f1916919091016040019291505056fea2646970667358221220abb6f79a3a7aa29352ecd46c280567f619d37a055bd39cf2b538974764ea521a64736f6c63430008130033000000000000000000000000fc0000000000000000000000000000000000000200000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c350000000000000000000000001aee2382e05dc68bdfc472f1e46d570fecca581400000000000000000000000012992595328e52267c95e45b1a97014d6ddf8683000000000000000000000000daa04c5ddcad2c3574753dd4da6aeaad367e5765000000000000000000000000f5ca906f05cafa944c27c6881bed3dfd3a785b6a000000000000000000000000b0552b6860ce5c0202976db056b5e3cc4f9cc765
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063918f8674116100a2578063d0f492f711610071578063d0f492f71461021f578063d38bfff414610232578063d7b96d4e14610245578063f7d9d0c41461026c578063fc0c546a1461027f57600080fd5b8063918f8674146101f2578063a6f19c84146101fb578063b7fa1ba71461020e578063bca7a9e21461021757600080fd5b806355a68ed3116100e957806355a68ed31461019d5780635aa6e675146101b0578063601aff12146101c3578063638126f8146101d65780638070c503146101df57600080fd5b8063075461721461011b578063238efcbc1461014b5780633d18678e146101555780634f1bfc9e14610168575b600080fd5b60005461012e906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101536102a6565b005b610153610163366004611176565b610311565b61018f7f000000000000000000000000000000000000000000000000000000000784ce0081565b604051908152602001610142565b6101536101ab3660046111a4565b610381565b60045461012e906001600160a01b031681565b6101536101d13660046111a4565b61045b565b61018f60025481565b60055461012e906001600160a01b031681565b61018f61271081565b60035461012e906001600160a01b031681565b61018f60015481565b610153610486565b61015361022d3660046111d6565b610626565b6101536102403660046111a4565b610a4a565b61012e7f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c3581565b61015361027a366004611176565b610a97565b61012e7f000000000000000000000000fc0000000000000000000000000000000000000281565b6005546001600160a01b031633146102d1576040516305189e0d60e21b815260040160405180910390fd5b600480546001600160a01b031916339081179091556040517fa6a85f15b976d399f39ad43e515e75910bac714bc55eeff6131fb90780d6f74690600090a2565b6004546001600160a01b0316331461033c576040516305189e0d60e21b815260040160405180910390fd5b601e811161037e5760018190556040518181527f3dda580d2b9d92da338ef46ec718e7b1dd0a2c505e3df4aa8d40360192a0f822906020015b60405180910390a15b50565b6004546001600160a01b031633146103ac576040516305189e0d60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091551561037e576003546000546040805163776c23fb60e01b8152905161037e936001600160a01b03908116936000199391169163776c23fb916004808201926020929091908290030181865afa158015610427573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044b9190611229565b6001600160a01b03169190610c63565b6004546001600160a01b0316331461037e576040516305189e0d60e21b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f000000000000000000000000fc000000000000000000000000000000000000026001600160a01b0316906370a0823190602401602060405180830381865afa1580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105119190611246565b905080156105765761056d6001600160a01b037f000000000000000000000000fc00000000000000000000000000000000000002167f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c3583610db5565b61057681610de5565b6002541561037e576000546002546040516340c10f1960e01b815233600482015260248101919091526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156105ce57600080fd5b505af11580156105e2573d6000803e3d6000fd5b50506002546040519081523392507f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d63915060200160405180910390a2600060025550565b83600003610647576040516301f4d90760e41b815260040160405180910390fd5b6001600160a01b03811661066e576040516366e7950960e01b815260040160405180910390fd5b821561082a576106c96001600160a01b037f000000000000000000000000fc0000000000000000000000000000000000000216337f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c3587610ed3565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000fc000000000000000000000000000000000000026001600160a01b0316906370a0823190602401602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190611246565b905080156107b0576107b06001600160a01b037f000000000000000000000000fc00000000000000000000000000000000000002167f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c3583610db5565b6107c26107bd8683611275565b610de5565b60025415610824576002546107d79086611275565b9450336001600160a01b03167f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d6360025460405161081691815260200190565b60405180910390a260006002555b506108a3565b61085f6001600160a01b037f000000000000000000000000fc0000000000000000000000000000000000000216333087610ed3565b600061271060015486610872919061128e565b61087c91906112a5565b905061088881866112c7565b9450806002600082825461089c9190611275565b9091555050505b8180156108ba57506003546001600160a01b031615155b1561098e576000546040516340c10f1960e01b8152306004820152602481018690526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561090b57600080fd5b505af115801561091f573d6000803e3d6000fd5b5050600354604051636e553f6560e01b8152600481018890526001600160a01b0385811660248301529091169250636e553f659150604401600060405180830381600087803b15801561097157600080fd5b505af1158015610985573d6000803e3d6000fd5b505050506109f5565b6000546040516340c10f1960e01b81526001600160a01b03838116600483015260248201879052909116906340c10f1990604401600060405180830381600087803b1580156109dc57600080fd5b505af11580156109f0573d6000803e3d6000fd5b505050505b6040805185815284151560208201528315158183015290516001600160a01b0383169133917f1652dc46c7c8f691f8e51f9897515fc24cbd8cafd7eb97f620fe1635399d8c769181900360600190a350505050565b6004546001600160a01b03163314610a75576040516305189e0d60e21b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b610aec6001600160a01b037f000000000000000000000000fc0000000000000000000000000000000000000216337f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c3584610ed3565b6001600160a01b037f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c351663b52c05fe82610b467f000000000000000000000000000000000000000000000000000000000784ce0042611275565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610b8457600080fd5b505af1158015610b98573d6000803e3d6000fd5b50506000546040516340c10f1960e01b8152336004820152602481018590526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015610be857600080fd5b505af1158015610bfc573d6000803e3d6000fd5b505050507fd297715049e243e1bd6e98f7fd4da4dce0544c26f4ddf14b24b617743ba06e28817f000000000000000000000000000000000000000000000000000000000784ce0042610c4e9190611275565b60408051928352602083019190915201610375565b801580610cdd5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015610cb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cdb9190611246565b155b610d4d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084015b60405180910390fd5b6040516001600160a01b038316602482015260448101829052610db090849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610f11565b505050565b6040516001600160a01b038316602482015260448101829052610db090849063a9059cbb60e01b90606401610d79565b801561037e576001600160a01b037f00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c3516635e70a6dc82610e457f000000000000000000000000000000000000000000000000000000000784ce0042611275565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b50506040518381523392507ff9626bca62c59d77fa45a204dc096874ee066a5c5e124aa9ce6c438dbdf7387a915060200160405180910390a250565b6040516001600160a01b0380851660248301528316604482015260648101829052610f0b9085906323b872dd60e01b90608401610d79565b50505050565b6000610f66826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610fe69092919063ffffffff16565b9050805160001480610f87575080806020019051810190610f8791906112da565b610db05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d44565b6060610ff58484600085610ffd565b949350505050565b60608247101561105e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d44565b600080866001600160a01b0316858760405161107a919061131b565b60006040518083038185875af1925050503d80600081146110b7576040519150601f19603f3d011682016040523d82523d6000602084013e6110bc565b606091505b50915091506110cd878383876110d8565b979650505050505050565b60608315611147578251600003611140576001600160a01b0385163b6111405760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d44565b5081610ff5565b610ff5838381511561115c5781518083602001fd5b8060405162461bcd60e51b8152600401610d449190611337565b60006020828403121561118857600080fd5b5035919050565b6001600160a01b038116811461037e57600080fd5b6000602082840312156111b657600080fd5b81356111c18161118f565b9392505050565b801515811461037e57600080fd5b600080600080608085870312156111ec57600080fd5b8435935060208501356111fe816111c8565b9250604085013561120e816111c8565b9150606085013561121e8161118f565b939692955090935050565b60006020828403121561123b57600080fd5b81516111c18161118f565b60006020828403121561125857600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156112885761128861125f565b92915050565b80820281158282048414176112885761128861125f565b6000826112c257634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156112885761128861125f565b6000602082840312156112ec57600080fd5b81516111c1816111c8565b60005b838110156113125781810151838201526020016112fa565b50506000910152565b6000825161132d8184602087016112f7565b9190910192915050565b60208152600082518060208401526113568160408501602087016112f7565b601f01601f1916919091016040019291505056fea2646970667358221220abb6f79a3a7aa29352ecd46c280567f619d37a055bd39cf2b538974764ea521a64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fc0000000000000000000000000000000000000200000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c350000000000000000000000001aee2382e05dc68bdfc472f1e46d570fecca581400000000000000000000000012992595328e52267c95e45b1a97014d6ddf8683000000000000000000000000daa04c5ddcad2c3574753dd4da6aeaad367e5765000000000000000000000000f5ca906f05cafa944c27c6881bed3dfd3a785b6a000000000000000000000000b0552b6860ce5c0202976db056b5e3cc4f9cc765
-----Decoded View---------------
Arg [0] : _token (address): 0xFc00000000000000000000000000000000000002
Arg [1] : _locker (address): 0x26aCff2adc9104FE1c26c958dC4C9a5180840c35
Arg [2] : _minter (address): 0x1AEe2382e05Dc68BDfC472F1E46d570feCca5814
Arg [3] : _gauge (address): 0x12992595328E52267c95e45B1a97014D6Ddf8683
Arg [4] : _mainOperator (address): 0xDAA04C5DDCAd2C3574753Dd4DA6AeAAD367E5765
Arg [5] : _delegationRegistry (address): 0xF5cA906f05cafa944c27c6881bed3DFd3a785b6A
Arg [6] : _initialDelegate (address): 0xB0552b6860CE5C0202976Db056b5e3Cc4f9CC765
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000fc00000000000000000000000000000000000002
Arg [1] : 00000000000000000000000026acff2adc9104fe1c26c958dc4c9a5180840c35
Arg [2] : 0000000000000000000000001aee2382e05dc68bdfc472f1e46d570fecca5814
Arg [3] : 00000000000000000000000012992595328e52267c95e45b1a97014d6ddf8683
Arg [4] : 000000000000000000000000daa04c5ddcad2c3574753dd4da6aeaad367e5765
Arg [5] : 000000000000000000000000f5ca906f05cafa944c27c6881bed3dfd3a785b6a
Arg [6] : 000000000000000000000000b0552b6860ce5c0202976db056b5e3cc4f9cc765
Deployed Bytecode Sourcemap
36788:2192:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26787:21;;;;;-1:-1:-1;;;;;26787:21:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;26787:21:0;;;;;;;;35409:192;;;:::i;:::-;;36383:214;;;;;;:::i;:::-;;:::i;26499:42::-;;;;;;;;553:25:1;;;541:2;526:18;26499:42:0;407:177:1;38479:286:0;;;;;;:::i;:::-;;:::i;27180:25::-;;;;;-1:-1:-1;;;;;27180:25:0;;;38899:78;;;;;;:::i;:::-;;:::i;27021:29::-;;;;;;27274:31;;;;;-1:-1:-1;;;;;27274:31:0;;;26406:44;;26444:6;26406:44;;27107:20;;;;;-1:-1:-1;;;;;27107:20:0;;;26887:40;;;;;;33726:724;;;:::i;31532:2085::-;;;;;;:::i;:::-;;:::i;35230:122::-;;;;;;:::i;:::-;;:::i;26690:31::-;;;;;30243:484;;;;;;:::i;:::-;;:::i;26602:30::-;;;;;35409:192;35475:16;;-1:-1:-1;;;;;35475:16:0;35461:10;:30;35457:55;;35500:12;;-1:-1:-1;;;35500:12:0;;;;;;;;;;;35457:55;35525:10;:23;;-1:-1:-1;;;;;;35525:23:0;35538:10;35525:23;;;;;;35564:29;;;;35525:10;;35564:29;35409:192::o;36383:214::-;29444:10;;-1:-1:-1;;;;;29444:10:0;29430;:24;29426:49;;29463:12;;-1:-1:-1;;;29463:12:0;;;;;;;;;;;29426:49;36504:2:::1;36486:14;:20;36459:131;;36540:20;:37:::0;;;36528:50:::1;::::0;553:25:1;;;36528:50:0::1;::::0;541:2:1;526:18;36528:50:0::1;;;;;;;;36459:131;36383:214:::0;:::o;38479:286::-;29444:10;;-1:-1:-1;;;;;29444:10:0;29430;:24;29426:49;;29463:12;;-1:-1:-1;;;29463:12:0;;;;;;;;;;;29426:49;38557:5:::1;:14:::0;;-1:-1:-1;;;;;;38557:14:0::1;-1:-1:-1::0;;;;;38557:14:0;::::1;::::0;;::::1;::::0;;;38586:20;38582:176:::1;;38721:5;::::0;::::1;38690:6:::0;38673:34:::1;::::0;;-1:-1:-1;;;38673:34:0;;;;38666:80:::1;::::0;-1:-1:-1;;;;;38721:5:0;;::::1;::::0;-1:-1:-1;;38728:17:0;38690:6;::::1;::::0;38673:32:::1;::::0;:34:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;38690:6;38673:34:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38666:54:0::1;::::0;:80;:54:::1;:80::i;38899:78::-:0;29444:10;;-1:-1:-1;;;;;29444:10:0;29430;:24;29426:49;;29463:12;;-1:-1:-1;;;29463:12:0;;;;;;;;;;;33726:724;33790:38;;-1:-1:-1;;;33790:38:0;;33822:4;33790:38;;;160:51:1;33767:20:0;;33797:5;-1:-1:-1;;;;;33790:23:0;;;;133:18:1;;33790:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33767:61;-1:-1:-1;33845:17:0;;33841:208;;33950:48;-1:-1:-1;;;;;33957:5:0;33950:26;33977:6;33985:12;33950:26;:48::i;:::-;34013:24;34024:12;34013:10;:24::i;:::-;34149:14;;:19;34145:298;;34250:6;;34275:14;;34237:53;;-1:-1:-1;;;34237:53:0;;34263:10;34237:53;;;2310:51:1;2377:18;;;2370:34;;;;-1:-1:-1;;;;;34250:6:0;;;;34237:25;;2283:18:1;;34237:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34342:14:0;;34312:45;;553:25:1;;;34330:10:0;;-1:-1:-1;34312:45:0;;-1:-1:-1;541:2:1;526:18;34312:45:0;;;;;;;34430:1;34413:14;:18;33756:694;33726:724::o;31532:2085::-;31628:7;31639:1;31628:12;31624:38;;31649:13;;-1:-1:-1;;;31649:13:0;;;;;;;;;;;31624:38;-1:-1:-1;;;;;31677:19:0;;31673:46;;31705:14;;-1:-1:-1;;;31705:14:0;;;;;;;;;;;31673:46;31803:5;31799:1281;;;31875:59;-1:-1:-1;;;;;31882:5:0;31875:30;31906:10;31918:6;31926:7;31875:30;:59::i;:::-;32007:38;;-1:-1:-1;;;32007:38:0;;32039:4;32007:38;;;160:51:1;31989:15:0;;32014:5;-1:-1:-1;;;;;32007:23:0;;;;133:18:1;;32007:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31989:56;-1:-1:-1;32066:12:0;;32062:96;;32099:43;-1:-1:-1;;;;;32106:5:0;32099:26;32126:6;32134:7;32099:26;:43::i;:::-;32239:29;32250:17;32260:7;32250;:17;:::i;:::-;32239:10;:29::i;:::-;32358:14;;:19;32354:195;;32409:14;;32398:25;;;;:::i;:::-;;;32467:10;-1:-1:-1;;;;;32449:45:0;;32479:14;;32449:45;;;;553:25:1;;541:2;526:18;;407:177;32449:45:0;;;;;;;;32532:1;32515:14;:18;32354:195;31810:750;31799:1281;;;32652:66;-1:-1:-1;;;;;32659:5:0;32652:30;32683:10;32703:4;32710:7;32652:30;:66::i;:::-;32801:21;26444:6;32836:20;;32826:7;:30;;;;:::i;:::-;32825:46;;;;:::i;:::-;32801:70;-1:-1:-1;32942:24:0;32801:70;32942:24;;:::i;:::-;;;33055:13;33037:14;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;;31799:1281:0;33155:6;:29;;;;-1:-1:-1;33165:5:0;;-1:-1:-1;;;;;33165:5:0;:19;;33155:29;33151:391;;;33262:6;;33249:49;;-1:-1:-1;;;33249:49:0;;33283:4;33249:49;;;2310:51:1;2377:18;;;2370:34;;;-1:-1:-1;;;;;33262:6:0;;;;33249:25;;2283:18:1;;33249:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33386:5:0;;33370:46;;-1:-1:-1;;;33370:46:0;;;;;3379:25:1;;;-1:-1:-1;;;;;3440:32:1;;;3420:18;;;3413:60;33386:5:0;;;;-1:-1:-1;33370:30:0;;-1:-1:-1;3352:18:1;;33370:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33151:391;;;33502:6;;33489:41;;-1:-1:-1;;;33489:41:0;;-1:-1:-1;;;;;2328:32:1;;;33489:41:0;;;2310:51:1;2377:18;;;2370:34;;;33502:6:0;;;;33489:25;;2283:18:1;;33489:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33151:391;33557:52;;;3674:25:1;;;3742:14;;3735:22;3730:2;3715:18;;3708:50;3801:14;;3794:22;3774:18;;;3767:50;33557:52:0;;-1:-1:-1;;;;;33557:52:0;;;33567:10;;33557:52;;;;;3662:2:1;33557:52:0;;;31532:2085;;;;:::o;35230:122::-;29444:10;;-1:-1:-1;;;;;29444:10:0;29430;:24;29426:49;;29463:12;;-1:-1:-1;;;29463:12:0;;;;;;;;;;;29426:49;35314:16:::1;:30:::0;;-1:-1:-1;;;;;;35314:30:0::1;-1:-1:-1::0;;;;;35314:30:0;;;::::1;::::0;;;::::1;::::0;;35230:122::o;30243:484::-;30354:68;-1:-1:-1;;;;;30361:5:0;30354:30;30385:10;30405:6;30414:7;30354:30;:68::i;:::-;-1:-1:-1;;;;;30481:6:0;30473:26;;30500:7;30509:35;30527:17;30509:15;:35;:::i;:::-;30473:72;;-1:-1:-1;;;;;;30473:72:0;;;;;;;;;;4002:25:1;;;;4043:18;;;4036:34;3975:18;;30473:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30612:6:0;;30599:46;;-1:-1:-1;;;30599:46:0;;30625:10;30599:46;;;2310:51:1;2377:18;;;2370:34;;;-1:-1:-1;;;;;30612:6:0;;;;-1:-1:-1;30599:25:0;;-1:-1:-1;2283:18:1;;30599:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30663:56;30674:7;30701:17;30683:15;:35;;;;:::i;:::-;30663:56;;;4002:25:1;;;4058:2;4043:18;;4036:34;;;;3975:18;30663:56:0;3828:248:1;20862:582:0;21192:10;;;21191:62;;-1:-1:-1;21208:39:0;;-1:-1:-1;;;21208:39:0;;21232:4;21208:39;;;4293:34:1;-1:-1:-1;;;;;4363:15:1;;;4343:18;;;4336:43;21208:15:0;;;;;4228:18:1;;21208:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;21191:62;21169:166;;;;-1:-1:-1;;;21169:166:0;;4592:2:1;21169:166:0;;;4574:21:1;4631:2;4611:18;;;4604:30;4670:34;4650:18;;;4643:62;-1:-1:-1;;;4721:18:1;;;4714:52;4783:19;;21169:166:0;;;;;;;;;21373:62;;-1:-1:-1;;;;;2328:32:1;;21373:62:0;;;2310:51:1;2377:18;;;2370:34;;;21346:90:0;;21366:5;;-1:-1:-1;;;21396:22:0;2283:18:1;;21373:62:0;;;;-1:-1:-1;;21373:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;21373:62:0;-1:-1:-1;;;;;;21373:62:0;;;;;;;;;;21346:19;:90::i;:::-;20862:582;;;:::o;19966:177::-;20076:58;;-1:-1:-1;;;;;2328:32:1;;20076:58:0;;;2310:51:1;2377:18;;;2370:34;;;20049:86:0;;20069:5;;-1:-1:-1;;;20099:23:0;2283:18:1;;20076:58:0;2136:274:1;34565:363:0;34716:12;;34712:209;;-1:-1:-1;;;;;34789:6:0;34781:28;;34810:7;34819:35;34837:17;34819:15;:35;:::i;:::-;34781:74;;-1:-1:-1;;;;;;34781:74:0;;;;;;;;;;4002:25:1;;;;4043:18;;;4036:34;3975:18;;34781:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34877:32:0;;553:25:1;;;34889:10:0;;-1:-1:-1;34877:32:0;;-1:-1:-1;541:2:1;526:18;34877:32:0;;;;;;;34565:363;:::o;20388:205::-;20516:68;;-1:-1:-1;;;;;5071:15:1;;;20516:68:0;;;5053:34:1;5123:15;;5103:18;;;5096:43;5155:18;;;5148:34;;;20489:96:0;;20509:5;;-1:-1:-1;;;20539:27:0;4988:18:1;;20516:68:0;4813:375:1;20489:96:0;20388:205;;;;:::o;24289:649::-;24713:23;24739:69;24767:4;24739:69;;;;;;;;;;;;;;;;;24747:5;-1:-1:-1;;;;;24739:27:0;;;:69;;;;;:::i;:::-;24713:95;;24827:10;:17;24848:1;24827:22;:56;;;;24864:10;24853:30;;;;;;;;;;;;:::i;:::-;24819:111;;;;-1:-1:-1;;;24819:111:0;;5645:2:1;24819:111:0;;;5627:21:1;5684:2;5664:18;;;5657:30;5723:34;5703:18;;;5696:62;-1:-1:-1;;;5774:18:1;;;5767:40;5824:19;;24819:111:0;5443:406:1;8996:229:0;9133:12;9165:52;9187:6;9195:4;9201:1;9204:12;9165:21;:52::i;:::-;9158:59;8996:229;-1:-1:-1;;;;8996:229:0:o;10082:455::-;10252:12;10310:5;10285:21;:30;;10277:81;;;;-1:-1:-1;;;10277:81:0;;6056:2:1;10277:81:0;;;6038:21:1;6095:2;6075:18;;;6068:30;6134:34;6114:18;;;6107:62;-1:-1:-1;;;6185:18:1;;;6178:36;6231:19;;10277:81:0;5854:402:1;10277:81:0;10370:12;10384:23;10411:6;-1:-1:-1;;;;;10411:11:0;10430:5;10437:4;10411:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10369:73;;;;10460:69;10487:6;10495:7;10504:10;10516:12;10460:26;:69::i;:::-;10453:76;10082:455;-1:-1:-1;;;;;;;10082:455:0:o;12655:644::-;12840:12;12869:7;12865:427;;;12897:10;:17;12918:1;12897:22;12893:290;;-1:-1:-1;;;;;6536:19:0;;;13107:60;;;;-1:-1:-1;;;13107:60:0;;7010:2:1;13107:60:0;;;6992:21:1;7049:2;7029:18;;;7022:30;7088:31;7068:18;;;7061:59;7137:18;;13107:60:0;6808:353:1;13107:60:0;-1:-1:-1;13204:10:0;13197:17;;12865:427;13247:33;13255:10;13267:12;14002:17;;:21;13998:388;;14234:10;14228:17;14291:15;14278:10;14274:2;14270:19;14263:44;13998:388;14361:12;14354:20;;-1:-1:-1;;;14354:20:0;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;589:131::-;-1:-1:-1;;;;;664:31:1;;654:42;;644:70;;710:1;707;700:12;725:247;784:6;837:2;825:9;816:7;812:23;808:32;805:52;;;853:1;850;843:12;805:52;892:9;879:23;911:31;936:5;911:31;:::i;:::-;961:5;725:247;-1:-1:-1;;;725:247:1:o;977:118::-;1063:5;1056:13;1049:21;1042:5;1039:32;1029:60;;1085:1;1082;1075:12;1100:586;1180:6;1188;1196;1204;1257:3;1245:9;1236:7;1232:23;1228:33;1225:53;;;1274:1;1271;1264:12;1225:53;1310:9;1297:23;1287:33;;1370:2;1359:9;1355:18;1342:32;1383:28;1405:5;1383:28;:::i;:::-;1430:5;-1:-1:-1;1487:2:1;1472:18;;1459:32;1500:30;1459:32;1500:30;:::i;:::-;1549:7;-1:-1:-1;1608:2:1;1593:18;;1580:32;1621:33;1580:32;1621:33;:::i;:::-;1100:586;;;;-1:-1:-1;1100:586:1;;-1:-1:-1;;1100:586:1:o;1691:251::-;1761:6;1814:2;1802:9;1793:7;1789:23;1785:32;1782:52;;;1830:1;1827;1820:12;1782:52;1862:9;1856:16;1881:31;1906:5;1881:31;:::i;1947:184::-;2017:6;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;-1:-1:-1;2109:16:1;;1947:184;-1:-1:-1;1947:184:1:o;2415:127::-;2476:10;2471:3;2467:20;2464:1;2457:31;2507:4;2504:1;2497:15;2531:4;2528:1;2521:15;2547:125;2612:9;;;2633:10;;;2630:36;;;2646:18;;:::i;:::-;2547:125;;;;:::o;2677:168::-;2750:9;;;2781;;2798:15;;;2792:22;;2778:37;2768:71;;2819:18;;:::i;2850:217::-;2890:1;2916;2906:132;;2960:10;2955:3;2951:20;2948:1;2941:31;2995:4;2992:1;2985:15;3023:4;3020:1;3013:15;2906:132;-1:-1:-1;3052:9:1;;2850:217::o;3072:128::-;3139:9;;;3160:11;;;3157:37;;;3174:18;;:::i;5193:245::-;5260:6;5313:2;5301:9;5292:7;5288:23;5284:32;5281:52;;;5329:1;5326;5319:12;5281:52;5361:9;5355:16;5380:28;5402:5;5380:28;:::i;6261:250::-;6346:1;6356:113;6370:6;6367:1;6364:13;6356:113;;;6446:11;;;6440:18;6427:11;;;6420:39;6392:2;6385:10;6356:113;;;-1:-1:-1;;6503:1:1;6485:16;;6478:27;6261:250::o;6516:287::-;6645:3;6683:6;6677:13;6699:66;6758:6;6753:3;6746:4;6738:6;6734:17;6699:66;:::i;:::-;6781:16;;;;;6516:287;-1:-1:-1;;6516:287:1:o;7166:396::-;7315:2;7304:9;7297:21;7278:4;7347:6;7341:13;7390:6;7385:2;7374:9;7370:18;7363:34;7406:79;7478:6;7473:2;7462:9;7458:18;7453:2;7445:6;7441:15;7406:79;:::i;:::-;7546:2;7525:15;-1:-1:-1;;7521:29:1;7506:45;;;;7553:2;7502:54;;7166:396;-1:-1:-1;;7166:396:1:o
Swarm Source
ipfs://abb6f79a3a7aa29352ecd46c280567f619d37a055bd39cf2b538974764ea521a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.