ETH Price: $3,319.88 (+1.85%)
Gas: 2 Gwei

Contract

0x490b8C6007fFa5d3728A49c2ee199e51f05D2F7e
 
Transaction Hash
Method
Block
From
To
Claim Fees200903402024-06-14 13:27:2345 days ago1718371643IN
0x490b8C60...1f05D2F7e
0 ETH0.002314868.26037374
Claim Fees197990062024-05-04 20:04:1186 days ago1714853051IN
0x490b8C60...1f05D2F7e
0 ETH0.002550866.0988063
Claim Fees192825122024-02-22 10:18:11158 days ago1708597091IN
0x490b8C60...1f05D2F7e
0 ETH0.010962136.95586112
Claim Fees189487792024-01-06 14:33:23205 days ago1704551603IN
0x490b8C60...1f05D2F7e
0 ETH0.0193267130.86353419
Lock CRV189487712024-01-06 14:31:47205 days ago1704551507IN
0x490b8C60...1f05D2F7e
0 ETH0.0080055828.36698239
Lock CRV187948782023-12-15 23:48:11226 days ago1702684091IN
0x490b8C60...1f05D2F7e
0 ETH0.0137782248.82174017
Lock CRV184495512023-10-28 15:20:23275 days ago1698506423IN
0x490b8C60...1f05D2F7e
0 ETH0.0046860816.60466424
Lock CRV180792142023-09-06 18:33:11327 days ago1694025191IN
0x490b8C60...1f05D2F7e
0 ETH0.0065198723.62796492
Set Vote Manager180302332023-08-30 21:56:59333 days ago1693432619IN
0x490b8C60...1f05D2F7e
0 ETH0.0009434219.08459075
Set Deposit Mana...180302312023-08-30 21:56:35333 days ago1693432595IN
0x490b8C60...1f05D2F7e
0 ETH0.0009535319.28937157
0x61016060179133092023-08-14 13:13:11350 days ago1692018791IN
 Create: CurveProxy
0 ETH0.0396843220

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurveProxy

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 9 : CurveProxy.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import "Address.sol";
import "SafeERC20.sol";
import "IGaugeController.sol";
import "ILiquidityGauge.sol";
import "PrismaOwnable.sol";

interface IVotingEscrow {
    function create_lock(uint256 amount, uint256 unlock_time) external;

    function increase_amount(uint256 amount) external;

    function increase_unlock_time(uint256 unlock_time) external;
}

interface IMinter {
    function mint(address gauge) external;
}

interface IFeeDistributor {
    function claim() external returns (uint256);

    function token() external view returns (address);
}

interface IAragon {
    function vote(uint256 _voteData, bool _supports, bool _executesIfDecided) external;
}

/**
    @title Prisma Curve Proxy
    @notice Locks CRV in Curve's `VotingEscrow` and interacts with various Curve
            contracts that require / provide benefit from the locked CRV position.
    @dev This contract cannot operate without approval in Curve's VotingEscrow
         smart wallet whitelist. See the Curve documentation for more info:
         https://docs.curve.fi/curve_dao/VotingEscrow/#smart-wallet-whitelist
 */
contract CurveProxy is PrismaOwnable {
    using Address for address;
    using SafeERC20 for IERC20;

    event CrvFeePctSet(uint256 feePct);

    IERC20 public immutable CRV;
    IGaugeController public immutable gaugeController;
    IMinter public immutable minter;
    IVotingEscrow public immutable votingEscrow;
    IFeeDistributor public immutable feeDistributor;
    IERC20 public immutable feeToken;

    uint256 constant WEEK = 604800;
    uint256 constant MAX_LOCK_DURATION = 4 * 365 * 86400; // 4 years

    uint64 public crvFeePct; // fee as a pct out of 10000
    uint64 public unlockTime;

    // the vote manager is approved to call voting-related functions
    // these functions are also callable directly by the owner
    address public voteManager;

    // the deposit manager is approved to call all gauge-related functionality
    // and can permit other contracts to access the same functions on a per-gauge basis
    address public depositManager;

    // permission for contracts which can call gauge-related functionality for a single gauge
    mapping(address caller => address gauge) public perGaugeApproval;

    // permission for callers which can execute arbitrary calls via this contract's `execute` function
    mapping(address caller => mapping(address target => mapping(bytes4 selector => bool))) executePermissions;

    struct GaugeWeightVote {
        address gauge;
        uint256 weight;
    }

    struct TokenBalance {
        IERC20 token;
        uint256 amount;
    }

    constructor(
        address _prismaCore,
        IERC20 _CRV,
        IGaugeController _gaugeController,
        IMinter _minter,
        IVotingEscrow _votingEscrow,
        IFeeDistributor _feeDistributor
    ) PrismaOwnable(_prismaCore) {
        CRV = _CRV;
        gaugeController = _gaugeController;
        minter = _minter;
        votingEscrow = _votingEscrow;
        feeDistributor = _feeDistributor;
        feeToken = IERC20(_feeDistributor.token());

        CRV.approve(address(votingEscrow), type(uint256).max);
    }

    modifier ownerOrVoteManager() {
        require(msg.sender == voteManager || msg.sender == owner(), "Only owner or vote manager");
        _;
    }

    modifier onlyDepositManager() {
        require(msg.sender == depositManager, "Only deposit manager");
        _;
    }

    modifier onlyApprovedGauge(address gauge) {
        require(perGaugeApproval[msg.sender] == gauge || msg.sender == depositManager, "Not approved for gauge");
        _;
    }

    /**
        @notice Grant or revoke permission for `caller` to call one or more
                functions on `target` via this contract.
     */
    function setExecutePermissions(
        address caller,
        address target,
        bytes4[] memory selectors,
        bool permitted
    ) external onlyOwner returns (bool) {
        mapping(bytes4 => bool) storage _executePermission = executePermissions[caller][target];
        for (uint256 i = 0; i < selectors.length; i++) {
            _executePermission[selectors[i]] = permitted;
        }
        return true;
    }

    /**
        @notice Set the fee percent taken on all CRV earned through this contract
        @dev CRV earned as fees is periodically added to the contract's locked position
     */
    function setCrvFeePct(uint64 _feePct) external onlyOwner returns (bool) {
        require(_feePct <= 10000, "Invalid setting");
        crvFeePct = _feePct;
        emit CrvFeePctSet(_feePct);
        return true;
    }

    function setVoteManager(address _voteManager) external onlyOwner returns (bool) {
        voteManager = _voteManager;

        return true;
    }

    function setDepositManager(address _depositManager) external onlyOwner returns (bool) {
        depositManager = _depositManager;

        return true;
    }

    function setPerGaugeApproval(address caller, address gauge) external onlyDepositManager returns (bool) {
        perGaugeApproval[caller] = gauge;

        return true;
    }

    /**
        @notice Claim pending 3CRV fees earned from the veCRV balance
                and transfer the fees onward to the fee receiver
        @dev This method is intentionally left unguarded
     */
    function claimFees() external returns (uint256) {
        feeDistributor.claim();
        uint256 amount = feeToken.balanceOf(address(this));

        feeToken.transfer(PRISMA_CORE.feeReceiver(), amount);

        return amount;
    }

    /**
        @notice Lock any CRV balance within the contract, and extend
                the unlock time to the maximum possible
        @dev This method is intentionally left unguarded
     */
    function lockCRV() external returns (bool) {
        uint256 maxUnlock = ((block.timestamp / WEEK) * WEEK) + MAX_LOCK_DURATION;
        uint256 amount = CRV.balanceOf(address(this));

        _updateLock(amount, unlockTime, maxUnlock);

        return true;
    }

    /**
        @notice Mint CRV rewards earned for a specific gauge
        @dev Once per week, also locks any CRV balance within the contract and extends the lock duration
        @param gauge Address of the gauge to mint CRV for
        @param receiver Address to send the minted CRV to
        @return uint256 Amount of CRV send to the receiver (after the fee)
     */
    function mintCRV(address gauge, address receiver) external onlyApprovedGauge(gauge) returns (uint256) {
        uint256 initial = CRV.balanceOf(address(this));
        minter.mint(gauge);
        uint256 amount = CRV.balanceOf(address(this)) - initial;

        // apply fee prior to transfer
        uint256 fee = (amount * crvFeePct) / 10000;
        amount -= fee;

        CRV.transfer(receiver, amount);

        // lock and extend if needed
        uint256 unlock = unlockTime;
        uint256 maxUnlock = ((block.timestamp / WEEK) * WEEK) + MAX_LOCK_DURATION;
        if (unlock < maxUnlock) {
            _updateLock(initial + fee, unlock, maxUnlock);
        }

        return amount;
    }

    /**
        @notice Submit one or more gauge weight votes
     */
    function voteForGaugeWeights(GaugeWeightVote[] calldata votes) external ownerOrVoteManager returns (bool) {
        for (uint256 i = 0; i < votes.length; i++) {
            gaugeController.vote_for_gauge_weights(votes[i].gauge, votes[i].weight);
        }

        return true;
    }

    /**
        @notice Submit a vote within the Curve DAO
     */
    function voteInCurveDao(IAragon aragon, uint256 id, bool support) external ownerOrVoteManager returns (bool) {
        aragon.vote(id, support, false);

        return true;
    }

    /**
        @notice Approve a 3rd-party caller to deposit into a specific gauge
        @dev Only required for some older Curve gauges
     */
    function approveGaugeDeposit(address gauge, address depositor) external onlyApprovedGauge(gauge) returns (bool) {
        ILiquidityGauge(gauge).set_approve_deposit(depositor, true);

        return true;
    }

    /**
        @notice Set the default receiver for extra rewards on a specific gauge
        @dev Only works on some gauge versions
     */
    function setGaugeRewardsReceiver(address gauge, address receiver) external onlyApprovedGauge(gauge) returns (bool) {
        ILiquidityGauge(gauge).set_rewards_receiver(receiver);

        return true;
    }

    /**
        @notice Withdraw LP tokens from a gauge
        @param gauge Address of the gauge to withdraw from
        @param lpToken Address of the LP token we are withdrawing from the gauge.
                       The contract trusts the caller to supply the correct address.
        @param amount Amount of LP tokens to withdraw
        @param receiver Address to send the LP token to
     */
    function withdrawFromGauge(
        address gauge,
        IERC20 lpToken,
        uint256 amount,
        address receiver
    ) external onlyApprovedGauge(gauge) returns (bool) {
        ILiquidityGauge(gauge).withdraw(amount);
        lpToken.transfer(receiver, amount);

        return true;
    }

    /**
        @notice Transfer arbitrary token balances out of this contract
        @dev Necessary for handling extra rewards on older gauge types
     */
    function transferTokens(
        address receiver,
        TokenBalance[] calldata balances
    ) external onlyDepositManager returns (bool) {
        for (uint256 i = 0; i < balances.length; i++) {
            balances[i].token.safeTransfer(receiver, balances[i].amount);
        }

        return true;
    }

    /**
        @notice Execute an arbitrary function call using this contract
        @dev Callable via the owner, or if explicit permission is given
             to the caller for this target and function selector
     */
    function execute(address target, bytes calldata data) external returns (bytes memory) {
        if (msg.sender != owner()) {
            bytes4 selector = bytes4(data[:4]);
            require(executePermissions[msg.sender][target][selector], "Not permitted");
        }
        return target.functionCall(data);
    }

    function _updateLock(uint256 amount, uint256 unlock, uint256 maxUnlock) internal {
        if (amount > 0) {
            if (unlock == 0) {
                votingEscrow.create_lock(amount, maxUnlock);
                unlockTime = uint64(maxUnlock);
                return;
            }
            votingEscrow.increase_amount(amount);
        }
        if (unlock < maxUnlock) {
            votingEscrow.increase_unlock_time(maxUnlock);
            unlockTime = uint64(maxUnlock);
        }
    }
}

File 2 of 9 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [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://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (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);
        }
    }
}

File 3 of 9 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "IERC20.sol";
import "draft-IERC20Permit.sol";
import "Address.sol";

/**
 * @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;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    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");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 4 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}

File 5 of 9 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}

File 6 of 9 : IGaugeController.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

interface IGaugeController {
    function vote_for_gauge_weights(address gauge, uint weight) external;

    function gauge_types(address gauge) external view returns (int128);
}

File 7 of 9 : ILiquidityGauge.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

interface ILiquidityGauge {
    function deposit(uint256 amount, address receiver) external;

    function withdraw(uint value) external;

    function lp_token() external view returns (address);

    function set_approve_deposit(address depositor, bool can_deposit) external;

    function set_rewards_receiver(address receiver) external;
}

File 8 of 9 : PrismaOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

import "IPrismaCore.sol";

/**
    @title Prisma Ownable
    @notice Contracts inheriting `PrismaOwnable` have the same owner as `PrismaCore`.
            The ownership cannot be independently modified or renounced.
 */
contract PrismaOwnable {
    IPrismaCore public immutable PRISMA_CORE;

    constructor(address _prismaCore) {
        PRISMA_CORE = IPrismaCore(_prismaCore);
    }

    modifier onlyOwner() {
        require(msg.sender == PRISMA_CORE.owner(), "Only owner");
        _;
    }

    function owner() public view returns (address) {
        return PRISMA_CORE.owner();
    }

    function guardian() public view returns (address) {
        return PRISMA_CORE.guardian();
    }
}

File 9 of 9 : IPrismaCore.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

interface IPrismaCore {
    function owner() external view returns (address);

    function guardian() external view returns (address);

    function feeReceiver() external view returns (address);

    function priceFeed() external view returns (address);

    function paused() external view returns (bool);

    function startTime() external view returns (uint256);

    function acceptTransferOwnership() external;

    function setGuardian(address guardian) external;
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "CurveProxy.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_prismaCore","type":"address"},{"internalType":"contract IERC20","name":"_CRV","type":"address"},{"internalType":"contract IGaugeController","name":"_gaugeController","type":"address"},{"internalType":"contract IMinter","name":"_minter","type":"address"},{"internalType":"contract IVotingEscrow","name":"_votingEscrow","type":"address"},{"internalType":"contract IFeeDistributor","name":"_feeDistributor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feePct","type":"uint256"}],"name":"CrvFeePctSet","type":"event"},{"inputs":[],"name":"CRV","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRISMA_CORE","outputs":[{"internalType":"contract IPrismaCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"depositor","type":"address"}],"name":"approveGaugeDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crvFeePct","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDistributor","outputs":[{"internalType":"contract IFeeDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeController","outputs":[{"internalType":"contract IGaugeController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockCRV","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintCRV","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"contract IMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"perGaugeApproval","outputs":[{"internalType":"address","name":"gauge","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_feePct","type":"uint64"}],"name":"setCrvFeePct","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_depositManager","type":"address"}],"name":"setDepositManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4[]","name":"selectors","type":"bytes4[]"},{"internalType":"bool","name":"permitted","type":"bool"}],"name":"setExecutePermissions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setGaugeRewardsReceiver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"gauge","type":"address"}],"name":"setPerGaugeApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voteManager","type":"address"}],"name":"setVoteManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"components":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct CurveProxy.TokenBalance[]","name":"balances","type":"tuple[]"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"}],"internalType":"struct CurveProxy.GaugeWeightVote[]","name":"votes","type":"tuple[]"}],"name":"voteForGaugeWeights","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAragon","name":"aragon","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"voteInCurveDao","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingEscrow","outputs":[{"internalType":"contract IVotingEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gauge","type":"address"},{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"withdrawFromGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101606040523480156200001257600080fd5b506040516200256838038062002568833981016040819052620000359162000171565b6001600160a01b0380871660805285811660a05284811660c05283811660e05282811661010052811661012081905260408051637e062a3560e11b8152905163fc0c546a916004808201926020929091908290030181865afa158015620000a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c6919062000205565b6001600160a01b039081166101405260a0516101005160405163095ea7b360e01b81529083166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af115801562000125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014b91906200022c565b5050505050505062000250565b6001600160a01b03811681146200016e57600080fd5b50565b60008060008060008060c087890312156200018b57600080fd5b8651620001988162000158565b6020880151909650620001ab8162000158565b6040880151909550620001be8162000158565b6060880151909450620001d18162000158565b6080880151909350620001e48162000158565b60a0880151909250620001f78162000158565b809150509295509295509295565b6000602082840312156200021857600080fd5b8151620002258162000158565b9392505050565b6000602082840312156200023f57600080fd5b815180151581146200022557600080fd5b60805160a05160c05160e0516101005161012051610140516122386200033060003960008181610321015281816114be015261153501526000818161024801526114230152600081816102fa01528181611842015281816118f2015261197501526000818161020901526111120152600081816103ff0152610cf10152600081816103d80152818161107d01528181611192015281816112650152611389015260008181610488015281816105e7015281816106bf0152818161083c01528181610c0801528181610de601528181610f41015261156401526122386000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806376cf733311610104578063a07d4a3b116100a2578063cc9641a811610071578063cc9641a814610483578063d294f093146104aa578063d8416494146104b2578063f2347d18146104c557600080fd5b8063a07d4a3b14610434578063b67b6df314610447578063c50573581461045a578063cb931f531461047b57600080fd5b80638da5cb5b116100de5780638da5cb5b146103cb578063945c9142146103d357806399eecb3b146103fa5780639ce984da1461042157600080fd5b806376cf73331461037c578063808a6de8146103a5578063852b2587146103b857600080fd5b8063452a932011610171578063647846a51161014b578063647846a51461031c5780636a03f561146103435780636c7ac9d8146103565780636c869aad1461036957600080fd5b8063452a9320146102da5780634ea11f25146102e25780634f2bfe5b146102f557600080fd5b80631cff79cd116101ad5780631cff79cd1461026a578063228d71a91461028a578063251c1aa3146102ad57806342c1e587146102c757600080fd5b806305d2df9c146101d457806307546172146102045780630d43e8ad14610243575b600080fd5b6000546101e7906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101fb565b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b61027d610278366004611c23565b6104d8565b6040516101fb9190611cf7565b61029d610298366004611d0a565b6105e3565b60405190151581526020016101fb565b6000546101e790600160401b90046001600160401b031681565b60015461022b906001600160a01b031681565b61022b6106bb565b61029d6102f0366004611d40565b610744565b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b61029d610351366004611db0565b610838565b60025461022b906001600160a01b031681565b61029d610377366004611ef7565b610986565b61022b61038a366004611d0a565b6003602052600090815260409020546001600160a01b031681565b61029d6103b3366004611f4b565b610a5a565b61029d6103c6366004611f84565b610ae6565b61022b610c04565b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b61029d61042f366004611fd7565b610c64565b61029d610442366004612018565b610de2565b61029d610455366004611d0a565b610f3d565b61046d610468366004611f4b565b611014565b6040519081526020016101fb565b61029d61133c565b61022b7f000000000000000000000000000000000000000000000000000000000000000081565b61046d61141f565b61029d6104c0366004611f4b565b61165b565b61029d6104d3366004611f4b565b6116f6565b60606104e2610c04565b6001600160a01b0316336001600160a01b0316146105915760006105096004828587612041565b6105129161206b565b3360009081526004602090815260408083206001600160a01b038a16845282528083206001600160e01b03198516845290915290205490915060ff1661058f5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c195c9b5a5d1d1959609a1b60448201526064015b60405180910390fd5b505b6105db83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050611775565b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610643573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610667919061209b565b6001600160a01b0316336001600160a01b0316146106975760405162461bcd60e51b8152600401610586906120b8565b50600280546001600160a01b0319166001600160a01b03831617905560015b919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f919061209b565b905090565b6001546000906001600160a01b03163314806107785750610763610c04565b6001600160a01b0316336001600160a01b0316145b6107c45760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c79206f776e6572206f7220766f7465206d616e616765720000000000006044820152606401610586565b604051636f899de560e11b8152600481018490528215156024820152600060448201526001600160a01b0385169063df133bca906064015b600060405180830381600087803b15801561081657600080fd5b505af115801561082a573d6000803e3d6000fd5b506001979650505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc919061209b565b6001600160a01b0316336001600160a01b0316146108ec5760405162461bcd60e51b8152600401610586906120b8565b6001600160a01b0380861660009081526004602090815260408083209388168352929052908120905b84518110156109795783826000878481518110610934576109346120dc565b6020908102919091018101516001600160e01b0319168252810191909152604001600020805460ff19169115159190911790558061097181612108565b915050610915565b5060019695505050505050565b6002546000906001600160a01b031633146109da5760405162461bcd60e51b815260206004820152601460248201527327b7363c903232b837b9b4ba1036b0b730b3b2b960611b6044820152606401610586565b60005b82811015610a4f57610a3d858585848181106109fb576109fb6120dc565b90506040020160200135868685818110610a1757610a176120dc565b610a2d9260206040909202019081019150611d0a565b6001600160a01b031691906117c0565b80610a4781612108565b9150506109dd565b506001949350505050565b6002546000906001600160a01b03163314610aae5760405162461bcd60e51b815260206004820152601460248201527327b7363c903232b837b9b4ba1036b0b730b3b2b960611b6044820152606401610586565b506001600160a01b03828116600090815260036020526040902080546001600160a01b03191691831691909117905560015b92915050565b3360009081526003602052604081205485906001600160a01b0380831691161480610b1b57506002546001600160a01b031633145b610b375760405162461bcd60e51b815260040161058690612121565b604051632e1a7d4d60e01b8152600481018590526001600160a01b03871690632e1a7d4d90602401600060405180830381600087803b158015610b7957600080fd5b505af1158015610b8d573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018890528816925063a9059cbb91506044016020604051808303816000875af1158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190612151565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561071b573d6000803e3d6000fd5b6001546000906001600160a01b0316331480610c985750610c83610c04565b6001600160a01b0316336001600160a01b0316145b610ce45760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c79206f776e6572206f7220766f7465206d616e616765720000000000006044820152606401610586565b60005b82811015610dd8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d7136328858584818110610d3057610d306120dc565b610d469260206040909202019081019150611d0a565b868685818110610d5857610d586120dc565b905060400201602001356040518363ffffffff1660e01b8152600401610d939291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015610dad57600080fd5b505af1158015610dc1573d6000803e3d6000fd5b505050508080610dd090612108565b915050610ce7565b5060019392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e66919061209b565b6001600160a01b0316336001600160a01b031614610e965760405162461bcd60e51b8152600401610586906120b8565b612710826001600160401b03161115610ee35760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642073657474696e6760881b6044820152606401610586565b6000805467ffffffffffffffff19166001600160401b0384169081179091556040519081527f33bcbecdf036f60bcc25ade9d867a25a5ce5c4e24c055fc401ff4fa30fe6e49a9060200160405180910390a1506001919050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc1919061209b565b6001600160a01b0316336001600160a01b031614610ff15760405162461bcd60e51b8152600401610586906120b8565b50600180546001600160a01b0383166001600160a01b0319909116178155919050565b3360009081526003602052604081205483906001600160a01b038083169116148061104957506002546001600160a01b031633145b6110655760405162461bcd60e51b815260040161058690612121565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f0919061216e565b6040516335313c2160e11b81526001600160a01b0387811660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690636a62784290602401600060405180830381600087803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092508391506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fd919061216e565b6112079190612187565b600080549192509061271090611226906001600160401b03168461219a565b61123091906121b1565b905061123c8183612187565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529193507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156112b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d49190612151565b5060008054600160401b90046001600160401b031690630784ce0062093a806112fd81426121b1565b611307919061219a565b61131191906121d3565b90508082101561132f5761132f61132884876121d3565b8383611817565b5091979650505050505050565b600080630784ce0062093a8061135281426121b1565b61135c919061219a565b61136691906121d3565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156113d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f4919061216e565b600054909150611416908290600160401b90046001600160401b031684611817565b60019250505090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634e71d92d6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a5919061216e565b506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611531919061216e565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e4919061209b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190612151565b50919050565b3360009081526003602052604081205483906001600160a01b038083169116148061169057506002546001600160a01b031633145b6116ac5760405162461bcd60e51b815260040161058690612121565b604051630749d1f560e21b81526001600160a01b03848116600483015260016024830152851690631d2747d490604401600060405180830381600087803b15801561081657600080fd5b3360009081526003602052604081205483906001600160a01b038083169116148061172b57506002546001600160a01b031633145b6117475760405162461bcd60e51b815260040161058690612121565b604051635efcc08b60e11b81526001600160a01b03848116600483015285169063bdf98116906024016107fc565b60606117b9838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506119ac565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611812908490611a87565b505050565b821561195757816000036118dc576040516365fc387360e01b815260048101849052602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906365fc3873906044015b600060405180830381600087803b15801561188f57600080fd5b505af11580156118a3573d6000803e3d6000fd5b5050600080546001600160401b03909416600160401b026fffffffffffffffff0000000000000000199094169390931790925550505050565b604051631255d9df60e21b8152600481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690634957677c90602401600060405180830381600087803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b505050505b80821015611812576040516377fbd30960e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063eff7a61290602401611875565b606082471015611a0d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610586565b600080866001600160a01b03168587604051611a2991906121e6565b60006040518083038185875af1925050503d8060008114611a66576040519150601f19603f3d011682016040523d82523d6000602084013e611a6b565b606091505b5091509150611a7c87838387611b59565b979650505050505050565b6000611adc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611bd29092919063ffffffff16565b8051909150156118125780806020019051810190611afa9190612151565b6118125760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610586565b60608315611bc8578251600003611bc1576001600160a01b0385163b611bc15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610586565b50816105db565b6105db8383611be1565b60606105db84846000856119ac565b815115611bf15781518083602001fd5b8060405162461bcd60e51b81526004016105869190611cf7565b6001600160a01b0381168114611c2057600080fd5b50565b600080600060408486031215611c3857600080fd5b8335611c4381611c0b565b925060208401356001600160401b0380821115611c5f57600080fd5b818601915086601f830112611c7357600080fd5b813581811115611c8257600080fd5b876020828501011115611c9457600080fd5b6020830194508093505050509250925092565b60005b83811015611cc2578181015183820152602001611caa565b50506000910152565b60008151808452611ce3816020860160208601611ca7565b601f01601f19169290920160200192915050565b6020815260006117b96020830184611ccb565b600060208284031215611d1c57600080fd5b81356117b981611c0b565b8015158114611c2057600080fd5b80356106b681611d27565b600080600060608486031215611d5557600080fd5b8335611d6081611c0b565b9250602084013591506040840135611d7781611d27565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b80356001600160e01b0319811681146106b657600080fd5b60008060008060808587031215611dc657600080fd5b8435611dd181611c0b565b9350602085810135611de281611c0b565b935060408601356001600160401b0380821115611dfe57600080fd5b818801915088601f830112611e1257600080fd5b813581811115611e2457611e24611d82565b8060051b604051601f19603f83011681018181108582111715611e4957611e49611d82565b60405291825284820192508381018501918b831115611e6757600080fd5b938501935b82851015611e8c57611e7d85611d98565b84529385019392850192611e6c565b809750505050505050611ea160608601611d35565b905092959194509250565b60008083601f840112611ebe57600080fd5b5081356001600160401b03811115611ed557600080fd5b6020830191508360208260061b8501011115611ef057600080fd5b9250929050565b600080600060408486031215611f0c57600080fd5b8335611f1781611c0b565b925060208401356001600160401b03811115611f3257600080fd5b611f3e86828701611eac565b9497909650939450505050565b60008060408385031215611f5e57600080fd5b8235611f6981611c0b565b91506020830135611f7981611c0b565b809150509250929050565b60008060008060808587031215611f9a57600080fd5b8435611fa581611c0b565b93506020850135611fb581611c0b565b9250604085013591506060850135611fcc81611c0b565b939692955090935050565b60008060208385031215611fea57600080fd5b82356001600160401b0381111561200057600080fd5b61200c85828601611eac565b90969095509350505050565b60006020828403121561202a57600080fd5b81356001600160401b03811681146117b957600080fd5b6000808585111561205157600080fd5b8386111561205e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156120935780818660040360031b1b83161692505b505092915050565b6000602082840312156120ad57600080fd5b81516117b981611c0b565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161211a5761211a6120f2565b5060010190565b6020808252601690820152754e6f7420617070726f76656420666f7220676175676560501b604082015260600190565b60006020828403121561216357600080fd5b81516117b981611d27565b60006020828403121561218057600080fd5b5051919050565b81810381811115610ae057610ae06120f2565b8082028115828204841417610ae057610ae06120f2565b6000826121ce57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ae057610ae06120f2565b600082516121f8818460208701611ca7565b919091019291505056fea26469706673582212202c6e9a8bb673daeef59655abd8e25d3774173eb74e5926d1a212ccf87f9dca4664736f6c634300081300330000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf8000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000002f50d538606fa9edd2b11e2446beb18c9d5846bb000000000000000000000000d061d61a4d941c39e5453435b6345dc261c2fce00000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a2000000000000000000000000a464e6dcda8ac41e03616f95f4bc98a13b8922dc

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806376cf733311610104578063a07d4a3b116100a2578063cc9641a811610071578063cc9641a814610483578063d294f093146104aa578063d8416494146104b2578063f2347d18146104c557600080fd5b8063a07d4a3b14610434578063b67b6df314610447578063c50573581461045a578063cb931f531461047b57600080fd5b80638da5cb5b116100de5780638da5cb5b146103cb578063945c9142146103d357806399eecb3b146103fa5780639ce984da1461042157600080fd5b806376cf73331461037c578063808a6de8146103a5578063852b2587146103b857600080fd5b8063452a932011610171578063647846a51161014b578063647846a51461031c5780636a03f561146103435780636c7ac9d8146103565780636c869aad1461036957600080fd5b8063452a9320146102da5780634ea11f25146102e25780634f2bfe5b146102f557600080fd5b80631cff79cd116101ad5780631cff79cd1461026a578063228d71a91461028a578063251c1aa3146102ad57806342c1e587146102c757600080fd5b806305d2df9c146101d457806307546172146102045780630d43e8ad14610243575b600080fd5b6000546101e7906001600160401b031681565b6040516001600160401b0390911681526020015b60405180910390f35b61022b7f000000000000000000000000d061d61a4d941c39e5453435b6345dc261c2fce081565b6040516001600160a01b0390911681526020016101fb565b61022b7f000000000000000000000000a464e6dcda8ac41e03616f95f4bc98a13b8922dc81565b61027d610278366004611c23565b6104d8565b6040516101fb9190611cf7565b61029d610298366004611d0a565b6105e3565b60405190151581526020016101fb565b6000546101e790600160401b90046001600160401b031681565b60015461022b906001600160a01b031681565b61022b6106bb565b61029d6102f0366004611d40565b610744565b61022b7f0000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a281565b61022b7f0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e49081565b61029d610351366004611db0565b610838565b60025461022b906001600160a01b031681565b61029d610377366004611ef7565b610986565b61022b61038a366004611d0a565b6003602052600090815260409020546001600160a01b031681565b61029d6103b3366004611f4b565b610a5a565b61029d6103c6366004611f84565b610ae6565b61022b610c04565b61022b7f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5281565b61022b7f0000000000000000000000002f50d538606fa9edd2b11e2446beb18c9d5846bb81565b61029d61042f366004611fd7565b610c64565b61029d610442366004612018565b610de2565b61029d610455366004611d0a565b610f3d565b61046d610468366004611f4b565b611014565b6040519081526020016101fb565b61029d61133c565b61022b7f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf881565b61046d61141f565b61029d6104c0366004611f4b565b61165b565b61029d6104d3366004611f4b565b6116f6565b60606104e2610c04565b6001600160a01b0316336001600160a01b0316146105915760006105096004828587612041565b6105129161206b565b3360009081526004602090815260408083206001600160a01b038a16845282528083206001600160e01b03198516845290915290205490915060ff1661058f5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c195c9b5a5d1d1959609a1b60448201526064015b60405180910390fd5b505b6105db83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03881692915050611775565b949350505050565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610643573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610667919061209b565b6001600160a01b0316336001600160a01b0316146106975760405162461bcd60e51b8152600401610586906120b8565b50600280546001600160a01b0319166001600160a01b03831617905560015b919050565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa15801561071b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073f919061209b565b905090565b6001546000906001600160a01b03163314806107785750610763610c04565b6001600160a01b0316336001600160a01b0316145b6107c45760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c79206f776e6572206f7220766f7465206d616e616765720000000000006044820152606401610586565b604051636f899de560e11b8152600481018490528215156024820152600060448201526001600160a01b0385169063df133bca906064015b600060405180830381600087803b15801561081657600080fd5b505af115801561082a573d6000803e3d6000fd5b506001979650505050505050565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc919061209b565b6001600160a01b0316336001600160a01b0316146108ec5760405162461bcd60e51b8152600401610586906120b8565b6001600160a01b0380861660009081526004602090815260408083209388168352929052908120905b84518110156109795783826000878481518110610934576109346120dc565b6020908102919091018101516001600160e01b0319168252810191909152604001600020805460ff19169115159190911790558061097181612108565b915050610915565b5060019695505050505050565b6002546000906001600160a01b031633146109da5760405162461bcd60e51b815260206004820152601460248201527327b7363c903232b837b9b4ba1036b0b730b3b2b960611b6044820152606401610586565b60005b82811015610a4f57610a3d858585848181106109fb576109fb6120dc565b90506040020160200135868685818110610a1757610a176120dc565b610a2d9260206040909202019081019150611d0a565b6001600160a01b031691906117c0565b80610a4781612108565b9150506109dd565b506001949350505050565b6002546000906001600160a01b03163314610aae5760405162461bcd60e51b815260206004820152601460248201527327b7363c903232b837b9b4ba1036b0b730b3b2b960611b6044820152606401610586565b506001600160a01b03828116600090815260036020526040902080546001600160a01b03191691831691909117905560015b92915050565b3360009081526003602052604081205485906001600160a01b0380831691161480610b1b57506002546001600160a01b031633145b610b375760405162461bcd60e51b815260040161058690612121565b604051632e1a7d4d60e01b8152600481018590526001600160a01b03871690632e1a7d4d90602401600060405180830381600087803b158015610b7957600080fd5b505af1158015610b8d573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018890528816925063a9059cbb91506044016020604051808303816000875af1158015610be0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190612151565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561071b573d6000803e3d6000fd5b6001546000906001600160a01b0316331480610c985750610c83610c04565b6001600160a01b0316336001600160a01b0316145b610ce45760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c79206f776e6572206f7220766f7465206d616e616765720000000000006044820152606401610586565b60005b82811015610dd8577f0000000000000000000000002f50d538606fa9edd2b11e2446beb18c9d5846bb6001600160a01b031663d7136328858584818110610d3057610d306120dc565b610d469260206040909202019081019150611d0a565b868685818110610d5857610d586120dc565b905060400201602001356040518363ffffffff1660e01b8152600401610d939291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015610dad57600080fd5b505af1158015610dc1573d6000803e3d6000fd5b505050508080610dd090612108565b915050610ce7565b5060019392505050565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e66919061209b565b6001600160a01b0316336001600160a01b031614610e965760405162461bcd60e51b8152600401610586906120b8565b612710826001600160401b03161115610ee35760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642073657474696e6760881b6044820152606401610586565b6000805467ffffffffffffffff19166001600160401b0384169081179091556040519081527f33bcbecdf036f60bcc25ade9d867a25a5ce5c4e24c055fc401ff4fa30fe6e49a9060200160405180910390a1506001919050565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc1919061209b565b6001600160a01b0316336001600160a01b031614610ff15760405162461bcd60e51b8152600401610586906120b8565b50600180546001600160a01b0383166001600160a01b0319909116178155919050565b3360009081526003602052604081205483906001600160a01b038083169116148061104957506002546001600160a01b031633145b6110655760405162461bcd60e51b815260040161058690612121565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd526001600160a01b0316906370a0823190602401602060405180830381865afa1580156110cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f0919061216e565b6040516335313c2160e11b81526001600160a01b0387811660048301529192507f000000000000000000000000d061d61a4d941c39e5453435b6345dc261c2fce090911690636a62784290602401600060405180830381600087803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092508391506001600160a01b037f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5216906370a0823190602401602060405180830381865afa1580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fd919061216e565b6112079190612187565b600080549192509061271090611226906001600160401b03168461219a565b61123091906121b1565b905061123c8183612187565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529193507f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd529091169063a9059cbb906044016020604051808303816000875af11580156112b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d49190612151565b5060008054600160401b90046001600160401b031690630784ce0062093a806112fd81426121b1565b611307919061219a565b61131191906121d3565b90508082101561132f5761132f61132884876121d3565b8383611817565b5091979650505050505050565b600080630784ce0062093a8061135281426121b1565b61135c919061219a565b61136691906121d3565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd5216906370a0823190602401602060405180830381865afa1580156113d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f4919061216e565b600054909150611416908290600160401b90046001600160401b031684611817565b60019250505090565b60007f000000000000000000000000a464e6dcda8ac41e03616f95f4bc98a13b8922dc6001600160a01b0316634e71d92d6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a5919061216e565b506040516370a0823160e01b81523060048201526000907f0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e4906001600160a01b0316906370a0823190602401602060405180830381865afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611531919061216e565b90507f0000000000000000000000006c3f90f043a72fa612cbac8115ee7e52bde6e4906001600160a01b031663a9059cbb7f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e4919061209b565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116559190612151565b50919050565b3360009081526003602052604081205483906001600160a01b038083169116148061169057506002546001600160a01b031633145b6116ac5760405162461bcd60e51b815260040161058690612121565b604051630749d1f560e21b81526001600160a01b03848116600483015260016024830152851690631d2747d490604401600060405180830381600087803b15801561081657600080fd5b3360009081526003602052604081205483906001600160a01b038083169116148061172b57506002546001600160a01b031633145b6117475760405162461bcd60e51b815260040161058690612121565b604051635efcc08b60e11b81526001600160a01b03848116600483015285169063bdf98116906024016107fc565b60606117b9838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c656400008152506119ac565b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611812908490611a87565b505050565b821561195757816000036118dc576040516365fc387360e01b815260048101849052602481018290527f0000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a26001600160a01b0316906365fc3873906044015b600060405180830381600087803b15801561188f57600080fd5b505af11580156118a3573d6000803e3d6000fd5b5050600080546001600160401b03909416600160401b026fffffffffffffffff0000000000000000199094169390931790925550505050565b604051631255d9df60e21b8152600481018490527f0000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a26001600160a01b031690634957677c90602401600060405180830381600087803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b505050505b80821015611812576040516377fbd30960e11b8152600481018290527f0000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a26001600160a01b03169063eff7a61290602401611875565b606082471015611a0d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610586565b600080866001600160a01b03168587604051611a2991906121e6565b60006040518083038185875af1925050503d8060008114611a66576040519150601f19603f3d011682016040523d82523d6000602084013e611a6b565b606091505b5091509150611a7c87838387611b59565b979650505050505050565b6000611adc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611bd29092919063ffffffff16565b8051909150156118125780806020019051810190611afa9190612151565b6118125760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610586565b60608315611bc8578251600003611bc1576001600160a01b0385163b611bc15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610586565b50816105db565b6105db8383611be1565b60606105db84846000856119ac565b815115611bf15781518083602001fd5b8060405162461bcd60e51b81526004016105869190611cf7565b6001600160a01b0381168114611c2057600080fd5b50565b600080600060408486031215611c3857600080fd5b8335611c4381611c0b565b925060208401356001600160401b0380821115611c5f57600080fd5b818601915086601f830112611c7357600080fd5b813581811115611c8257600080fd5b876020828501011115611c9457600080fd5b6020830194508093505050509250925092565b60005b83811015611cc2578181015183820152602001611caa565b50506000910152565b60008151808452611ce3816020860160208601611ca7565b601f01601f19169290920160200192915050565b6020815260006117b96020830184611ccb565b600060208284031215611d1c57600080fd5b81356117b981611c0b565b8015158114611c2057600080fd5b80356106b681611d27565b600080600060608486031215611d5557600080fd5b8335611d6081611c0b565b9250602084013591506040840135611d7781611d27565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b80356001600160e01b0319811681146106b657600080fd5b60008060008060808587031215611dc657600080fd5b8435611dd181611c0b565b9350602085810135611de281611c0b565b935060408601356001600160401b0380821115611dfe57600080fd5b818801915088601f830112611e1257600080fd5b813581811115611e2457611e24611d82565b8060051b604051601f19603f83011681018181108582111715611e4957611e49611d82565b60405291825284820192508381018501918b831115611e6757600080fd5b938501935b82851015611e8c57611e7d85611d98565b84529385019392850192611e6c565b809750505050505050611ea160608601611d35565b905092959194509250565b60008083601f840112611ebe57600080fd5b5081356001600160401b03811115611ed557600080fd5b6020830191508360208260061b8501011115611ef057600080fd5b9250929050565b600080600060408486031215611f0c57600080fd5b8335611f1781611c0b565b925060208401356001600160401b03811115611f3257600080fd5b611f3e86828701611eac565b9497909650939450505050565b60008060408385031215611f5e57600080fd5b8235611f6981611c0b565b91506020830135611f7981611c0b565b809150509250929050565b60008060008060808587031215611f9a57600080fd5b8435611fa581611c0b565b93506020850135611fb581611c0b565b9250604085013591506060850135611fcc81611c0b565b939692955090935050565b60008060208385031215611fea57600080fd5b82356001600160401b0381111561200057600080fd5b61200c85828601611eac565b90969095509350505050565b60006020828403121561202a57600080fd5b81356001600160401b03811681146117b957600080fd5b6000808585111561205157600080fd5b8386111561205e57600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156120935780818660040360031b1b83161692505b505092915050565b6000602082840312156120ad57600080fd5b81516117b981611c0b565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161211a5761211a6120f2565b5060010190565b6020808252601690820152754e6f7420617070726f76656420666f7220676175676560501b604082015260600190565b60006020828403121561216357600080fd5b81516117b981611d27565b60006020828403121561218057600080fd5b5051919050565b81810381811115610ae057610ae06120f2565b8082028115828204841417610ae057610ae06120f2565b6000826121ce57634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610ae057610ae06120f2565b600082516121f8818460208701611ca7565b919091019291505056fea26469706673582212202c6e9a8bb673daeef59655abd8e25d3774173eb74e5926d1a212ccf87f9dca4664736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf8000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd520000000000000000000000002f50d538606fa9edd2b11e2446beb18c9d5846bb000000000000000000000000d061d61a4d941c39e5453435b6345dc261c2fce00000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a2000000000000000000000000a464e6dcda8ac41e03616f95f4bc98a13b8922dc

-----Decoded View---------------
Arg [0] : _prismaCore (address): 0x5d17eA085F2FF5da3e6979D5d26F1dBaB664ccf8
Arg [1] : _CRV (address): 0xD533a949740bb3306d119CC777fa900bA034cd52
Arg [2] : _gaugeController (address): 0x2F50D538606Fa9EDD2B11E2446BEb18C9D5846bB
Arg [3] : _minter (address): 0xd061D61a4d941c39E5453435B6345Dc261C2fcE0
Arg [4] : _votingEscrow (address): 0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2
Arg [5] : _feeDistributor (address): 0xA464e6DCda8AC41e03616F95f4BC98a13b8922Dc

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf8
Arg [1] : 000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52
Arg [2] : 0000000000000000000000002f50d538606fa9edd2b11e2446beb18c9d5846bb
Arg [3] : 000000000000000000000000d061d61a4d941c39e5453435b6345dc261c2fce0
Arg [4] : 0000000000000000000000005f3b5dfeb7b28cdbd7faba78963ee202a494e2a2
Arg [5] : 000000000000000000000000a464e6dcda8ac41e03616f95f4bc98a13b8922dc


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.