Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x38d6ba67be8a0a7275264a635a913821a7d06c7aac2f1a68b4a508b01e649997 | Deposit | (pending) | 7 hrs ago | IN | 0 ETH | (Pending) | |||
Deposit | 20752890 | 5 days ago | IN | 0 ETH | 0.0012203 | ||||
Deposit | 20708531 | 11 days ago | IN | 0 ETH | 0.000473 | ||||
Deposit | 20705422 | 12 days ago | IN | 0 ETH | 0.00067889 | ||||
Deposit | 20669449 | 17 days ago | IN | 0 ETH | 0.00127179 | ||||
Deposit | 20668685 | 17 days ago | IN | 0 ETH | 0.0004586 | ||||
Deposit | 20668299 | 17 days ago | IN | 0 ETH | 0.00036042 | ||||
Deposit | 20657600 | 19 days ago | IN | 0 ETH | 0.00006967 | ||||
Deposit | 20656927 | 19 days ago | IN | 0 ETH | 0.00054178 | ||||
Deposit | 20655310 | 19 days ago | IN | 0 ETH | 0.00041678 | ||||
Deposit | 20655303 | 19 days ago | IN | 0 ETH | 0.00040992 | ||||
Deposit | 20655293 | 19 days ago | IN | 0 ETH | 0.00040645 | ||||
Deposit | 20655285 | 19 days ago | IN | 0 ETH | 0.00043027 | ||||
Deposit | 20655272 | 19 days ago | IN | 0 ETH | 0.00039918 | ||||
Deposit | 20655259 | 19 days ago | IN | 0 ETH | 0.00040961 | ||||
Deposit | 20655246 | 19 days ago | IN | 0 ETH | 0.00039102 | ||||
Deposit | 20655238 | 19 days ago | IN | 0 ETH | 0.00040207 | ||||
Deposit | 20655158 | 19 days ago | IN | 0 ETH | 0.00041044 | ||||
Deposit | 20655148 | 19 days ago | IN | 0 ETH | 0.00059817 | ||||
Deposit | 20637722 | 21 days ago | IN | 0 ETH | 0.00044571 | ||||
Deposit | 20633650 | 22 days ago | IN | 0 ETH | 0.00126548 | ||||
Deposit | 20580650 | 29 days ago | IN | 0 ETH | 0.00053519 | ||||
Deposit | 20579208 | 30 days ago | IN | 0 ETH | 0.00105506 | ||||
Deposit | 20578662 | 30 days ago | IN | 0 ETH | 0.00094008 | ||||
Deposit | 20554628 | 33 days ago | IN | 0 ETH | 0.0007239 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FXNDepositor
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-28 */ // SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.20; 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 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 setFxsDepositor(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 setOperator(address _operator) external; } interface ITokenMinter { function mint(address, uint256) external; function burn(address, uint256) external; } interface ILiquidityGauge { struct Reward { address token; address distributor; uint256 period_finish; uint256 rate; 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; function working_balances(address _address) external view returns (uint256); // // solhint-disable-next-line // function claim_rewards_for(address _user) external; // 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); function claimable_reward(address _user, address _reward_token) external view returns (uint256); function claimable_tokens(address _user) external returns (uint256); function user_checkpoint(address _user) external returns (bool); function commit_transfer_ownership(address) external; function claim_rewards(address) external; function add_reward(address, address) external; function set_claimer(address) external; function admin() external view returns (address); function set_reward_distributor(address _rewardToken, address _newDistrib) external; function initialize( address staking_token, address admin, address SDT, address voting_escrow, address veBoost_proxy, address distributor ) external; } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol) // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @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); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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); } } } /** * @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 Depositor { using SafeERC20 for IERC20; /// @notice Denominator for fixed point math. uint256 public constant DENOMINATOR = 10_000; /// @notice Maximum lock duration. uint256 private 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 immutable 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. 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 { /// 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, address(locker), _amount); /// Transfer the balance uint256 balance = IERC20(token).balanceOf(address(this)); 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; } if (_stake) { /// 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 { // 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 onlyGovernance { ISdToken(minter).setOperator(_minter); emit SdTokenOperatorChanged(_minter); } /// @notice Set the gauge to deposit sdToken /// @param _gauge gauge address function setGauge(address _gauge) external onlyGovernance { gauge = _gauge; /// 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 FXNDepositor is Depositor { constructor(address _token, address _locker, address _minter, address _gauge) Depositor(_token, _locker, _minter, _gauge, 4 * 365 days) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ADDRESS_ZERO","type":"error"},{"inputs":[],"name":"AMOUNT_ZERO","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":"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":"_minter","type":"address"}],"name":"setSdTokenMinterOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052600a6000553480156200001757600080fd5b5060405162001a8638038062001a868339810160408190526200003a9162000491565b600380546001600160a01b031990811633179091556001600160a01b0380861660a0526002805482851693168317905580841660e081905290851660c052630784ce006080819052869286928692869290916200009a91600019620000a9565b505050505050505050620005ac565b801580620001275750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620004ee565b155b6200019f5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620001f7918591620001fc16565b505050565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200024b906001600160a01b038516908490620002d0565b90508051600014806200026f5750808060200190518101906200026f919062000508565b620001f75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000196565b6060620002e18484600085620002e9565b949350505050565b6060824710156200034c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000196565b600080866001600160a01b031685876040516200036a919062000559565b60006040518083038185875af1925050503d8060008114620003a9576040519150601f19603f3d011682016040523d82523d6000602084013e620003ae565b606091505b509092509050620003c287838387620003cd565b979650505050505050565b606083156200044157825160000362000439576001600160a01b0385163b620004395760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000196565b5081620002e1565b620002e18383815115620004585781518083602001fd5b8060405162461bcd60e51b815260040162000196919062000577565b80516001600160a01b03811681146200048c57600080fd5b919050565b60008060008060808587031215620004a857600080fd5b620004b38562000474565b9350620004c36020860162000474565b9250620004d36040860162000474565b9150620004e36060860162000474565b905092959194509250565b6000602082840312156200050157600080fd5b5051919050565b6000602082840312156200051b57600080fd5b815180151581146200052c57600080fd5b9392505050565b60005b838110156200055057818101518382015260200162000536565b50506000910152565b600082516200056d81846020870162000533565b9190910192915050565b60208152600082518060208401526200059881604085016020870162000533565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161140d6200067960003960008181610115015281816103b301528181610426015281816105d10152818161090e01528181610a030152610c2101526000818161022c0152818161057b015281816106f3015281816107d401528181610b3201528181610b610152610e7c015260008181610266015281816104d101528181610559015281816106d001528181610730015281816107b2015281816108800152610b0f015260008181610b8c01528181610cab0152610ea7015261140d6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063918f8674116100a2578063d0f492f711610071578063d0f492f714610201578063d38bfff414610214578063d7b96d4e14610227578063f7d9d0c41461024e578063fc0c546a1461026157600080fd5b8063918f8674146101d4578063a6f19c84146101dd578063b7fa1ba7146101f0578063bca7a9e2146101f957600080fd5b80635aa6e675116100de5780635aa6e67514610184578063601aff1214610197578063638126f8146101aa5780638070c503146101c157600080fd5b80630754617214610110578063238efcbc146101545780633d18678e1461015e57806355a68ed314610171575b600080fd5b6101377f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61015c610288565b005b61015c61016c3660046111fd565b6102f3565b61015c61017f366004611232565b610363565b600354610137906001600160a01b031681565b61015c6101a5366004611232565b6103dc565b6101b360015481565b60405190815260200161014b565b600454610137906001600160a01b031681565b6101b361271081565b600254610137906001600160a01b031681565b6101b360005481565b61015c6104b9565b61015c61020f366004611262565b610675565b61015c610222366004611232565b610ab5565b6101377f000000000000000000000000000000000000000000000000000000000000000081565b61015c61025c3660046111fd565b610b02565b6101377f000000000000000000000000000000000000000000000000000000000000000081565b6004546001600160a01b031633146102b3576040516305189e0d60e21b815260040160405180910390fd5b600380546001600160a01b031916339081179091556040517fa6a85f15b976d399f39ad43e515e75910bac714bc55eeff6131fb90780d6f74690600090a2565b6003546001600160a01b0316331461031e576040516305189e0d60e21b815260040160405180910390fd5b601e81116103605760008190556040518181527f3dda580d2b9d92da338ef46ec718e7b1dd0a2c505e3df4aa8d40360192a0f822906020015b60405180910390a15b50565b6003546001600160a01b0316331461038e576040516305189e0d60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03838116918217909255610360917f00000000000000000000000000000000000000000000000000000000000000001690600019610cea565b6003546001600160a01b03163314610407576040516305189e0d60e21b815260040160405180910390fd5b60405163b3ab15fb60e01b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063b3ab15fb90602401600060405180830381600087803b15801561046a57600080fd5b505af115801561047e573d6000803e3d6000fd5b50506040516001600160a01b03841692507f860079172b8d313ffe6600be83301a99a5099e33a3f5cbe541d97e98074cbfe79150600090a250565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610520573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054491906112b3565b905080156105a9576105a06001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610e3c565b6105a981610e6c565b60015415610360576001546040516340c10f1960e01b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561061d57600080fd5b505af1158015610631573d6000803e3d6000fd5b50506001546040519081523392507f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d63915060200160405180910390a2600060015550565b83600003610696576040516301f4d90760e41b815260040160405180910390fd5b6001600160a01b0381166106bd576040516366e7950960e01b815260040160405180910390fd5b8215610873576107186001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f000000000000000000000000000000000000000000000000000000000000000087610f5a565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561077f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a391906112b3565b90506107f96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610e3c565b61080b61080686836112e2565b610e6c565b6001541561086d5760015461082090866112e2565b9450336001600160a01b03167f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d6360015460405161085f91815260200190565b60405180910390a260006001555b506108ec565b6108a86001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087610f5a565b6000612710600054866108bb91906112fb565b6108c59190611312565b90506108d18186611334565b945080600160008282546108e591906112e2565b9091555050505b81156109dd576040516340c10f1960e01b8152306004820152602481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b5050600254604051636e553f6560e01b8152600481018890526001600160a01b0385811660248301529091169250636e553f659150604401600060405180830381600087803b1580156109c057600080fd5b505af11580156109d4573d6000803e3d6000fd5b50505050610a60565b6040516340c10f1960e01b81526001600160a01b038281166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b158015610a4757600080fd5b505af1158015610a5b573d6000803e3d6000fd5b505050505b6040805185815284151560208201528315158183015290516001600160a01b0383169133917f1652dc46c7c8f691f8e51f9897515fc24cbd8cafd7eb97f620fe1635399d8c769181900360600190a350505050565b6003546001600160a01b03163314610ae0576040516305189e0d60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610b576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016337f000000000000000000000000000000000000000000000000000000000000000084610f5a565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663b52c05fe82610bb17f0000000000000000000000000000000000000000000000000000000000000000426112e2565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b50506040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506340c10f199150604401600060405180830381600087803b158015610c6f57600080fd5b505af1158015610c83573d6000803e3d6000fd5b505050507fd297715049e243e1bd6e98f7fd4da4dce0544c26f4ddf14b24b617743ba06e28817f000000000000000000000000000000000000000000000000000000000000000042610cd591906112e2565b60408051928352602083019190915201610357565b801580610d645750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015610d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6291906112b3565b155b610dd45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084015b60405180910390fd5b6040516001600160a01b038316602482015260448101829052610e3790849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610f98565b505050565b6040516001600160a01b038316602482015260448101829052610e3790849063a9059cbb60e01b90606401610e00565b8015610360576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635e70a6dc82610ecc7f0000000000000000000000000000000000000000000000000000000000000000426112e2565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610f0a57600080fd5b505af1158015610f1e573d6000803e3d6000fd5b50506040518381523392507ff9626bca62c59d77fa45a204dc096874ee066a5c5e124aa9ce6c438dbdf7387a915060200160405180910390a250565b6040516001600160a01b0380851660248301528316604482015260648101829052610f929085906323b872dd60e01b90608401610e00565b50505050565b6000610fed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661106d9092919063ffffffff16565b905080516000148061100e57508080602001905181019061100e9190611347565b610e375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610dcb565b606061107c8484600085611084565b949350505050565b6060824710156110e55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610dcb565b600080866001600160a01b031685876040516111019190611388565b60006040518083038185875af1925050503d806000811461113e576040519150601f19603f3d011682016040523d82523d6000602084013e611143565b606091505b50915091506111548783838761115f565b979650505050505050565b606083156111ce5782516000036111c7576001600160a01b0385163b6111c75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dcb565b508161107c565b61107c83838151156111e35781518083602001fd5b8060405162461bcd60e51b8152600401610dcb91906113a4565b60006020828403121561120f57600080fd5b5035919050565b80356001600160a01b038116811461122d57600080fd5b919050565b60006020828403121561124457600080fd5b61124d82611216565b9392505050565b801515811461036057600080fd5b6000806000806080858703121561127857600080fd5b84359350602085013561128a81611254565b9250604085013561129a81611254565b91506112a860608601611216565b905092959194509250565b6000602082840312156112c557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156112f5576112f56112cc565b92915050565b80820281158282048414176112f5576112f56112cc565b60008261132f57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156112f5576112f56112cc565b60006020828403121561135957600080fd5b815161124d81611254565b60005b8381101561137f578181015183820152602001611367565b50506000910152565b6000825161139a818460208701611364565b9190910192915050565b60208152600082518060208401526113c3816040850160208701611364565b601f01601f1916919091016040019291505056fea2646970667358221220414bfb543742e233d1905d29f89195bceca3d3c2dafa62ef251a19d8ed133b6264736f6c63430008140033000000000000000000000000365accfca291e7d3914637abf1f7635db165bb0900000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad000000000000000000000000bcfe5c47129253c6b8a9a00565b3358b488d42e0
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063918f8674116100a2578063d0f492f711610071578063d0f492f714610201578063d38bfff414610214578063d7b96d4e14610227578063f7d9d0c41461024e578063fc0c546a1461026157600080fd5b8063918f8674146101d4578063a6f19c84146101dd578063b7fa1ba7146101f0578063bca7a9e2146101f957600080fd5b80635aa6e675116100de5780635aa6e67514610184578063601aff1214610197578063638126f8146101aa5780638070c503146101c157600080fd5b80630754617214610110578063238efcbc146101545780633d18678e1461015e57806355a68ed314610171575b600080fd5b6101377f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad81565b6040516001600160a01b0390911681526020015b60405180910390f35b61015c610288565b005b61015c61016c3660046111fd565b6102f3565b61015c61017f366004611232565b610363565b600354610137906001600160a01b031681565b61015c6101a5366004611232565b6103dc565b6101b360015481565b60405190815260200161014b565b600454610137906001600160a01b031681565b6101b361271081565b600254610137906001600160a01b031681565b6101b360005481565b61015c6104b9565b61015c61020f366004611262565b610675565b61015c610222366004611232565b610ab5565b6101377f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb81565b61015c61025c3660046111fd565b610b02565b6101377f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb0981565b6004546001600160a01b031633146102b3576040516305189e0d60e21b815260040160405180910390fd5b600380546001600160a01b031916339081179091556040517fa6a85f15b976d399f39ad43e515e75910bac714bc55eeff6131fb90780d6f74690600090a2565b6003546001600160a01b0316331461031e576040516305189e0d60e21b815260040160405180910390fd5b601e81116103605760008190556040518181527f3dda580d2b9d92da338ef46ec718e7b1dd0a2c505e3df4aa8d40360192a0f822906020015b60405180910390a15b50565b6003546001600160a01b0316331461038e576040516305189e0d60e21b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b03838116918217909255610360917f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad1690600019610cea565b6003546001600160a01b03163314610407576040516305189e0d60e21b815260040160405180910390fd5b60405163b3ab15fb60e01b81526001600160a01b0382811660048301527f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad169063b3ab15fb90602401600060405180830381600087803b15801561046a57600080fd5b505af115801561047e573d6000803e3d6000fd5b50506040516001600160a01b03841692507f860079172b8d313ffe6600be83301a99a5099e33a3f5cbe541d97e98074cbfe79150600090a250565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb096001600160a01b0316906370a0823190602401602060405180830381865afa158015610520573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054491906112b3565b905080156105a9576105a06001600160a01b037f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb09167f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb83610e3c565b6105a981610e6c565b60015415610360576001546040516340c10f1960e01b815233600482015260248101919091527f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad6001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561061d57600080fd5b505af1158015610631573d6000803e3d6000fd5b50506001546040519081523392507f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d63915060200160405180910390a2600060015550565b83600003610696576040516301f4d90760e41b815260040160405180910390fd5b6001600160a01b0381166106bd576040516366e7950960e01b815260040160405180910390fd5b8215610873576107186001600160a01b037f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb0916337f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb87610f5a565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb096001600160a01b0316906370a0823190602401602060405180830381865afa15801561077f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a391906112b3565b90506107f96001600160a01b037f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb09167f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb83610e3c565b61080b61080686836112e2565b610e6c565b6001541561086d5760015461082090866112e2565b9450336001600160a01b03167f70220290ea80981efd0f0f7e6b1b5085605eb976822c8b8422e5bcc53e4c6d6360015460405161085f91815260200190565b60405180910390a260006001555b506108ec565b6108a86001600160a01b037f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb0916333087610f5a565b6000612710600054866108bb91906112fb565b6108c59190611312565b90506108d18186611334565b945080600160008282546108e591906112e2565b9091555050505b81156109dd576040516340c10f1960e01b8152306004820152602481018590527f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad6001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561095a57600080fd5b505af115801561096e573d6000803e3d6000fd5b5050600254604051636e553f6560e01b8152600481018890526001600160a01b0385811660248301529091169250636e553f659150604401600060405180830381600087803b1580156109c057600080fd5b505af11580156109d4573d6000803e3d6000fd5b50505050610a60565b6040516340c10f1960e01b81526001600160a01b038281166004830152602482018690527f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad16906340c10f1990604401600060405180830381600087803b158015610a4757600080fd5b505af1158015610a5b573d6000803e3d6000fd5b505050505b6040805185815284151560208201528315158183015290516001600160a01b0383169133917f1652dc46c7c8f691f8e51f9897515fc24cbd8cafd7eb97f620fe1635399d8c769181900360600190a350505050565b6003546001600160a01b03163314610ae0576040516305189e0d60e21b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b610b576001600160a01b037f000000000000000000000000365accfca291e7d3914637abf1f7635db165bb0916337f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb84610f5a565b6001600160a01b037f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb1663b52c05fe82610bb17f000000000000000000000000000000000000000000000000000000000784ce00426112e2565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b50506040516340c10f1960e01b8152336004820152602481018490527f000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad6001600160a01b031692506340c10f199150604401600060405180830381600087803b158015610c6f57600080fd5b505af1158015610c83573d6000803e3d6000fd5b505050507fd297715049e243e1bd6e98f7fd4da4dce0544c26f4ddf14b24b617743ba06e28817f000000000000000000000000000000000000000000000000000000000784ce0042610cd591906112e2565b60408051928352602083019190915201610357565b801580610d645750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015610d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6291906112b3565b155b610dd45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b60648201526084015b60405180910390fd5b6040516001600160a01b038316602482015260448101829052610e3790849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610f98565b505050565b6040516001600160a01b038316602482015260448101829052610e3790849063a9059cbb60e01b90606401610e00565b8015610360576001600160a01b037f00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb16635e70a6dc82610ecc7f000000000000000000000000000000000000000000000000000000000784ce00426112e2565b6040516001600160e01b031960e085901b16815260048101929092526024820152604401600060405180830381600087803b158015610f0a57600080fd5b505af1158015610f1e573d6000803e3d6000fd5b50506040518381523392507ff9626bca62c59d77fa45a204dc096874ee066a5c5e124aa9ce6c438dbdf7387a915060200160405180910390a250565b6040516001600160a01b0380851660248301528316604482015260648101829052610f929085906323b872dd60e01b90608401610e00565b50505050565b6000610fed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661106d9092919063ffffffff16565b905080516000148061100e57508080602001905181019061100e9190611347565b610e375760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610dcb565b606061107c8484600085611084565b949350505050565b6060824710156110e55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610dcb565b600080866001600160a01b031685876040516111019190611388565b60006040518083038185875af1925050503d806000811461113e576040519150601f19603f3d011682016040523d82523d6000602084013e611143565b606091505b50915091506111548783838761115f565b979650505050505050565b606083156111ce5782516000036111c7576001600160a01b0385163b6111c75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610dcb565b508161107c565b61107c83838151156111e35781518083602001fd5b8060405162461bcd60e51b8152600401610dcb91906113a4565b60006020828403121561120f57600080fd5b5035919050565b80356001600160a01b038116811461122d57600080fd5b919050565b60006020828403121561124457600080fd5b61124d82611216565b9392505050565b801515811461036057600080fd5b6000806000806080858703121561127857600080fd5b84359350602085013561128a81611254565b9250604085013561129a81611254565b91506112a860608601611216565b905092959194509250565b6000602082840312156112c557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156112f5576112f56112cc565b92915050565b80820281158282048414176112f5576112f56112cc565b60008261132f57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156112f5576112f56112cc565b60006020828403121561135957600080fd5b815161124d81611254565b60005b8381101561137f578181015183820152602001611367565b50506000910152565b6000825161139a818460208701611364565b9190910192915050565b60208152600082518060208401526113c3816040850160208701611364565b601f01601f1916919091016040019291505056fea2646970667358221220414bfb543742e233d1905d29f89195bceca3d3c2dafa62ef251a19d8ed133b6264736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000365accfca291e7d3914637abf1f7635db165bb0900000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad000000000000000000000000bcfe5c47129253c6b8a9a00565b3358b488d42e0
-----Decoded View---------------
Arg [0] : _token (address): 0x365AccFCa291e7D3914637ABf1F7635dB165Bb09
Arg [1] : _locker (address): 0x75736518075a01034fa72D675D36a47e9B06B2Fb
Arg [2] : _minter (address): 0xe19d1c837B8A1C83A56cD9165b2c0256D39653aD
Arg [3] : _gauge (address): 0xbcfE5c47129253C6B8a9A00565B3358b488D42E0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000365accfca291e7d3914637abf1f7635db165bb09
Arg [1] : 00000000000000000000000075736518075a01034fa72d675d36a47e9b06b2fb
Arg [2] : 000000000000000000000000e19d1c837b8a1c83a56cd9165b2c0256d39653ad
Arg [3] : 000000000000000000000000bcfe5c47129253c6b8a9a00565b3358b488d42e0
Deployed Bytecode Sourcemap
35271:197:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25524:31;;;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25524:31:0;;;;;;;;33962:192;;;:::i;:::-;;34866:214;;;;;;:::i;:::-;;:::i;34541:195::-;;;;;;:::i;:::-;;:::i;25927:25::-;;;;;-1:-1:-1;;;;;25927:25:0;;;34268:178;;;;;;:::i;:::-;;:::i;25768:29::-;;;;;;;;;922:25:1;;;910:2;895:18;25768:29:0;776:177:1;26021:31:0;;;;;-1:-1:-1;;;;;26021:31:0;;;25142:44;;25180:6;25142:44;;25854:20;;;;;-1:-1:-1;;;;;25854:20:0;;;25634:40;;;;;;32287:724;;;:::i;30220:1958::-;;;;;;:::i;:::-;;:::i;33783:122::-;;;;;;:::i;:::-;;:::i;25427:31::-;;;;;28939:476;;;;;;:::i;:::-;;:::i;25339:30::-;;;;;33962:192;34028:16;;-1:-1:-1;;;;;34028:16:0;34014:10;:30;34010:55;;34053:12;;-1:-1:-1;;;34053:12:0;;;;;;;;;;;34010:55;34078:10;:23;;-1:-1:-1;;;;;;34078:23:0;34091:10;34078:23;;;;;;34117:29;;;;34078:10;;34117:29;33962:192::o;34866:214::-;28191:10;;-1:-1:-1;;;;;28191:10:0;28177;:24;28173:49;;28210:12;;-1:-1:-1;;;28210:12:0;;;;;;;;;;;28173:49;34987:2:::1;34969:14;:20;34942:131;;35023:20;:37:::0;;;35011:50:::1;::::0;922:25:1;;;35011:50:0::1;::::0;910:2:1;895:18;35011:50:0::1;;;;;;;;34942:131;34866:214:::0;:::o;34541:195::-;28191:10;;-1:-1:-1;;;;;28191:10:0;28177;:24;28173:49;;28210:12;;-1:-1:-1;;;28210:12:0;;;;;;;;;;;28173:49;34610:5:::1;:14:::0;;-1:-1:-1;;;;;;34610:14:0::1;-1:-1:-1::0;;;;;34610:14:0;;::::1;::::0;;::::1;::::0;;;34676:52:::1;::::0;34683:6:::1;34676:26;::::0;-1:-1:-1;;34676:26:0::1;:52::i;34268:178::-:0;28191:10;;-1:-1:-1;;;;;28191:10:0;28177;:24;28173:49;;28210:12;;-1:-1:-1;;;28210:12:0;;;;;;;;;;;28173:49;34354:37:::1;::::0;-1:-1:-1;;;34354:37:0;;-1:-1:-1;;;;;178:32:1;;;34354:37:0::1;::::0;::::1;160:51:1::0;34363:6:0::1;34354:28;::::0;::::1;::::0;133:18:1;;34354:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34407:31:0::1;::::0;-1:-1:-1;;;;;34407:31:0;::::1;::::0;-1:-1:-1;34407:31:0::1;::::0;-1:-1:-1;34407:31:0;;::::1;34268:178:::0;:::o;32287:724::-;32351:38;;-1:-1:-1;;;32351:38:0;;32383:4;32351:38;;;160:51:1;32328:20:0;;32358:5;-1:-1:-1;;;;;32351:23:0;;;;133:18:1;;32351:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32328:61;-1:-1:-1;32406:17:0;;32402:208;;32511:48;-1:-1:-1;;;;;32518:5:0;32511:26;32538:6;32546:12;32511:26;:48::i;:::-;32574:24;32585:12;32574:10;:24::i;:::-;32710:14;;:19;32706:298;;32836:14;;32798:53;;-1:-1:-1;;;32798:53:0;;32824:10;32798:53;;;1968:51:1;2035:18;;;2028:34;;;;32811:6:0;-1:-1:-1;;;;;32798:25:0;;;;1941:18:1;;32798:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32903:14:0;;32873:45;;922:25:1;;;32891:10:0;;-1:-1:-1;32873:45:0;;-1:-1:-1;910:2:1;895:18;32873:45:0;;;;;;;32991:1;32974:14;:18;32317:694;32287:724::o;30220:1958::-;30316:7;30327:1;30316:12;30312:38;;30337:13;;-1:-1:-1;;;30337:13:0;;;;;;;;;;;30312:38;-1:-1:-1;;;;;30365:19:0;;30361:46;;30393:14;;-1:-1:-1;;;30393:14:0;;;;;;;;;;;30361:46;30491:5;30487:1236;;;30563:68;-1:-1:-1;;;;;30570:5:0;30563:30;30594:10;30614:6;30623:7;30563:30;:68::i;:::-;30704:38;;-1:-1:-1;;;30704:38:0;;30736:4;30704:38;;;160:51:1;30686:15:0;;30711:5;-1:-1:-1;;;;;30704:23:0;;;;133:18:1;;30704:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30686:56;-1:-1:-1;30757:43:0;-1:-1:-1;;;;;30764:5:0;30757:26;30784:6;30686:56;30757:26;:43::i;:::-;30882:29;30893:17;30903:7;30893;:17;:::i;:::-;30882:10;:29::i;:::-;31001:14;;:19;30997:195;;31052:14;;31041:25;;;;:::i;:::-;;;31110:10;-1:-1:-1;;;;;31092:45:0;;31122:14;;31092:45;;;;922:25:1;;910:2;895:18;;776:177;31092:45:0;;;;;;;;31175:1;31158:14;:18;30997:195;30498:705;30487:1236;;;31295:66;-1:-1:-1;;;;;31302:5:0;31295:30;31326:10;31346:4;31353:7;31295:30;:66::i;:::-;31444:21;25180:6;31479:20;;31469:7;:30;;;;:::i;:::-;31468:46;;;;:::i;:::-;31444:70;-1:-1:-1;31585:24:0;31444:70;31585:24;;:::i;:::-;;;31698:13;31680:14;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;;30487:1236:0;31739:6;31735:368;;;31810:49;;-1:-1:-1;;;31810:49:0;;31844:4;31810:49;;;1968:51:1;2035:18;;;2028:34;;;31823:6:0;-1:-1:-1;;;;;31810:25:0;;;;1941:18:1;;31810:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31947:5:0;;31931:46;;-1:-1:-1;;;31931:46:0;;;;;3037:25:1;;;-1:-1:-1;;;;;3098:32:1;;;3078:18;;;3071:60;31947:5:0;;;;-1:-1:-1;31931:30:0;;-1:-1:-1;3010:18:1;;31931:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31735:368;;;32050:41;;-1:-1:-1;;;32050:41:0;;-1:-1:-1;;;;;1986:32:1;;;32050:41:0;;;1968:51:1;2035:18;;;2028:34;;;32063:6:0;32050:25;;;;1941:18:1;;32050:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31735:368;32118:52;;;3332:25:1;;;3400:14;;3393:22;3388:2;3373:18;;3366:50;3459:14;;3452:22;3432:18;;;3425:50;32118:52:0;;-1:-1:-1;;;;;32118:52:0;;;32128:10;;32118:52;;;;;3320:2:1;32118:52:0;;;30220:1958;;;;:::o;33783:122::-;28191:10;;-1:-1:-1;;;;;28191:10:0;28177;:24;28173:49;;28210:12;;-1:-1:-1;;;28210:12:0;;;;;;;;;;;28173:49;33867:16:::1;:30:::0;;-1:-1:-1;;;;;;33867:30:0::1;-1:-1:-1::0;;;;;33867:30:0;;;::::1;::::0;;;::::1;::::0;;33783:122::o;28939:476::-;29042:68;-1:-1:-1;;;;;29049:5:0;29042:30;29073:10;29093:6;29102:7;29042:30;:68::i;:::-;-1:-1:-1;;;;;29169:6:0;29161:26;;29188:7;29197:35;29215:17;29197:15;:35;:::i;:::-;29161:72;;-1:-1:-1;;;;;;29161:72:0;;;;;;;;;;3660:25:1;;;;3701:18;;;3694:34;3633:18;;29161:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29287:46:0;;-1:-1:-1;;;29287:46:0;;29313:10;29287:46;;;1968:51:1;2035:18;;;2028:34;;;29300:6:0;-1:-1:-1;;;;;29287:25:0;;-1:-1:-1;29287:25:0;;-1:-1:-1;1941:18:1;;29287:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29351:56;29362:7;29389:17;29371:15;:35;;;;:::i;:::-;29351:56;;;3660:25:1;;;3716:2;3701:18;;3694:34;;;;3633:18;29351:56:0;3486:248:1;19600:582:0;19930:10;;;19929:62;;-1:-1:-1;19946:39:0;;-1:-1:-1;;;19946:39:0;;19970:4;19946:39;;;3951:34:1;-1:-1:-1;;;;;4021:15:1;;;4001:18;;;3994:43;19946:15:0;;;;;3886:18:1;;19946:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;19929:62;19907:166;;;;-1:-1:-1;;;19907:166:0;;4250:2:1;19907:166:0;;;4232:21:1;4289:2;4269:18;;;4262:30;4328:34;4308:18;;;4301:62;-1:-1:-1;;;4379:18:1;;;4372:52;4441:19;;19907:166:0;;;;;;;;;20111:62;;-1:-1:-1;;;;;1986:32:1;;20111:62:0;;;1968:51:1;2035:18;;;2028:34;;;20084:90:0;;20104:5;;-1:-1:-1;;;20134:22:0;1941:18:1;;20111:62:0;;;;-1:-1:-1;;20111:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;20111:62:0;-1:-1:-1;;;;;;20111:62:0;;;;;;;;;;20084:19;:90::i;:::-;19600:582;;;:::o;18704:177::-;18814:58;;-1:-1:-1;;;;;1986:32:1;;18814:58:0;;;1968:51:1;2035:18;;;2028:34;;;18787:86:0;;18807:5;;-1:-1:-1;;;18837:23:0;1941:18:1;;18814:58:0;1794:274:1;33126:355:0;33269:12;;33265:209;;-1:-1:-1;;;;;33342:6:0;33334:28;;33363:7;33372:35;33390:17;33372:15;:35;:::i;:::-;33334:74;;-1:-1:-1;;;;;;33334:74:0;;;;;;;;;;3660:25:1;;;;3701:18;;;3694:34;3633:18;;33334:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33430:32:0;;922:25:1;;;33442:10:0;;-1:-1:-1;33430:32:0;;-1:-1:-1;910:2:1;895:18;33430:32:0;;;;;;;33126:355;:::o;19126:205::-;19254:68;;-1:-1:-1;;;;;4729:15:1;;;19254:68:0;;;4711:34:1;4781:15;;4761:18;;;4754:43;4813:18;;;4806:34;;;19227:96:0;;19247:5;;-1:-1:-1;;;19277:27:0;4646:18:1;;19254:68:0;4471:375:1;19227:96:0;19126:205;;;;:::o;23027:649::-;23451:23;23477:69;23505:4;23477:69;;;;;;;;;;;;;;;;;23485:5;-1:-1:-1;;;;;23477:27:0;;;:69;;;;;:::i;:::-;23451:95;;23565:10;:17;23586:1;23565:22;:56;;;;23602:10;23591:30;;;;;;;;;;;;:::i;:::-;23557:111;;;;-1:-1:-1;;;23557:111:0;;5303:2:1;23557:111:0;;;5285:21:1;5342:2;5322:18;;;5315:30;5381:34;5361:18;;;5354:62;-1:-1:-1;;;5432:18:1;;;5425:40;5482:19;;23557:111:0;5101:406:1;12586:229:0;12723:12;12755:52;12777:6;12785:4;12791:1;12794:12;12755:21;:52::i;:::-;12748:59;12586:229;-1:-1:-1;;;;12586:229:0:o;13672:455::-;13842:12;13900:5;13875:21;:30;;13867:81;;;;-1:-1:-1;;;13867:81:0;;5714:2:1;13867:81:0;;;5696:21:1;5753:2;5733:18;;;5726:30;5792:34;5772:18;;;5765:62;-1:-1:-1;;;5843:18:1;;;5836:36;5889:19;;13867:81:0;5512:402:1;13867:81:0;13960:12;13974:23;14001:6;-1:-1:-1;;;;;14001:11:0;14020:5;14027:4;14001:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13959:73;;;;14050:69;14077:6;14085:7;14094:10;14106:12;14050:26;:69::i;:::-;14043:76;13672:455;-1:-1:-1;;;;;;;13672:455:0:o;16245:644::-;16430:12;16459:7;16455:427;;;16487:10;:17;16508:1;16487:22;16483:290;;-1:-1:-1;;;;;10126:19:0;;;16697:60;;;;-1:-1:-1;;;16697:60:0;;6668:2:1;16697:60:0;;;6650:21:1;6707:2;6687:18;;;6680:30;6746:31;6726:18;;;6719:59;6795:18;;16697:60:0;6466:353:1;16697:60:0;-1:-1:-1;16794:10:0;16787:17;;16455:427;16837:33;16845:10;16857:12;17592:17;;:21;17588:388;;17824:10;17818:17;17881:15;17868:10;17864:2;17860:19;17853:44;17588:388;17951:12;17944:20;;-1:-1:-1;;;17944: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;407:173::-;475:20;;-1:-1:-1;;;;;524:31:1;;514:42;;504:70;;570:1;567;560:12;504:70;407:173;;;:::o;585:186::-;644:6;697:2;685:9;676:7;672:23;668:32;665:52;;;713:1;710;703:12;665:52;736:29;755:9;736:29;:::i;:::-;726:39;585:186;-1:-1:-1;;;585:186:1:o;958:118::-;1044:5;1037:13;1030:21;1023:5;1020:32;1010:60;;1066:1;1063;1056:12;1081:519;1161:6;1169;1177;1185;1238:3;1226:9;1217:7;1213:23;1209:33;1206:53;;;1255:1;1252;1245:12;1206:53;1291:9;1278:23;1268:33;;1351:2;1340:9;1336:18;1323:32;1364:28;1386:5;1364:28;:::i;:::-;1411:5;-1:-1:-1;1468:2:1;1453:18;;1440:32;1481:30;1440:32;1481:30;:::i;:::-;1530:7;-1:-1:-1;1556:38:1;1590:2;1575:18;;1556:38;:::i;:::-;1546:48;;1081:519;;;;;;;:::o;1605:184::-;1675:6;1728:2;1716:9;1707:7;1703:23;1699:32;1696:52;;;1744:1;1741;1734:12;1696:52;-1:-1:-1;1767:16:1;;1605:184;-1:-1:-1;1605:184:1:o;2073:127::-;2134:10;2129:3;2125:20;2122:1;2115:31;2165:4;2162:1;2155:15;2189:4;2186:1;2179:15;2205:125;2270:9;;;2291:10;;;2288:36;;;2304:18;;:::i;:::-;2205:125;;;;:::o;2335:168::-;2408:9;;;2439;;2456:15;;;2450:22;;2436:37;2426:71;;2477:18;;:::i;2508:217::-;2548:1;2574;2564:132;;2618:10;2613:3;2609:20;2606:1;2599:31;2653:4;2650:1;2643:15;2681:4;2678:1;2671:15;2564:132;-1:-1:-1;2710:9:1;;2508:217::o;2730:128::-;2797:9;;;2818:11;;;2815:37;;;2832:18;;:::i;4851:245::-;4918:6;4971:2;4959:9;4950:7;4946:23;4942:32;4939:52;;;4987:1;4984;4977:12;4939:52;5019:9;5013:16;5038:28;5060:5;5038:28;:::i;5919:250::-;6004:1;6014:113;6028:6;6025:1;6022:13;6014:113;;;6104:11;;;6098:18;6085:11;;;6078:39;6050:2;6043:10;6014:113;;;-1:-1:-1;;6161:1:1;6143:16;;6136:27;5919:250::o;6174:287::-;6303:3;6341:6;6335:13;6357:66;6416:6;6411:3;6404:4;6396:6;6392:17;6357:66;:::i;:::-;6439:16;;;;;6174:287;-1:-1:-1;;6174:287:1:o;6824:396::-;6973:2;6962:9;6955:21;6936:4;7005:6;6999:13;7048:6;7043:2;7032:9;7028:18;7021:34;7064:79;7136:6;7131:2;7120:9;7116:18;7111:2;7103:6;7099:15;7064:79;:::i;:::-;7204:2;7183:15;-1:-1:-1;;7179:29:1;7164:45;;;;7211:2;7160:54;;6824:396;-1:-1:-1;;6824:396:1:o
Swarm Source
ipfs://414bfb543742e233d1905d29f89195bceca3d3c2dafa62ef251a19d8ed133b62
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.