ETH Price: $3,128.17 (-0.54%)

Token

CROC Vault (xCROC)
 

Overview

Max Total Supply

107,897,861.992908148604411393 xCROC

Holders

870

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
82,158.036358893 xCROC

Value
$0.00
0xcaf288e6bd537698be0264bb23d03cfe32b147f0
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RevenueDistributionToken

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : Vault.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.18;

import { ERC20 }       from "./tokens/ERC20.sol";
import { ERC20Helper } from "./tokens/ERC20Helper.sol";

import { IRevenueDistributionToken } from "./interfaces/IRevenueDistributionToken.sol";

/*
    ██████╗ ██████╗ ████████╗
    ██╔══██╗██╔══██╗╚══██╔══╝
    ██████╔╝██║  ██║   ██║
    ██╔══██╗██║  ██║   ██║
    ██║  ██║██████╔╝   ██║
    ╚═╝  ╚═╝╚═════╝    ╚═╝
*/

contract RevenueDistributionToken is IRevenueDistributionToken, ERC20 {

    uint256 public immutable override precision;  // Precision of rates, equals max deposit amounts before rounding errors occur

    address public override asset;  // Underlying ERC-20 asset used by ERC-4626 functionality.

    address public override owner;         // Current owner of the contract, able to update the vesting schedule.
    address public override pendingOwner;  // Pending owner of the contract, able to accept ownership.

    uint256 public override freeAssets;           // Amount of assets unlocked regardless of time passed.
    uint256 public override issuanceRate;         // asset/second rate dependent on aggregate vesting schedule.
    uint256 public override lastUpdated;          // Timestamp of when issuance equation was last updated.
    uint256 public override vestingPeriodFinish;  // Timestamp when current vesting schedule ends.

    uint256 private locked = 1;  // Used in reentrancy check.

    /*****************/
    /*** Modifiers ***/
    /*****************/

    modifier nonReentrant() {
        require(locked == 1, "RDT:LOCKED");

        locked = 2;

        _;

        locked = 1;
    }

    constructor(string memory name_, string memory symbol_, address owner_, address asset_, uint256 precision_)
        ERC20(name_, symbol_, ERC20(asset_).decimals())
    {
        require((owner = owner_) != address(0), "RDT:C:OWNER_ZERO_ADDRESS");

        asset     = asset_;  // Don't need to check zero address as ERC20(asset_).decimals() will fail in ERC20 constructor.
        precision = precision_;
    }

    /********************************/
    /*** Administrative Functions ***/
    /********************************/

    function acceptOwnership() external virtual override {
        require(msg.sender == pendingOwner, "RDT:AO:NOT_PO");

        emit OwnershipAccepted(owner, msg.sender);

        owner        = msg.sender;
        pendingOwner = address(0);
    }

    function setPendingOwner(address pendingOwner_) external virtual override {
        require(msg.sender == owner, "RDT:SPO:NOT_OWNER");

        pendingOwner = pendingOwner_;

        emit PendingOwnerSet(msg.sender, pendingOwner_);
    }

    function updateVestingSchedule(uint256 vestingPeriod_) external virtual override returns (uint256 issuanceRate_, uint256 freeAssets_) {
        require(msg.sender == owner, "RDT:UVS:NOT_OWNER");
        require(totalSupply != 0,    "RDT:UVS:ZERO_SUPPLY");

        // Update "y-intercept" to reflect current available asset.
        freeAssets_ = freeAssets = totalAssets();

        // Calculate slope.
        issuanceRate_ = issuanceRate = ((ERC20(asset).balanceOf(address(this)) - freeAssets_) * precision) / vestingPeriod_;

        // Update timestamp and period finish.
        vestingPeriodFinish = (lastUpdated = block.timestamp) + vestingPeriod_;

        emit IssuanceParamsUpdated(freeAssets_, issuanceRate_);
        emit VestingScheduleUpdated(msg.sender, vestingPeriodFinish);
    }

    /************************/
    /*** Staker Functions ***/
    /************************/

    function deposit(uint256 assets_, address receiver_) external virtual override nonReentrant returns (uint256 shares_) {
        _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender);
    }

    function depositWithPermit(
        uint256 assets_,
        address receiver_,
        uint256 deadline_,
        uint8   v_,
        bytes32 r_,
        bytes32 s_
    )
        external virtual override nonReentrant returns (uint256 shares_)
    {
        ERC20(asset).permit(msg.sender, address(this), assets_, deadline_, v_, r_, s_);
        _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender);
    }

    function mint(uint256 shares_, address receiver_) external virtual override nonReentrant returns (uint256 assets_) {
        _mint(shares_, assets_ = previewMint(shares_), receiver_, msg.sender);
    }

    function mintWithPermit(
        uint256 shares_,
        address receiver_,
        uint256 maxAssets_,
        uint256 deadline_,
        uint8   v_,
        bytes32 r_,
        bytes32 s_
    )
        external virtual override nonReentrant returns (uint256 assets_)
    {
        require((assets_ = previewMint(shares_)) <= maxAssets_, "RDT:MWP:INSUFFICIENT_PERMIT");

        ERC20(asset).permit(msg.sender, address(this), maxAssets_, deadline_, v_, r_, s_);
                    (shares_, assets_, receiver_, msg.sender);
    }

    function redeem(uint256 shares_, address receiver_, address owner_) external virtual override nonReentrant returns (uint256 assets_) {
        _burn(shares_, assets_ = previewRedeem(shares_), receiver_, owner_, msg.sender);
    }

    function withdraw(uint256 assets_, address receiver_, address owner_) external virtual override nonReentrant returns (uint256 shares_) {
        _burn(shares_ = previewWithdraw(assets_), assets_, receiver_, owner_, msg.sender);
    }

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function _mint(uint256 shares_, uint256 assets_, address receiver_, address caller_) internal {
        require(receiver_ != address(0), "RDT:M:ZERO_RECEIVER");
        require(shares_   != uint256(0), "RDT:M:ZERO_SHARES");
        require(assets_   != uint256(0), "RDT:M:ZERO_ASSETS");

        _mint(receiver_, shares_);

        uint256 freeAssetsCache = freeAssets = totalAssets() + assets_;

        uint256 issuanceRate_ = _updateIssuanceParams();

        emit Deposit(caller_, receiver_, assets_, shares_);
        emit IssuanceParamsUpdated(freeAssetsCache, issuanceRate_);

        require(ERC20Helper.transferFrom(asset, caller_, address(this), assets_), "RDT:M:TRANSFER_FROM");
    }

    function _burn(uint256 shares_, uint256 assets_, address receiver_, address owner_, address caller_) internal {
        require(receiver_ != address(0), "RDT:B:ZERO_RECEIVER");
        require(shares_   != uint256(0), "RDT:B:ZERO_SHARES");
        require(assets_   != uint256(0), "RDT:B:ZERO_ASSETS");

        if (caller_ != owner_) {
            _decreaseAllowance(owner_, caller_, shares_);
        }

        _burn(owner_, shares_);

        uint256 freeAssetsCache = freeAssets = totalAssets() - assets_;

        uint256 issuanceRate_ = _updateIssuanceParams();

        emit Withdraw(caller_, receiver_, owner_, assets_, shares_);
        emit IssuanceParamsUpdated(freeAssetsCache, issuanceRate_);

        require(ERC20Helper.transfer(asset, receiver_, assets_), "RDT:B:TRANSFER");
    }

    function _updateIssuanceParams() internal returns (uint256 issuanceRate_) {
        return issuanceRate = (lastUpdated = block.timestamp) > vestingPeriodFinish ? 0 : issuanceRate;
    }

    /**********************/
    /*** View Functions ***/
    /**********************/

    function balanceOfAssets(address account_) public view virtual override returns (uint256 balanceOfAssets_) {
        return convertToAssets(balanceOf[account_]);
    }

    function convertToAssets(uint256 shares_) public view virtual override returns (uint256 assets_) {
        uint256 supply = totalSupply;  // Cache to stack.

        assets_ = supply == 0 ? shares_ : (shares_ * totalAssets()) / supply;
    }

    function convertToShares(uint256 assets_) public view virtual override returns (uint256 shares_) {
        uint256 supply = totalSupply;  // Cache to stack.

        shares_ = supply == 0 ? assets_ : (assets_ * supply) / totalAssets();
    }

    function maxDeposit(address receiver_) external pure virtual override returns (uint256 maxAssets_) {
        receiver_;  // Silence warning
        maxAssets_ = type(uint256).max;
    }

    function maxMint(address receiver_) external pure virtual override returns (uint256 maxShares_) {
        receiver_;  // Silence warning
        maxShares_ = type(uint256).max;
    }

    function maxRedeem(address owner_) external view virtual override returns (uint256 maxShares_) {
        maxShares_ = balanceOf[owner_];
    }

    function maxWithdraw(address owner_) external view virtual override returns (uint256 maxAssets_) {
        maxAssets_ = balanceOfAssets(owner_);
    }

    function previewDeposit(uint256 assets_) public view virtual override returns (uint256 shares_) {
        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round DOWN if it’s calculating the amount of shares to issue to a user, given an amount of assets provided.
        shares_ = convertToShares(assets_);
    }

    function previewMint(uint256 shares_) public view virtual override returns (uint256 assets_) {
        uint256 supply = totalSupply;  // Cache to stack.

        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round UP if it’s calculating the amount of assets a user must provide, to be issued a given amount of shares.
        assets_ = supply == 0 ? shares_ : _divRoundUp(shares_ * totalAssets(), supply);
    }

    function previewRedeem(uint256 shares_) public view virtual override returns (uint256 assets_) {
        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round DOWN if it’s calculating the amount of assets to send to a user, given amount of shares returned.
        assets_ = convertToAssets(shares_);
    }

    function previewWithdraw(uint256 assets_) public view virtual override returns (uint256 shares_) {
        uint256 supply = totalSupply;  // Cache to stack.

        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round UP if it’s calculating the amount of shares a user must return, to be sent a given amount of assets.
        shares_ = supply == 0 ? assets_ : _divRoundUp(assets_ * supply, totalAssets());
    }

    function totalAssets() public view virtual override returns (uint256 totalManagedAssets_) {
        uint256 issuanceRate_ = issuanceRate;

        if (issuanceRate_ == 0) return freeAssets;

        uint256 vestingPeriodFinish_ = vestingPeriodFinish;
        uint256 lastUpdated_         = lastUpdated;

        uint256 vestingTimePassed =
            block.timestamp > vestingPeriodFinish_ ?
                vestingPeriodFinish_ - lastUpdated_ :
                block.timestamp - lastUpdated_;

        return ((issuanceRate_ * vestingTimePassed) / precision) + freeAssets;
    }

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function _divRoundUp(uint256 numerator_, uint256 divisor_) internal pure returns (uint256 result_) {
       return (numerator_ / divisor_) + (numerator_ % divisor_ > 0 ? 1 : 0);
    }

}

File 2 of 7 : IERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.18;

/// @title Interface of the ERC20 standard as defined in the EIP, including EIP-2612 permit functionality.
interface IERC20 {

    /**************/
    /*** Events ***/
    /**************/

    /**
     *  @dev   Emitted when one account has set the allowance of another account over their tokens.
     *  @param owner_   Account that tokens are approved from.
     *  @param spender_ Account that tokens are approved for.
     *  @param amount_  Amount of tokens that have been approved.
     */
    event Approval(address indexed owner_, address indexed spender_, uint256 amount_);

    /**
     *  @dev   Emitted when tokens have moved from one account to another.
     *  @param owner_     Account that tokens have moved from.
     *  @param recipient_ Account that tokens have moved to.
     *  @param amount_    Amount of tokens that have been transferred.
     */
    event Transfer(address indexed owner_, address indexed recipient_, uint256 amount_);

    /**************************/
    /*** External Functions ***/
    /**************************/

    /**
     *  @dev    Function that allows one account to set the allowance of another account over their tokens.
     *          Emits an {Approval} event.
     *  @param  spender_ Account that tokens are approved for.
     *  @param  amount_  Amount of tokens that have been approved.
     *  @return success_ Boolean indicating whether the operation succeeded.
     */
    function approve(address spender_, uint256 amount_) external returns (bool success_);

    /**
     *  @dev    Function that allows one account to decrease the allowance of another account over their tokens.
     *          Emits an {Approval} event.
     *  @param  spender_          Account that tokens are approved for.
     *  @param  subtractedAmount_ Amount to decrease approval by.
     *  @return success_          Boolean indicating whether the operation succeeded.
     */
    function decreaseAllowance(address spender_, uint256 subtractedAmount_) external returns (bool success_);

    /**
     *  @dev    Function that allows one account to increase the allowance of another account over their tokens.
     *          Emits an {Approval} event.
     *  @param  spender_     Account that tokens are approved for.
     *  @param  addedAmount_ Amount to increase approval by.
     *  @return success_     Boolean indicating whether the operation succeeded.
     */
    function increaseAllowance(address spender_, uint256 addedAmount_) external returns (bool success_);

    /**
     *  @dev   Approve by signature.
     *  @param owner_    Owner address that signed the permit.
     *  @param spender_  Spender of the permit.
     *  @param amount_   Permit approval spend limit.
     *  @param deadline_ Deadline after which the permit is invalid.
     *  @param v_        ECDSA signature v component.
     *  @param r_        ECDSA signature r component.
     *  @param s_        ECDSA signature s component.
     */
    function permit(address owner_, address spender_, uint amount_, uint deadline_, uint8 v_, bytes32 r_, bytes32 s_) external;

    /**
     *  @dev    Moves an amount of tokens from `msg.sender` to a specified account.
     *          Emits a {Transfer} event.
     *  @param  recipient_ Account that receives tokens.
     *  @param  amount_    Amount of tokens that are transferred.
     *  @return success_   Boolean indicating whether the operation succeeded.
     */
    function transfer(address recipient_, uint256 amount_) external returns (bool success_);

    /**
     *  @dev    Moves a pre-approved amount of tokens from a sender to a specified account.
     *          Emits a {Transfer} event.
     *          Emits an {Approval} event.
     *  @param  owner_     Account that tokens are moving from.
     *  @param  recipient_ Account that receives tokens.
     *  @param  amount_    Amount of tokens that are transferred.
     *  @return success_   Boolean indicating whether the operation succeeded.
     */
    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);

    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
     *  @dev    Returns the allowance that one account has given another over their tokens.
     *  @param  owner_     Account that tokens are approved from.
     *  @param  spender_   Account that tokens are approved for.
     *  @return allowance_ Allowance that one account has given another over their tokens.
     */
    function allowance(address owner_, address spender_) external view returns (uint256 allowance_);

    /**
     *  @dev    Returns the amount of tokens owned by a given account.
     *  @param  account_ Account that owns the tokens.
     *  @return balance_ Amount of tokens owned by a given account.
     */
    function balanceOf(address account_) external view returns (uint256 balance_);

    /**
     *  @dev    Returns the decimal precision used by the token.
     *  @return decimals_ The decimal precision used by the token.
     */
    function decimals() external view returns (uint8 decimals_);

    /**
     *  @dev    Returns the signature domain separator.
     *  @return domainSeparator_ The signature domain separator.
     */
    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator_);

    /**
     *  @dev    Returns the name of the token.
     *  @return name_ The name of the token.
     */
    function name() external view returns (string memory name_);

    /**
      *  @dev    Returns the nonce for the given owner.
      *  @param  owner_  The address of the owner account.
      *  @return nonce_ The nonce for the given owner.
     */
    function nonces(address owner_) external view returns (uint256 nonce_);

    /**
     *  @dev    Returns the permit type hash.
     *  @return permitTypehash_ The permit type hash.
     */
    function PERMIT_TYPEHASH() external view returns (bytes32 permitTypehash_);

    /**
     *  @dev    Returns the symbol of the token.
     *  @return symbol_ The symbol of the token.
     */
    function symbol() external view returns (string memory symbol_);

    /**
     *  @dev    Returns the total amount of tokens in existence.
     *  @return totalSupply_ The total amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256 totalSupply_);

}

File 3 of 7 : IERC20Like.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.18;

/// @title Interface of the ERC20 standard as needed by ERC20Helper.
interface IERC20Like {

    function approve(address spender_, uint256 amount_) external returns (bool success_);

    function transfer(address recipient_, uint256 amount_) external returns (bool success_);

    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);

}

File 4 of 7 : IERC4626.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.18;

import { IERC20 } from "./IERC20.sol";

/// @title A standard for tokenized Vaults with a single underlying ERC-20 token.
interface IERC4626 is IERC20 {

    /**************/
    /*** Events ***/
    /**************/

    /**
     *  @dev   `caller_` has exchanged `assets_` for `shares_` and transferred them to `owner_`.
     *         MUST be emitted when assets are deposited via the `deposit` or `mint` methods.
     *  @param caller_ The caller of the function that emitted the `Deposit` event.
     *  @param owner_  The owner of the shares.
     *  @param assets_ The amount of assets deposited.
     *  @param shares_ The amount of shares minted.
     */
    event Deposit(address indexed caller_, address indexed owner_, uint256 assets_, uint256 shares_);

    /**
     *  @dev   `caller_` has exchanged `shares_`, owned by `owner_`, for `assets_`, and transferred them to `receiver_`.
     *         MUST be emitted when assets are withdrawn via the `withdraw` or `redeem` methods.
     *  @param caller_   The caller of the function that emitted the `Withdraw` event.
     *  @param receiver_ The receiver of the assets.
     *  @param owner_    The owner of the shares.
     *  @param assets_   The amount of assets withdrawn.
     *  @param shares_   The amount of shares burned.
     */
    event Withdraw(address indexed caller_, address indexed receiver_, address indexed owner_, uint256 assets_, uint256 shares_);

    /***********************/
    /*** State Variables ***/
    /***********************/

    /**
     *  @dev    The address of the underlying asset used by the Vault.
     *          MUST be a contract that implements the ERC-20 standard.
     *          MUST NOT revert.
     *  @return asset_ The address of the underlying asset.
     */
    function asset() external view returns (address asset_);

    /********************************/
    /*** State Changing Functions ***/
    /********************************/

    /**
     *  @dev    Mints `shares_` to `receiver_` by depositing `assets_` into the Vault.
     *          MUST emit the {Deposit} event.
     *          MUST revert if all of the assets cannot be deposited (due to insufficient approval, deposit limits, slippage, etc).
     *  @param  assets_   The amount of assets to deposit.
     *  @param  receiver_ The receiver of the shares.
     *  @return shares_   The amount of shares minted.
     */
    function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_);

    /**
     *  @dev    Mints `shares_` to `receiver_` by depositing `assets_` into the Vault.
     *          MUST emit the {Deposit} event.
     *          MUST revert if all of shares cannot be minted (due to insufficient approval, deposit limits, slippage, etc).
     *  @param  shares_   The amount of shares to mint.
     *  @param  receiver_ The receiver of the shares.
     *  @return assets_   The amount of assets deposited.
     */
    function mint(uint256 shares_, address receiver_) external returns (uint256 assets_);

    /**
     *  @dev    Burns `shares_` from `owner_` and sends `assets_` to `receiver_`.
     *          MUST emit the {Withdraw} event.
     *          MUST revert if all of the shares cannot be redeemed (due to insufficient shares, withdrawal limits, slippage, etc).
     *  @param  shares_   The amount of shares to redeem.
     *  @param  receiver_ The receiver of the assets.
     *  @param  owner_    The owner of the shares.
     *  @return assets_   The amount of assets sent to the receiver.
     */
    function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assets_);

    /**
     *  @dev    Burns `shares_` from `owner_` and sends `assets_` to `receiver_`.
     *          MUST emit the {Withdraw} event.
     *          MUST revert if all of the assets cannot be withdrawn (due to insufficient assets, withdrawal limits, slippage, etc).
     *  @param  assets_   The amount of assets to withdraw.
     *  @param  receiver_ The receiver of the assets.
     *  @param  owner_    The owner of the assets.
     *  @return shares_   The amount of shares burned from the owner.
     */
    function withdraw(uint256 assets_, address receiver_, address owner_) external returns (uint256 shares_);

    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
     *  @dev    The amount of `assets_` the `shares_` are currently equivalent to.
     *          MUST NOT be inclusive of any fees that are charged against assets in the Vault.
     *          MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange.
     *          MUST NOT show any variations depending on the caller.
     *          MUST NOT revert.
     *  @param  shares_ The amount of shares to convert.
     *  @return assets_ The amount of equivalent assets.
     */
    function convertToAssets(uint256 shares_) external view returns (uint256 assets_);

    /**
     *  @dev    The amount of `shares_` the `assets_` are currently equivalent to.
     *          MUST NOT be inclusive of any fees that are charged against assets in the Vault.
     *          MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange.
     *          MUST NOT show any variations depending on the caller.
     *          MUST NOT revert.
     *  @param  assets_ The amount of assets to convert.
     *  @return shares_ The amount of equivalent shares.
     */
    function convertToShares(uint256 assets_) external view returns (uint256 shares_);

    /**
     *  @dev    Maximum amount of `assets_` that can be deposited on behalf of the `receiver_` through a `deposit` call.
     *          MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise.
     *          MUST NOT revert.
     *  @param  receiver_ The receiver of the assets.
     *  @return assets_   The maximum amount of assets that can be deposited.
     */
    function maxDeposit(address receiver_) external view returns (uint256 assets_);

    /**
     *  @dev    Maximum amount of `shares_` that can be minted on behalf of the `receiver_` through a `mint` call.
     *          MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise.
     *          MUST NOT revert.
     *  @param  receiver_ The receiver of the shares.
     *  @return shares_   The maximum amount of shares that can be minted.
     */
    function maxMint(address receiver_) external view returns (uint256 shares_);

    /**
     *  @dev    Maximum amount of `shares_` that can be redeemed from the `owner_` through a `redeem` call.
     *          MUST return a limited value if the owner is subject to any limits, or the total amount of owned shares otherwise.
     *          MUST NOT revert.
     *  @param  owner_  The owner of the shares.
     *  @return shares_ The maximum amount of shares that can be redeemed.
     */
    function maxRedeem(address owner_) external view returns (uint256 shares_);

    /**
     *  @dev    Maximum amount of `assets_` that can be withdrawn from the `owner_` through a `withdraw` call.
     *          MUST return a limited value if the owner is subject to any limits, or the total amount of owned assets otherwise.
     *          MUST NOT revert.
     *  @param  owner_  The owner of the assets.
     *  @return assets_ The maximum amount of assets that can be withdrawn.
     */
    function maxWithdraw(address owner_) external view returns (uint256 assets_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given current on-chain conditions.
     *          MUST return as close to and no more than the exact amount of shares that would be minted in a `deposit` call in the same transaction.
     *          MUST NOT account for deposit limits like those returned from `maxDeposit` and should always act as though the deposit would be accepted.
     *          MUST NOT revert.
     *  @param  assets_ The amount of assets to deposit.
     *  @return shares_ The amount of shares that would be minted.
     */
    function previewDeposit(uint256 assets_) external view returns (uint256 shares_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given current on-chain conditions.
     *          MUST return as close to and no fewer than the exact amount of assets that would be deposited in a `mint` call in the same transaction.
     *          MUST NOT account for mint limits like those returned from `maxMint` and should always act as though the minting would be accepted.
     *          MUST NOT revert.
     *  @param  shares_ The amount of shares to mint.
     *  @return assets_ The amount of assets that would be deposited.
     */
    function previewMint(uint256 shares_) external view returns (uint256 assets_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block, given current on-chain conditions.
     *          MUST return as close to and no more than the exact amount of assets that would be withdrawn in a `redeem` call in the same transaction.
     *          MUST NOT account for redemption limits like those returned from `maxRedeem` and should always act as though the redemption would be accepted.
     *          MUST NOT revert.
     *  @param  shares_ The amount of shares to redeem.
     *  @return assets_ The amount of assets that would be withdrawn.
     */
    function previewRedeem(uint256 shares_) external view returns (uint256 assets_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, given current on-chain conditions.
     *          MUST return as close to and no fewer than the exact amount of shares that would be burned in a `withdraw` call in the same transaction.
     *          MUST NOT account for withdrawal limits like those returned from `maxWithdraw` and should always act as though the withdrawal would be accepted.
     *          MUST NOT revert.
     *  @param  assets_ The amount of assets to withdraw.
     *  @return shares_ The amount of shares that would be redeemed.
     */
    function previewWithdraw(uint256 assets_) external view returns (uint256 shares_);

    /**
     *  @dev    Total amount of the underlying asset that is managed by the Vault.
     *          SHOULD include compounding that occurs from any yields.
     *          MUST NOT revert.
     *  @return totalAssets_ The total amount of assets the Vault manages.
     */
    function totalAssets() external view returns (uint256 totalAssets_);

}

File 5 of 7 : IRevenueDistributionToken.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.18;

import { IERC20 } from "./IERC20.sol";

import { IERC4626 } from "./IERC4626.sol";

/// @title A token that represents ownership of future revenues distributed linearly over time.
interface IRevenueDistributionToken is IERC20, IERC4626 {

    /**************/
    /*** Events ***/
    /**************/

    /**
     *  @dev   Issuance parameters have been updated after a `_mint` or `_burn`.
     *  @param freeAssets_   Resulting `freeAssets` (y-intercept) value after accounting update.
     *  @param issuanceRate_ The new issuance rate of `asset` until `vestingPeriodFinish_`.
     */
    event IssuanceParamsUpdated(uint256 freeAssets_, uint256 issuanceRate_);

    /**
     *  @dev   `newOwner_` has accepted the transferral of RDT ownership from `previousOwner_`.
     *  @param previousOwner_ The previous RDT owner.
     *  @param newOwner_      The new RDT owner.
     */
    event OwnershipAccepted(address indexed previousOwner_, address indexed newOwner_);

    /**
     *  @dev   `owner_` has set the new pending owner of RDT to `pendingOwner_`.
     *  @param owner_        The current RDT owner.
     *  @param pendingOwner_ The new pending RDT owner.
     */
    event PendingOwnerSet(address indexed owner_, address indexed pendingOwner_);

    /**
     *  @dev   `owner_` has updated the RDT vesting schedule to end at `vestingPeriodFinish_`.
     *  @param owner_               The current RDT owner.
     *  @param vestingPeriodFinish_ When the unvested balance will finish vesting.
     */
    event VestingScheduleUpdated(address indexed owner_, uint256 vestingPeriodFinish_);

    /***********************/
    /*** State Variables ***/
    /***********************/

    /**
     *  @dev The total amount of the underlying asset that is currently unlocked and is not time-dependent.
     *       Analogous to the y-intercept in a linear function.
     */
    function freeAssets() external view returns (uint256 freeAssets_);

    /**
     *  @dev The rate of issuance of the vesting schedule that is currently active.
     *       Denominated as the amount of underlying assets vesting per second.
     */
    function issuanceRate() external view returns (uint256 issuanceRate_);

    /**
     *  @dev The timestamp of when the linear function was last recalculated.
     *       Analogous to t0 in a linear function.
     */
    function lastUpdated() external view returns (uint256 lastUpdated_);

    /**
     *  @dev The address of the account that is allowed to update the vesting schedule.
     */
    function owner() external view returns (address owner_);

    /**
     *  @dev The next owner, nominated by the current owner.
     */
    function pendingOwner() external view returns (address pendingOwner_);

    /**
     *  @dev The precision at which the issuance rate is measured.
     */
    function precision() external view returns (uint256 precision_);

    /**
     *  @dev The end of the current vesting schedule.
     */
    function vestingPeriodFinish() external view returns (uint256 vestingPeriodFinish_);

    /********************************/
    /*** Administrative Functions ***/
    /********************************/

    /**
     *  @dev Sets the pending owner as the new owner.
     *       Can be called only by the pending owner, and only after their nomination by the current owner.
     */
    function acceptOwnership() external;

    /**
     *  @dev   Sets a new address as the pending owner.
     *  @param pendingOwner_ The address of the next potential owner.
     */
    function setPendingOwner(address pendingOwner_) external;

    /**
     *  @dev    Updates the current vesting formula based on the amount of total unvested funds in the contract and the new `vestingPeriod_`.
     *  @param  vestingPeriod_ The amount of time over which all currently unaccounted underlying assets will be vested over.
     *  @return issuanceRate_  The new issuance rate.
     *  @return freeAssets_    The new amount of underlying assets that are unlocked.
     */
    function updateVestingSchedule(uint256 vestingPeriod_) external returns (uint256 issuanceRate_, uint256 freeAssets_);

    /************************/
    /*** Staker Functions ***/
    /************************/

    /**
     *  @dev    Does a ERC4626 `deposit` with a ERC-2612 `permit`.
     *  @param  assets_   The amount of `asset` to deposit.
     *  @param  receiver_ The receiver of the shares.
     *  @param  deadline_ The timestamp after which the `permit` signature is no longer valid.
     *  @param  v_        ECDSA signature v component.
     *  @param  r_        ECDSA signature r component.
     *  @param  s_        ECDSA signature s component.
     *  @return shares_   The amount of shares minted.
     */
    function depositWithPermit(uint256 assets_, address receiver_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external returns (uint256 shares_);

    /**
     *  @dev    Does a ERC4626 `mint` with a ERC-2612 `permit`.
     *  @param  shares_    The amount of `shares` to mint.
     *  @param  receiver_  The receiver of the shares.
     *  @param  maxAssets_ The maximum amount of assets that can be taken, as per the permit.
     *  @param  deadline_  The timestamp after which the `permit` signature is no longer valid.
     *  @param  v_         ECDSA signature v component.
     *  @param  r_         ECDSA signature r component.
     *  @param  s_         ECDSA signature s component.
     *  @return assets_    The amount of shares deposited.
     */
    function mintWithPermit(uint256 shares_, address receiver_, uint256 maxAssets_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external returns (uint256 assets_);


    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
     *  @dev    Returns the amount of underlying assets owned by the specified account.
     *  @param  account_ Address of the account.
     *  @return assets_  Amount of assets owned.
     */
    function balanceOfAssets(address account_) external view returns (uint256 assets_);

}

File 6 of 7 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.18;

import { IERC20 } from "../interfaces/IERC20.sol";

/*
    ███████╗██████╗  ██████╗    ██████╗  ██████╗
    ██╔════╝██╔══██╗██╔════╝    ╚════██╗██╔═████╗
    █████╗  ██████╔╝██║          █████╔╝██║██╔██║
    ██╔══╝  ██╔══██╗██║         ██╔═══╝ ████╔╝██║
    ███████╗██║  ██║╚██████╗    ███████╗╚██████╔╝
    ╚══════╝╚═╝  ╚═╝ ╚═════╝    ╚══════╝ ╚═════╝
*/

/**
 *  @title Modern ERC-20 implementation.
 *  @dev   Acknowledgements to Solmate, OpenZeppelin, and DSS for inspiring this code.
 */
contract ERC20 is IERC20 {

    /**************/
    /*** ERC-20 ***/
    /**************/

    string public override name;
    string public override symbol;

    uint8 public immutable override decimals;

    uint256 public override totalSupply;

    mapping(address => uint256) public override balanceOf;

    mapping(address => mapping(address => uint256)) public override allowance;

    /****************/
    /*** ERC-2612 ***/
    /****************/

    // PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    mapping(address => uint256) public override nonces;

    /**
     *  @param name_     The name of the token.
     *  @param symbol_   The symbol of the token.
     *  @param decimals_ The decimal precision used by the token.
     */
    constructor(string memory name_, string memory symbol_, uint8 decimals_) {
        name     = name_;
        symbol   = symbol_;
        decimals = decimals_;
    }

    /**************************/
    /*** External Functions ***/
    /**************************/

    function approve(address spender_, uint256 amount_) external override returns (bool success_) {
        _approve(msg.sender, spender_, amount_);
        return true;
    }

    function decreaseAllowance(address spender_, uint256 subtractedAmount_) external override returns (bool success_) {
        _decreaseAllowance(msg.sender, spender_, subtractedAmount_);
        return true;
    }

    function increaseAllowance(address spender_, uint256 addedAmount_) external override returns (bool success_) {
        _approve(msg.sender, spender_, allowance[msg.sender][spender_] + addedAmount_);
        return true;
    }

    function permit(address owner_, address spender_, uint256 amount_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external override {
        require(deadline_ >= block.timestamp, "ERC20:P:EXPIRED");

        // Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}.
        require(
            uint256(s_) <= uint256(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) &&
            (v_ == 27 || v_ == 28),
            "ERC20:P:MALLEABLE"
        );

        // Nonce realistically cannot overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner_, spender_, amount_, nonces[owner_]++, deadline_))
                )
            );

            address recoveredAddress = ecrecover(digest, v_, r_, s_);

            require(recoveredAddress == owner_ && owner_ != address(0), "ERC20:P:INVALID_SIGNATURE");
        }

        _approve(owner_, spender_, amount_);
    }

    function transfer(address recipient_, uint256 amount_) external override returns (bool success_) {
        _transfer(msg.sender, recipient_, amount_);
        return true;
    }

    function transferFrom(address owner_, address recipient_, uint256 amount_) external override returns (bool success_) {
        _decreaseAllowance(owner_, msg.sender, amount_);
        _transfer(owner_, recipient_, amount_);
        return true;
    }

    /**********************/
    /*** View Functions ***/
    /**********************/

    function DOMAIN_SEPARATOR() public view override returns (bytes32 domainSeparator_) {
        return keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function _approve(address owner_, address spender_, uint256 amount_) internal {
        emit Approval(owner_, spender_, allowance[owner_][spender_] = amount_);
    }

    function _burn(address owner_, uint256 amount_) internal {
        balanceOf[owner_] -= amount_;

        // Cannot underflow because a user's balance will never be larger than the total supply.
        unchecked { totalSupply -= amount_; }

        emit Transfer(owner_, address(0), amount_);
    }

    function _decreaseAllowance(address owner_, address spender_, uint256 subtractedAmount_) internal {
        uint256 spenderAllowance = allowance[owner_][spender_];  // Cache to memory.

        if (spenderAllowance != type(uint256).max) {
            _approve(owner_, spender_, spenderAllowance - subtractedAmount_);
        }
    }

    function _mint(address recipient_, uint256 amount_) internal {
        totalSupply += amount_;

        // Cannot overflow because totalSupply would first overflow in the statement above.
        unchecked { balanceOf[recipient_] += amount_; }

        emit Transfer(address(0), recipient_, amount_);
    }

    function _transfer(address owner_, address recipient_, uint256 amount_) internal {
        balanceOf[owner_] -= amount_;

        // Cannot overflow because minting prevents overflow of totalSupply, and sum of user balances == totalSupply.
        unchecked { balanceOf[recipient_] += amount_; }

        emit Transfer(owner_, recipient_, amount_);
    }

}

File 7 of 7 : ERC20Helper.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.18;

import { IERC20Like } from "../interfaces/IERC20Like.sol";

/**
 * @title Small Library to standardize erc20 token interactions.
 */
library ERC20Helper {

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function transfer(address token_, address to_, uint256 amount_) internal returns (bool success_) {
        return _call(token_, abi.encodeWithSelector(IERC20Like.transfer.selector, to_, amount_));
    }

    function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) {
        return _call(token_, abi.encodeWithSelector(IERC20Like.transferFrom.selector, from_, to_, amount_));
    }

    function approve(address token_, address spender_, uint256 amount_) internal returns (bool success_) {
        // If setting approval to zero fails, return false.
        if (!_call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, uint256(0)))) return false;

        // If `amount_` is zero, return true as the previous step already did this.
        if (amount_ == uint256(0)) return true;

        // Return the result of setting the approval to `amount_`.
        return _call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, amount_));
    }

    function _call(address token_, bytes memory data_) private returns (bool success_) {
        if (token_.code.length == uint256(0)) return false;

        bytes memory returnData;
        ( success_, returnData ) = token_.call(data_);

        return success_ && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
    }

}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"asset_","type":"address"},{"internalType":"uint256","name":"precision_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"spender_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"freeAssets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"issuanceRate_","type":"uint256"}],"name":"IssuanceParamsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner_","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner_","type":"address"}],"name":"OwnershipAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"recipient_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"vestingPeriodFinish_","type":"uint256"}],"name":"VestingScheduleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"receiver_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"domainSeparator_","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"balanceOfAssets","outputs":[{"internalType":"uint256","name":"balanceOfAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"subtractedAmount_","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"depositWithPermit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"addedAmount_","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issuanceRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"maxAssets_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"precision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalManagedAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestingPeriod_","type":"uint256"}],"name":"updateVestingSchedule","outputs":[{"internalType":"uint256","name":"issuanceRate_","type":"uint256"},{"internalType":"uint256","name":"freeAssets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingPeriodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

60c06040526001600d553480156200001657600080fd5b506040516200447c3803806200447c83398181016040528101906200003c91906200041d565b84848373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b0919062000521565b8260009081620000c1919062000794565b508160019081620000d3919062000794565b508060ff1660808160ff1681525050505050600073ffffffffffffffffffffffffffffffffffffffff1683600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905573ffffffffffffffffffffffffffffffffffffffff160362000196576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018d90620008dc565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060a081815250505050505050620008fe565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002538262000208565b810181811067ffffffffffffffff8211171562000275576200027462000219565b5b80604052505050565b60006200028a620001ea565b905062000298828262000248565b919050565b600067ffffffffffffffff821115620002bb57620002ba62000219565b5b620002c68262000208565b9050602081019050919050565b60005b83811015620002f3578082015181840152602081019050620002d6565b60008484015250505050565b60006200031662000310846200029d565b6200027e565b90508281526020810184848401111562000335576200033462000203565b5b62000342848285620002d3565b509392505050565b600082601f830112620003625762000361620001fe565b5b815162000374848260208601620002ff565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003aa826200037d565b9050919050565b620003bc816200039d565b8114620003c857600080fd5b50565b600081519050620003dc81620003b1565b92915050565b6000819050919050565b620003f781620003e2565b81146200040357600080fd5b50565b6000815190506200041781620003ec565b92915050565b600080600080600060a086880312156200043c576200043b620001f4565b5b600086015167ffffffffffffffff8111156200045d576200045c620001f9565b5b6200046b888289016200034a565b955050602086015167ffffffffffffffff8111156200048f576200048e620001f9565b5b6200049d888289016200034a565b9450506040620004b088828901620003cb565b9350506060620004c388828901620003cb565b9250506080620004d68882890162000406565b9150509295509295909350565b600060ff82169050919050565b620004fb81620004e3565b81146200050757600080fd5b50565b6000815190506200051b81620004f0565b92915050565b6000602082840312156200053a5762000539620001f4565b5b60006200054a848285016200050a565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005a657607f821691505b602082108103620005bc57620005bb6200055e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006267fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005e7565b620006328683620005e7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620006756200066f6200066984620003e2565b6200064a565b620003e2565b9050919050565b6000819050919050565b620006918362000654565b620006a9620006a0826200067c565b848454620005f4565b825550505050565b600090565b620006c0620006b1565b620006cd81848462000686565b505050565b5b81811015620006f557620006e9600082620006b6565b600181019050620006d3565b5050565b601f82111562000744576200070e81620005c2565b6200071984620005d7565b8101602085101562000729578190505b620007416200073885620005d7565b830182620006d2565b50505b505050565b600082821c905092915050565b6000620007696000198460080262000749565b1980831691505092915050565b600062000784838362000756565b9150826002028217905092915050565b6200079f8262000553565b67ffffffffffffffff811115620007bb57620007ba62000219565b5b620007c782546200058d565b620007d4828285620006f9565b600060209050601f8311600181146200080c5760008415620007f7578287015190505b62000803858262000776565b86555062000873565b601f1984166200081c86620005c2565b60005b8281101562000846578489015182556001820191506020850194506020810190506200081f565b8683101562000866578489015162000862601f89168262000756565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5244543a433a4f574e45525f5a45524f5f414444524553530000000000000000600082015250565b6000620008c46018836200087b565b9150620008d1826200088c565b602082019050919050565b60006020820190508181036000830152620008f781620008b5565b9050919050565b60805160a051613b4a62000932600039600081816109b5015281816116550152611a7901526000610b730152613b4a6000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063c63d75b6116100c3578063d505accf11610087578063d505accf14610863578063d905777e1461087f578063dd62ed3e146108af578063e13aa990146108df578063e30c397814610910578063ef8b30f71461092e57610274565b8063c63d75b614610797578063c6e6f592146107c7578063ce96cb77146107f7578063d0b06f5d14610827578063d3b5dc3b1461084557610274565b8063a457c2d711610115578063a457c2d71461068b578063a9059cbb146106bb578063b3d7f6b9146106eb578063b460af941461071b578063ba0876521461074b578063c42069ec1461077b57610274565b80637ecebe00146105bf5780638da5cb5b146105ef5780639159b2061461060d57806394bf804d1461063d57806395d89b411461066d57610274565b806338d52e0f116101ea5780634cdad506116101ae5780634cdad506146104c557806350921b23146104f557806360dd37d9146105255780636e553f651461055557806370a082311461058557806379ba5097146105b557610274565b806338d52e0f1461040b57806339509351146104295780633c2f7773146104595780633c9ae2ba14610477578063402d267d1461049557610274565b806311f240ac1161023c57806311f240ac1461034557806318160ddd1461036357806323b872dd1461038157806330adf81f146103b1578063313ce567146103cf5780633644e515146103ed57610274565b806301e1d1141461027957806306fdde031461029757806307a2d13a146102b5578063095ea7b3146102e55780630a28a47714610315575b600080fd5b61028161095e565b60405161028e91906127c6565b60405180910390f35b61029f6109fe565b6040516102ac9190612871565b60405180910390f35b6102cf60048036038101906102ca91906128c4565b610a8c565b6040516102dc91906127c6565b60405180910390f35b6102ff60048036038101906102fa919061294f565b610ac9565b60405161030c91906129aa565b60405180910390f35b61032f600480360381019061032a91906128c4565b610ae0565b60405161033c91906127c6565b60405180910390f35b61034d610b1b565b60405161035a91906127c6565b60405180910390f35b61036b610b21565b60405161037891906127c6565b60405180910390f35b61039b600480360381019061039691906129c5565b610b27565b6040516103a891906129aa565b60405180910390f35b6103b9610b4a565b6040516103c69190612a31565b60405180910390f35b6103d7610b71565b6040516103e49190612a68565b60405180910390f35b6103f5610b95565b6040516104029190612a31565b60405180910390f35b610413610c3d565b6040516104209190612a92565b60405180910390f35b610443600480360381019061043e919061294f565b610c63565b60405161045091906129aa565b60405180910390f35b610461610d01565b60405161046e91906127c6565b60405180910390f35b61047f610d07565b60405161048c91906127c6565b60405180910390f35b6104af60048036038101906104aa9190612aad565b610d0d565b6040516104bc91906127c6565b60405180910390f35b6104df60048036038101906104da91906128c4565b610d37565b6040516104ec91906127c6565b60405180910390f35b61050f600480360381019061050a9190612b32565b610d49565b60405161051c91906127c6565b60405180910390f35b61053f600480360381019061053a9190612bbf565b610e5a565b60405161054c91906127c6565b60405180910390f35b61056f600480360381019061056a9190612c61565b610fa3565b60405161057c91906127c6565b60405180910390f35b61059f600480360381019061059a9190612aad565b611017565b6040516105ac91906127c6565b60405180910390f35b6105bd61102f565b005b6105d960048036038101906105d49190612aad565b6111c0565b6040516105e691906127c6565b60405180910390f35b6105f76111d8565b6040516106049190612a92565b60405180910390f35b61062760048036038101906106229190612aad565b6111fe565b60405161063491906127c6565b60405180910390f35b61065760048036038101906106529190612c61565b61124f565b60405161066491906127c6565b60405180910390f35b6106756112c3565b6040516106829190612871565b60405180910390f35b6106a560048036038101906106a0919061294f565b611351565b6040516106b291906129aa565b60405180910390f35b6106d560048036038101906106d0919061294f565b611368565b6040516106e291906129aa565b60405180910390f35b610705600480360381019061070091906128c4565b61137f565b60405161071291906127c6565b60405180910390f35b61073560048036038101906107309190612ca1565b6113ba565b60405161074291906127c6565b60405180910390f35b61076560048036038101906107609190612ca1565b611430565b60405161077291906127c6565b60405180910390f35b61079560048036038101906107909190612aad565b6114a6565b005b6107b160048036038101906107ac9190612aad565b6115d4565b6040516107be91906127c6565b60405180910390f35b6107e160048036038101906107dc91906128c4565b6115fe565b6040516107ee91906127c6565b60405180910390f35b610811600480360381019061080c9190612aad565b61163b565b60405161081e91906127c6565b60405180910390f35b61082f61164d565b60405161083c91906127c6565b60405180910390f35b61084d611653565b60405161085a91906127c6565b60405180910390f35b61087d60048036038101906108789190612cf4565b611677565b005b61089960048036038101906108949190612aad565b611921565b6040516108a691906127c6565b60405180910390f35b6108c960048036038101906108c49190612d96565b61196a565b6040516108d691906127c6565b60405180910390f35b6108f960048036038101906108f491906128c4565b61198f565b604051610907929190612dd6565b60405180910390f35b610918611bff565b6040516109259190612a92565b60405180910390f35b610948600480360381019061094391906128c4565b611c25565b60405161095591906127c6565b60405180910390f35b600080600a54905060008103610979576009549150506109fb565b6000600c5490506000600b54905060008242116109a157814261099c9190612e2e565b6109ae565b81836109ad9190612e2e565b5b90506009547f000000000000000000000000000000000000000000000000000000000000000082866109e09190612e62565b6109ea9190612ed3565b6109f49190612f04565b9450505050505b90565b60008054610a0b90612f67565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3790612f67565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b505050505081565b600080600254905060008114610abf5780610aa561095e565b84610ab09190612e62565b610aba9190612ed3565b610ac1565b825b915050919050565b6000610ad6338484611c37565b6001905092915050565b600080600254905060008114610b1157610b0c8184610aff9190612e62565b610b0761095e565b611d20565b610b13565b825b915050919050565b60095481565b60025481565b6000610b34843384611d5f565b610b3f848484611e24565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610bc7919061303b565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001610c22959493929190613052565b60405160208183030381529060405280519060200120905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cf7338484600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cf29190612f04565b611c37565b6001905092915050565b600c5481565b600a5481565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000610d4282610a8c565b9050919050565b60006001600d5414610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906130f1565b60405180910390fd5b6002600d81905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf33308a898989896040518863ffffffff1660e01b8152600401610dff9796959493929190613111565b600060405180830381600087803b158015610e1957600080fd5b505af1158015610e2d573d6000803e3d6000fd5b50505050610e48610e3d88611c25565b915081888833611f31565b6001600d819055509695505050505050565b60006001600d5414610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e98906130f1565b60405180910390fd5b6002600d8190555085610eb38961137f565b9150811115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906131cc565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333089898989896040518863ffffffff1660e01b8152600401610f5e9796959493929190613111565b600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050506001600d81905550979650505050505050565b60006001600d5414610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1906130f1565b60405180910390fd5b6002600d81905550611009610ffe84611c25565b915081848433611f31565b6001600d8190555092915050565b60036020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b690613238565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c60405160405180910390a333600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611248600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8c565b9050919050565b60006001600d5414611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130f1565b60405180910390fd5b6002600d819055506112b5836112ab8561137f565b9250828433611f31565b6001600d8190555092915050565b600180546112d090612f67565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90612f67565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b505050505081565b600061135e338484611d5f565b6001905092915050565b6000611375338484611e24565b6001905092915050565b6000806002549050600081146113b0576113ab61139a61095e565b846113a59190612e62565b82611d20565b6113b2565b825b915050919050565b60006001600d5414611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906130f1565b60405180910390fd5b6002600d8190555061142161141585610ae0565b9150818585853361216d565b6001600d819055509392505050565b60006001600d5414611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906130f1565b60405180910390fd5b6002600d819055506114978461148c86610d37565b92508285853361216d565b6001600d819055509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906132a4565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f60405160405180910390a350565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000806002549050600081146116315761161661095e565b81846116229190612e62565b61162c9190612ed3565b611633565b825b915050919050565b6000611646826111fe565b9050919050565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b428410156116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190613310565b60405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08160001c111580156116fe5750601b8360ff1614806116fd5750601c8360ff16145b5b61173d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117349061337c565b60405180910390fd5b6000611747610b95565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016117d29695949392919061339c565b604051602081830303815290604052805190602001206040516020016117f9929190613475565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161183694939291906134ac565b6020604051602081039080840390855afa158015611858573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480156118cc5750600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b61190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061353d565b60405180910390fd5b5050611918878787611c37565b50505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906135a9565b60405180910390fd5b600060025403611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613615565b60405180910390fd5b611a6f61095e565b60098190559050827f000000000000000000000000000000000000000000000000000000000000000082600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611af49190612a92565b602060405180830381865afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b35919061364a565b611b3f9190612e2e565b611b499190612e62565b611b539190612ed3565b600a81905591508242600b819055611b6b9190612f04565b600c819055507f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8183604051611ba2929190612dd6565b60405180910390a13373ffffffffffffffffffffffffffffffffffffffff167f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab3600c54604051611bf291906127c6565b60405180910390a2915091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c30826115fe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055604051611d1391906127c6565b60405180910390a3505050565b6000808284611d2f9190613677565b11611d3b576000611d3e565b60015b60ff168284611d4d9190612ed3565b611d579190612f04565b905092915050565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e1e57611e1d84848484611e189190612e2e565b611c37565b5b50505050565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e739190612e2e565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f2491906127c6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906136f4565b60405180910390fd5b60008403611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613760565b60405180910390fd5b60008303612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d906137cc565b60405180910390fd5b61203082856123ff565b60008361203b61095e565b6120459190612f04565b6009819055905060006120566124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d787896040516120b7929190612dd6565b60405180910390a37f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa82826040516120f0929190612dd6565b60405180910390a1612126600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168430886124f4565b612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613838565b60405180910390fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d3906138a4565b60405180910390fd5b6000850361221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690613910565b60405180910390fd5b60008403612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599061397c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122a1576122a0828287611d5f565b5b6122ab8286612583565b6000846122b661095e565b6122c09190612e2e565b6009819055905060006122d16124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b604051612349929190612dd6565b60405180910390a47f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8282604051612382929190612dd6565b60405180910390a16123b7600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168688612653565b6123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906139e8565b60405180910390fd5b50505050505050565b80600260008282546124119190612f04565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124c391906127c6565b60405180910390a35050565b6000600c5442600b819055116124e757600a546124ea565b60005b600a819055905090565b6000612579856323b872dd60e01b86868660405160240161251793929190613a08565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b9050949350505050565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d29190612e2e565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161264791906127c6565b60405180910390a35050565b60006126d68463a9059cbb60e01b8585604051602401612674929190613a3f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b90509392505050565b6000808373ffffffffffffffffffffffffffffffffffffffff163b0361270857600090506127a7565b60608373ffffffffffffffffffffffffffffffffffffffff168360405161272f9190613aa4565b6000604051808303816000865af19150503d806000811461276c576040519150601f19603f3d011682016040523d82523d6000602084013e612771565b606091505b5080925081935050508180156127a357506000815114806127a25750808060200190518101906127a19190613ae7565b5b5b9150505b92915050565b6000819050919050565b6127c0816127ad565b82525050565b60006020820190506127db60008301846127b7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281b578082015181840152602081019050612800565b60008484015250505050565b6000601f19601f8301169050919050565b6000612843826127e1565b61284d81856127ec565b935061285d8185602086016127fd565b61286681612827565b840191505092915050565b6000602082019050818103600083015261288b8184612838565b905092915050565b600080fd5b6128a1816127ad565b81146128ac57600080fd5b50565b6000813590506128be81612898565b92915050565b6000602082840312156128da576128d9612893565b5b60006128e8848285016128af565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061291c826128f1565b9050919050565b61292c81612911565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b6000806040838503121561296657612965612893565b5b60006129748582860161293a565b9250506020612985858286016128af565b9150509250929050565b60008115159050919050565b6129a48161298f565b82525050565b60006020820190506129bf600083018461299b565b92915050565b6000806000606084860312156129de576129dd612893565b5b60006129ec8682870161293a565b93505060206129fd8682870161293a565b9250506040612a0e868287016128af565b9150509250925092565b6000819050919050565b612a2b81612a18565b82525050565b6000602082019050612a466000830184612a22565b92915050565b600060ff82169050919050565b612a6281612a4c565b82525050565b6000602082019050612a7d6000830184612a59565b92915050565b612a8c81612911565b82525050565b6000602082019050612aa76000830184612a83565b92915050565b600060208284031215612ac357612ac2612893565b5b6000612ad18482850161293a565b91505092915050565b612ae381612a4c565b8114612aee57600080fd5b50565b600081359050612b0081612ada565b92915050565b612b0f81612a18565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060008060008060c08789031215612b4f57612b4e612893565b5b6000612b5d89828a016128af565b9650506020612b6e89828a0161293a565b9550506040612b7f89828a016128af565b9450506060612b9089828a01612af1565b9350506080612ba189828a01612b1d565b92505060a0612bb289828a01612b1d565b9150509295509295509295565b600080600080600080600060e0888a031215612bde57612bdd612893565b5b6000612bec8a828b016128af565b9750506020612bfd8a828b0161293a565b9650506040612c0e8a828b016128af565b9550506060612c1f8a828b016128af565b9450506080612c308a828b01612af1565b93505060a0612c418a828b01612b1d565b92505060c0612c528a828b01612b1d565b91505092959891949750929550565b60008060408385031215612c7857612c77612893565b5b6000612c86858286016128af565b9250506020612c978582860161293a565b9150509250929050565b600080600060608486031215612cba57612cb9612893565b5b6000612cc8868287016128af565b9350506020612cd98682870161293a565b9250506040612cea8682870161293a565b9150509250925092565b600080600080600080600060e0888a031215612d1357612d12612893565b5b6000612d218a828b0161293a565b9750506020612d328a828b0161293a565b9650506040612d438a828b016128af565b9550506060612d548a828b016128af565b9450506080612d658a828b01612af1565b93505060a0612d768a828b01612b1d565b92505060c0612d878a828b01612b1d565b91505092959891949750929550565b60008060408385031215612dad57612dac612893565b5b6000612dbb8582860161293a565b9250506020612dcc8582860161293a565b9150509250929050565b6000604082019050612deb60008301856127b7565b612df860208301846127b7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e39826127ad565b9150612e44836127ad565b9250828203905081811115612e5c57612e5b612dff565b5b92915050565b6000612e6d826127ad565b9150612e78836127ad565b9250828202612e86816127ad565b91508282048414831517612e9d57612e9c612dff565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ede826127ad565b9150612ee9836127ad565b925082612ef957612ef8612ea4565b5b828204905092915050565b6000612f0f826127ad565b9150612f1a836127ad565b9250828201905080821115612f3257612f31612dff565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7f57607f821691505b602082108103612f9257612f91612f38565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612fc581612f67565b612fcf8186612f98565b94506001821660008114612fea5760018114612fff57613032565b60ff1983168652811515820286019350613032565b61300885612fa3565b60005b8381101561302a5781548189015260018201915060208101905061300b565b838801955050505b50505092915050565b60006130478284612fb8565b915081905092915050565b600060a0820190506130676000830188612a22565b6130746020830187612a22565b6130816040830186612a22565b61308e60608301856127b7565b61309b6080830184612a83565b9695505050505050565b7f5244543a4c4f434b454400000000000000000000000000000000000000000000600082015250565b60006130db600a836127ec565b91506130e6826130a5565b602082019050919050565b6000602082019050818103600083015261310a816130ce565b9050919050565b600060e082019050613126600083018a612a83565b6131336020830189612a83565b61314060408301886127b7565b61314d60608301876127b7565b61315a6080830186612a59565b61316760a0830185612a22565b61317460c0830184612a22565b98975050505050505050565b7f5244543a4d57503a494e53554646494349454e545f5045524d49540000000000600082015250565b60006131b6601b836127ec565b91506131c182613180565b602082019050919050565b600060208201905081810360008301526131e5816131a9565b9050919050565b7f5244543a414f3a4e4f545f504f00000000000000000000000000000000000000600082015250565b6000613222600d836127ec565b915061322d826131ec565b602082019050919050565b6000602082019050818103600083015261325181613215565b9050919050565b7f5244543a53504f3a4e4f545f4f574e4552000000000000000000000000000000600082015250565b600061328e6011836127ec565b915061329982613258565b602082019050919050565b600060208201905081810360008301526132bd81613281565b9050919050565b7f45524332303a503a455850495245440000000000000000000000000000000000600082015250565b60006132fa600f836127ec565b9150613305826132c4565b602082019050919050565b60006020820190508181036000830152613329816132ed565b9050919050565b7f45524332303a503a4d414c4c4541424c45000000000000000000000000000000600082015250565b60006133666011836127ec565b915061337182613330565b602082019050919050565b6000602082019050818103600083015261339581613359565b9050919050565b600060c0820190506133b16000830189612a22565b6133be6020830188612a83565b6133cb6040830187612a83565b6133d860608301866127b7565b6133e560808301856127b7565b6133f260a08301846127b7565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061343e6002836133fd565b915061344982613408565b600282019050919050565b6000819050919050565b61346f61346a82612a18565b613454565b82525050565b600061348082613431565b915061348c828561345e565b60208201915061349c828461345e565b6020820191508190509392505050565b60006080820190506134c16000830187612a22565b6134ce6020830186612a59565b6134db6040830185612a22565b6134e86060830184612a22565b95945050505050565b7f45524332303a503a494e56414c49445f5349474e415455524500000000000000600082015250565b60006135276019836127ec565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f5244543a5556533a4e4f545f4f574e4552000000000000000000000000000000600082015250565b60006135936011836127ec565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f5244543a5556533a5a45524f5f535550504c5900000000000000000000000000600082015250565b60006135ff6013836127ec565b915061360a826135c9565b602082019050919050565b6000602082019050818103600083015261362e816135f2565b9050919050565b60008151905061364481612898565b92915050565b6000602082840312156136605761365f612893565b5b600061366e84828501613635565b91505092915050565b6000613682826127ad565b915061368d836127ad565b92508261369d5761369c612ea4565b5b828206905092915050565b7f5244543a4d3a5a45524f5f524543454956455200000000000000000000000000600082015250565b60006136de6013836127ec565b91506136e9826136a8565b602082019050919050565b6000602082019050818103600083015261370d816136d1565b9050919050565b7f5244543a4d3a5a45524f5f534841524553000000000000000000000000000000600082015250565b600061374a6011836127ec565b915061375582613714565b602082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b7f5244543a4d3a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006137b66011836127ec565b91506137c182613780565b602082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b7f5244543a4d3a5452414e534645525f46524f4d00000000000000000000000000600082015250565b60006138226013836127ec565b915061382d826137ec565b602082019050919050565b6000602082019050818103600083015261385181613815565b9050919050565b7f5244543a423a5a45524f5f524543454956455200000000000000000000000000600082015250565b600061388e6013836127ec565b915061389982613858565b602082019050919050565b600060208201905081810360008301526138bd81613881565b9050919050565b7f5244543a423a5a45524f5f534841524553000000000000000000000000000000600082015250565b60006138fa6011836127ec565b9150613905826138c4565b602082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f5244543a423a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006139666011836127ec565b915061397182613930565b602082019050919050565b6000602082019050818103600083015261399581613959565b9050919050565b7f5244543a423a5452414e53464552000000000000000000000000000000000000600082015250565b60006139d2600e836127ec565b91506139dd8261399c565b602082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b6000606082019050613a1d6000830186612a83565b613a2a6020830185612a83565b613a3760408301846127b7565b949350505050565b6000604082019050613a546000830185612a83565b613a6160208301846127b7565b9392505050565b600081519050919050565b6000613a7e82613a68565b613a888185612f98565b9350613a988185602086016127fd565b80840191505092915050565b6000613ab08284613a73565b915081905092915050565b613ac48161298f565b8114613acf57600080fd5b50565b600081519050613ae181613abb565b92915050565b600060208284031215613afd57613afc612893565b5b6000613b0b84828501613ad2565b9150509291505056fea264697066735822122040f82169d54fd3be0764aa41225bc5aae7e179a3bcf93208ca2be357cc5b821e64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a8c2111fa095d07facc7d963cc752c253504c2de000000000000000000000000caa79bf8b1d00bf3d4f6dbec6221955871c04618000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000000000000000000000000000a43524f43205661756c740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057843524f43000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063c63d75b6116100c3578063d505accf11610087578063d505accf14610863578063d905777e1461087f578063dd62ed3e146108af578063e13aa990146108df578063e30c397814610910578063ef8b30f71461092e57610274565b8063c63d75b614610797578063c6e6f592146107c7578063ce96cb77146107f7578063d0b06f5d14610827578063d3b5dc3b1461084557610274565b8063a457c2d711610115578063a457c2d71461068b578063a9059cbb146106bb578063b3d7f6b9146106eb578063b460af941461071b578063ba0876521461074b578063c42069ec1461077b57610274565b80637ecebe00146105bf5780638da5cb5b146105ef5780639159b2061461060d57806394bf804d1461063d57806395d89b411461066d57610274565b806338d52e0f116101ea5780634cdad506116101ae5780634cdad506146104c557806350921b23146104f557806360dd37d9146105255780636e553f651461055557806370a082311461058557806379ba5097146105b557610274565b806338d52e0f1461040b57806339509351146104295780633c2f7773146104595780633c9ae2ba14610477578063402d267d1461049557610274565b806311f240ac1161023c57806311f240ac1461034557806318160ddd1461036357806323b872dd1461038157806330adf81f146103b1578063313ce567146103cf5780633644e515146103ed57610274565b806301e1d1141461027957806306fdde031461029757806307a2d13a146102b5578063095ea7b3146102e55780630a28a47714610315575b600080fd5b61028161095e565b60405161028e91906127c6565b60405180910390f35b61029f6109fe565b6040516102ac9190612871565b60405180910390f35b6102cf60048036038101906102ca91906128c4565b610a8c565b6040516102dc91906127c6565b60405180910390f35b6102ff60048036038101906102fa919061294f565b610ac9565b60405161030c91906129aa565b60405180910390f35b61032f600480360381019061032a91906128c4565b610ae0565b60405161033c91906127c6565b60405180910390f35b61034d610b1b565b60405161035a91906127c6565b60405180910390f35b61036b610b21565b60405161037891906127c6565b60405180910390f35b61039b600480360381019061039691906129c5565b610b27565b6040516103a891906129aa565b60405180910390f35b6103b9610b4a565b6040516103c69190612a31565b60405180910390f35b6103d7610b71565b6040516103e49190612a68565b60405180910390f35b6103f5610b95565b6040516104029190612a31565b60405180910390f35b610413610c3d565b6040516104209190612a92565b60405180910390f35b610443600480360381019061043e919061294f565b610c63565b60405161045091906129aa565b60405180910390f35b610461610d01565b60405161046e91906127c6565b60405180910390f35b61047f610d07565b60405161048c91906127c6565b60405180910390f35b6104af60048036038101906104aa9190612aad565b610d0d565b6040516104bc91906127c6565b60405180910390f35b6104df60048036038101906104da91906128c4565b610d37565b6040516104ec91906127c6565b60405180910390f35b61050f600480360381019061050a9190612b32565b610d49565b60405161051c91906127c6565b60405180910390f35b61053f600480360381019061053a9190612bbf565b610e5a565b60405161054c91906127c6565b60405180910390f35b61056f600480360381019061056a9190612c61565b610fa3565b60405161057c91906127c6565b60405180910390f35b61059f600480360381019061059a9190612aad565b611017565b6040516105ac91906127c6565b60405180910390f35b6105bd61102f565b005b6105d960048036038101906105d49190612aad565b6111c0565b6040516105e691906127c6565b60405180910390f35b6105f76111d8565b6040516106049190612a92565b60405180910390f35b61062760048036038101906106229190612aad565b6111fe565b60405161063491906127c6565b60405180910390f35b61065760048036038101906106529190612c61565b61124f565b60405161066491906127c6565b60405180910390f35b6106756112c3565b6040516106829190612871565b60405180910390f35b6106a560048036038101906106a0919061294f565b611351565b6040516106b291906129aa565b60405180910390f35b6106d560048036038101906106d0919061294f565b611368565b6040516106e291906129aa565b60405180910390f35b610705600480360381019061070091906128c4565b61137f565b60405161071291906127c6565b60405180910390f35b61073560048036038101906107309190612ca1565b6113ba565b60405161074291906127c6565b60405180910390f35b61076560048036038101906107609190612ca1565b611430565b60405161077291906127c6565b60405180910390f35b61079560048036038101906107909190612aad565b6114a6565b005b6107b160048036038101906107ac9190612aad565b6115d4565b6040516107be91906127c6565b60405180910390f35b6107e160048036038101906107dc91906128c4565b6115fe565b6040516107ee91906127c6565b60405180910390f35b610811600480360381019061080c9190612aad565b61163b565b60405161081e91906127c6565b60405180910390f35b61082f61164d565b60405161083c91906127c6565b60405180910390f35b61084d611653565b60405161085a91906127c6565b60405180910390f35b61087d60048036038101906108789190612cf4565b611677565b005b61089960048036038101906108949190612aad565b611921565b6040516108a691906127c6565b60405180910390f35b6108c960048036038101906108c49190612d96565b61196a565b6040516108d691906127c6565b60405180910390f35b6108f960048036038101906108f491906128c4565b61198f565b604051610907929190612dd6565b60405180910390f35b610918611bff565b6040516109259190612a92565b60405180910390f35b610948600480360381019061094391906128c4565b611c25565b60405161095591906127c6565b60405180910390f35b600080600a54905060008103610979576009549150506109fb565b6000600c5490506000600b54905060008242116109a157814261099c9190612e2e565b6109ae565b81836109ad9190612e2e565b5b90506009547f000000000000000000000000000000000000000c9f2c9cd04674edea4000000082866109e09190612e62565b6109ea9190612ed3565b6109f49190612f04565b9450505050505b90565b60008054610a0b90612f67565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3790612f67565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b505050505081565b600080600254905060008114610abf5780610aa561095e565b84610ab09190612e62565b610aba9190612ed3565b610ac1565b825b915050919050565b6000610ad6338484611c37565b6001905092915050565b600080600254905060008114610b1157610b0c8184610aff9190612e62565b610b0761095e565b611d20565b610b13565b825b915050919050565b60095481565b60025481565b6000610b34843384611d5f565b610b3f848484611e24565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610bc7919061303b565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001610c22959493929190613052565b60405160208183030381529060405280519060200120905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cf7338484600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cf29190612f04565b611c37565b6001905092915050565b600c5481565b600a5481565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000610d4282610a8c565b9050919050565b60006001600d5414610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906130f1565b60405180910390fd5b6002600d81905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf33308a898989896040518863ffffffff1660e01b8152600401610dff9796959493929190613111565b600060405180830381600087803b158015610e1957600080fd5b505af1158015610e2d573d6000803e3d6000fd5b50505050610e48610e3d88611c25565b915081888833611f31565b6001600d819055509695505050505050565b60006001600d5414610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e98906130f1565b60405180910390fd5b6002600d8190555085610eb38961137f565b9150811115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906131cc565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333089898989896040518863ffffffff1660e01b8152600401610f5e9796959493929190613111565b600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050506001600d81905550979650505050505050565b60006001600d5414610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1906130f1565b60405180910390fd5b6002600d81905550611009610ffe84611c25565b915081848433611f31565b6001600d8190555092915050565b60036020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b690613238565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c60405160405180910390a333600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611248600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8c565b9050919050565b60006001600d5414611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130f1565b60405180910390fd5b6002600d819055506112b5836112ab8561137f565b9250828433611f31565b6001600d8190555092915050565b600180546112d090612f67565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90612f67565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b505050505081565b600061135e338484611d5f565b6001905092915050565b6000611375338484611e24565b6001905092915050565b6000806002549050600081146113b0576113ab61139a61095e565b846113a59190612e62565b82611d20565b6113b2565b825b915050919050565b60006001600d5414611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906130f1565b60405180910390fd5b6002600d8190555061142161141585610ae0565b9150818585853361216d565b6001600d819055509392505050565b60006001600d5414611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906130f1565b60405180910390fd5b6002600d819055506114978461148c86610d37565b92508285853361216d565b6001600d819055509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906132a4565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f60405160405180910390a350565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000806002549050600081146116315761161661095e565b81846116229190612e62565b61162c9190612ed3565b611633565b825b915050919050565b6000611646826111fe565b9050919050565b600b5481565b7f000000000000000000000000000000000000000c9f2c9cd04674edea4000000081565b428410156116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190613310565b60405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08160001c111580156116fe5750601b8360ff1614806116fd5750601c8360ff16145b5b61173d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117349061337c565b60405180910390fd5b6000611747610b95565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016117d29695949392919061339c565b604051602081830303815290604052805190602001206040516020016117f9929190613475565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161183694939291906134ac565b6020604051602081039080840390855afa158015611858573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480156118cc5750600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b61190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061353d565b60405180910390fd5b5050611918878787611c37565b50505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906135a9565b60405180910390fd5b600060025403611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613615565b60405180910390fd5b611a6f61095e565b60098190559050827f000000000000000000000000000000000000000c9f2c9cd04674edea4000000082600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611af49190612a92565b602060405180830381865afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b35919061364a565b611b3f9190612e2e565b611b499190612e62565b611b539190612ed3565b600a81905591508242600b819055611b6b9190612f04565b600c819055507f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8183604051611ba2929190612dd6565b60405180910390a13373ffffffffffffffffffffffffffffffffffffffff167f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab3600c54604051611bf291906127c6565b60405180910390a2915091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c30826115fe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055604051611d1391906127c6565b60405180910390a3505050565b6000808284611d2f9190613677565b11611d3b576000611d3e565b60015b60ff168284611d4d9190612ed3565b611d579190612f04565b905092915050565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e1e57611e1d84848484611e189190612e2e565b611c37565b5b50505050565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e739190612e2e565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f2491906127c6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906136f4565b60405180910390fd5b60008403611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613760565b60405180910390fd5b60008303612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d906137cc565b60405180910390fd5b61203082856123ff565b60008361203b61095e565b6120459190612f04565b6009819055905060006120566124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d787896040516120b7929190612dd6565b60405180910390a37f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa82826040516120f0929190612dd6565b60405180910390a1612126600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168430886124f4565b612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613838565b60405180910390fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d3906138a4565b60405180910390fd5b6000850361221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690613910565b60405180910390fd5b60008403612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599061397c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122a1576122a0828287611d5f565b5b6122ab8286612583565b6000846122b661095e565b6122c09190612e2e565b6009819055905060006122d16124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b604051612349929190612dd6565b60405180910390a47f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8282604051612382929190612dd6565b60405180910390a16123b7600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168688612653565b6123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906139e8565b60405180910390fd5b50505050505050565b80600260008282546124119190612f04565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124c391906127c6565b60405180910390a35050565b6000600c5442600b819055116124e757600a546124ea565b60005b600a819055905090565b6000612579856323b872dd60e01b86868660405160240161251793929190613a08565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b9050949350505050565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d29190612e2e565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161264791906127c6565b60405180910390a35050565b60006126d68463a9059cbb60e01b8585604051602401612674929190613a3f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b90509392505050565b6000808373ffffffffffffffffffffffffffffffffffffffff163b0361270857600090506127a7565b60608373ffffffffffffffffffffffffffffffffffffffff168360405161272f9190613aa4565b6000604051808303816000865af19150503d806000811461276c576040519150601f19603f3d011682016040523d82523d6000602084013e612771565b606091505b5080925081935050508180156127a357506000815114806127a25750808060200190518101906127a19190613ae7565b5b5b9150505b92915050565b6000819050919050565b6127c0816127ad565b82525050565b60006020820190506127db60008301846127b7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281b578082015181840152602081019050612800565b60008484015250505050565b6000601f19601f8301169050919050565b6000612843826127e1565b61284d81856127ec565b935061285d8185602086016127fd565b61286681612827565b840191505092915050565b6000602082019050818103600083015261288b8184612838565b905092915050565b600080fd5b6128a1816127ad565b81146128ac57600080fd5b50565b6000813590506128be81612898565b92915050565b6000602082840312156128da576128d9612893565b5b60006128e8848285016128af565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061291c826128f1565b9050919050565b61292c81612911565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b6000806040838503121561296657612965612893565b5b60006129748582860161293a565b9250506020612985858286016128af565b9150509250929050565b60008115159050919050565b6129a48161298f565b82525050565b60006020820190506129bf600083018461299b565b92915050565b6000806000606084860312156129de576129dd612893565b5b60006129ec8682870161293a565b93505060206129fd8682870161293a565b9250506040612a0e868287016128af565b9150509250925092565b6000819050919050565b612a2b81612a18565b82525050565b6000602082019050612a466000830184612a22565b92915050565b600060ff82169050919050565b612a6281612a4c565b82525050565b6000602082019050612a7d6000830184612a59565b92915050565b612a8c81612911565b82525050565b6000602082019050612aa76000830184612a83565b92915050565b600060208284031215612ac357612ac2612893565b5b6000612ad18482850161293a565b91505092915050565b612ae381612a4c565b8114612aee57600080fd5b50565b600081359050612b0081612ada565b92915050565b612b0f81612a18565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060008060008060c08789031215612b4f57612b4e612893565b5b6000612b5d89828a016128af565b9650506020612b6e89828a0161293a565b9550506040612b7f89828a016128af565b9450506060612b9089828a01612af1565b9350506080612ba189828a01612b1d565b92505060a0612bb289828a01612b1d565b9150509295509295509295565b600080600080600080600060e0888a031215612bde57612bdd612893565b5b6000612bec8a828b016128af565b9750506020612bfd8a828b0161293a565b9650506040612c0e8a828b016128af565b9550506060612c1f8a828b016128af565b9450506080612c308a828b01612af1565b93505060a0612c418a828b01612b1d565b92505060c0612c528a828b01612b1d565b91505092959891949750929550565b60008060408385031215612c7857612c77612893565b5b6000612c86858286016128af565b9250506020612c978582860161293a565b9150509250929050565b600080600060608486031215612cba57612cb9612893565b5b6000612cc8868287016128af565b9350506020612cd98682870161293a565b9250506040612cea8682870161293a565b9150509250925092565b600080600080600080600060e0888a031215612d1357612d12612893565b5b6000612d218a828b0161293a565b9750506020612d328a828b0161293a565b9650506040612d438a828b016128af565b9550506060612d548a828b016128af565b9450506080612d658a828b01612af1565b93505060a0612d768a828b01612b1d565b92505060c0612d878a828b01612b1d565b91505092959891949750929550565b60008060408385031215612dad57612dac612893565b5b6000612dbb8582860161293a565b9250506020612dcc8582860161293a565b9150509250929050565b6000604082019050612deb60008301856127b7565b612df860208301846127b7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e39826127ad565b9150612e44836127ad565b9250828203905081811115612e5c57612e5b612dff565b5b92915050565b6000612e6d826127ad565b9150612e78836127ad565b9250828202612e86816127ad565b91508282048414831517612e9d57612e9c612dff565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ede826127ad565b9150612ee9836127ad565b925082612ef957612ef8612ea4565b5b828204905092915050565b6000612f0f826127ad565b9150612f1a836127ad565b9250828201905080821115612f3257612f31612dff565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7f57607f821691505b602082108103612f9257612f91612f38565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612fc581612f67565b612fcf8186612f98565b94506001821660008114612fea5760018114612fff57613032565b60ff1983168652811515820286019350613032565b61300885612fa3565b60005b8381101561302a5781548189015260018201915060208101905061300b565b838801955050505b50505092915050565b60006130478284612fb8565b915081905092915050565b600060a0820190506130676000830188612a22565b6130746020830187612a22565b6130816040830186612a22565b61308e60608301856127b7565b61309b6080830184612a83565b9695505050505050565b7f5244543a4c4f434b454400000000000000000000000000000000000000000000600082015250565b60006130db600a836127ec565b91506130e6826130a5565b602082019050919050565b6000602082019050818103600083015261310a816130ce565b9050919050565b600060e082019050613126600083018a612a83565b6131336020830189612a83565b61314060408301886127b7565b61314d60608301876127b7565b61315a6080830186612a59565b61316760a0830185612a22565b61317460c0830184612a22565b98975050505050505050565b7f5244543a4d57503a494e53554646494349454e545f5045524d49540000000000600082015250565b60006131b6601b836127ec565b91506131c182613180565b602082019050919050565b600060208201905081810360008301526131e5816131a9565b9050919050565b7f5244543a414f3a4e4f545f504f00000000000000000000000000000000000000600082015250565b6000613222600d836127ec565b915061322d826131ec565b602082019050919050565b6000602082019050818103600083015261325181613215565b9050919050565b7f5244543a53504f3a4e4f545f4f574e4552000000000000000000000000000000600082015250565b600061328e6011836127ec565b915061329982613258565b602082019050919050565b600060208201905081810360008301526132bd81613281565b9050919050565b7f45524332303a503a455850495245440000000000000000000000000000000000600082015250565b60006132fa600f836127ec565b9150613305826132c4565b602082019050919050565b60006020820190508181036000830152613329816132ed565b9050919050565b7f45524332303a503a4d414c4c4541424c45000000000000000000000000000000600082015250565b60006133666011836127ec565b915061337182613330565b602082019050919050565b6000602082019050818103600083015261339581613359565b9050919050565b600060c0820190506133b16000830189612a22565b6133be6020830188612a83565b6133cb6040830187612a83565b6133d860608301866127b7565b6133e560808301856127b7565b6133f260a08301846127b7565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061343e6002836133fd565b915061344982613408565b600282019050919050565b6000819050919050565b61346f61346a82612a18565b613454565b82525050565b600061348082613431565b915061348c828561345e565b60208201915061349c828461345e565b6020820191508190509392505050565b60006080820190506134c16000830187612a22565b6134ce6020830186612a59565b6134db6040830185612a22565b6134e86060830184612a22565b95945050505050565b7f45524332303a503a494e56414c49445f5349474e415455524500000000000000600082015250565b60006135276019836127ec565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f5244543a5556533a4e4f545f4f574e4552000000000000000000000000000000600082015250565b60006135936011836127ec565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f5244543a5556533a5a45524f5f535550504c5900000000000000000000000000600082015250565b60006135ff6013836127ec565b915061360a826135c9565b602082019050919050565b6000602082019050818103600083015261362e816135f2565b9050919050565b60008151905061364481612898565b92915050565b6000602082840312156136605761365f612893565b5b600061366e84828501613635565b91505092915050565b6000613682826127ad565b915061368d836127ad565b92508261369d5761369c612ea4565b5b828206905092915050565b7f5244543a4d3a5a45524f5f524543454956455200000000000000000000000000600082015250565b60006136de6013836127ec565b91506136e9826136a8565b602082019050919050565b6000602082019050818103600083015261370d816136d1565b9050919050565b7f5244543a4d3a5a45524f5f534841524553000000000000000000000000000000600082015250565b600061374a6011836127ec565b915061375582613714565b602082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b7f5244543a4d3a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006137b66011836127ec565b91506137c182613780565b602082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b7f5244543a4d3a5452414e534645525f46524f4d00000000000000000000000000600082015250565b60006138226013836127ec565b915061382d826137ec565b602082019050919050565b6000602082019050818103600083015261385181613815565b9050919050565b7f5244543a423a5a45524f5f524543454956455200000000000000000000000000600082015250565b600061388e6013836127ec565b915061389982613858565b602082019050919050565b600060208201905081810360008301526138bd81613881565b9050919050565b7f5244543a423a5a45524f5f534841524553000000000000000000000000000000600082015250565b60006138fa6011836127ec565b9150613905826138c4565b602082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f5244543a423a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006139666011836127ec565b915061397182613930565b602082019050919050565b6000602082019050818103600083015261399581613959565b9050919050565b7f5244543a423a5452414e53464552000000000000000000000000000000000000600082015250565b60006139d2600e836127ec565b91506139dd8261399c565b602082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b6000606082019050613a1d6000830186612a83565b613a2a6020830185612a83565b613a3760408301846127b7565b949350505050565b6000604082019050613a546000830185612a83565b613a6160208301846127b7565b9392505050565b600081519050919050565b6000613a7e82613a68565b613a888185612f98565b9350613a988185602086016127fd565b80840191505092915050565b6000613ab08284613a73565b915081905092915050565b613ac48161298f565b8114613acf57600080fd5b50565b600081519050613ae181613abb565b92915050565b600060208284031215613afd57613afc612893565b5b6000613b0b84828501613ad2565b9150509291505056fea264697066735822122040f82169d54fd3be0764aa41225bc5aae7e179a3bcf93208ca2be357cc5b821e64736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a8c2111fa095d07facc7d963cc752c253504c2de000000000000000000000000caa79bf8b1d00bf3d4f6dbec6221955871c04618000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000000000000000000000000000a43524f43205661756c740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057843524f43000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): CROC Vault
Arg [1] : symbol_ (string): xCROC
Arg [2] : owner_ (address): 0xa8C2111FA095D07FACC7d963cC752C253504C2De
Arg [3] : asset_ (address): 0xcaa79Bf8B1d00Bf3D4f6dbEC6221955871C04618
Arg [4] : precision_ (uint256): 1000000000000000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000a8c2111fa095d07facc7d963cc752c253504c2de
Arg [3] : 000000000000000000000000caa79bf8b1d00bf3d4f6dbec6221955871c04618
Arg [4] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 43524f43205661756c7400000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 7843524f43000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.