ERC-20
DeFi
Overview
Max Total Supply
360,675.75264734804970974 xMPL
Holders
185 ( -0.541%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0 xMPLValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
xMPL
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.8.7; /** * @title xMPL * @author lucas-manuel, JGCarv, deluca-mike, edag94, vbidin * @notice This contract contains functionality to facilitate on-chain distribution * of protocol revenues denominated in MPL tokens. xMPL inherits the core * functionality from Maple's Revenue Distribution Token, which allows * users to lock assets to earn rewards distributions based on a vesting * schedule, with the added functionality to perform a one time asset * migration of the underlying token. * @dev This code was deployed at commit 9604d297132503cb05d74f2998c18b07f345ecc0 * (https://github.com/maple-labs/xMPL/releases/tag/v1.0.1). */ /// @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_); } /// @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(IERC20.transfer.selector, to_, amount_)); } function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) { return _call(token_, abi.encodeWithSelector(IERC20.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(IERC20.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(IERC20.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))); } } /// @title Token migrator contract to migrate MPL tokens after a timelock. contract Migrator { address public immutable newToken; address public immutable oldToken; constructor(address oldToken_, address newToken_) { require(IERC20(newToken_).decimals() == IERC20(oldToken_).decimals(), "M:C:DECIMAL_MISMATCH"); oldToken = oldToken_; newToken = newToken_; } function migrate(uint256 amount_) external { migrate(msg.sender, amount_); } function migrate(address owner_, uint256 amount_) public { require(amount_ != uint256(0), "M:M:ZERO_AMOUNT"); require(ERC20Helper.transferFrom(oldToken, owner_, address(this), amount_), "M:M:TRANSFER_FROM_FAILED"); require(ERC20Helper.transfer(newToken, owner_, amount_), "M:M:TRANSFER_FAILED"); } } /* ███████╗██████╗ ██████╗ ██████╗ ██████╗ ██╔════╝██╔══██╗██╔════╝ ╚════██╗██╔═████╗ █████╗ ██████╔╝██║ █████╔╝██║██╔██║ ██╔══╝ ██╔══██╗██║ ██╔═══╝ ████╔╝██║ ███████╗██║ ██║╚██████╗ ███████╗╚██████╔╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ */ /** * @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_); } } /// @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_); } /// @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_); } /* ██████╗ ██████╗ ████████╗ ██╔══██╗██╔══██╗╚══██╔══╝ ██████╔╝██║ ██║ ██║ ██╔══██╗██║ ██║ ██║ ██║ ██║██████╔╝ ██║ ╚═╝ ╚═╝╚═════╝ ╚═╝ */ /// @title A token that represents ownership of future revenues distributed linearly over time. 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_); _mint(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); } } /// @title A token that represents ownership of future MPL-denominated revenues distributed linearly over time. interface IxMPL is IRevenueDistributionToken { /**************/ /*** Events ***/ /**************/ /** * @dev Notifies that a scheduled migration was cancelled. */ event MigrationCancelled(); /** * @dev Notifies that a scheduled migration was executed. * @param fromAsset_ The address of the old asset. * @param toAsset_ The address of new asset migrated to. * @param amount_ The amount of tokens migrated. */ event MigrationPerformed(address indexed fromAsset_, address indexed toAsset_, uint256 amount_); /** * @dev Notifies that migration was scheduled. * @param fromAsset_ The current asset address. * @param toAsset_ The address of the asset to be migrated to. * @param migrator_ The address of the migrator contract. * @param migrationTime_ The earliest time the migration is scheduled for. */ event MigrationScheduled(address indexed fromAsset_, address indexed toAsset_, address indexed migrator_, uint256 migrationTime_); /********************************/ /*** Administrative Functions ***/ /********************************/ /** * @dev Cancel the scheduled migration */ function cancelMigration() external; /** * @dev Perform a migration of the asset. */ function performMigration() external; /** * @dev Schedule a migration to be executed after a delay. * @param migrator_ The address of the migrator contract. * @param newAsset_ The address of the new asset token. */ function scheduleMigration(address migrator_, address newAsset_) external; /**********************/ /*** View Functions ***/ /**********************/ /** * @dev Get the minimum delay that a scheduled transaction needs in order to be executed. * @return minimumMigrationDelay_ The delay in seconds. */ function MINIMUM_MIGRATION_DELAY() external pure returns (uint256 minimumMigrationDelay_); /** * @dev Get the timestamp that a migration is scheduled for. * @return scheduledMigrationTimestamp_ The timestamp of the migration. */ function scheduledMigrationTimestamp() external view returns (uint256 scheduledMigrationTimestamp_); /** * @dev The address of the migrator contract to be used during the scheduled migration. * @return scheduledMigrator_ The address of the migrator. */ function scheduledMigrator() external view returns (address scheduledMigrator_); /** * @dev The address of the new asset token to be migrated to during the scheduled migration. * @return scheduledNewAsset_ The address of the new asset token. */ function scheduledNewAsset() external view returns (address scheduledNewAsset_); } /* ██╗ ██╗███╗ ███╗██████╗ ██╗ ╚██╗██╔╝████╗ ████║██╔══██╗██║ ╚███╔╝ ██╔████╔██║██████╔╝██║ ██╔██╗ ██║╚██╔╝██║██╔═══╝ ██║ ██╔╝ ██╗██║ ╚═╝ ██║██║ ███████╗ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══════╝ */ /// @title A token that represents ownership of future MPL-denominated revenues distributed linearly over time. contract xMPL is IxMPL, RevenueDistributionToken { uint256 public constant override MINIMUM_MIGRATION_DELAY = 10 days; address public override scheduledMigrator; address public override scheduledNewAsset; uint256 public override scheduledMigrationTimestamp; constructor(string memory name_, string memory symbol_, address owner_, address asset_, uint256 precision_) RevenueDistributionToken(name_, symbol_, owner_, asset_, precision_) { } /*****************/ /*** Modifiers ***/ /*****************/ modifier onlyOwner { require(msg.sender == owner, "xMPL:NOT_OWNER"); _; } /********************************/ /*** Administrative Functions ***/ /********************************/ function cancelMigration() external override onlyOwner { require(scheduledMigrationTimestamp != 0, "xMPL:CM:NOT_SCHEDULED"); _cleanupMigration(); emit MigrationCancelled(); } function performMigration() external override onlyOwner { uint256 migrationTimestamp = scheduledMigrationTimestamp; address migrator = scheduledMigrator; address oldAsset = asset; address newAsset = scheduledNewAsset; require(migrationTimestamp != 0, "xMPL:PM:NOT_SCHEDULED"); require(block.timestamp >= migrationTimestamp, "xMPL:PM:TOO_EARLY"); uint256 oldAssetBalanceBeforeMigration = ERC20(oldAsset).balanceOf(address(this)); uint256 newAssetBalanceBeforeMigration = ERC20(newAsset).balanceOf(address(this)); require(ERC20(oldAsset).approve(migrator, oldAssetBalanceBeforeMigration), "xMPL:PM:APPROVAL_FAILED"); Migrator(migrator).migrate(oldAssetBalanceBeforeMigration); require(ERC20(newAsset).balanceOf(address(this)) - newAssetBalanceBeforeMigration == oldAssetBalanceBeforeMigration, "xMPL:PM:WRONG_AMOUNT"); emit MigrationPerformed(oldAsset, newAsset, oldAssetBalanceBeforeMigration); asset = newAsset; _cleanupMigration(); } function scheduleMigration(address migrator_, address newAsset_) external override onlyOwner { require(migrator_ != address(0), "xMPL:SM:INVALID_MIGRATOR"); require(newAsset_ != address(0), "xMPL:SM:INVALID_NEW_ASSET"); scheduledMigrationTimestamp = block.timestamp + MINIMUM_MIGRATION_DELAY; scheduledMigrator = migrator_; scheduledNewAsset = newAsset_; emit MigrationScheduled(asset, newAsset_, migrator_, scheduledMigrationTimestamp); } /*************************/ /*** Utility Functions ***/ /*************************/ function _cleanupMigration() internal { delete scheduledMigrationTimestamp; delete scheduledMigrator; delete scheduledNewAsset; } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "bytecodeHash": "none" } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":[],"name":"MigrationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAsset_","type":"address"},{"indexed":true,"internalType":"address","name":"toAsset_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"MigrationPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAsset_","type":"address"},{"indexed":true,"internalType":"address","name":"toAsset_","type":"address"},{"indexed":true,"internalType":"address","name":"migrator_","type":"address"},{"indexed":false,"internalType":"uint256","name":"migrationTime_","type":"uint256"}],"name":"MigrationScheduled","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":"MINIMUM_MIGRATION_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"cancelMigration","outputs":[],"stateMutability":"nonpayable","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":[],"name":"performMigration","outputs":[],"stateMutability":"nonpayable","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":"migrator_","type":"address"},{"internalType":"address","name":"newAsset_","type":"address"}],"name":"scheduleMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"scheduledMigrationTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scheduledMigrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scheduledNewAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"}]
Contract Creation Code
60c06040526001600d553480156200001657600080fd5b506040516200364738038062003647833981016040819052620000399162000327565b84848484848484836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007a57600080fd5b505afa1580156200008f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b59190620003c0565b8251620000ca906000906020860190620001ad565b508151620000e0906001906020850190620001ad565b5060f81b7fff00000000000000000000000000000000000000000000000000000000000000166080525050600780546001600160a01b0319166001600160a01b0385169081179091556200017a5760405162461bcd60e51b815260206004820152601860248201527f5244543a433a4f574e45525f5a45524f5f414444524553530000000000000000604482015260640160405180910390fd5b600680546001600160a01b0319166001600160a01b03939093169290921790915560a052506200043f9650505050505050565b828054620001bb90620003ec565b90600052602060002090601f016020900481019282620001df57600085556200022a565b82601f10620001fa57805160ff19168380011785556200022a565b828001600101855582156200022a579182015b828111156200022a5782518255916020019190600101906200020d565b50620002389291506200023c565b5090565b5b808211156200023857600081556001016200023d565b80516001600160a01b03811681146200026b57600080fd5b919050565b600082601f8301126200028257600080fd5b81516001600160401b03808211156200029f576200029f62000429565b604051601f8301601f19908116603f01168101908282118183101715620002ca57620002ca62000429565b81604052838152602092508683858801011115620002e757600080fd5b600091505b838210156200030b5785820183015181830184015290820190620002ec565b838211156200031d5760008385830101525b9695505050505050565b600080600080600060a086880312156200034057600080fd5b85516001600160401b03808211156200035857600080fd5b6200036689838a0162000270565b965060208801519150808211156200037d57600080fd5b506200038c8882890162000270565b9450506200039d6040870162000253565b9250620003ad6060870162000253565b9150608086015190509295509295909350565b600060208284031215620003d357600080fd5b815160ff81168114620003e557600080fd5b9392505050565b600181811c908216806200040157607f821691505b602082108114156200042357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160f81c60a0516131d162000476600039600081816106e90152818161081d01526120a30152600061041a01526131d16000f3fe608060405234801561001057600080fd5b50600436106103415760003560e01c806379ba5097116101bd578063ba087652116100f9578063d3b5dc3b116100a2578063dd62ed3e1161007c578063dd62ed3e14610754578063e13aa9901461077f578063e30c3978146107a7578063ef8b30f7146107c757600080fd5b8063d3b5dc3b146106e4578063d505accf1461070b578063d905777e1461071e57600080fd5b8063c6e6f592116100d3578063c6e6f592146106b5578063ce96cb77146106c8578063d0b06f5d146106db57600080fd5b8063ba0876521461068f578063c42069ec146106a2578063c63d75b6146104e057600080fd5b806394bf804d11610166578063a9059cbb11610140578063a9059cbb14610643578063ab0b0fd314610656578063b3d7f6b914610669578063b460af941461067c57600080fd5b806394bf804d1461061557806395d89b4114610628578063a457c2d71461063057600080fd5b8063899d0c0111610197578063899d0c01146105d95780638da5cb5b146105e25780639159b2061461060257600080fd5b806379ba5097146105915780637bb002d6146105995780637ecebe00146105b957600080fd5b806336f8d3f11161028c5780634cdad506116102355780636109ff4b1161020f5780636109ff4b1461054c5780636e2f2aca146105545780636e553f651461055e57806370a082311461057157600080fd5b80634cdad5061461051357806350921b231461052657806360dd37d91461053957600080fd5b80633c2f7773116102665780633c2f7773146104ce5780633c9ae2ba146104d7578063402d267d146104e057600080fd5b806336f8d3f11461045657806338d52e0f1461049b57806339509351146104bb57600080fd5b806311f240ac116102ee57806330adf81f116102c857806330adf81f146103ee578063313ce567146104155780633644e5151461044e57600080fd5b806311f240ac146103c957806318160ddd146103d257806323b872dd146103db57600080fd5b8063095ea7b31161031f578063095ea7b3146103895780630a28a477146103ac57806310639ea0146103bf57600080fd5b806301e1d1141461034657806306fdde031461036157806307a2d13a14610376575b600080fd5b61034e6107da565b6040519081526020015b60405180910390f35b610369610863565b6040516103589190613001565b61034e610384366004612dfe565b6108f1565b61039c610397366004612db2565b610928565b6040519015158152602001610358565b61034e6103ba366004612dfe565b61093f565b6103c7610965565b005b61034e60095481565b61034e60025481565b61039c6103e9366004612d0c565b610abd565b61034e7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610358565b61034e610adf565b600f546104769073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610358565b6006546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61039c6104c9366004612db2565b610baa565b61034e600c5481565b61034e600a5481565b61034e6104ee366004612cbe565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b61034e610521366004612dfe565b610bf3565b61034e610534366004612eba565b610bfe565b61034e610547366004612e8f565b610d45565b6103c7610ef7565b61034e620d2f0081565b61034e61056c366004612e30565b611523565b61034e61057f366004612cbe565b60036020526000908152604090205481565b6103c76115b8565b600e546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6105c7366004612cbe565b60056020526000908152604090205481565b61034e60105481565b6007546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e610610366004612cbe565b6116b6565b61034e610623366004612e30565b6116e5565b61036961176f565b61039c61063e366004612db2565b61177c565b61039c610651366004612db2565b611789565b6103c7610664366004612cd9565b611796565b61034e610677366004612dfe565b6119bc565b61034e61068a366004612e53565b6119e3565b61034e61069d366004612e53565b611a7a565b6103c76106b0366004612cbe565b611b05565b61034e6106c3366004612dfe565b611bf7565b61034e6106d6366004612cbe565b611c15565b61034e600b5481565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b6103c7610719366004612d48565b611c20565b61034e61072c366004612cbe565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61034e610762366004612cd9565b600460209081526000928352604080842090915290825290205481565b61079261078d366004612dfe565b611f71565b60408051928352602083019190915201610358565b6008546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6107d5366004612dfe565b6121e6565b600a54600090806107ed57505060095490565b600c54600b54600042831061080b5761080682426130bb565b610815565b61081582846130bb565b6009549091507f0000000000000000000000000000000000000000000000000000000000000000610846838761307e565b610850919061306a565b61085a9190613052565b94505050505090565b60008054610870906130fe565b80601f016020809104026020016040519081016040528092919081815260200182805461089c906130fe565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b505050505081565b600254600090801561091f57806109066107da565b610910908561307e565b61091a919061306a565b610921565b825b9392505050565b60006109353384846121f1565b5060015b92915050565b600254600090801561091f5761091a610958828561307e565b6109606107da565b612260565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064015b60405180910390fd5b601054610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a434d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b610a926000601055600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600f80549091169055565b6040517f29183829efed7c15f37ba982c36934966b558232f770f334108ac30e4301333a90600090a1565b6000610aca843384612293565b610ad5848484612302565b5060019392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610b119190612f2e565b604080519182900382208282018252600183527f31000000000000000000000000000000000000000000000000000000000000006020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610935918590610bee908690613052565b6121f1565b6000610939826108f1565b6000600d54600114610c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018990526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610d0757600080fd5b505af1158015610d1b573d6000803e3d6000fd5b50505050610d36610d2b886121e6565b91508188883361239f565b6001600d559695505050505050565b6000600d54600114610db3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d5585610dc2896119bc565b9150811115610e2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5244543a4d57503a494e53554646494349454e545f5045524d4954000000000060448201526064016109e2565b6006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b50505050610ee78882893361239f565b6001600d55979650505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b601054600e54600654600f5473ffffffffffffffffffffffffffffffffffffffff92831692918216911683611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a504d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b83421015611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f784d504c3a504d3a544f4f5f4541524c5900000000000000000000000000000060448201526064016109e2565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b1580156110db57600080fd5b505afa1580156110ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111139190612e17565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190612e17565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529192509085169063095ea7b390604401602060405180830381600087803b15801561122a57600080fd5b505af115801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190612ddc565b6112c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f784d504c3a504d3a415050524f56414c5f4641494c454400000000000000000060448201526064016109e2565b6040517f454b06080000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff86169063454b060890602401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284925083915073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b1580156113b157600080fd5b505afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612e17565b6113f391906130bb565b1461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f784d504c3a504d3a57524f4e475f414d4f554e5400000000000000000000000060448201526064016109e2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd2b4bfa00cffc450ec3f60db3c511bebc1e88911c9c7b25ef8b294c934fa116c846040516114b991815260200190565b60405180910390a3600680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8616179091556000601055600e805482169055600f805490911690555b505050505050565b6000600d54600114611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad6115a2846121e6565b91508184843361239f565b6001600d5592915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5244543a414f3a4e4f545f504f0000000000000000000000000000000000000060448201526064016109e2565b600754604051339173ffffffffffffffffffffffffffffffffffffffff16907f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c90600090a3600780547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600880549091169055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812054610939906108f1565b6000600d54600114611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad83611765816119bc565b925082843361239f565b60018054610870906130fe565b6000610935338484612293565b6000610935338484612302565b60075473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8216611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f784d504c3a534d3a494e56414c49445f4d49475241544f52000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8116611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f784d504c3a534d3a494e56414c49445f4e45575f41535345540000000000000060448201526064016109e2565b61191e620d2f0042613052565b6010819055600e805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600f8054868316931683179055600654604051939492939116917ffc384cf40fadcb79796c4f6b26dab65f122020fbffaa19c2ad28bf4da410cded916119b091815260200190565b60405180910390a45050565b600254600090801561091f5761091a6119d36107da565b6119dd908561307e565b82612260565b6000600d54600114611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e611a628561093f565b91508185858533612650565b6001600d559392505050565b6000600d54600114611ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e84611afa81610bf3565b925082858533612650565b60075473ffffffffffffffffffffffffffffffffffffffff163314611b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a53504f3a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600254600090801561091f57611c0b6107da565b610910828561307e565b6000610939826116b6565b42841015611c8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f45524332303a503a45585049524544000000000000000000000000000000000060448201526064016109e2565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111801590611cca57508260ff16601b1480611cca57508260ff16601c145b611d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f45524332303a503a4d414c4c4541424c4500000000000000000000000000000060448201526064016109e2565b6000611d3a610adf565b73ffffffffffffffffffffffffffffffffffffffff89811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e99573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148015611ef5575073ffffffffffffffffffffffffffffffffffffffff891615155b611f5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f45524332303a503a494e56414c49445f5349474e41545552450000000000000060448201526064016109e2565b5050611f688787876121f1565b50505050505050565b600754600090819073ffffffffffffffffffffffffffffffffffffffff163314611ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a5556533a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600254612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a5556533a5a45524f5f535550504c590000000000000000000000000060448201526064016109e2565b6120686107da565b60098190556006546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925084917f000000000000000000000000000000000000000000000000000000000000000091849173ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156120ff57600080fd5b505afa158015612113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121379190612e17565b61214191906130bb565b61214b919061307e565b612155919061306a565b600a81905591508242600b81905561216d9190613052565b600c5560408051828152602081018490527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a1600c5460405190815233907f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab39060200160405180910390a2915091565b600061093982611bf7565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008061226d8385613152565b1161227957600061227c565b60015b60ff16612289838561306a565b6109219190613052565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122fc576122fc8484610bee85856130bb565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548392906123379084906130bb565b909155505073ffffffffffffffffffffffffffffffffffffffff808316600081815260036020526040908190208054850190555190918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122539085815260200190565b73ffffffffffffffffffffffffffffffffffffffff821661241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b83612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b826124ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b6124f48285612955565b6000836124ff6107da565b6125099190613052565b60098190559050600061251a6129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78789604051612584929190918252602082015260400190565b60405180910390a360408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546125ea9073ffffffffffffffffffffffffffffffffffffffff168430886129f3565b61151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5452414e534645525f46524f4d0000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff83166126cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a423a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b84612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b8361279b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127d9576127d9828287612293565b6127e38286612adb565b6000846127ee6107da565b6127f891906130bb565b6009819055905060006128096129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b60405161288a929190918252602082015260400190565b60405180910390a460408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546128ef9073ffffffffffffffffffffffffffffffffffffffff168688612b69565b611f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5244543a423a5452414e5346455200000000000000000000000000000000000060448201526064016109e2565b80600260008282546129679190613052565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000600c5442600b819055116129e657600a546129e9565b60005b600a819055905090565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052600090612ad29086907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612bca565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290612b109084906130bb565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016129c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052600090612bc29085907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a50565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff83163b612bf057506000610939565b60608373ffffffffffffffffffffffffffffffffffffffff1683604051612c179190612f12565b6000604051808303816000865af19150503d8060008114612c54576040519150601f19603f3d011682016040523d82523d6000602084013e612c59565b606091505b509092509050818015612bc2575080511580612bc2575080806020019051810190612bc29190612ddc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ca857600080fd5b919050565b803560ff81168114612ca857600080fd5b600060208284031215612cd057600080fd5b61092182612c84565b60008060408385031215612cec57600080fd5b612cf583612c84565b9150612d0360208401612c84565b90509250929050565b600080600060608486031215612d2157600080fd5b612d2a84612c84565b9250612d3860208501612c84565b9150604084013590509250925092565b600080600080600080600060e0888a031215612d6357600080fd5b612d6c88612c84565b9650612d7a60208901612c84565b95506040880135945060608801359350612d9660808901612cad565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612dc557600080fd5b612dce83612c84565b946020939093013593505050565b600060208284031215612dee57600080fd5b8151801515811461092157600080fd5b600060208284031215612e1057600080fd5b5035919050565b600060208284031215612e2957600080fd5b5051919050565b60008060408385031215612e4357600080fd5b82359150612d0360208401612c84565b600080600060608486031215612e6857600080fd5b83359250612e7860208501612c84565b9150612e8660408501612c84565b90509250925092565b600080600080600080600060e0888a031215612eaa57600080fd5b87359650612d7a60208901612c84565b60008060008060008060c08789031215612ed357600080fd5b86359550612ee360208801612c84565b945060408701359350612ef860608801612cad565b92506080870135915060a087013590509295509295509295565b60008251612f248184602087016130d2565b9190910192915050565b600080835481600182811c915080831680612f4a57607f831692505b6020808410821415612f83577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612f975760018114612fc657612ff3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612ff3565b60008a81526020902060005b86811015612feb5781548b820152908501908301612fd2565b505084890196505b509498975050505050505050565b60208152600082518060208401526130208160408501602087016130d2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000821982111561306557613065613166565b500190565b60008261307957613079613195565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130b6576130b6613166565b500290565b6000828210156130cd576130cd613166565b500390565b60005b838110156130ed5781810151838201526020016130d5565b838111156122fc5750506000910152565b600181811c9082168061311257607f821691505b6020821081141561314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008261316157613161613195565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000807000a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a19600000000000000000000000033349b282065b0284d756f0577fb39c158f935e6000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000000000000000004784d504c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004784d504c00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103415760003560e01c806379ba5097116101bd578063ba087652116100f9578063d3b5dc3b116100a2578063dd62ed3e1161007c578063dd62ed3e14610754578063e13aa9901461077f578063e30c3978146107a7578063ef8b30f7146107c757600080fd5b8063d3b5dc3b146106e4578063d505accf1461070b578063d905777e1461071e57600080fd5b8063c6e6f592116100d3578063c6e6f592146106b5578063ce96cb77146106c8578063d0b06f5d146106db57600080fd5b8063ba0876521461068f578063c42069ec146106a2578063c63d75b6146104e057600080fd5b806394bf804d11610166578063a9059cbb11610140578063a9059cbb14610643578063ab0b0fd314610656578063b3d7f6b914610669578063b460af941461067c57600080fd5b806394bf804d1461061557806395d89b4114610628578063a457c2d71461063057600080fd5b8063899d0c0111610197578063899d0c01146105d95780638da5cb5b146105e25780639159b2061461060257600080fd5b806379ba5097146105915780637bb002d6146105995780637ecebe00146105b957600080fd5b806336f8d3f11161028c5780634cdad506116102355780636109ff4b1161020f5780636109ff4b1461054c5780636e2f2aca146105545780636e553f651461055e57806370a082311461057157600080fd5b80634cdad5061461051357806350921b231461052657806360dd37d91461053957600080fd5b80633c2f7773116102665780633c2f7773146104ce5780633c9ae2ba146104d7578063402d267d146104e057600080fd5b806336f8d3f11461045657806338d52e0f1461049b57806339509351146104bb57600080fd5b806311f240ac116102ee57806330adf81f116102c857806330adf81f146103ee578063313ce567146104155780633644e5151461044e57600080fd5b806311f240ac146103c957806318160ddd146103d257806323b872dd146103db57600080fd5b8063095ea7b31161031f578063095ea7b3146103895780630a28a477146103ac57806310639ea0146103bf57600080fd5b806301e1d1141461034657806306fdde031461036157806307a2d13a14610376575b600080fd5b61034e6107da565b6040519081526020015b60405180910390f35b610369610863565b6040516103589190613001565b61034e610384366004612dfe565b6108f1565b61039c610397366004612db2565b610928565b6040519015158152602001610358565b61034e6103ba366004612dfe565b61093f565b6103c7610965565b005b61034e60095481565b61034e60025481565b61039c6103e9366004612d0c565b610abd565b61034e7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61043c7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610358565b61034e610adf565b600f546104769073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610358565b6006546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61039c6104c9366004612db2565b610baa565b61034e600c5481565b61034e600a5481565b61034e6104ee366004612cbe565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b61034e610521366004612dfe565b610bf3565b61034e610534366004612eba565b610bfe565b61034e610547366004612e8f565b610d45565b6103c7610ef7565b61034e620d2f0081565b61034e61056c366004612e30565b611523565b61034e61057f366004612cbe565b60036020526000908152604090205481565b6103c76115b8565b600e546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6105c7366004612cbe565b60056020526000908152604090205481565b61034e60105481565b6007546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e610610366004612cbe565b6116b6565b61034e610623366004612e30565b6116e5565b61036961176f565b61039c61063e366004612db2565b61177c565b61039c610651366004612db2565b611789565b6103c7610664366004612cd9565b611796565b61034e610677366004612dfe565b6119bc565b61034e61068a366004612e53565b6119e3565b61034e61069d366004612e53565b611a7a565b6103c76106b0366004612cbe565b611b05565b61034e6106c3366004612dfe565b611bf7565b61034e6106d6366004612cbe565b611c15565b61034e600b5481565b61034e7f000000000000000000000000000000000000000c9f2c9cd04674edea4000000081565b6103c7610719366004612d48565b611c20565b61034e61072c366004612cbe565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61034e610762366004612cd9565b600460209081526000928352604080842090915290825290205481565b61079261078d366004612dfe565b611f71565b60408051928352602083019190915201610358565b6008546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6107d5366004612dfe565b6121e6565b600a54600090806107ed57505060095490565b600c54600b54600042831061080b5761080682426130bb565b610815565b61081582846130bb565b6009549091507f000000000000000000000000000000000000000c9f2c9cd04674edea40000000610846838761307e565b610850919061306a565b61085a9190613052565b94505050505090565b60008054610870906130fe565b80601f016020809104026020016040519081016040528092919081815260200182805461089c906130fe565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b505050505081565b600254600090801561091f57806109066107da565b610910908561307e565b61091a919061306a565b610921565b825b9392505050565b60006109353384846121f1565b5060015b92915050565b600254600090801561091f5761091a610958828561307e565b6109606107da565b612260565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064015b60405180910390fd5b601054610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a434d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b610a926000601055600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600f80549091169055565b6040517f29183829efed7c15f37ba982c36934966b558232f770f334108ac30e4301333a90600090a1565b6000610aca843384612293565b610ad5848484612302565b5060019392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610b119190612f2e565b604080519182900382208282018252600183527f31000000000000000000000000000000000000000000000000000000000000006020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610935918590610bee908690613052565b6121f1565b6000610939826108f1565b6000600d54600114610c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018990526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610d0757600080fd5b505af1158015610d1b573d6000803e3d6000fd5b50505050610d36610d2b886121e6565b91508188883361239f565b6001600d559695505050505050565b6000600d54600114610db3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d5585610dc2896119bc565b9150811115610e2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5244543a4d57503a494e53554646494349454e545f5045524d4954000000000060448201526064016109e2565b6006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b50505050610ee78882893361239f565b6001600d55979650505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b601054600e54600654600f5473ffffffffffffffffffffffffffffffffffffffff92831692918216911683611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a504d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b83421015611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f784d504c3a504d3a544f4f5f4541524c5900000000000000000000000000000060448201526064016109e2565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b1580156110db57600080fd5b505afa1580156110ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111139190612e17565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190612e17565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529192509085169063095ea7b390604401602060405180830381600087803b15801561122a57600080fd5b505af115801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190612ddc565b6112c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f784d504c3a504d3a415050524f56414c5f4641494c454400000000000000000060448201526064016109e2565b6040517f454b06080000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff86169063454b060890602401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284925083915073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b1580156113b157600080fd5b505afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612e17565b6113f391906130bb565b1461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f784d504c3a504d3a57524f4e475f414d4f554e5400000000000000000000000060448201526064016109e2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd2b4bfa00cffc450ec3f60db3c511bebc1e88911c9c7b25ef8b294c934fa116c846040516114b991815260200190565b60405180910390a3600680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8616179091556000601055600e805482169055600f805490911690555b505050505050565b6000600d54600114611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad6115a2846121e6565b91508184843361239f565b6001600d5592915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5244543a414f3a4e4f545f504f0000000000000000000000000000000000000060448201526064016109e2565b600754604051339173ffffffffffffffffffffffffffffffffffffffff16907f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c90600090a3600780547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600880549091169055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812054610939906108f1565b6000600d54600114611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad83611765816119bc565b925082843361239f565b60018054610870906130fe565b6000610935338484612293565b6000610935338484612302565b60075473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8216611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f784d504c3a534d3a494e56414c49445f4d49475241544f52000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8116611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f784d504c3a534d3a494e56414c49445f4e45575f41535345540000000000000060448201526064016109e2565b61191e620d2f0042613052565b6010819055600e805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600f8054868316931683179055600654604051939492939116917ffc384cf40fadcb79796c4f6b26dab65f122020fbffaa19c2ad28bf4da410cded916119b091815260200190565b60405180910390a45050565b600254600090801561091f5761091a6119d36107da565b6119dd908561307e565b82612260565b6000600d54600114611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e611a628561093f565b91508185858533612650565b6001600d559392505050565b6000600d54600114611ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e84611afa81610bf3565b925082858533612650565b60075473ffffffffffffffffffffffffffffffffffffffff163314611b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a53504f3a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600254600090801561091f57611c0b6107da565b610910828561307e565b6000610939826116b6565b42841015611c8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f45524332303a503a45585049524544000000000000000000000000000000000060448201526064016109e2565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111801590611cca57508260ff16601b1480611cca57508260ff16601c145b611d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f45524332303a503a4d414c4c4541424c4500000000000000000000000000000060448201526064016109e2565b6000611d3a610adf565b73ffffffffffffffffffffffffffffffffffffffff89811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e99573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148015611ef5575073ffffffffffffffffffffffffffffffffffffffff891615155b611f5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f45524332303a503a494e56414c49445f5349474e41545552450000000000000060448201526064016109e2565b5050611f688787876121f1565b50505050505050565b600754600090819073ffffffffffffffffffffffffffffffffffffffff163314611ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a5556533a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600254612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a5556533a5a45524f5f535550504c590000000000000000000000000060448201526064016109e2565b6120686107da565b60098190556006546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925084917f000000000000000000000000000000000000000c9f2c9cd04674edea4000000091849173ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156120ff57600080fd5b505afa158015612113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121379190612e17565b61214191906130bb565b61214b919061307e565b612155919061306a565b600a81905591508242600b81905561216d9190613052565b600c5560408051828152602081018490527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a1600c5460405190815233907f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab39060200160405180910390a2915091565b600061093982611bf7565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008061226d8385613152565b1161227957600061227c565b60015b60ff16612289838561306a565b6109219190613052565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122fc576122fc8484610bee85856130bb565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548392906123379084906130bb565b909155505073ffffffffffffffffffffffffffffffffffffffff808316600081815260036020526040908190208054850190555190918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122539085815260200190565b73ffffffffffffffffffffffffffffffffffffffff821661241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b83612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b826124ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b6124f48285612955565b6000836124ff6107da565b6125099190613052565b60098190559050600061251a6129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78789604051612584929190918252602082015260400190565b60405180910390a360408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546125ea9073ffffffffffffffffffffffffffffffffffffffff168430886129f3565b61151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5452414e534645525f46524f4d0000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff83166126cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a423a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b84612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b8361279b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127d9576127d9828287612293565b6127e38286612adb565b6000846127ee6107da565b6127f891906130bb565b6009819055905060006128096129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b60405161288a929190918252602082015260400190565b60405180910390a460408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546128ef9073ffffffffffffffffffffffffffffffffffffffff168688612b69565b611f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5244543a423a5452414e5346455200000000000000000000000000000000000060448201526064016109e2565b80600260008282546129679190613052565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000600c5442600b819055116129e657600a546129e9565b60005b600a819055905090565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052600090612ad29086907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612bca565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290612b109084906130bb565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016129c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052600090612bc29085907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a50565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff83163b612bf057506000610939565b60608373ffffffffffffffffffffffffffffffffffffffff1683604051612c179190612f12565b6000604051808303816000865af19150503d8060008114612c54576040519150601f19603f3d011682016040523d82523d6000602084013e612c59565b606091505b509092509050818015612bc2575080511580612bc2575080806020019051810190612bc29190612ddc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ca857600080fd5b919050565b803560ff81168114612ca857600080fd5b600060208284031215612cd057600080fd5b61092182612c84565b60008060408385031215612cec57600080fd5b612cf583612c84565b9150612d0360208401612c84565b90509250929050565b600080600060608486031215612d2157600080fd5b612d2a84612c84565b9250612d3860208501612c84565b9150604084013590509250925092565b600080600080600080600060e0888a031215612d6357600080fd5b612d6c88612c84565b9650612d7a60208901612c84565b95506040880135945060608801359350612d9660808901612cad565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612dc557600080fd5b612dce83612c84565b946020939093013593505050565b600060208284031215612dee57600080fd5b8151801515811461092157600080fd5b600060208284031215612e1057600080fd5b5035919050565b600060208284031215612e2957600080fd5b5051919050565b60008060408385031215612e4357600080fd5b82359150612d0360208401612c84565b600080600060608486031215612e6857600080fd5b83359250612e7860208501612c84565b9150612e8660408501612c84565b90509250925092565b600080600080600080600060e0888a031215612eaa57600080fd5b87359650612d7a60208901612c84565b60008060008060008060c08789031215612ed357600080fd5b86359550612ee360208801612c84565b945060408701359350612ef860608801612cad565b92506080870135915060a087013590509295509295509295565b60008251612f248184602087016130d2565b9190910192915050565b600080835481600182811c915080831680612f4a57607f831692505b6020808410821415612f83577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612f975760018114612fc657612ff3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612ff3565b60008a81526020902060005b86811015612feb5781548b820152908501908301612fd2565b505084890196505b509498975050505050505050565b60208152600082518060208401526130208160408501602087016130d2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000821982111561306557613065613166565b500190565b60008261307957613079613195565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130b6576130b6613166565b500290565b6000828210156130cd576130cd613166565b500390565b60005b838110156130ed5781810151838201526020016130d5565b838111156122fc5750506000910152565b600181811c9082168061311257607f821691505b6020821081141561314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008261316157613161613195565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000807000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a19600000000000000000000000033349b282065b0284d756f0577fb39c158f935e6000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000000000000000004784d504c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004784d504c00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): xMPL
Arg [1] : symbol_ (string): xMPL
Arg [2] : owner_ (address): 0xd6d4Bcde6c816F17889f1Dd3000aF0261B03a196
Arg [3] : asset_ (address): 0x33349B282065b0284d756F0577FB39c158F935e6
Arg [4] : precision_ (uint256): 1000000000000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196
Arg [3] : 00000000000000000000000033349b282065b0284d756f0577fb39c158f935e6
Arg [4] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 784d504c00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 784d504c00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
47724:2860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43268:580;;;:::i;:::-;;;8348:25:1;;;8336:2;8321:18;43268:580:0;;;;;;;;10599:27;;;:::i;:::-;;;;;;;:::i;40423:241::-;;;;;;:::i;:::-;;:::i;11720:171::-;;;;;;:::i;:::-;;:::i;:::-;;;8175:14:1;;8168:22;8150:41;;8138:2;8123:18;11720:171:0;8010:187:1;42798:464:0;;;;;;:::i;:::-;;:::i;48490:204::-;;;:::i;:::-;;33889:34;;;;;;10715:35;;;;;;13760:250;;;;;;:::i;:::-;;:::i;11089:117::-;;11140:66;11089:117;;10668:40;;;;;;;;19666:4:1;19654:17;;;19636:36;;19624:2;19609:18;10668:40:0;19494:184:1;14104:419:0;;;:::i;47900:41::-;;;;;;;;;;;;6552:42:1;6540:55;;;6522:74;;6510:2;6495:18;47900:41:0;6376:226:1;33575:29:0;;;;;;;;;12114:225;;;;;;:::i;:::-;;:::i;34214:43::-;;;;;;33995:36;;;;;;40917:185;;;;;;:::i;:::-;-1:-1:-1;41078:17:0;;40917:185;42436:356;;;;;;:::i;:::-;;:::i;36723:426::-;;;;;;:::i;:::-;;:::i;37362:525::-;;;;;;:::i;:::-;;:::i;48700:1102::-;;;:::i;47780:66::-;;47839:7;47780:66;;36510:207;;;;;;:::i;:::-;;:::i;10757:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35119:245;;;:::i;47853:41::-;;;;;;;;;11213:50;;;;;;:::i;:::-;;;;;;;;;;;;;;47948:51;;;;;;33671:29;;;;;;;;;40250:167;;;;;;:::i;:::-;;:::i;37155:201::-;;;;;;:::i;:::-;;:::i;10632:29::-;;;:::i;11897:211::-;;;;;;:::i;:::-;;:::i;13577:177::-;;;;;;:::i;:::-;;:::i;49808:513::-;;;;;;:::i;:::-;;:::i;41967:463::-;;;;;;:::i;:::-;;:::i;38128:233::-;;;;;;:::i;:::-;;:::i;37893:229::-;;;;;;:::i;:::-;;:::i;35370:237::-;;;;;;:::i;:::-;;:::i;40670:241::-;;;;;;:::i;:::-;;:::i;41444:150::-;;;;;;:::i;:::-;;:::i;34107:35::-;;;;;;33445:43;;;;;12345:1226;;;;;;:::i;:::-;;:::i;41296:142::-;;;;;;:::i;:::-;41414:17;;41371:18;41414:17;;;:9;:17;;;;;;;41296:142;10817:73;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;35613:797;;;;;;:::i;:::-;;:::i;:::-;;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;;19388:18;35613:797:0;19241:248:1;33785:36:0;;;;;;;;;41600:361;;;;;;:::i;:::-;;:::i;43268:580::-;43392:12;;43329:27;;43419:18;43415:41;;-1:-1:-1;;43446:10:0;;;43268:580::o;43415:41::-;43498:19;;43558:11;;43467:28;43620:15;:38;-1:-1:-1;43620:141:0;;43731:30;43749:12;43731:15;:30;:::i;:::-;43620:141;;;43677:35;43700:12;43677:20;:35;:::i;:::-;43831:10;;43580:181;;-1:-1:-1;43818:9:0;43781:33;43580:181;43781:13;:33;:::i;:::-;43780:47;;;;:::i;:::-;43779:62;;;;:::i;:::-;43772:69;;;;;;43268:580;:::o;10599:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40423:241::-;40547:11;;40503:15;;40599:11;;:58;;40651:6;40634:13;:11;:13::i;:::-;40624:23;;:7;:23;:::i;:::-;40623:34;;;;:::i;:::-;40599:58;;;40613:7;40599:58;40589:68;40423:241;-1:-1:-1;;;40423:241:0:o;11720:171::-;11799:13;11824:39;11833:10;11845:8;11855:7;11824:8;:39::i;:::-;-1:-1:-1;11880:4:0;11720:171;;;;;:::o;42798:464::-;42922:11;;42878:15;;43187:11;;:68;;43211:44;43223:16;43233:6;43223:7;:16;:::i;:::-;43241:13;:11;:13::i;:::-;43211:11;:44::i;48490:204::-;48324:5;;;;48310:10;:19;48302:46;;;;;;;18918:2:1;48302:46:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:16;18976:18;;;18969:44;19030:18;;48302:46:0;;;;;;;;;48563:27:::1;::::0;48555:66:::1;;;::::0;::::1;::::0;;18215:2:1;48555:66:0::1;::::0;::::1;18197:21:1::0;18254:2;18234:18;;;18227:30;18293:23;18273:18;;;18266:51;18334:18;;48555:66:0::1;18013:345:1::0;48555:66:0::1;48632:19;50472:34:::0;50479:27;50472:34;50523:17;50516:24;;;;;;;;;50557:17;50550:24;;;;;;;50424:157;48632:19:::1;48667:20;::::0;::::1;::::0;;;::::1;48490:204::o:0;13760:250::-;13862:13;13887:47;13906:6;13914:10;13926:7;13887:18;:47::i;:::-;13944:38;13954:6;13962:10;13974:7;13944:9;:38::i;:::-;-1:-1:-1;13999:4:0;13760:250;;;;;:::o;14104:419::-;14162:24;14256:95;14385:4;14369:22;;;;;;:::i;:::-;;;;;;;;;;14419:10;;;;;;;;;;;;;;14228:278;;;;;9262:25:1;;;;9303:18;;9296:34;;;;14409:21:0;9346:18:1;;;9339:34;14448:13:0;9389:18:1;;;9382:34;14487:4:0;9432:19:1;;;9425:84;9234:19;;14228:278:0;;;;;;;;;;;;14205:311;;;;;;14198:318;;14104:419;:::o;12114:225::-;12242:10;12208:13;12264:21;;;:9;:21;;;;;;;;;:31;;;;;;;;;;12208:13;;12233:78;;12254:8;;12264:46;;12298:12;;12264:46;:::i;:::-;12233:8;:78::i;42436:356::-;42514:15;42761:24;42777:7;42761:15;:24::i;36723:426::-;36951:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;36988:5:::1;::::0;36982:78:::1;::::0;;;;37002:10:::1;36982:78;::::0;::::1;7382:34:1::0;37022:4:0::1;7432:18:1::0;;;7425:43;7484:18;;;7477:34;;;7527:18;;;7520:34;;;7603:4;7591:17;;7570:19;;;7563:46;7625:19;;;7618:35;;;7669:19;;;7662:35;;;36988:5:0::1;::::0;;::::1;::::0;36982:19:::1;::::0;7293::1;;36982:78:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37070:72;37086:23;37101:7;37086:14;:23::i;:::-;37076:33;;;37111:7;37120:9;37131:10;37070:5;:72::i;:::-;34571:1:::0;34562:6;:10;36723:426;;-1:-1:-1;;;;;;36723:426:0:o;37362:525::-;37615:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;37690;37665:20:::1;37677:7:::0;37665:11:::1;:20::i;:::-;37655:30;;;37654:46;;37646:86;;;::::0;::::1;::::0;;17859:2:1;37646:86:0::1;::::0;::::1;17841:21:1::0;17898:2;17878:18;;;17871:30;17937:29;17917:18;;;17910:57;17984:18;;37646:86:0::1;17657:351:1::0;37646:86:0::1;37749:5;::::0;37743:81:::1;::::0;;;;37763:10:::1;37743:81;::::0;::::1;7382:34:1::0;37783:4:0::1;7432:18:1::0;;;7425:43;7484:18;;;7477:34;;;7527:18;;;7520:34;;;7603:4;7591:17;;7570:19;;;7563:46;7625:19;;;7618:35;;;7669:19;;;7662:35;;;37749:5:0::1;::::0;;::::1;::::0;37743:19:::1;::::0;7293::1;;37743:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37834:46;37840:7;37849;37858:9;37869:10;37834:5;:46::i;:::-;34571:1:::0;34562:6;:10;37362:525;;-1:-1:-1;;;;;;;37362:525:0:o;48700:1102::-;48324:5;;;;48310:10;:19;48302:46;;;;;;;18918:2:1;48302:46:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:16;18976:18;;;18969:44;19030:18;;48302:46:0;18716:338:1;48302:46:0;48795:27:::1;::::0;48861:17:::1;::::0;48917:5:::1;::::0;48961:17:::1;::::0;48861::::1;::::0;;::::1;::::0;48917:5;;::::1;::::0;48961:17:::1;48997:23:::0;48989:71:::1;;;::::0;::::1;::::0;;12309:2:1;48989:71:0::1;::::0;::::1;12291:21:1::0;12348:2;12328:18;;;12321:30;12387:23;12367:18;;;12360:51;12428:18;;48989:71:0::1;12107:345:1::0;48989:71:0::1;49097:18;49078:15;:37;;49070:67;;;::::0;::::1;::::0;;17167:2:1;49070:67:0::1;::::0;::::1;17149:21:1::0;17206:2;17186:18;;;17179:30;17245:19;17225:18;;;17218:47;17282:18;;49070:67:0::1;16965:341:1::0;49070:67:0::1;49189:40;::::0;;;;49223:4:::1;49189:40;::::0;::::1;6522:74:1::0;49148:38:0::1;::::0;49189:25:::1;::::0;::::1;::::0;::::1;::::0;6495:18:1;;49189:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49280;::::0;;;;49314:4:::1;49280:40;::::0;::::1;6522:74:1::0;49148:81:0;;-1:-1:-1;49239:38:0::1;::::0;49280:25:::1;::::0;::::1;::::0;::::1;::::0;6495:18:1;;49280:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49339:65;::::0;;;;:23:::1;7900:55:1::0;;;49339:65:0::1;::::0;::::1;7882:74:1::0;7972:18;;;7965:34;;;49239:81:0;;-1:-1:-1;49339:23:0;;::::1;::::0;::::1;::::0;7855:18:1;;49339:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49331:101;;;::::0;::::1;::::0;;13353:2:1;49331:101:0::1;::::0;::::1;13335:21:1::0;13392:2;13372:18;;;13365:30;13431:25;13411:18;;;13404:53;13474:18;;49331:101:0::1;13151:347:1::0;49331:101:0::1;49443:58;::::0;;;;::::1;::::0;::::1;8348:25:1::0;;;49443:26:0::1;::::0;::::1;::::0;::::1;::::0;8321:18:1;;49443:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49520:40:0::1;::::0;;;;49554:4:::1;49520:40;::::0;::::1;6522:74:1::0;49597:30:0;;-1:-1:-1;49563:30:0;;-1:-1:-1;49520:25:0::1;::::0;::::1;::::0;::::1;::::0;6495:18:1;;49520:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;:107;49512:140;;;::::0;::::1;::::0;;14407:2:1;49512:140:0::1;::::0;::::1;14389:21:1::0;14446:2;14426:18;;;14419:30;14485:22;14465:18;;;14458:50;14525:18;;49512:140:0::1;14205:344:1::0;49512:140:0::1;49697:8;49668:70;;49687:8;49668:70;;;49707:30;49668:70;;;;8348:25:1::0;;8336:2;8321:18;;8202:177;49668:70:0::1;;;;;;;;49749:5;:16:::0;;;;;::::1;;::::0;::::1;;::::0;;;-1:-1:-1;50479:27:0;50472:34;50523:17;50516:24;;;;;;50557:17;50550:24;;;;;;;49776:19:::1;48756:1046;;;;;;48700:1102::o:0;36510:207::-;36611:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;36638:72:::1;36654:23;36669:7:::0;36654:14:::1;:23::i;:::-;36644:33;;;36679:7;36688:9;36699:10;36638:5;:72::i;:::-;34571:1:::0;34562:6;:10;36510:207;;-1:-1:-1;;36510:207:0:o;35119:245::-;35204:12;;;;35190:10;:26;35182:52;;;;;;;15443:2:1;35182:52:0;;;15425:21:1;15482:2;15462:18;;;15455:30;15521:15;15501:18;;;15494:43;15554:18;;35182:52:0;15241:337:1;35182:52:0;35268:5;;35250:36;;35275:10;;35250:36;35268:5;;35250:36;;35268:5;;35250:36;35297:5;:25;;;;;;35312:10;35297:25;;;;35332:12;:25;;;;;;;35119:245::o;40250:167::-;40390:19;;;40331:24;40390:19;;;:9;:19;;;;;;40374:36;;:15;:36::i;37155:201::-;37253:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;37280:69:::1;37286:7:::0;37305:20:::1;37286:7:::0;37305:11:::1;:20::i;:::-;37295:30;;;37327:9;37338:10;37280:5;:69::i;10632:29::-:0;;;;;;;:::i;11897:211::-;11996:13;12021:59;12040:10;12052:8;12062:17;12021:18;:59::i;13577:177::-;13659:13;13684:42;13694:10;13706;13718:7;13684:9;:42::i;49808:513::-;48324:5;;;;48310:10;:19;48302:46;;;;;;;18918:2:1;48302:46:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:16;18976:18;;;18969:44;19030:18;;48302:46:0;18716:338:1;48302:46:0;49919:23:::1;::::0;::::1;49911:60;;;::::0;::::1;::::0;;18565:2:1;49911:60:0::1;::::0;::::1;18547:21:1::0;18604:2;18584:18;;;18577:30;18643:26;18623:18;;;18616:54;18687:18;;49911:60:0::1;18363:348:1::0;49911:60:0::1;49989:23;::::0;::::1;49981:61;;;::::0;::::1;::::0;;11609:2:1;49981:61:0::1;::::0;::::1;11591:21:1::0;11648:2;11628:18;;;11621:30;11687:27;11667:18;;;11660:55;11732:18;;49981:61:0::1;11407:349:1::0;49981:61:0::1;50083:41;47839:7;50083:15;:41;:::i;:::-;50053:27;:71:::0;;;50134:17:::1;:39:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;50183:17:::1;:39:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;50257:5:::1;::::0;50238:76:::1;::::0;50134:39;;50183;;50257:5;::::1;::::0;50238:76:::1;::::0;::::1;::::0;8348:25:1;;8336:2;8321:18;;8202:177;50238:76:0::1;;;;;;;;49808:513:::0;;:::o;41967:463::-;42087:11;;42043:15;;42355:11;;:68;;42379:44;42401:13;:11;:13::i;:::-;42391:23;;:7;:23;:::i;:::-;42416:6;42379:11;:44::i;38128:233::-;38246:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;38273:81:::1;38289:24;38305:7:::0;38289:15:::1;:24::i;:::-;38279:34;;;38315:7;38324:9;38335:6;38343:10;38273:5;:81::i;:::-;34571:1:::0;34562:6;:10;38128:233;;-1:-1:-1;;;38128:233:0:o;37893:229::-;38009:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;38036:79:::1;38042:7:::0;38061:22:::1;38042:7:::0;38061:13:::1;:22::i;:::-;38051:32;;;38085:9;38096:6;38104:10;38036:5;:79::i;35370:237::-:0;35476:5;;;;35462:10;:19;35454:49;;;;;;;16821:2:1;35454:49:0;;;16803:21:1;16860:2;16840:18;;;16833:30;16899:19;16879:18;;;16872:47;16936:18;;35454:49:0;16619:341:1;35454:49:0;35514:12;:28;;;;;;;;;;;;;35558:42;;35574:10;;35558:42;;-1:-1:-1;;35558:42:0;35370:237;:::o;40670:241::-;40794:11;;40750:15;;40846:11;;:58;;40891:13;:11;:13::i;:::-;40871:16;40881:6;40871:7;:16;:::i;41444:150::-;41521:18;41564:23;41580:6;41564:15;:23::i;12345:1226::-;12514:15;12501:9;:28;;12493:56;;;;;;;16131:2:1;12493:56:0;;;16113:21:1;16170:2;16150:18;;;16143:30;16209:17;16189:18;;;16182:45;16244:18;;12493:56:0;15929:339:1;12493:56:0;12823:66;12800:90;;;;;:128;;;12907:2;:8;;12913:2;12907:8;:20;;;;12919:2;:8;;12925:2;12919:8;12907:20;12779:192;;;;;;;12659:2:1;12779:192:0;;;12641:21:1;12698:2;12678:18;;;12671:30;12737:19;12717:18;;;12710:47;12774:18;;12779:192:0;12457:341:1;12779:192:0;13054:14;13168:18;:16;:18::i;:::-;13273:14;;;;13229:15;13273:14;;;:6;:14;;;;;;;;;:16;;;;;;;;13218:83;;11140:66;13218:83;;;8671:25:1;8773:18;;;8766:43;;;;8845:15;;;8825:18;;;8818:43;8877:18;;;8870:34;;;8920:19;;;8913:35;;;;8964:19;;;;8957:35;;;13218:83:0;;;;;;;;;;8643:19:1;;;13218:83:0;;;13208:94;;;;;;;;6197:66:1;13098:222:0;;;6185:79:1;6280:11;;;6273:27;;;;6316:12;;;6309:28;;;;6353:12;;13098:222:0;;;;;;;;;;;;;13071:263;;13098:222;13071:263;;;;13349:24;13376:29;;;;;;;;;9747:25:1;;;9820:4;9808:17;;9788:18;;;9781:45;;;;9842:18;;;9835:34;;;9885:18;;;9878:34;;;13071:263:0;;-1:-1:-1;13349:24:0;13376:29;;9719:19:1;;13376:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13349:56;;13448:6;13428:26;;:16;:26;;;:50;;;;-1:-1:-1;13458:20:0;;;;;13428:50;13420:88;;;;;;;13705:2:1;13420:88:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:27;13763:18;;;13756:55;13828:18;;13420:88:0;13503:349:1;13420:88:0;13030:489;;13529:35;13538:6;13546:8;13556:7;13529:8;:35::i;:::-;12345:1226;;;;;;;:::o;35613:797::-;35779:5;;35703:21;;;;35779:5;;35765:10;:19;35757:49;;;;;;;15785:2:1;35757:49:0;;;15767:21:1;15824:2;15804:18;;;15797:30;15863:19;15843:18;;;15836:47;15900:18;;35757:49:0;15583:341:1;35757:49:0;35824:11;;35816:51;;;;;;;10918:2:1;35816:51:0;;;10900:21:1;10957:2;10937:18;;;10930:30;10996:21;10976:18;;;10969:49;11035:18;;35816:51:0;10716:343:1;35816:51:0;35973:13;:11;:13::i;:::-;35960:10;:26;;;36064:5;;36058:37;;;;;36089:4;36058:37;;;6522:74:1;35960:26:0;;-1:-1:-1;36126:14:0;;36113:9;;35960:26;;36064:5;;;;;36058:22;;6495:18:1;;36058:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;36057:65;;;;:::i;:::-;36056:84;;;;:::i;:::-;36041:12;:99;;;36025:115;;36254:14;36235:15;36221:11;:29;;;36220:48;;;;:::i;:::-;36198:19;:70;36284:49;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;36284:49:0;;19388:18:1;36284:49:0;;;;;;;36383:19;;36348:55;;8348:25:1;;;36371:10:0;;36348:55;;8336:2:1;8321:18;36348:55:0;;;;;;;35613:797;;;:::o;41600:361::-;41679:15;41930:24;41946:7;41930:15;:24::i;14629:165::-;14722:65;;;;14749:17;;;;:9;:17;;;;;;;;14722:65;;;14749:27;;;;;;;;;;:37;;;14722:65;;8348:25:1;;;14722:65:0;;8321:18:1;14722:65:0;;;;;;;;14629:165;;;:::o;43954:183::-;44036:15;;44096:21;44109:8;44096:10;:21;:::i;:::-;:25;:33;;44128:1;44096:33;;;44124:1;44096:33;44069:61;;44070:21;44083:8;44070:10;:21;:::i;:::-;44069:61;;;;:::i;15105:332::-;15240:17;;;;15213:24;15240:17;;;:9;:17;;;;;;;;:27;;;;;;;;;;15323:17;15303:37;;15299:132;;15356:64;15365:6;15373:8;15383:36;15402:17;15383:16;:36;:::i;15356:64::-;15203:234;15105:332;;;:::o;15755:354::-;15846:17;;;;;;;:9;:17;;;;;:28;;15867:7;;15846:17;:28;;15867:7;;15846:28;:::i;:::-;;;;-1:-1:-1;;16015:21:0;;;;;;;;:9;:21;;;;;;;:32;;;;;;16065:37;16015:21;;16065:37;;;;;;;16040:7;8348:25:1;;8336:2;8321:18;;8202:177;38467:695:0;38579:23;;;38571:55;;;;;;;14059:2:1;38571:55:0;;;14041:21:1;14098:2;14078:18;;;14071:30;14137:21;14117:18;;;14110:49;14176:18;;38571:55:0;13857:343:1;38571:55:0;38644:23;38636:53;;;;;;;10572:2:1;38636:53:0;;;10554:21:1;10611:2;10591:18;;;10584:30;10650:19;10630:18;;;10623:47;10687:18;;38636:53:0;10370:341:1;38636:53:0;38707:23;38699:53;;;;;;;11963:2:1;38699:53:0;;;11945:21:1;12002:2;11982:18;;;11975:30;12041:19;12021:18;;;12014:47;12078:18;;38699:53:0;11761:341:1;38699:53:0;38763:25;38769:9;38780:7;38763:5;:25::i;:::-;38799:23;38854:7;38838:13;:11;:13::i;:::-;:23;;;;:::i;:::-;38825:10;:36;;;38799:62;;38872:21;38896:23;:21;:23::i;:::-;38872:47;;38952:9;38935:45;;38943:7;38935:45;;;38963:7;38972;38935:45;;;;;;19415:25:1;;;19471:2;19456:18;;19449:34;19403:2;19388:18;;19241:248;38935:45:0;;;;;;;;38995:53;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;38995:53:0;;19388:18:1;38995:53:0;;;;;;;39092:5;;39067:64;;39092:5;;39099:7;39116:4;39123:7;39067:24;:64::i;:::-;39059:96;;;;;;;15095:2:1;39059:96:0;;;15077:21:1;15134:2;15114:18;;;15107:30;15173:21;15153:18;;;15146:49;15212:18;;39059:96:0;14893:343:1;39168:797:0;39296:23;;;39288:55;;;;;;;13005:2:1;39288:55:0;;;12987:21:1;13044:2;13024:18;;;13017:30;13083:21;13063:18;;;13056:49;13122:18;;39288:55:0;12803:343:1;39288:55:0;39361:23;39353:53;;;;;;;17513:2:1;39353:53:0;;;17495:21:1;17552:2;17532:18;;;17525:30;17591:19;17571:18;;;17564:47;17628:18;;39353:53:0;17311:341:1;39353:53:0;39424:23;39416:53;;;;;;;16475:2:1;39416:53:0;;;16457:21:1;16514:2;16494:18;;;16487:30;16553:19;16533:18;;;16526:47;16590:18;;39416:53:0;16273:341:1;39416:53:0;39495:6;39484:17;;:7;:17;;;39480:92;;39517:44;39536:6;39544:7;39553;39517:18;:44::i;:::-;39582:22;39588:6;39596:7;39582:5;:22::i;:::-;39615:23;39670:7;39654:13;:11;:13::i;:::-;:23;;;;:::i;:::-;39641:10;:36;;;39615:62;;39688:21;39712:23;:21;:23::i;:::-;39688:47;;39780:6;39751:54;;39769:9;39751:54;;39760:7;39751:54;;;39788:7;39797;39751:54;;;;;;19415:25:1;;;19471:2;19456:18;;19449:34;19403:2;19388:18;;19241:248;39751:54:0;;;;;;;;39820:53;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;39820:53:0;;19388:18:1;39820:53:0;;;;;;;39913:5;;39892:47;;39913:5;;39920:9;39931:7;39892:20;:47::i;:::-;39884:74;;;;;;;11266:2:1;39884:74:0;;;11248:21:1;11305:2;11285:18;;;11278:30;11344:16;11324:18;;;11317:44;11378:18;;39884:74:0;11064:338:1;15443:306:0;15529:7;15514:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;15651:21:0;;;;;;;:9;:21;;;;;;;;:32;;;;;;15701:41;8348:25:1;;;15701:41:0;;8321:18:1;15701:41:0;;;;;;;;15443:306;;:::o;39971:185::-;40022:21;40111:19;;40092:15;40078:11;:29;;;40077:53;:72;;40137:12;;40077:72;;;40133:1;40077:72;40062:12;:87;;;40055:94;;39971:185;:::o;7571:228::-;7718:73;;6819:42:1;6888:15;;;7718:73:0;;;6870:34:1;6940:15;;6920:18;;;6913:43;6972:18;;;6965:34;;;7672:13:0;;7704:88;;7710:6;;7741:28;;6782:18:1;;7718:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7704:5;:88::i;:::-;7697:95;7571:228;-1:-1:-1;;;;;7571:228:0:o;14800:299::-;14867:17;;;;;;;:9;:17;;;;;:28;;14888:7;;14867:17;:28;;14888:7;;14867:28;:::i;:::-;;;;-1:-1:-1;;15015:11:0;:22;;;;;;;15055:37;;8348:25:1;;;-1:-1:-1;;15055:37:0;;;;;;8336:2:1;8321:18;15055:37:0;8202:177:1;7367:198:0;7495:62;;7912:42:1;7900:55;;7495:62:0;;;7882:74:1;7972:18;;;7965:34;;;7449:13:0;;7481:77;;7487:6;;7518:24;;7855:18:1;;7495:62:0;7708:297:1;7481:77:0;7474:84;7367:198;-1:-1:-1;;;;7367:198:0:o;8391:336::-;8459:13;8488:18;;;;8484:50;;-1:-1:-1;8529:5:0;8522:12;;8484:50;8545:23;8605:6;:11;;8617:5;8605:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8578:45:0;;-1:-1:-1;8578:45:0;-1:-1:-1;8578:45:0;8641:79;;;;-1:-1:-1;8654:17:0;;:31;;:65;;;8700:10;8689:30;;;;;;;;;;;;:::i;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:156::-;281:20;;341:4;330:16;;320:27;;310:55;;361:1;358;351:12;376:186;435:6;488:2;476:9;467:7;463:23;459:32;456:52;;;504:1;501;494:12;456:52;527:29;546:9;527:29;:::i;567:260::-;635:6;643;696:2;684:9;675:7;671:23;667:32;664:52;;;712:1;709;702:12;664:52;735:29;754:9;735:29;:::i;:::-;725:39;;783:38;817:2;806:9;802:18;783:38;:::i;:::-;773:48;;567:260;;;;;:::o;832:328::-;909:6;917;925;978:2;966:9;957:7;953:23;949:32;946:52;;;994:1;991;984:12;946:52;1017:29;1036:9;1017:29;:::i;:::-;1007:39;;1065:38;1099:2;1088:9;1084:18;1065:38;:::i;:::-;1055:48;;1150:2;1139:9;1135:18;1122:32;1112:42;;832:328;;;;;:::o;1165:606::-;1276:6;1284;1292;1300;1308;1316;1324;1377:3;1365:9;1356:7;1352:23;1348:33;1345:53;;;1394:1;1391;1384:12;1345:53;1417:29;1436:9;1417:29;:::i;:::-;1407:39;;1465:38;1499:2;1488:9;1484:18;1465:38;:::i;:::-;1455:48;;1550:2;1539:9;1535:18;1522:32;1512:42;;1601:2;1590:9;1586:18;1573:32;1563:42;;1624:37;1656:3;1645:9;1641:19;1624:37;:::i;:::-;1614:47;;1708:3;1697:9;1693:19;1680:33;1670:43;;1760:3;1749:9;1745:19;1732:33;1722:43;;1165:606;;;;;;;;;;:::o;1776:254::-;1844:6;1852;1905:2;1893:9;1884:7;1880:23;1876:32;1873:52;;;1921:1;1918;1911:12;1873:52;1944:29;1963:9;1944:29;:::i;:::-;1934:39;2020:2;2005:18;;;;1992:32;;-1:-1:-1;;;1776:254:1:o;2035:277::-;2102:6;2155:2;2143:9;2134:7;2130:23;2126:32;2123:52;;;2171:1;2168;2161:12;2123:52;2203:9;2197:16;2256:5;2249:13;2242:21;2235:5;2232:32;2222:60;;2278:1;2275;2268:12;2317:180;2376:6;2429:2;2417:9;2408:7;2404:23;2400:32;2397:52;;;2445:1;2442;2435:12;2397:52;-1:-1:-1;2468:23:1;;2317:180;-1:-1:-1;2317:180:1:o;2502:184::-;2572:6;2625:2;2613:9;2604:7;2600:23;2596:32;2593:52;;;2641:1;2638;2631:12;2593:52;-1:-1:-1;2664:16:1;;2502:184;-1:-1:-1;2502:184:1:o;2691:254::-;2759:6;2767;2820:2;2808:9;2799:7;2795:23;2791:32;2788:52;;;2836:1;2833;2826:12;2788:52;2872:9;2859:23;2849:33;;2901:38;2935:2;2924:9;2920:18;2901:38;:::i;2950:328::-;3027:6;3035;3043;3096:2;3084:9;3075:7;3071:23;3067:32;3064:52;;;3112:1;3109;3102:12;3064:52;3148:9;3135:23;3125:33;;3177:38;3211:2;3200:9;3196:18;3177:38;:::i;:::-;3167:48;;3234:38;3268:2;3257:9;3253:18;3234:38;:::i;:::-;3224:48;;2950:328;;;;;:::o;3283:600::-;3394:6;3402;3410;3418;3426;3434;3442;3495:3;3483:9;3474:7;3470:23;3466:33;3463:53;;;3512:1;3509;3502:12;3463:53;3548:9;3535:23;3525:33;;3577:38;3611:2;3600:9;3596:18;3577:38;:::i;3888:531::-;3990:6;3998;4006;4014;4022;4030;4083:3;4071:9;4062:7;4058:23;4054:33;4051:53;;;4100:1;4097;4090:12;4051:53;4136:9;4123:23;4113:33;;4165:38;4199:2;4188:9;4184:18;4165:38;:::i;:::-;4155:48;;4250:2;4239:9;4235:18;4222:32;4212:42;;4273:36;4305:2;4294:9;4290:18;4273:36;:::i;:::-;4263:46;;4356:3;4345:9;4341:19;4328:33;4318:43;;4408:3;4397:9;4393:19;4380:33;4370:43;;3888:531;;;;;;;;:::o;4424:274::-;4553:3;4591:6;4585:13;4607:53;4653:6;4648:3;4641:4;4633:6;4629:17;4607:53;:::i;:::-;4676:16;;;;;4424:274;-1:-1:-1;;4424:274:1:o;4703:1219::-;4833:3;4862:1;4895:6;4889:13;4925:3;4947:1;4975:9;4971:2;4967:18;4957:28;;5035:2;5024:9;5020:18;5057;5047:61;;5101:4;5093:6;5089:17;5079:27;;5047:61;5127:2;5175;5167:6;5164:14;5144:18;5141:38;5138:222;;;5214:77;5209:3;5202:90;5315:4;5312:1;5305:15;5345:4;5340:3;5333:17;5138:222;5376:18;5403:162;;;;5579:1;5574:323;;;;5369:528;;5403:162;5451:66;5440:9;5436:82;5431:3;5424:95;5548:6;5543:3;5539:16;5532:23;;5403:162;;5574:323;19759:1;19752:14;;;19796:4;19783:18;;5672:1;5686:165;5700:6;5697:1;5694:13;5686:165;;;5778:14;;5765:11;;;5758:35;5821:16;;;;5715:10;;5686:165;;;5690:3;;5880:6;5875:3;5871:16;5864:23;;5369:528;-1:-1:-1;5913:3:1;;4703:1219;-1:-1:-1;;;;;;;;4703:1219:1:o;9923:442::-;10072:2;10061:9;10054:21;10035:4;10104:6;10098:13;10147:6;10142:2;10131:9;10127:18;10120:34;10163:66;10222:6;10217:2;10206:9;10202:18;10197:2;10189:6;10185:15;10163:66;:::i;:::-;10281:2;10269:15;10286:66;10265:88;10250:104;;;;10356:2;10246:113;;9923:442;-1:-1:-1;;9923:442:1:o;19812:128::-;19852:3;19883:1;19879:6;19876:1;19873:13;19870:39;;;19889:18;;:::i;:::-;-1:-1:-1;19925:9:1;;19812:128::o;19945:120::-;19985:1;20011;20001:35;;20016:18;;:::i;:::-;-1:-1:-1;20050:9:1;;19945:120::o;20070:228::-;20110:7;20236:1;20168:66;20164:74;20161:1;20158:81;20153:1;20146:9;20139:17;20135:105;20132:131;;;20243:18;;:::i;:::-;-1:-1:-1;20283:9:1;;20070:228::o;20303:125::-;20343:4;20371:1;20368;20365:8;20362:34;;;20376:18;;:::i;:::-;-1:-1:-1;20413:9:1;;20303:125::o;20433:258::-;20505:1;20515:113;20529:6;20526:1;20523:13;20515:113;;;20605:11;;;20599:18;20586:11;;;20579:39;20551:2;20544:10;20515:113;;;20646:6;20643:1;20640:13;20637:48;;;-1:-1:-1;;20681:1:1;20663:16;;20656:27;20433:258::o;20696:437::-;20775:1;20771:12;;;;20818;;;20839:61;;20893:4;20885:6;20881:17;20871:27;;20839:61;20946:2;20938:6;20935:14;20915:18;20912:38;20909:218;;;20983:77;20980:1;20973:88;21084:4;21081:1;21074:15;21112:4;21109:1;21102:15;20909:218;;20696:437;;;:::o;21138:112::-;21170:1;21196;21186:35;;21201:18;;:::i;:::-;-1:-1:-1;21235:9:1;;21138:112::o;21255:184::-;21307:77;21304:1;21297:88;21404:4;21401:1;21394:15;21428:4;21425:1;21418:15;21444:184;21496:77;21493:1;21486:88;21593:4;21590:1;21583:15;21617:4;21614:1;21607:15
Swarm Source
none
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.