ERC-20
Overview
Max Total Supply
106,582,197.028310015163905683 xCROC
Holders
869
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.008258219554963235 xCROCValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RevenueDistributionToken
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.8.18; import { ERC20 } from "./tokens/ERC20.sol"; import { ERC20Helper } from "./tokens/ERC20Helper.sol"; import { IRevenueDistributionToken } from "./interfaces/IRevenueDistributionToken.sol"; /* ██████╗ ██████╗ ████████╗ ██╔══██╗██╔══██╗╚══██╔══╝ ██████╔╝██║ ██║ ██║ ██╔══██╗██║ ██║ ██║ ██║ ██║██████╔╝ ██║ ╚═╝ ╚═╝╚═════╝ ╚═╝ */ contract RevenueDistributionToken is IRevenueDistributionToken, ERC20 { uint256 public immutable override precision; // Precision of rates, equals max deposit amounts before rounding errors occur address public override asset; // Underlying ERC-20 asset used by ERC-4626 functionality. address public override owner; // Current owner of the contract, able to update the vesting schedule. address public override pendingOwner; // Pending owner of the contract, able to accept ownership. uint256 public override freeAssets; // Amount of assets unlocked regardless of time passed. uint256 public override issuanceRate; // asset/second rate dependent on aggregate vesting schedule. uint256 public override lastUpdated; // Timestamp of when issuance equation was last updated. uint256 public override vestingPeriodFinish; // Timestamp when current vesting schedule ends. uint256 private locked = 1; // Used in reentrancy check. /*****************/ /*** Modifiers ***/ /*****************/ modifier nonReentrant() { require(locked == 1, "RDT:LOCKED"); locked = 2; _; locked = 1; } constructor(string memory name_, string memory symbol_, address owner_, address asset_, uint256 precision_) ERC20(name_, symbol_, ERC20(asset_).decimals()) { require((owner = owner_) != address(0), "RDT:C:OWNER_ZERO_ADDRESS"); asset = asset_; // Don't need to check zero address as ERC20(asset_).decimals() will fail in ERC20 constructor. precision = precision_; } /********************************/ /*** Administrative Functions ***/ /********************************/ function acceptOwnership() external virtual override { require(msg.sender == pendingOwner, "RDT:AO:NOT_PO"); emit OwnershipAccepted(owner, msg.sender); owner = msg.sender; pendingOwner = address(0); } function setPendingOwner(address pendingOwner_) external virtual override { require(msg.sender == owner, "RDT:SPO:NOT_OWNER"); pendingOwner = pendingOwner_; emit PendingOwnerSet(msg.sender, pendingOwner_); } function updateVestingSchedule(uint256 vestingPeriod_) external virtual override returns (uint256 issuanceRate_, uint256 freeAssets_) { require(msg.sender == owner, "RDT:UVS:NOT_OWNER"); require(totalSupply != 0, "RDT:UVS:ZERO_SUPPLY"); // Update "y-intercept" to reflect current available asset. freeAssets_ = freeAssets = totalAssets(); // Calculate slope. issuanceRate_ = issuanceRate = ((ERC20(asset).balanceOf(address(this)) - freeAssets_) * precision) / vestingPeriod_; // Update timestamp and period finish. vestingPeriodFinish = (lastUpdated = block.timestamp) + vestingPeriod_; emit IssuanceParamsUpdated(freeAssets_, issuanceRate_); emit VestingScheduleUpdated(msg.sender, vestingPeriodFinish); } /************************/ /*** Staker Functions ***/ /************************/ function deposit(uint256 assets_, address receiver_) external virtual override nonReentrant returns (uint256 shares_) { _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender); } function depositWithPermit( uint256 assets_, address receiver_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_ ) external virtual override nonReentrant returns (uint256 shares_) { ERC20(asset).permit(msg.sender, address(this), assets_, deadline_, v_, r_, s_); _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender); } function mint(uint256 shares_, address receiver_) external virtual override nonReentrant returns (uint256 assets_) { _mint(shares_, assets_ = previewMint(shares_), receiver_, msg.sender); } function mintWithPermit( uint256 shares_, address receiver_, uint256 maxAssets_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_ ) external virtual override nonReentrant returns (uint256 assets_) { require((assets_ = previewMint(shares_)) <= maxAssets_, "RDT:MWP:INSUFFICIENT_PERMIT"); ERC20(asset).permit(msg.sender, address(this), maxAssets_, deadline_, v_, r_, s_); (shares_, assets_, receiver_, msg.sender); } function redeem(uint256 shares_, address receiver_, address owner_) external virtual override nonReentrant returns (uint256 assets_) { _burn(shares_, assets_ = previewRedeem(shares_), receiver_, owner_, msg.sender); } function withdraw(uint256 assets_, address receiver_, address owner_) external virtual override nonReentrant returns (uint256 shares_) { _burn(shares_ = previewWithdraw(assets_), assets_, receiver_, owner_, msg.sender); } /**************************/ /*** Internal Functions ***/ /**************************/ function _mint(uint256 shares_, uint256 assets_, address receiver_, address caller_) internal { require(receiver_ != address(0), "RDT:M:ZERO_RECEIVER"); require(shares_ != uint256(0), "RDT:M:ZERO_SHARES"); require(assets_ != uint256(0), "RDT:M:ZERO_ASSETS"); _mint(receiver_, shares_); uint256 freeAssetsCache = freeAssets = totalAssets() + assets_; uint256 issuanceRate_ = _updateIssuanceParams(); emit Deposit(caller_, receiver_, assets_, shares_); emit IssuanceParamsUpdated(freeAssetsCache, issuanceRate_); require(ERC20Helper.transferFrom(asset, caller_, address(this), assets_), "RDT:M:TRANSFER_FROM"); } function _burn(uint256 shares_, uint256 assets_, address receiver_, address owner_, address caller_) internal { require(receiver_ != address(0), "RDT:B:ZERO_RECEIVER"); require(shares_ != uint256(0), "RDT:B:ZERO_SHARES"); require(assets_ != uint256(0), "RDT:B:ZERO_ASSETS"); if (caller_ != owner_) { _decreaseAllowance(owner_, caller_, shares_); } _burn(owner_, shares_); uint256 freeAssetsCache = freeAssets = totalAssets() - assets_; uint256 issuanceRate_ = _updateIssuanceParams(); emit Withdraw(caller_, receiver_, owner_, assets_, shares_); emit IssuanceParamsUpdated(freeAssetsCache, issuanceRate_); require(ERC20Helper.transfer(asset, receiver_, assets_), "RDT:B:TRANSFER"); } function _updateIssuanceParams() internal returns (uint256 issuanceRate_) { return issuanceRate = (lastUpdated = block.timestamp) > vestingPeriodFinish ? 0 : issuanceRate; } /**********************/ /*** View Functions ***/ /**********************/ function balanceOfAssets(address account_) public view virtual override returns (uint256 balanceOfAssets_) { return convertToAssets(balanceOf[account_]); } function convertToAssets(uint256 shares_) public view virtual override returns (uint256 assets_) { uint256 supply = totalSupply; // Cache to stack. assets_ = supply == 0 ? shares_ : (shares_ * totalAssets()) / supply; } function convertToShares(uint256 assets_) public view virtual override returns (uint256 shares_) { uint256 supply = totalSupply; // Cache to stack. shares_ = supply == 0 ? assets_ : (assets_ * supply) / totalAssets(); } function maxDeposit(address receiver_) external pure virtual override returns (uint256 maxAssets_) { receiver_; // Silence warning maxAssets_ = type(uint256).max; } function maxMint(address receiver_) external pure virtual override returns (uint256 maxShares_) { receiver_; // Silence warning maxShares_ = type(uint256).max; } function maxRedeem(address owner_) external view virtual override returns (uint256 maxShares_) { maxShares_ = balanceOf[owner_]; } function maxWithdraw(address owner_) external view virtual override returns (uint256 maxAssets_) { maxAssets_ = balanceOfAssets(owner_); } function previewDeposit(uint256 assets_) public view virtual override returns (uint256 shares_) { // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations, // it should round DOWN if it’s calculating the amount of shares to issue to a user, given an amount of assets provided. shares_ = convertToShares(assets_); } function previewMint(uint256 shares_) public view virtual override returns (uint256 assets_) { uint256 supply = totalSupply; // Cache to stack. // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations, // it should round UP if it’s calculating the amount of assets a user must provide, to be issued a given amount of shares. assets_ = supply == 0 ? shares_ : _divRoundUp(shares_ * totalAssets(), supply); } function previewRedeem(uint256 shares_) public view virtual override returns (uint256 assets_) { // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations, // it should round DOWN if it’s calculating the amount of assets to send to a user, given amount of shares returned. assets_ = convertToAssets(shares_); } function previewWithdraw(uint256 assets_) public view virtual override returns (uint256 shares_) { uint256 supply = totalSupply; // Cache to stack. // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations, // it should round UP if it’s calculating the amount of shares a user must return, to be sent a given amount of assets. shares_ = supply == 0 ? assets_ : _divRoundUp(assets_ * supply, totalAssets()); } function totalAssets() public view virtual override returns (uint256 totalManagedAssets_) { uint256 issuanceRate_ = issuanceRate; if (issuanceRate_ == 0) return freeAssets; uint256 vestingPeriodFinish_ = vestingPeriodFinish; uint256 lastUpdated_ = lastUpdated; uint256 vestingTimePassed = block.timestamp > vestingPeriodFinish_ ? vestingPeriodFinish_ - lastUpdated_ : block.timestamp - lastUpdated_; return ((issuanceRate_ * vestingTimePassed) / precision) + freeAssets; } /**************************/ /*** Internal Functions ***/ /**************************/ function _divRoundUp(uint256 numerator_, uint256 divisor_) internal pure returns (uint256 result_) { return (numerator_ / divisor_) + (numerator_ % divisor_ > 0 ? 1 : 0); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.18; /// @title Interface of the ERC20 standard as defined in the EIP, including EIP-2612 permit functionality. interface IERC20 { /**************/ /*** Events ***/ /**************/ /** * @dev Emitted when one account has set the allowance of another account over their tokens. * @param owner_ Account that tokens are approved from. * @param spender_ Account that tokens are approved for. * @param amount_ Amount of tokens that have been approved. */ event Approval(address indexed owner_, address indexed spender_, uint256 amount_); /** * @dev Emitted when tokens have moved from one account to another. * @param owner_ Account that tokens have moved from. * @param recipient_ Account that tokens have moved to. * @param amount_ Amount of tokens that have been transferred. */ event Transfer(address indexed owner_, address indexed recipient_, uint256 amount_); /**************************/ /*** External Functions ***/ /**************************/ /** * @dev Function that allows one account to set the allowance of another account over their tokens. * Emits an {Approval} event. * @param spender_ Account that tokens are approved for. * @param amount_ Amount of tokens that have been approved. * @return success_ Boolean indicating whether the operation succeeded. */ function approve(address spender_, uint256 amount_) external returns (bool success_); /** * @dev Function that allows one account to decrease the allowance of another account over their tokens. * Emits an {Approval} event. * @param spender_ Account that tokens are approved for. * @param subtractedAmount_ Amount to decrease approval by. * @return success_ Boolean indicating whether the operation succeeded. */ function decreaseAllowance(address spender_, uint256 subtractedAmount_) external returns (bool success_); /** * @dev Function that allows one account to increase the allowance of another account over their tokens. * Emits an {Approval} event. * @param spender_ Account that tokens are approved for. * @param addedAmount_ Amount to increase approval by. * @return success_ Boolean indicating whether the operation succeeded. */ function increaseAllowance(address spender_, uint256 addedAmount_) external returns (bool success_); /** * @dev Approve by signature. * @param owner_ Owner address that signed the permit. * @param spender_ Spender of the permit. * @param amount_ Permit approval spend limit. * @param deadline_ Deadline after which the permit is invalid. * @param v_ ECDSA signature v component. * @param r_ ECDSA signature r component. * @param s_ ECDSA signature s component. */ function permit(address owner_, address spender_, uint amount_, uint deadline_, uint8 v_, bytes32 r_, bytes32 s_) external; /** * @dev Moves an amount of tokens from `msg.sender` to a specified account. * Emits a {Transfer} event. * @param recipient_ Account that receives tokens. * @param amount_ Amount of tokens that are transferred. * @return success_ Boolean indicating whether the operation succeeded. */ function transfer(address recipient_, uint256 amount_) external returns (bool success_); /** * @dev Moves a pre-approved amount of tokens from a sender to a specified account. * Emits a {Transfer} event. * Emits an {Approval} event. * @param owner_ Account that tokens are moving from. * @param recipient_ Account that receives tokens. * @param amount_ Amount of tokens that are transferred. * @return success_ Boolean indicating whether the operation succeeded. */ function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_); /**********************/ /*** View Functions ***/ /**********************/ /** * @dev Returns the allowance that one account has given another over their tokens. * @param owner_ Account that tokens are approved from. * @param spender_ Account that tokens are approved for. * @return allowance_ Allowance that one account has given another over their tokens. */ function allowance(address owner_, address spender_) external view returns (uint256 allowance_); /** * @dev Returns the amount of tokens owned by a given account. * @param account_ Account that owns the tokens. * @return balance_ Amount of tokens owned by a given account. */ function balanceOf(address account_) external view returns (uint256 balance_); /** * @dev Returns the decimal precision used by the token. * @return decimals_ The decimal precision used by the token. */ function decimals() external view returns (uint8 decimals_); /** * @dev Returns the signature domain separator. * @return domainSeparator_ The signature domain separator. */ function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator_); /** * @dev Returns the name of the token. * @return name_ The name of the token. */ function name() external view returns (string memory name_); /** * @dev Returns the nonce for the given owner. * @param owner_ The address of the owner account. * @return nonce_ The nonce for the given owner. */ function nonces(address owner_) external view returns (uint256 nonce_); /** * @dev Returns the permit type hash. * @return permitTypehash_ The permit type hash. */ function PERMIT_TYPEHASH() external view returns (bytes32 permitTypehash_); /** * @dev Returns the symbol of the token. * @return symbol_ The symbol of the token. */ function symbol() external view returns (string memory symbol_); /** * @dev Returns the total amount of tokens in existence. * @return totalSupply_ The total amount of tokens in existence. */ function totalSupply() external view returns (uint256 totalSupply_); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.18; /// @title Interface of the ERC20 standard as needed by ERC20Helper. interface IERC20Like { function approve(address spender_, uint256 amount_) external returns (bool success_); function transfer(address recipient_, uint256 amount_) external returns (bool success_); function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.18; import { IERC20 } from "./IERC20.sol"; /// @title A standard for tokenized Vaults with a single underlying ERC-20 token. interface IERC4626 is IERC20 { /**************/ /*** Events ***/ /**************/ /** * @dev `caller_` has exchanged `assets_` for `shares_` and transferred them to `owner_`. * MUST be emitted when assets are deposited via the `deposit` or `mint` methods. * @param caller_ The caller of the function that emitted the `Deposit` event. * @param owner_ The owner of the shares. * @param assets_ The amount of assets deposited. * @param shares_ The amount of shares minted. */ event Deposit(address indexed caller_, address indexed owner_, uint256 assets_, uint256 shares_); /** * @dev `caller_` has exchanged `shares_`, owned by `owner_`, for `assets_`, and transferred them to `receiver_`. * MUST be emitted when assets are withdrawn via the `withdraw` or `redeem` methods. * @param caller_ The caller of the function that emitted the `Withdraw` event. * @param receiver_ The receiver of the assets. * @param owner_ The owner of the shares. * @param assets_ The amount of assets withdrawn. * @param shares_ The amount of shares burned. */ event Withdraw(address indexed caller_, address indexed receiver_, address indexed owner_, uint256 assets_, uint256 shares_); /***********************/ /*** State Variables ***/ /***********************/ /** * @dev The address of the underlying asset used by the Vault. * MUST be a contract that implements the ERC-20 standard. * MUST NOT revert. * @return asset_ The address of the underlying asset. */ function asset() external view returns (address asset_); /********************************/ /*** State Changing Functions ***/ /********************************/ /** * @dev Mints `shares_` to `receiver_` by depositing `assets_` into the Vault. * MUST emit the {Deposit} event. * MUST revert if all of the assets cannot be deposited (due to insufficient approval, deposit limits, slippage, etc). * @param assets_ The amount of assets to deposit. * @param receiver_ The receiver of the shares. * @return shares_ The amount of shares minted. */ function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_); /** * @dev Mints `shares_` to `receiver_` by depositing `assets_` into the Vault. * MUST emit the {Deposit} event. * MUST revert if all of shares cannot be minted (due to insufficient approval, deposit limits, slippage, etc). * @param shares_ The amount of shares to mint. * @param receiver_ The receiver of the shares. * @return assets_ The amount of assets deposited. */ function mint(uint256 shares_, address receiver_) external returns (uint256 assets_); /** * @dev Burns `shares_` from `owner_` and sends `assets_` to `receiver_`. * MUST emit the {Withdraw} event. * MUST revert if all of the shares cannot be redeemed (due to insufficient shares, withdrawal limits, slippage, etc). * @param shares_ The amount of shares to redeem. * @param receiver_ The receiver of the assets. * @param owner_ The owner of the shares. * @return assets_ The amount of assets sent to the receiver. */ function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assets_); /** * @dev Burns `shares_` from `owner_` and sends `assets_` to `receiver_`. * MUST emit the {Withdraw} event. * MUST revert if all of the assets cannot be withdrawn (due to insufficient assets, withdrawal limits, slippage, etc). * @param assets_ The amount of assets to withdraw. * @param receiver_ The receiver of the assets. * @param owner_ The owner of the assets. * @return shares_ The amount of shares burned from the owner. */ function withdraw(uint256 assets_, address receiver_, address owner_) external returns (uint256 shares_); /**********************/ /*** View Functions ***/ /**********************/ /** * @dev The amount of `assets_` the `shares_` are currently equivalent to. * MUST NOT be inclusive of any fees that are charged against assets in the Vault. * MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange. * MUST NOT show any variations depending on the caller. * MUST NOT revert. * @param shares_ The amount of shares to convert. * @return assets_ The amount of equivalent assets. */ function convertToAssets(uint256 shares_) external view returns (uint256 assets_); /** * @dev The amount of `shares_` the `assets_` are currently equivalent to. * MUST NOT be inclusive of any fees that are charged against assets in the Vault. * MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange. * MUST NOT show any variations depending on the caller. * MUST NOT revert. * @param assets_ The amount of assets to convert. * @return shares_ The amount of equivalent shares. */ function convertToShares(uint256 assets_) external view returns (uint256 shares_); /** * @dev Maximum amount of `assets_` that can be deposited on behalf of the `receiver_` through a `deposit` call. * MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise. * MUST NOT revert. * @param receiver_ The receiver of the assets. * @return assets_ The maximum amount of assets that can be deposited. */ function maxDeposit(address receiver_) external view returns (uint256 assets_); /** * @dev Maximum amount of `shares_` that can be minted on behalf of the `receiver_` through a `mint` call. * MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise. * MUST NOT revert. * @param receiver_ The receiver of the shares. * @return shares_ The maximum amount of shares that can be minted. */ function maxMint(address receiver_) external view returns (uint256 shares_); /** * @dev Maximum amount of `shares_` that can be redeemed from the `owner_` through a `redeem` call. * MUST return a limited value if the owner is subject to any limits, or the total amount of owned shares otherwise. * MUST NOT revert. * @param owner_ The owner of the shares. * @return shares_ The maximum amount of shares that can be redeemed. */ function maxRedeem(address owner_) external view returns (uint256 shares_); /** * @dev Maximum amount of `assets_` that can be withdrawn from the `owner_` through a `withdraw` call. * MUST return a limited value if the owner is subject to any limits, or the total amount of owned assets otherwise. * MUST NOT revert. * @param owner_ The owner of the assets. * @return assets_ The maximum amount of assets that can be withdrawn. */ function maxWithdraw(address owner_) external view returns (uint256 assets_); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given current on-chain conditions. * MUST return as close to and no more than the exact amount of shares that would be minted in a `deposit` call in the same transaction. * MUST NOT account for deposit limits like those returned from `maxDeposit` and should always act as though the deposit would be accepted. * MUST NOT revert. * @param assets_ The amount of assets to deposit. * @return shares_ The amount of shares that would be minted. */ function previewDeposit(uint256 assets_) external view returns (uint256 shares_); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given current on-chain conditions. * MUST return as close to and no fewer than the exact amount of assets that would be deposited in a `mint` call in the same transaction. * MUST NOT account for mint limits like those returned from `maxMint` and should always act as though the minting would be accepted. * MUST NOT revert. * @param shares_ The amount of shares to mint. * @return assets_ The amount of assets that would be deposited. */ function previewMint(uint256 shares_) external view returns (uint256 assets_); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block, given current on-chain conditions. * MUST return as close to and no more than the exact amount of assets that would be withdrawn in a `redeem` call in the same transaction. * MUST NOT account for redemption limits like those returned from `maxRedeem` and should always act as though the redemption would be accepted. * MUST NOT revert. * @param shares_ The amount of shares to redeem. * @return assets_ The amount of assets that would be withdrawn. */ function previewRedeem(uint256 shares_) external view returns (uint256 assets_); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, given current on-chain conditions. * MUST return as close to and no fewer than the exact amount of shares that would be burned in a `withdraw` call in the same transaction. * MUST NOT account for withdrawal limits like those returned from `maxWithdraw` and should always act as though the withdrawal would be accepted. * MUST NOT revert. * @param assets_ The amount of assets to withdraw. * @return shares_ The amount of shares that would be redeemed. */ function previewWithdraw(uint256 assets_) external view returns (uint256 shares_); /** * @dev Total amount of the underlying asset that is managed by the Vault. * SHOULD include compounding that occurs from any yields. * MUST NOT revert. * @return totalAssets_ The total amount of assets the Vault manages. */ function totalAssets() external view returns (uint256 totalAssets_); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.18; import { IERC20 } from "./IERC20.sol"; import { IERC4626 } from "./IERC4626.sol"; /// @title A token that represents ownership of future revenues distributed linearly over time. interface IRevenueDistributionToken is IERC20, IERC4626 { /**************/ /*** Events ***/ /**************/ /** * @dev Issuance parameters have been updated after a `_mint` or `_burn`. * @param freeAssets_ Resulting `freeAssets` (y-intercept) value after accounting update. * @param issuanceRate_ The new issuance rate of `asset` until `vestingPeriodFinish_`. */ event IssuanceParamsUpdated(uint256 freeAssets_, uint256 issuanceRate_); /** * @dev `newOwner_` has accepted the transferral of RDT ownership from `previousOwner_`. * @param previousOwner_ The previous RDT owner. * @param newOwner_ The new RDT owner. */ event OwnershipAccepted(address indexed previousOwner_, address indexed newOwner_); /** * @dev `owner_` has set the new pending owner of RDT to `pendingOwner_`. * @param owner_ The current RDT owner. * @param pendingOwner_ The new pending RDT owner. */ event PendingOwnerSet(address indexed owner_, address indexed pendingOwner_); /** * @dev `owner_` has updated the RDT vesting schedule to end at `vestingPeriodFinish_`. * @param owner_ The current RDT owner. * @param vestingPeriodFinish_ When the unvested balance will finish vesting. */ event VestingScheduleUpdated(address indexed owner_, uint256 vestingPeriodFinish_); /***********************/ /*** State Variables ***/ /***********************/ /** * @dev The total amount of the underlying asset that is currently unlocked and is not time-dependent. * Analogous to the y-intercept in a linear function. */ function freeAssets() external view returns (uint256 freeAssets_); /** * @dev The rate of issuance of the vesting schedule that is currently active. * Denominated as the amount of underlying assets vesting per second. */ function issuanceRate() external view returns (uint256 issuanceRate_); /** * @dev The timestamp of when the linear function was last recalculated. * Analogous to t0 in a linear function. */ function lastUpdated() external view returns (uint256 lastUpdated_); /** * @dev The address of the account that is allowed to update the vesting schedule. */ function owner() external view returns (address owner_); /** * @dev The next owner, nominated by the current owner. */ function pendingOwner() external view returns (address pendingOwner_); /** * @dev The precision at which the issuance rate is measured. */ function precision() external view returns (uint256 precision_); /** * @dev The end of the current vesting schedule. */ function vestingPeriodFinish() external view returns (uint256 vestingPeriodFinish_); /********************************/ /*** Administrative Functions ***/ /********************************/ /** * @dev Sets the pending owner as the new owner. * Can be called only by the pending owner, and only after their nomination by the current owner. */ function acceptOwnership() external; /** * @dev Sets a new address as the pending owner. * @param pendingOwner_ The address of the next potential owner. */ function setPendingOwner(address pendingOwner_) external; /** * @dev Updates the current vesting formula based on the amount of total unvested funds in the contract and the new `vestingPeriod_`. * @param vestingPeriod_ The amount of time over which all currently unaccounted underlying assets will be vested over. * @return issuanceRate_ The new issuance rate. * @return freeAssets_ The new amount of underlying assets that are unlocked. */ function updateVestingSchedule(uint256 vestingPeriod_) external returns (uint256 issuanceRate_, uint256 freeAssets_); /************************/ /*** Staker Functions ***/ /************************/ /** * @dev Does a ERC4626 `deposit` with a ERC-2612 `permit`. * @param assets_ The amount of `asset` to deposit. * @param receiver_ The receiver of the shares. * @param deadline_ The timestamp after which the `permit` signature is no longer valid. * @param v_ ECDSA signature v component. * @param r_ ECDSA signature r component. * @param s_ ECDSA signature s component. * @return shares_ The amount of shares minted. */ function depositWithPermit(uint256 assets_, address receiver_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external returns (uint256 shares_); /** * @dev Does a ERC4626 `mint` with a ERC-2612 `permit`. * @param shares_ The amount of `shares` to mint. * @param receiver_ The receiver of the shares. * @param maxAssets_ The maximum amount of assets that can be taken, as per the permit. * @param deadline_ The timestamp after which the `permit` signature is no longer valid. * @param v_ ECDSA signature v component. * @param r_ ECDSA signature r component. * @param s_ ECDSA signature s component. * @return assets_ The amount of shares deposited. */ function mintWithPermit(uint256 shares_, address receiver_, uint256 maxAssets_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external returns (uint256 assets_); /**********************/ /*** View Functions ***/ /**********************/ /** * @dev Returns the amount of underlying assets owned by the specified account. * @param account_ Address of the account. * @return assets_ Amount of assets owned. */ function balanceOfAssets(address account_) external view returns (uint256 assets_); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.18; import { IERC20 } from "../interfaces/IERC20.sol"; /* ███████╗██████╗ ██████╗ ██████╗ ██████╗ ██╔════╝██╔══██╗██╔════╝ ╚════██╗██╔═████╗ █████╗ ██████╔╝██║ █████╔╝██║██╔██║ ██╔══╝ ██╔══██╗██║ ██╔═══╝ ████╔╝██║ ███████╗██║ ██║╚██████╗ ███████╗╚██████╔╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ */ /** * @title Modern ERC-20 implementation. * @dev Acknowledgements to Solmate, OpenZeppelin, and DSS for inspiring this code. */ contract ERC20 is IERC20 { /**************/ /*** ERC-20 ***/ /**************/ string public override name; string public override symbol; uint8 public immutable override decimals; uint256 public override totalSupply; mapping(address => uint256) public override balanceOf; mapping(address => mapping(address => uint256)) public override allowance; /****************/ /*** ERC-2612 ***/ /****************/ // PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public override nonces; /** * @param name_ The name of the token. * @param symbol_ The symbol of the token. * @param decimals_ The decimal precision used by the token. */ constructor(string memory name_, string memory symbol_, uint8 decimals_) { name = name_; symbol = symbol_; decimals = decimals_; } /**************************/ /*** External Functions ***/ /**************************/ function approve(address spender_, uint256 amount_) external override returns (bool success_) { _approve(msg.sender, spender_, amount_); return true; } function decreaseAllowance(address spender_, uint256 subtractedAmount_) external override returns (bool success_) { _decreaseAllowance(msg.sender, spender_, subtractedAmount_); return true; } function increaseAllowance(address spender_, uint256 addedAmount_) external override returns (bool success_) { _approve(msg.sender, spender_, allowance[msg.sender][spender_] + addedAmount_); return true; } function permit(address owner_, address spender_, uint256 amount_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external override { require(deadline_ >= block.timestamp, "ERC20:P:EXPIRED"); // Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. require( uint256(s_) <= uint256(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) && (v_ == 27 || v_ == 28), "ERC20:P:MALLEABLE" ); // Nonce realistically cannot overflow. unchecked { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256(abi.encode(PERMIT_TYPEHASH, owner_, spender_, amount_, nonces[owner_]++, deadline_)) ) ); address recoveredAddress = ecrecover(digest, v_, r_, s_); require(recoveredAddress == owner_ && owner_ != address(0), "ERC20:P:INVALID_SIGNATURE"); } _approve(owner_, spender_, amount_); } function transfer(address recipient_, uint256 amount_) external override returns (bool success_) { _transfer(msg.sender, recipient_, amount_); return true; } function transferFrom(address owner_, address recipient_, uint256 amount_) external override returns (bool success_) { _decreaseAllowance(owner_, msg.sender, amount_); _transfer(owner_, recipient_, amount_); return true; } /**********************/ /*** View Functions ***/ /**********************/ function DOMAIN_SEPARATOR() public view override returns (bytes32 domainSeparator_) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), block.chainid, address(this) ) ); } /**************************/ /*** Internal Functions ***/ /**************************/ function _approve(address owner_, address spender_, uint256 amount_) internal { emit Approval(owner_, spender_, allowance[owner_][spender_] = amount_); } function _burn(address owner_, uint256 amount_) internal { balanceOf[owner_] -= amount_; // Cannot underflow because a user's balance will never be larger than the total supply. unchecked { totalSupply -= amount_; } emit Transfer(owner_, address(0), amount_); } function _decreaseAllowance(address owner_, address spender_, uint256 subtractedAmount_) internal { uint256 spenderAllowance = allowance[owner_][spender_]; // Cache to memory. if (spenderAllowance != type(uint256).max) { _approve(owner_, spender_, spenderAllowance - subtractedAmount_); } } function _mint(address recipient_, uint256 amount_) internal { totalSupply += amount_; // Cannot overflow because totalSupply would first overflow in the statement above. unchecked { balanceOf[recipient_] += amount_; } emit Transfer(address(0), recipient_, amount_); } function _transfer(address owner_, address recipient_, uint256 amount_) internal { balanceOf[owner_] -= amount_; // Cannot overflow because minting prevents overflow of totalSupply, and sum of user balances == totalSupply. unchecked { balanceOf[recipient_] += amount_; } emit Transfer(owner_, recipient_, amount_); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.18; import { IERC20Like } from "../interfaces/IERC20Like.sol"; /** * @title Small Library to standardize erc20 token interactions. */ library ERC20Helper { /**************************/ /*** Internal Functions ***/ /**************************/ function transfer(address token_, address to_, uint256 amount_) internal returns (bool success_) { return _call(token_, abi.encodeWithSelector(IERC20Like.transfer.selector, to_, amount_)); } function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) { return _call(token_, abi.encodeWithSelector(IERC20Like.transferFrom.selector, from_, to_, amount_)); } function approve(address token_, address spender_, uint256 amount_) internal returns (bool success_) { // If setting approval to zero fails, return false. if (!_call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, uint256(0)))) return false; // If `amount_` is zero, return true as the previous step already did this. if (amount_ == uint256(0)) return true; // Return the result of setting the approval to `amount_`. return _call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, amount_)); } function _call(address token_, bytes memory data_) private returns (bool success_) { if (token_.code.length == uint256(0)) return false; bytes memory returnData; ( success_, returnData ) = token_.call(data_); return success_ && (returnData.length == uint256(0) || abi.decode(returnData, (bool))); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
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":[{"indexed":true,"internalType":"address","name":"previousOwner_","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner_","type":"address"}],"name":"OwnershipAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"recipient_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"vestingPeriodFinish_","type":"uint256"}],"name":"VestingScheduleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"receiver_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"domainSeparator_","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"balanceOfAssets","outputs":[{"internalType":"uint256","name":"balanceOfAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"subtractedAmount_","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"depositWithPermit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"addedAmount_","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issuanceRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"maxAssets_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"precision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalManagedAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestingPeriod_","type":"uint256"}],"name":"updateVestingSchedule","outputs":[{"internalType":"uint256","name":"issuanceRate_","type":"uint256"},{"internalType":"uint256","name":"freeAssets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingPeriodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526001600d553480156200001657600080fd5b506040516200447c3803806200447c83398181016040528101906200003c91906200041d565b84848373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b0919062000521565b8260009081620000c1919062000794565b508160019081620000d3919062000794565b508060ff1660808160ff1681525050505050600073ffffffffffffffffffffffffffffffffffffffff1683600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905573ffffffffffffffffffffffffffffffffffffffff160362000196576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018d90620008dc565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060a081815250505050505050620008fe565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002538262000208565b810181811067ffffffffffffffff8211171562000275576200027462000219565b5b80604052505050565b60006200028a620001ea565b905062000298828262000248565b919050565b600067ffffffffffffffff821115620002bb57620002ba62000219565b5b620002c68262000208565b9050602081019050919050565b60005b83811015620002f3578082015181840152602081019050620002d6565b60008484015250505050565b60006200031662000310846200029d565b6200027e565b90508281526020810184848401111562000335576200033462000203565b5b62000342848285620002d3565b509392505050565b600082601f830112620003625762000361620001fe565b5b815162000374848260208601620002ff565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003aa826200037d565b9050919050565b620003bc816200039d565b8114620003c857600080fd5b50565b600081519050620003dc81620003b1565b92915050565b6000819050919050565b620003f781620003e2565b81146200040357600080fd5b50565b6000815190506200041781620003ec565b92915050565b600080600080600060a086880312156200043c576200043b620001f4565b5b600086015167ffffffffffffffff8111156200045d576200045c620001f9565b5b6200046b888289016200034a565b955050602086015167ffffffffffffffff8111156200048f576200048e620001f9565b5b6200049d888289016200034a565b9450506040620004b088828901620003cb565b9350506060620004c388828901620003cb565b9250506080620004d68882890162000406565b9150509295509295909350565b600060ff82169050919050565b620004fb81620004e3565b81146200050757600080fd5b50565b6000815190506200051b81620004f0565b92915050565b6000602082840312156200053a5762000539620001f4565b5b60006200054a848285016200050a565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005a657607f821691505b602082108103620005bc57620005bb6200055e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006267fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005e7565b620006328683620005e7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620006756200066f6200066984620003e2565b6200064a565b620003e2565b9050919050565b6000819050919050565b620006918362000654565b620006a9620006a0826200067c565b848454620005f4565b825550505050565b600090565b620006c0620006b1565b620006cd81848462000686565b505050565b5b81811015620006f557620006e9600082620006b6565b600181019050620006d3565b5050565b601f82111562000744576200070e81620005c2565b6200071984620005d7565b8101602085101562000729578190505b620007416200073885620005d7565b830182620006d2565b50505b505050565b600082821c905092915050565b6000620007696000198460080262000749565b1980831691505092915050565b600062000784838362000756565b9150826002028217905092915050565b6200079f8262000553565b67ffffffffffffffff811115620007bb57620007ba62000219565b5b620007c782546200058d565b620007d4828285620006f9565b600060209050601f8311600181146200080c5760008415620007f7578287015190505b62000803858262000776565b86555062000873565b601f1984166200081c86620005c2565b60005b8281101562000846578489015182556001820191506020850194506020810190506200081f565b8683101562000866578489015162000862601f89168262000756565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5244543a433a4f574e45525f5a45524f5f414444524553530000000000000000600082015250565b6000620008c46018836200087b565b9150620008d1826200088c565b602082019050919050565b60006020820190508181036000830152620008f781620008b5565b9050919050565b60805160a051613b4a62000932600039600081816109b5015281816116550152611a7901526000610b730152613b4a6000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063c63d75b6116100c3578063d505accf11610087578063d505accf14610863578063d905777e1461087f578063dd62ed3e146108af578063e13aa990146108df578063e30c397814610910578063ef8b30f71461092e57610274565b8063c63d75b614610797578063c6e6f592146107c7578063ce96cb77146107f7578063d0b06f5d14610827578063d3b5dc3b1461084557610274565b8063a457c2d711610115578063a457c2d71461068b578063a9059cbb146106bb578063b3d7f6b9146106eb578063b460af941461071b578063ba0876521461074b578063c42069ec1461077b57610274565b80637ecebe00146105bf5780638da5cb5b146105ef5780639159b2061461060d57806394bf804d1461063d57806395d89b411461066d57610274565b806338d52e0f116101ea5780634cdad506116101ae5780634cdad506146104c557806350921b23146104f557806360dd37d9146105255780636e553f651461055557806370a082311461058557806379ba5097146105b557610274565b806338d52e0f1461040b57806339509351146104295780633c2f7773146104595780633c9ae2ba14610477578063402d267d1461049557610274565b806311f240ac1161023c57806311f240ac1461034557806318160ddd1461036357806323b872dd1461038157806330adf81f146103b1578063313ce567146103cf5780633644e515146103ed57610274565b806301e1d1141461027957806306fdde031461029757806307a2d13a146102b5578063095ea7b3146102e55780630a28a47714610315575b600080fd5b61028161095e565b60405161028e91906127c6565b60405180910390f35b61029f6109fe565b6040516102ac9190612871565b60405180910390f35b6102cf60048036038101906102ca91906128c4565b610a8c565b6040516102dc91906127c6565b60405180910390f35b6102ff60048036038101906102fa919061294f565b610ac9565b60405161030c91906129aa565b60405180910390f35b61032f600480360381019061032a91906128c4565b610ae0565b60405161033c91906127c6565b60405180910390f35b61034d610b1b565b60405161035a91906127c6565b60405180910390f35b61036b610b21565b60405161037891906127c6565b60405180910390f35b61039b600480360381019061039691906129c5565b610b27565b6040516103a891906129aa565b60405180910390f35b6103b9610b4a565b6040516103c69190612a31565b60405180910390f35b6103d7610b71565b6040516103e49190612a68565b60405180910390f35b6103f5610b95565b6040516104029190612a31565b60405180910390f35b610413610c3d565b6040516104209190612a92565b60405180910390f35b610443600480360381019061043e919061294f565b610c63565b60405161045091906129aa565b60405180910390f35b610461610d01565b60405161046e91906127c6565b60405180910390f35b61047f610d07565b60405161048c91906127c6565b60405180910390f35b6104af60048036038101906104aa9190612aad565b610d0d565b6040516104bc91906127c6565b60405180910390f35b6104df60048036038101906104da91906128c4565b610d37565b6040516104ec91906127c6565b60405180910390f35b61050f600480360381019061050a9190612b32565b610d49565b60405161051c91906127c6565b60405180910390f35b61053f600480360381019061053a9190612bbf565b610e5a565b60405161054c91906127c6565b60405180910390f35b61056f600480360381019061056a9190612c61565b610fa3565b60405161057c91906127c6565b60405180910390f35b61059f600480360381019061059a9190612aad565b611017565b6040516105ac91906127c6565b60405180910390f35b6105bd61102f565b005b6105d960048036038101906105d49190612aad565b6111c0565b6040516105e691906127c6565b60405180910390f35b6105f76111d8565b6040516106049190612a92565b60405180910390f35b61062760048036038101906106229190612aad565b6111fe565b60405161063491906127c6565b60405180910390f35b61065760048036038101906106529190612c61565b61124f565b60405161066491906127c6565b60405180910390f35b6106756112c3565b6040516106829190612871565b60405180910390f35b6106a560048036038101906106a0919061294f565b611351565b6040516106b291906129aa565b60405180910390f35b6106d560048036038101906106d0919061294f565b611368565b6040516106e291906129aa565b60405180910390f35b610705600480360381019061070091906128c4565b61137f565b60405161071291906127c6565b60405180910390f35b61073560048036038101906107309190612ca1565b6113ba565b60405161074291906127c6565b60405180910390f35b61076560048036038101906107609190612ca1565b611430565b60405161077291906127c6565b60405180910390f35b61079560048036038101906107909190612aad565b6114a6565b005b6107b160048036038101906107ac9190612aad565b6115d4565b6040516107be91906127c6565b60405180910390f35b6107e160048036038101906107dc91906128c4565b6115fe565b6040516107ee91906127c6565b60405180910390f35b610811600480360381019061080c9190612aad565b61163b565b60405161081e91906127c6565b60405180910390f35b61082f61164d565b60405161083c91906127c6565b60405180910390f35b61084d611653565b60405161085a91906127c6565b60405180910390f35b61087d60048036038101906108789190612cf4565b611677565b005b61089960048036038101906108949190612aad565b611921565b6040516108a691906127c6565b60405180910390f35b6108c960048036038101906108c49190612d96565b61196a565b6040516108d691906127c6565b60405180910390f35b6108f960048036038101906108f491906128c4565b61198f565b604051610907929190612dd6565b60405180910390f35b610918611bff565b6040516109259190612a92565b60405180910390f35b610948600480360381019061094391906128c4565b611c25565b60405161095591906127c6565b60405180910390f35b600080600a54905060008103610979576009549150506109fb565b6000600c5490506000600b54905060008242116109a157814261099c9190612e2e565b6109ae565b81836109ad9190612e2e565b5b90506009547f000000000000000000000000000000000000000000000000000000000000000082866109e09190612e62565b6109ea9190612ed3565b6109f49190612f04565b9450505050505b90565b60008054610a0b90612f67565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3790612f67565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b505050505081565b600080600254905060008114610abf5780610aa561095e565b84610ab09190612e62565b610aba9190612ed3565b610ac1565b825b915050919050565b6000610ad6338484611c37565b6001905092915050565b600080600254905060008114610b1157610b0c8184610aff9190612e62565b610b0761095e565b611d20565b610b13565b825b915050919050565b60095481565b60025481565b6000610b34843384611d5f565b610b3f848484611e24565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610bc7919061303b565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001610c22959493929190613052565b60405160208183030381529060405280519060200120905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cf7338484600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cf29190612f04565b611c37565b6001905092915050565b600c5481565b600a5481565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000610d4282610a8c565b9050919050565b60006001600d5414610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906130f1565b60405180910390fd5b6002600d81905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf33308a898989896040518863ffffffff1660e01b8152600401610dff9796959493929190613111565b600060405180830381600087803b158015610e1957600080fd5b505af1158015610e2d573d6000803e3d6000fd5b50505050610e48610e3d88611c25565b915081888833611f31565b6001600d819055509695505050505050565b60006001600d5414610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e98906130f1565b60405180910390fd5b6002600d8190555085610eb38961137f565b9150811115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906131cc565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333089898989896040518863ffffffff1660e01b8152600401610f5e9796959493929190613111565b600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050506001600d81905550979650505050505050565b60006001600d5414610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1906130f1565b60405180910390fd5b6002600d81905550611009610ffe84611c25565b915081848433611f31565b6001600d8190555092915050565b60036020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b690613238565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c60405160405180910390a333600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611248600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8c565b9050919050565b60006001600d5414611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130f1565b60405180910390fd5b6002600d819055506112b5836112ab8561137f565b9250828433611f31565b6001600d8190555092915050565b600180546112d090612f67565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90612f67565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b505050505081565b600061135e338484611d5f565b6001905092915050565b6000611375338484611e24565b6001905092915050565b6000806002549050600081146113b0576113ab61139a61095e565b846113a59190612e62565b82611d20565b6113b2565b825b915050919050565b60006001600d5414611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906130f1565b60405180910390fd5b6002600d8190555061142161141585610ae0565b9150818585853361216d565b6001600d819055509392505050565b60006001600d5414611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906130f1565b60405180910390fd5b6002600d819055506114978461148c86610d37565b92508285853361216d565b6001600d819055509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906132a4565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f60405160405180910390a350565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000806002549050600081146116315761161661095e565b81846116229190612e62565b61162c9190612ed3565b611633565b825b915050919050565b6000611646826111fe565b9050919050565b600b5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b428410156116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190613310565b60405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08160001c111580156116fe5750601b8360ff1614806116fd5750601c8360ff16145b5b61173d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117349061337c565b60405180910390fd5b6000611747610b95565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016117d29695949392919061339c565b604051602081830303815290604052805190602001206040516020016117f9929190613475565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161183694939291906134ac565b6020604051602081039080840390855afa158015611858573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480156118cc5750600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b61190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061353d565b60405180910390fd5b5050611918878787611c37565b50505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906135a9565b60405180910390fd5b600060025403611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613615565b60405180910390fd5b611a6f61095e565b60098190559050827f000000000000000000000000000000000000000000000000000000000000000082600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611af49190612a92565b602060405180830381865afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b35919061364a565b611b3f9190612e2e565b611b499190612e62565b611b539190612ed3565b600a81905591508242600b819055611b6b9190612f04565b600c819055507f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8183604051611ba2929190612dd6565b60405180910390a13373ffffffffffffffffffffffffffffffffffffffff167f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab3600c54604051611bf291906127c6565b60405180910390a2915091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c30826115fe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055604051611d1391906127c6565b60405180910390a3505050565b6000808284611d2f9190613677565b11611d3b576000611d3e565b60015b60ff168284611d4d9190612ed3565b611d579190612f04565b905092915050565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e1e57611e1d84848484611e189190612e2e565b611c37565b5b50505050565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e739190612e2e565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f2491906127c6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906136f4565b60405180910390fd5b60008403611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613760565b60405180910390fd5b60008303612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d906137cc565b60405180910390fd5b61203082856123ff565b60008361203b61095e565b6120459190612f04565b6009819055905060006120566124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d787896040516120b7929190612dd6565b60405180910390a37f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa82826040516120f0929190612dd6565b60405180910390a1612126600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168430886124f4565b612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613838565b60405180910390fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d3906138a4565b60405180910390fd5b6000850361221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690613910565b60405180910390fd5b60008403612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599061397c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122a1576122a0828287611d5f565b5b6122ab8286612583565b6000846122b661095e565b6122c09190612e2e565b6009819055905060006122d16124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b604051612349929190612dd6565b60405180910390a47f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8282604051612382929190612dd6565b60405180910390a16123b7600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168688612653565b6123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906139e8565b60405180910390fd5b50505050505050565b80600260008282546124119190612f04565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124c391906127c6565b60405180910390a35050565b6000600c5442600b819055116124e757600a546124ea565b60005b600a819055905090565b6000612579856323b872dd60e01b86868660405160240161251793929190613a08565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b9050949350505050565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d29190612e2e565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161264791906127c6565b60405180910390a35050565b60006126d68463a9059cbb60e01b8585604051602401612674929190613a3f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b90509392505050565b6000808373ffffffffffffffffffffffffffffffffffffffff163b0361270857600090506127a7565b60608373ffffffffffffffffffffffffffffffffffffffff168360405161272f9190613aa4565b6000604051808303816000865af19150503d806000811461276c576040519150601f19603f3d011682016040523d82523d6000602084013e612771565b606091505b5080925081935050508180156127a357506000815114806127a25750808060200190518101906127a19190613ae7565b5b5b9150505b92915050565b6000819050919050565b6127c0816127ad565b82525050565b60006020820190506127db60008301846127b7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281b578082015181840152602081019050612800565b60008484015250505050565b6000601f19601f8301169050919050565b6000612843826127e1565b61284d81856127ec565b935061285d8185602086016127fd565b61286681612827565b840191505092915050565b6000602082019050818103600083015261288b8184612838565b905092915050565b600080fd5b6128a1816127ad565b81146128ac57600080fd5b50565b6000813590506128be81612898565b92915050565b6000602082840312156128da576128d9612893565b5b60006128e8848285016128af565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061291c826128f1565b9050919050565b61292c81612911565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b6000806040838503121561296657612965612893565b5b60006129748582860161293a565b9250506020612985858286016128af565b9150509250929050565b60008115159050919050565b6129a48161298f565b82525050565b60006020820190506129bf600083018461299b565b92915050565b6000806000606084860312156129de576129dd612893565b5b60006129ec8682870161293a565b93505060206129fd8682870161293a565b9250506040612a0e868287016128af565b9150509250925092565b6000819050919050565b612a2b81612a18565b82525050565b6000602082019050612a466000830184612a22565b92915050565b600060ff82169050919050565b612a6281612a4c565b82525050565b6000602082019050612a7d6000830184612a59565b92915050565b612a8c81612911565b82525050565b6000602082019050612aa76000830184612a83565b92915050565b600060208284031215612ac357612ac2612893565b5b6000612ad18482850161293a565b91505092915050565b612ae381612a4c565b8114612aee57600080fd5b50565b600081359050612b0081612ada565b92915050565b612b0f81612a18565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060008060008060c08789031215612b4f57612b4e612893565b5b6000612b5d89828a016128af565b9650506020612b6e89828a0161293a565b9550506040612b7f89828a016128af565b9450506060612b9089828a01612af1565b9350506080612ba189828a01612b1d565b92505060a0612bb289828a01612b1d565b9150509295509295509295565b600080600080600080600060e0888a031215612bde57612bdd612893565b5b6000612bec8a828b016128af565b9750506020612bfd8a828b0161293a565b9650506040612c0e8a828b016128af565b9550506060612c1f8a828b016128af565b9450506080612c308a828b01612af1565b93505060a0612c418a828b01612b1d565b92505060c0612c528a828b01612b1d565b91505092959891949750929550565b60008060408385031215612c7857612c77612893565b5b6000612c86858286016128af565b9250506020612c978582860161293a565b9150509250929050565b600080600060608486031215612cba57612cb9612893565b5b6000612cc8868287016128af565b9350506020612cd98682870161293a565b9250506040612cea8682870161293a565b9150509250925092565b600080600080600080600060e0888a031215612d1357612d12612893565b5b6000612d218a828b0161293a565b9750506020612d328a828b0161293a565b9650506040612d438a828b016128af565b9550506060612d548a828b016128af565b9450506080612d658a828b01612af1565b93505060a0612d768a828b01612b1d565b92505060c0612d878a828b01612b1d565b91505092959891949750929550565b60008060408385031215612dad57612dac612893565b5b6000612dbb8582860161293a565b9250506020612dcc8582860161293a565b9150509250929050565b6000604082019050612deb60008301856127b7565b612df860208301846127b7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e39826127ad565b9150612e44836127ad565b9250828203905081811115612e5c57612e5b612dff565b5b92915050565b6000612e6d826127ad565b9150612e78836127ad565b9250828202612e86816127ad565b91508282048414831517612e9d57612e9c612dff565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ede826127ad565b9150612ee9836127ad565b925082612ef957612ef8612ea4565b5b828204905092915050565b6000612f0f826127ad565b9150612f1a836127ad565b9250828201905080821115612f3257612f31612dff565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7f57607f821691505b602082108103612f9257612f91612f38565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612fc581612f67565b612fcf8186612f98565b94506001821660008114612fea5760018114612fff57613032565b60ff1983168652811515820286019350613032565b61300885612fa3565b60005b8381101561302a5781548189015260018201915060208101905061300b565b838801955050505b50505092915050565b60006130478284612fb8565b915081905092915050565b600060a0820190506130676000830188612a22565b6130746020830187612a22565b6130816040830186612a22565b61308e60608301856127b7565b61309b6080830184612a83565b9695505050505050565b7f5244543a4c4f434b454400000000000000000000000000000000000000000000600082015250565b60006130db600a836127ec565b91506130e6826130a5565b602082019050919050565b6000602082019050818103600083015261310a816130ce565b9050919050565b600060e082019050613126600083018a612a83565b6131336020830189612a83565b61314060408301886127b7565b61314d60608301876127b7565b61315a6080830186612a59565b61316760a0830185612a22565b61317460c0830184612a22565b98975050505050505050565b7f5244543a4d57503a494e53554646494349454e545f5045524d49540000000000600082015250565b60006131b6601b836127ec565b91506131c182613180565b602082019050919050565b600060208201905081810360008301526131e5816131a9565b9050919050565b7f5244543a414f3a4e4f545f504f00000000000000000000000000000000000000600082015250565b6000613222600d836127ec565b915061322d826131ec565b602082019050919050565b6000602082019050818103600083015261325181613215565b9050919050565b7f5244543a53504f3a4e4f545f4f574e4552000000000000000000000000000000600082015250565b600061328e6011836127ec565b915061329982613258565b602082019050919050565b600060208201905081810360008301526132bd81613281565b9050919050565b7f45524332303a503a455850495245440000000000000000000000000000000000600082015250565b60006132fa600f836127ec565b9150613305826132c4565b602082019050919050565b60006020820190508181036000830152613329816132ed565b9050919050565b7f45524332303a503a4d414c4c4541424c45000000000000000000000000000000600082015250565b60006133666011836127ec565b915061337182613330565b602082019050919050565b6000602082019050818103600083015261339581613359565b9050919050565b600060c0820190506133b16000830189612a22565b6133be6020830188612a83565b6133cb6040830187612a83565b6133d860608301866127b7565b6133e560808301856127b7565b6133f260a08301846127b7565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061343e6002836133fd565b915061344982613408565b600282019050919050565b6000819050919050565b61346f61346a82612a18565b613454565b82525050565b600061348082613431565b915061348c828561345e565b60208201915061349c828461345e565b6020820191508190509392505050565b60006080820190506134c16000830187612a22565b6134ce6020830186612a59565b6134db6040830185612a22565b6134e86060830184612a22565b95945050505050565b7f45524332303a503a494e56414c49445f5349474e415455524500000000000000600082015250565b60006135276019836127ec565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f5244543a5556533a4e4f545f4f574e4552000000000000000000000000000000600082015250565b60006135936011836127ec565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f5244543a5556533a5a45524f5f535550504c5900000000000000000000000000600082015250565b60006135ff6013836127ec565b915061360a826135c9565b602082019050919050565b6000602082019050818103600083015261362e816135f2565b9050919050565b60008151905061364481612898565b92915050565b6000602082840312156136605761365f612893565b5b600061366e84828501613635565b91505092915050565b6000613682826127ad565b915061368d836127ad565b92508261369d5761369c612ea4565b5b828206905092915050565b7f5244543a4d3a5a45524f5f524543454956455200000000000000000000000000600082015250565b60006136de6013836127ec565b91506136e9826136a8565b602082019050919050565b6000602082019050818103600083015261370d816136d1565b9050919050565b7f5244543a4d3a5a45524f5f534841524553000000000000000000000000000000600082015250565b600061374a6011836127ec565b915061375582613714565b602082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b7f5244543a4d3a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006137b66011836127ec565b91506137c182613780565b602082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b7f5244543a4d3a5452414e534645525f46524f4d00000000000000000000000000600082015250565b60006138226013836127ec565b915061382d826137ec565b602082019050919050565b6000602082019050818103600083015261385181613815565b9050919050565b7f5244543a423a5a45524f5f524543454956455200000000000000000000000000600082015250565b600061388e6013836127ec565b915061389982613858565b602082019050919050565b600060208201905081810360008301526138bd81613881565b9050919050565b7f5244543a423a5a45524f5f534841524553000000000000000000000000000000600082015250565b60006138fa6011836127ec565b9150613905826138c4565b602082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f5244543a423a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006139666011836127ec565b915061397182613930565b602082019050919050565b6000602082019050818103600083015261399581613959565b9050919050565b7f5244543a423a5452414e53464552000000000000000000000000000000000000600082015250565b60006139d2600e836127ec565b91506139dd8261399c565b602082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b6000606082019050613a1d6000830186612a83565b613a2a6020830185612a83565b613a3760408301846127b7565b949350505050565b6000604082019050613a546000830185612a83565b613a6160208301846127b7565b9392505050565b600081519050919050565b6000613a7e82613a68565b613a888185612f98565b9350613a988185602086016127fd565b80840191505092915050565b6000613ab08284613a73565b915081905092915050565b613ac48161298f565b8114613acf57600080fd5b50565b600081519050613ae181613abb565b92915050565b600060208284031215613afd57613afc612893565b5b6000613b0b84828501613ad2565b9150509291505056fea264697066735822122040f82169d54fd3be0764aa41225bc5aae7e179a3bcf93208ca2be357cc5b821e64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a8c2111fa095d07facc7d963cc752c253504c2de000000000000000000000000caa79bf8b1d00bf3d4f6dbec6221955871c04618000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000000000000000000000000000a43524f43205661756c740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057843524f43000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063c63d75b6116100c3578063d505accf11610087578063d505accf14610863578063d905777e1461087f578063dd62ed3e146108af578063e13aa990146108df578063e30c397814610910578063ef8b30f71461092e57610274565b8063c63d75b614610797578063c6e6f592146107c7578063ce96cb77146107f7578063d0b06f5d14610827578063d3b5dc3b1461084557610274565b8063a457c2d711610115578063a457c2d71461068b578063a9059cbb146106bb578063b3d7f6b9146106eb578063b460af941461071b578063ba0876521461074b578063c42069ec1461077b57610274565b80637ecebe00146105bf5780638da5cb5b146105ef5780639159b2061461060d57806394bf804d1461063d57806395d89b411461066d57610274565b806338d52e0f116101ea5780634cdad506116101ae5780634cdad506146104c557806350921b23146104f557806360dd37d9146105255780636e553f651461055557806370a082311461058557806379ba5097146105b557610274565b806338d52e0f1461040b57806339509351146104295780633c2f7773146104595780633c9ae2ba14610477578063402d267d1461049557610274565b806311f240ac1161023c57806311f240ac1461034557806318160ddd1461036357806323b872dd1461038157806330adf81f146103b1578063313ce567146103cf5780633644e515146103ed57610274565b806301e1d1141461027957806306fdde031461029757806307a2d13a146102b5578063095ea7b3146102e55780630a28a47714610315575b600080fd5b61028161095e565b60405161028e91906127c6565b60405180910390f35b61029f6109fe565b6040516102ac9190612871565b60405180910390f35b6102cf60048036038101906102ca91906128c4565b610a8c565b6040516102dc91906127c6565b60405180910390f35b6102ff60048036038101906102fa919061294f565b610ac9565b60405161030c91906129aa565b60405180910390f35b61032f600480360381019061032a91906128c4565b610ae0565b60405161033c91906127c6565b60405180910390f35b61034d610b1b565b60405161035a91906127c6565b60405180910390f35b61036b610b21565b60405161037891906127c6565b60405180910390f35b61039b600480360381019061039691906129c5565b610b27565b6040516103a891906129aa565b60405180910390f35b6103b9610b4a565b6040516103c69190612a31565b60405180910390f35b6103d7610b71565b6040516103e49190612a68565b60405180910390f35b6103f5610b95565b6040516104029190612a31565b60405180910390f35b610413610c3d565b6040516104209190612a92565b60405180910390f35b610443600480360381019061043e919061294f565b610c63565b60405161045091906129aa565b60405180910390f35b610461610d01565b60405161046e91906127c6565b60405180910390f35b61047f610d07565b60405161048c91906127c6565b60405180910390f35b6104af60048036038101906104aa9190612aad565b610d0d565b6040516104bc91906127c6565b60405180910390f35b6104df60048036038101906104da91906128c4565b610d37565b6040516104ec91906127c6565b60405180910390f35b61050f600480360381019061050a9190612b32565b610d49565b60405161051c91906127c6565b60405180910390f35b61053f600480360381019061053a9190612bbf565b610e5a565b60405161054c91906127c6565b60405180910390f35b61056f600480360381019061056a9190612c61565b610fa3565b60405161057c91906127c6565b60405180910390f35b61059f600480360381019061059a9190612aad565b611017565b6040516105ac91906127c6565b60405180910390f35b6105bd61102f565b005b6105d960048036038101906105d49190612aad565b6111c0565b6040516105e691906127c6565b60405180910390f35b6105f76111d8565b6040516106049190612a92565b60405180910390f35b61062760048036038101906106229190612aad565b6111fe565b60405161063491906127c6565b60405180910390f35b61065760048036038101906106529190612c61565b61124f565b60405161066491906127c6565b60405180910390f35b6106756112c3565b6040516106829190612871565b60405180910390f35b6106a560048036038101906106a0919061294f565b611351565b6040516106b291906129aa565b60405180910390f35b6106d560048036038101906106d0919061294f565b611368565b6040516106e291906129aa565b60405180910390f35b610705600480360381019061070091906128c4565b61137f565b60405161071291906127c6565b60405180910390f35b61073560048036038101906107309190612ca1565b6113ba565b60405161074291906127c6565b60405180910390f35b61076560048036038101906107609190612ca1565b611430565b60405161077291906127c6565b60405180910390f35b61079560048036038101906107909190612aad565b6114a6565b005b6107b160048036038101906107ac9190612aad565b6115d4565b6040516107be91906127c6565b60405180910390f35b6107e160048036038101906107dc91906128c4565b6115fe565b6040516107ee91906127c6565b60405180910390f35b610811600480360381019061080c9190612aad565b61163b565b60405161081e91906127c6565b60405180910390f35b61082f61164d565b60405161083c91906127c6565b60405180910390f35b61084d611653565b60405161085a91906127c6565b60405180910390f35b61087d60048036038101906108789190612cf4565b611677565b005b61089960048036038101906108949190612aad565b611921565b6040516108a691906127c6565b60405180910390f35b6108c960048036038101906108c49190612d96565b61196a565b6040516108d691906127c6565b60405180910390f35b6108f960048036038101906108f491906128c4565b61198f565b604051610907929190612dd6565b60405180910390f35b610918611bff565b6040516109259190612a92565b60405180910390f35b610948600480360381019061094391906128c4565b611c25565b60405161095591906127c6565b60405180910390f35b600080600a54905060008103610979576009549150506109fb565b6000600c5490506000600b54905060008242116109a157814261099c9190612e2e565b6109ae565b81836109ad9190612e2e565b5b90506009547f000000000000000000000000000000000000000c9f2c9cd04674edea4000000082866109e09190612e62565b6109ea9190612ed3565b6109f49190612f04565b9450505050505b90565b60008054610a0b90612f67565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3790612f67565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b505050505081565b600080600254905060008114610abf5780610aa561095e565b84610ab09190612e62565b610aba9190612ed3565b610ac1565b825b915050919050565b6000610ad6338484611c37565b6001905092915050565b600080600254905060008114610b1157610b0c8184610aff9190612e62565b610b0761095e565b611d20565b610b13565b825b915050919050565b60095481565b60025481565b6000610b34843384611d5f565b610b3f848484611e24565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b81565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610bc7919061303b565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001610c22959493929190613052565b60405160208183030381529060405280519060200120905090565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cf7338484600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cf29190612f04565b611c37565b6001905092915050565b600c5481565b600a5481565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000610d4282610a8c565b9050919050565b60006001600d5414610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d87906130f1565b60405180910390fd5b6002600d81905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf33308a898989896040518863ffffffff1660e01b8152600401610dff9796959493929190613111565b600060405180830381600087803b158015610e1957600080fd5b505af1158015610e2d573d6000803e3d6000fd5b50505050610e48610e3d88611c25565b915081888833611f31565b6001600d819055509695505050505050565b60006001600d5414610ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e98906130f1565b60405180910390fd5b6002600d8190555085610eb38961137f565b9150811115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906131cc565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333089898989896040518863ffffffff1660e01b8152600401610f5e9796959493929190613111565b600060405180830381600087803b158015610f7857600080fd5b505af1158015610f8c573d6000803e3d6000fd5b505050506001600d81905550979650505050505050565b60006001600d5414610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe1906130f1565b60405180910390fd5b6002600d81905550611009610ffe84611c25565b915081848433611f31565b6001600d8190555092915050565b60036020528060005260406000206000915090505481565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b690613238565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c60405160405180910390a333600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60056020528060005260406000206000915090505481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611248600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8c565b9050919050565b60006001600d5414611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d906130f1565b60405180910390fd5b6002600d819055506112b5836112ab8561137f565b9250828433611f31565b6001600d8190555092915050565b600180546112d090612f67565b80601f01602080910402602001604051908101604052809291908181526020018280546112fc90612f67565b80156113495780601f1061131e57610100808354040283529160200191611349565b820191906000526020600020905b81548152906001019060200180831161132c57829003601f168201915b505050505081565b600061135e338484611d5f565b6001905092915050565b6000611375338484611e24565b6001905092915050565b6000806002549050600081146113b0576113ab61139a61095e565b846113a59190612e62565b82611d20565b6113b2565b825b915050919050565b60006001600d5414611401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f8906130f1565b60405180910390fd5b6002600d8190555061142161141585610ae0565b9150818585853361216d565b6001600d819055509392505050565b60006001600d5414611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906130f1565b60405180910390fd5b6002600d819055506114978461148c86610d37565b92508285853361216d565b6001600d819055509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906132a4565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f60405160405180910390a350565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9050919050565b6000806002549050600081146116315761161661095e565b81846116229190612e62565b61162c9190612ed3565b611633565b825b915050919050565b6000611646826111fe565b9050919050565b600b5481565b7f000000000000000000000000000000000000000c9f2c9cd04674edea4000000081565b428410156116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190613310565b60405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08160001c111580156116fe5750601b8360ff1614806116fd5750601c8360ff16145b5b61173d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117349061337c565b60405180910390fd5b6000611747610b95565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960001b898989600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558a6040516020016117d29695949392919061339c565b604051602081830303815290604052805190602001206040516020016117f9929190613475565b60405160208183030381529060405280519060200120905060006001828686866040516000815260200160405260405161183694939291906134ac565b6020604051602081039080840390855afa158015611858573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480156118cc5750600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b61190b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119029061353d565b60405180910390fd5b5050611918878787611c37565b50505050505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6004602052816000526040600020602052806000526040600020600091509150505481565b600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a19906135a9565b60405180910390fd5b600060025403611a67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5e90613615565b60405180910390fd5b611a6f61095e565b60098190559050827f000000000000000000000000000000000000000c9f2c9cd04674edea4000000082600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611af49190612a92565b602060405180830381865afa158015611b11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b35919061364a565b611b3f9190612e2e565b611b499190612e62565b611b539190612ed3565b600a81905591508242600b819055611b6b9190612f04565b600c819055507f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8183604051611ba2929190612dd6565b60405180910390a13373ffffffffffffffffffffffffffffffffffffffff167f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab3600c54604051611bf291906127c6565b60405180910390a2915091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611c30826115fe565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055604051611d1391906127c6565b60405180910390a3505050565b6000808284611d2f9190613677565b11611d3b576000611d3e565b60015b60ff168284611d4d9190612ed3565b611d579190612f04565b905092915050565b6000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e1e57611e1d84848484611e189190612e2e565b611c37565b5b50505050565b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e739190612e2e565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f2491906127c6565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f97906136f4565b60405180910390fd5b60008403611fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fda90613760565b60405180910390fd5b60008303612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d906137cc565b60405180910390fd5b61203082856123ff565b60008361203b61095e565b6120459190612f04565b6009819055905060006120566124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d787896040516120b7929190612dd6565b60405180910390a37f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa82826040516120f0929190612dd6565b60405180910390a1612126600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168430886124f4565b612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c90613838565b60405180910390fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036121dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d3906138a4565b60405180910390fd5b6000850361221f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221690613910565b60405180910390fd5b60008403612262576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122599061397c565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122a1576122a0828287611d5f565b5b6122ab8286612583565b6000846122b661095e565b6122c09190612e2e565b6009819055905060006122d16124cf565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b604051612349929190612dd6565b60405180910390a47f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa8282604051612382929190612dd6565b60405180910390a16123b7600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168688612653565b6123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed906139e8565b60405180910390fd5b50505050505050565b80600260008282546124119190612f04565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124c391906127c6565b60405180910390a35050565b6000600c5442600b819055116124e757600a546124ea565b60005b600a819055905090565b6000612579856323b872dd60e01b86868660405160240161251793929190613a08565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b9050949350505050565b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125d29190612e2e565b9250508190555080600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161264791906127c6565b60405180910390a35050565b60006126d68463a9059cbb60e01b8585604051602401612674929190613a3f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506126df565b90509392505050565b6000808373ffffffffffffffffffffffffffffffffffffffff163b0361270857600090506127a7565b60608373ffffffffffffffffffffffffffffffffffffffff168360405161272f9190613aa4565b6000604051808303816000865af19150503d806000811461276c576040519150601f19603f3d011682016040523d82523d6000602084013e612771565b606091505b5080925081935050508180156127a357506000815114806127a25750808060200190518101906127a19190613ae7565b5b5b9150505b92915050565b6000819050919050565b6127c0816127ad565b82525050565b60006020820190506127db60008301846127b7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281b578082015181840152602081019050612800565b60008484015250505050565b6000601f19601f8301169050919050565b6000612843826127e1565b61284d81856127ec565b935061285d8185602086016127fd565b61286681612827565b840191505092915050565b6000602082019050818103600083015261288b8184612838565b905092915050565b600080fd5b6128a1816127ad565b81146128ac57600080fd5b50565b6000813590506128be81612898565b92915050565b6000602082840312156128da576128d9612893565b5b60006128e8848285016128af565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061291c826128f1565b9050919050565b61292c81612911565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b6000806040838503121561296657612965612893565b5b60006129748582860161293a565b9250506020612985858286016128af565b9150509250929050565b60008115159050919050565b6129a48161298f565b82525050565b60006020820190506129bf600083018461299b565b92915050565b6000806000606084860312156129de576129dd612893565b5b60006129ec8682870161293a565b93505060206129fd8682870161293a565b9250506040612a0e868287016128af565b9150509250925092565b6000819050919050565b612a2b81612a18565b82525050565b6000602082019050612a466000830184612a22565b92915050565b600060ff82169050919050565b612a6281612a4c565b82525050565b6000602082019050612a7d6000830184612a59565b92915050565b612a8c81612911565b82525050565b6000602082019050612aa76000830184612a83565b92915050565b600060208284031215612ac357612ac2612893565b5b6000612ad18482850161293a565b91505092915050565b612ae381612a4c565b8114612aee57600080fd5b50565b600081359050612b0081612ada565b92915050565b612b0f81612a18565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060008060008060c08789031215612b4f57612b4e612893565b5b6000612b5d89828a016128af565b9650506020612b6e89828a0161293a565b9550506040612b7f89828a016128af565b9450506060612b9089828a01612af1565b9350506080612ba189828a01612b1d565b92505060a0612bb289828a01612b1d565b9150509295509295509295565b600080600080600080600060e0888a031215612bde57612bdd612893565b5b6000612bec8a828b016128af565b9750506020612bfd8a828b0161293a565b9650506040612c0e8a828b016128af565b9550506060612c1f8a828b016128af565b9450506080612c308a828b01612af1565b93505060a0612c418a828b01612b1d565b92505060c0612c528a828b01612b1d565b91505092959891949750929550565b60008060408385031215612c7857612c77612893565b5b6000612c86858286016128af565b9250506020612c978582860161293a565b9150509250929050565b600080600060608486031215612cba57612cb9612893565b5b6000612cc8868287016128af565b9350506020612cd98682870161293a565b9250506040612cea8682870161293a565b9150509250925092565b600080600080600080600060e0888a031215612d1357612d12612893565b5b6000612d218a828b0161293a565b9750506020612d328a828b0161293a565b9650506040612d438a828b016128af565b9550506060612d548a828b016128af565b9450506080612d658a828b01612af1565b93505060a0612d768a828b01612b1d565b92505060c0612d878a828b01612b1d565b91505092959891949750929550565b60008060408385031215612dad57612dac612893565b5b6000612dbb8582860161293a565b9250506020612dcc8582860161293a565b9150509250929050565b6000604082019050612deb60008301856127b7565b612df860208301846127b7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e39826127ad565b9150612e44836127ad565b9250828203905081811115612e5c57612e5b612dff565b5b92915050565b6000612e6d826127ad565b9150612e78836127ad565b9250828202612e86816127ad565b91508282048414831517612e9d57612e9c612dff565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ede826127ad565b9150612ee9836127ad565b925082612ef957612ef8612ea4565b5b828204905092915050565b6000612f0f826127ad565b9150612f1a836127ad565b9250828201905080821115612f3257612f31612dff565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f7f57607f821691505b602082108103612f9257612f91612f38565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612fc581612f67565b612fcf8186612f98565b94506001821660008114612fea5760018114612fff57613032565b60ff1983168652811515820286019350613032565b61300885612fa3565b60005b8381101561302a5781548189015260018201915060208101905061300b565b838801955050505b50505092915050565b60006130478284612fb8565b915081905092915050565b600060a0820190506130676000830188612a22565b6130746020830187612a22565b6130816040830186612a22565b61308e60608301856127b7565b61309b6080830184612a83565b9695505050505050565b7f5244543a4c4f434b454400000000000000000000000000000000000000000000600082015250565b60006130db600a836127ec565b91506130e6826130a5565b602082019050919050565b6000602082019050818103600083015261310a816130ce565b9050919050565b600060e082019050613126600083018a612a83565b6131336020830189612a83565b61314060408301886127b7565b61314d60608301876127b7565b61315a6080830186612a59565b61316760a0830185612a22565b61317460c0830184612a22565b98975050505050505050565b7f5244543a4d57503a494e53554646494349454e545f5045524d49540000000000600082015250565b60006131b6601b836127ec565b91506131c182613180565b602082019050919050565b600060208201905081810360008301526131e5816131a9565b9050919050565b7f5244543a414f3a4e4f545f504f00000000000000000000000000000000000000600082015250565b6000613222600d836127ec565b915061322d826131ec565b602082019050919050565b6000602082019050818103600083015261325181613215565b9050919050565b7f5244543a53504f3a4e4f545f4f574e4552000000000000000000000000000000600082015250565b600061328e6011836127ec565b915061329982613258565b602082019050919050565b600060208201905081810360008301526132bd81613281565b9050919050565b7f45524332303a503a455850495245440000000000000000000000000000000000600082015250565b60006132fa600f836127ec565b9150613305826132c4565b602082019050919050565b60006020820190508181036000830152613329816132ed565b9050919050565b7f45524332303a503a4d414c4c4541424c45000000000000000000000000000000600082015250565b60006133666011836127ec565b915061337182613330565b602082019050919050565b6000602082019050818103600083015261339581613359565b9050919050565b600060c0820190506133b16000830189612a22565b6133be6020830188612a83565b6133cb6040830187612a83565b6133d860608301866127b7565b6133e560808301856127b7565b6133f260a08301846127b7565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061343e6002836133fd565b915061344982613408565b600282019050919050565b6000819050919050565b61346f61346a82612a18565b613454565b82525050565b600061348082613431565b915061348c828561345e565b60208201915061349c828461345e565b6020820191508190509392505050565b60006080820190506134c16000830187612a22565b6134ce6020830186612a59565b6134db6040830185612a22565b6134e86060830184612a22565b95945050505050565b7f45524332303a503a494e56414c49445f5349474e415455524500000000000000600082015250565b60006135276019836127ec565b9150613532826134f1565b602082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f5244543a5556533a4e4f545f4f574e4552000000000000000000000000000000600082015250565b60006135936011836127ec565b915061359e8261355d565b602082019050919050565b600060208201905081810360008301526135c281613586565b9050919050565b7f5244543a5556533a5a45524f5f535550504c5900000000000000000000000000600082015250565b60006135ff6013836127ec565b915061360a826135c9565b602082019050919050565b6000602082019050818103600083015261362e816135f2565b9050919050565b60008151905061364481612898565b92915050565b6000602082840312156136605761365f612893565b5b600061366e84828501613635565b91505092915050565b6000613682826127ad565b915061368d836127ad565b92508261369d5761369c612ea4565b5b828206905092915050565b7f5244543a4d3a5a45524f5f524543454956455200000000000000000000000000600082015250565b60006136de6013836127ec565b91506136e9826136a8565b602082019050919050565b6000602082019050818103600083015261370d816136d1565b9050919050565b7f5244543a4d3a5a45524f5f534841524553000000000000000000000000000000600082015250565b600061374a6011836127ec565b915061375582613714565b602082019050919050565b600060208201905081810360008301526137798161373d565b9050919050565b7f5244543a4d3a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006137b66011836127ec565b91506137c182613780565b602082019050919050565b600060208201905081810360008301526137e5816137a9565b9050919050565b7f5244543a4d3a5452414e534645525f46524f4d00000000000000000000000000600082015250565b60006138226013836127ec565b915061382d826137ec565b602082019050919050565b6000602082019050818103600083015261385181613815565b9050919050565b7f5244543a423a5a45524f5f524543454956455200000000000000000000000000600082015250565b600061388e6013836127ec565b915061389982613858565b602082019050919050565b600060208201905081810360008301526138bd81613881565b9050919050565b7f5244543a423a5a45524f5f534841524553000000000000000000000000000000600082015250565b60006138fa6011836127ec565b9150613905826138c4565b602082019050919050565b60006020820190508181036000830152613929816138ed565b9050919050565b7f5244543a423a5a45524f5f415353455453000000000000000000000000000000600082015250565b60006139666011836127ec565b915061397182613930565b602082019050919050565b6000602082019050818103600083015261399581613959565b9050919050565b7f5244543a423a5452414e53464552000000000000000000000000000000000000600082015250565b60006139d2600e836127ec565b91506139dd8261399c565b602082019050919050565b60006020820190508181036000830152613a01816139c5565b9050919050565b6000606082019050613a1d6000830186612a83565b613a2a6020830185612a83565b613a3760408301846127b7565b949350505050565b6000604082019050613a546000830185612a83565b613a6160208301846127b7565b9392505050565b600081519050919050565b6000613a7e82613a68565b613a888185612f98565b9350613a988185602086016127fd565b80840191505092915050565b6000613ab08284613a73565b915081905092915050565b613ac48161298f565b8114613acf57600080fd5b50565b600081519050613ae181613abb565b92915050565b600060208284031215613afd57613afc612893565b5b6000613b0b84828501613ad2565b9150509291505056fea264697066735822122040f82169d54fd3be0764aa41225bc5aae7e179a3bcf93208ca2be357cc5b821e64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000a8c2111fa095d07facc7d963cc752c253504c2de000000000000000000000000caa79bf8b1d00bf3d4f6dbec6221955871c04618000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000000000000000000000000000000a43524f43205661756c740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057843524f43000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): CROC Vault
Arg [1] : symbol_ (string): xCROC
Arg [2] : owner_ (address): 0xa8C2111FA095D07FACC7d963cC752C253504C2De
Arg [3] : asset_ (address): 0xcaa79Bf8B1d00Bf3D4f6dbEC6221955871C04618
Arg [4] : precision_ (uint256): 1000000000000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000a8c2111fa095d07facc7d963cc752c253504c2de
Arg [3] : 000000000000000000000000caa79bf8b1d00bf3d4f6dbec6221955871c04618
Arg [4] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 43524f43205661756c7400000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 7843524f43000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.