Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 13,188 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Batch Mint | 8213186 | 296 days ago | IN | 0 ETH | 0.01257308 | ||||
| Batch Mint | 8212532 | 296 days ago | IN | 0 ETH | 0.00772248 | ||||
| Batch Mint | 8211117 | 296 days ago | IN | 0 ETH | 0.00486973 | ||||
| Batch Mint | 8208320 | 296 days ago | IN | 0 ETH | 0.00004344 | ||||
| Batch Mint | 8207806 | 296 days ago | IN | 0 ETH | 0.00083643 | ||||
| Batch Mint | 8206923 | 297 days ago | IN | 0 ETH | 0.00484253 | ||||
| Batch Mint | 8201013 | 297 days ago | IN | 0 ETH | 0.0003365 | ||||
| Batch Mint | 8200954 | 297 days ago | IN | 0 ETH | 0.00073806 | ||||
| Batch Mint | 8199868 | 298 days ago | IN | 0 ETH | 0.01602239 | ||||
| Batch Mint | 8199786 | 298 days ago | IN | 0 ETH | 0.02575675 | ||||
| Batch Mint | 8199784 | 298 days ago | IN | 0 ETH | 0.02575675 | ||||
| Batch Mint | 8199714 | 298 days ago | IN | 0 ETH | 0.00857618 | ||||
| Batch Mint | 8199428 | 298 days ago | IN | 0 ETH | 0.00449337 | ||||
| Batch Mint | 8198770 | 298 days ago | IN | 0 ETH | 0.01440689 | ||||
| Batch Mint | 8197509 | 298 days ago | IN | 0 ETH | 0.00020749 | ||||
| Batch Mint | 8195357 | 298 days ago | IN | 0 ETH | 0.00000157 | ||||
| Batch Mint | 8194933 | 298 days ago | IN | 0 ETH | 0.00018466 | ||||
| Batch Mint | 8194216 | 298 days ago | IN | 0 ETH | 0.00944101 | ||||
| Batch Mint | 8193653 | 299 days ago | IN | 0 ETH | 0.01894158 | ||||
| Batch Mint | 8192747 | 299 days ago | IN | 0 ETH | 0.0141759 | ||||
| Batch Mint | 8190749 | 299 days ago | IN | 0 ETH | 0.0076067 | ||||
| Batch Mint | 8189794 | 299 days ago | IN | 0 ETH | 0.00001886 | ||||
| Batch Mint | 8188591 | 299 days ago | IN | 0 ETH | 0.00111613 | ||||
| Batch Mint | 8188551 | 299 days ago | IN | 0 ETH | 0.00130935 | ||||
| Batch Mint | 8187779 | 299 days ago | IN | 0 ETH | 0.00347533 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
Amount
|
||
|---|---|---|---|---|---|---|---|
| 0x60803460 | 7993853 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993853 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993847 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993847 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993841 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993841 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993834 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993834 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993827 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993827 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993821 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993821 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993815 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993815 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993808 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993808 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993802 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993802 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993795 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993795 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993789 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993789 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993784 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60a06040 | 7993784 | 327 days ago | Contract Creation | 0 ETH | |||
| 0x60803460 | 7993778 | 327 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Faucet
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {FaucetERC20} from "./FaucetERC20.sol";
import {MockPriceFeed} from "../MockPriceFeed.sol";
contract Faucet is Ownable {
error OnlyMintOnce();
error TokenExisted(string name, string symbol, uint8 decimals);
struct TokenConfig {
address tokenAddr;
address priceFeedAddr;
}
uint256 public tokenNum;
mapping(address => uint256) public getTokenId;
mapping(uint256 => TokenConfig) public tokenConfigs;
mapping(address => bool) public isMinted;
mapping(bytes32 => uint256) public getTokenIdByKey;
bool public canOnlyMintOnce;
uint256 public mintUsdValue;
constructor(address adminAddr) Ownable(adminAddr) {
mintUsdValue = 10000;
}
function getTokenConfig(uint256 index) public view returns (TokenConfig memory) {
return tokenConfigs[index];
}
function addToken(string memory name, string memory symbol, uint8 decimals)
public
onlyOwner
returns (FaucetERC20 token, MockPriceFeed priceFeed)
{
if (getTokenIdByKey[calcTokenKey(name, symbol, decimals)] != 0) {
revert TokenExisted(name, symbol, decimals);
} else {
token = new FaucetERC20(address(this), name, symbol, decimals);
priceFeed = new MockPriceFeed(owner());
tokenNum++;
tokenConfigs[tokenNum] = TokenConfig(address(token), address(priceFeed));
getTokenId[address(token)] = tokenNum;
getTokenIdByKey[calcTokenKey(name, symbol, decimals)] = tokenNum;
}
}
function setMintUsdValue(uint256 _mintUsdValue) public onlyOwner {
mintUsdValue = _mintUsdValue;
}
function setPriceFeed(uint256 index, address priceFeedAddr) public onlyOwner {
tokenConfigs[index].priceFeedAddr = priceFeedAddr;
}
function setCanOnlyMintOnce(bool _canOnlyMintOnce) public onlyOwner {
canOnlyMintOnce = _canOnlyMintOnce;
}
function batchMint() public {
if (canOnlyMintOnce && isMinted[msg.sender]) revert OnlyMintOnce();
isMinted[msg.sender] = true;
for (uint256 i = 1; i < tokenNum + 1; i++) {
TokenConfig memory tokenConfig = tokenConfigs[i];
MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr);
(, int256 answer,,,) = priceFeed.latestRoundData();
uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals();
uint8 priceFeedDecimals = priceFeed.decimals();
uint256 mintAmt = (mintUsdValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer);
FaucetERC20(tokenConfig.tokenAddr).mint(msg.sender, mintAmt);
}
}
function batchMintWithValue(uint256 mintValue) public {
if (canOnlyMintOnce && isMinted[msg.sender]) revert OnlyMintOnce();
isMinted[msg.sender] = true;
for (uint256 i = 1; i < tokenNum + 1; i++) {
TokenConfig memory tokenConfig = tokenConfigs[i];
MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr);
(, int256 answer,,,) = priceFeed.latestRoundData();
uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals();
uint8 priceFeedDecimals = priceFeed.decimals();
uint256 mintAmt = (mintValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer);
FaucetERC20(tokenConfig.tokenAddr).mint(msg.sender, mintAmt);
}
}
function devBatchMint(address to) public onlyOwner {
for (uint256 i = 1; i < tokenNum + 1; i++) {
TokenConfig memory tokenConfig = tokenConfigs[i];
MockPriceFeed priceFeed = MockPriceFeed(tokenConfig.priceFeedAddr);
(, int256 answer,,,) = priceFeed.latestRoundData();
uint8 tokenDecimals = FaucetERC20(tokenConfig.tokenAddr).decimals();
uint8 priceFeedDecimals = priceFeed.decimals();
uint256 mintAmt = (mintUsdValue * 10 ** (priceFeedDecimals + tokenDecimals)) / uint256(answer);
FaucetERC20(tokenConfig.tokenAddr).mint(to, mintAmt);
}
}
function devMint(address to, address tokenAddr, uint256 mintAmt) public onlyOwner {
FaucetERC20(tokenAddr).mint(to, mintAmt);
}
function calcTokenKey(string memory name, string memory symbol, uint8 decimals) public pure returns (bytes32) {
return keccak256(abi.encodePacked(name, symbol, decimals));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract FaucetERC20 is ERC20, Ownable {
uint8 private immutable _decimals;
constructor(address adminAddr, string memory name, string memory symbol, uint8 _dec)
ERC20(name, symbol)
Ownable(adminAddr)
{
_decimals = _dec;
}
function decimals() public view virtual override returns (uint8) {
return _decimals;
}
function mint(address to, uint256 amount) external {
_mint(to, amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import {AggregatorV3Interface} from "@chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
contract MockPriceFeed is AggregatorV3Interface, Ownable {
struct RoundData {
uint80 roundId;
int256 answer;
uint256 startedAt;
uint256 updatedAt;
uint80 answeredInRound;
}
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
RoundData private _latestRoundData;
constructor(address admin) Ownable(admin) {}
function decimals() external pure override returns (uint8) {
return 8;
}
function description() external pure override returns (string memory) {
return "Test Oracle";
}
function version() external pure override returns (uint256) {
return 1;
}
function getRoundData(uint80)
external
view
override
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
{
return (
_latestRoundData.roundId,
_latestRoundData.answer,
_latestRoundData.startedAt,
_latestRoundData.updatedAt,
_latestRoundData.answeredInRound
);
}
function latestRoundData()
external
view
override
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
{
return (
_latestRoundData.roundId,
_latestRoundData.answer,
_latestRoundData.startedAt,
_latestRoundData.updatedAt,
_latestRoundData.answeredInRound
);
}
function updateRoundData(RoundData memory roundData) external onlyOwner {
_latestRoundData = roundData;
emit AnswerUpdated(roundData.answer, roundData.roundId, roundData.updatedAt);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// solhint-disable-next-line interface-starts-with-i
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function getRoundData(
uint80 _roundId
) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@chainlink/contracts/=lib/chainlink/contracts/",
"@pendle/core-v2/contracts/=lib/pendle-core-v2-public/contracts/",
"@uniswap/v3-core/contracts/=lib/v3-core/contracts/",
"@uniswap/v3-periphery/contracts/=lib/v3-periphery/contracts/",
"forge-std/=lib/forge-std/src/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"chainlink/=lib/chainlink/",
"ds-test/=lib/metamorpho/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/metamorpho/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"metamorpho/=lib/metamorpho/src/",
"morpho-blue/=lib/metamorpho/lib/morpho-blue/",
"murky/=lib/metamorpho/lib/universal-rewards-distributor/lib/murky/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"openzeppelin/=lib/metamorpho/lib/universal-rewards-distributor/lib/openzeppelin-contracts/contracts/",
"pendle-core-v2-public/=lib/pendle-core-v2-public/contracts/",
"universal-rewards-distributor/=lib/metamorpho/lib/universal-rewards-distributor/src/",
"v3-core/=lib/v3-core/",
"v3-periphery/=lib/v3-periphery/contracts/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true,
"libraries": {}
}Contract ABI
API[{"inputs":[{"internalType":"address","name":"adminAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"OnlyMintOnce","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"TokenExisted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"addToken","outputs":[{"internalType":"contract FaucetERC20","name":"token","type":"address"},{"internalType":"contract MockPriceFeed","name":"priceFeed","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintValue","type":"uint256"}],"name":"batchMintWithValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"}],"name":"calcTokenKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"canOnlyMintOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"devBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"mintAmt","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenConfig","outputs":[{"components":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"priceFeedAddr","type":"address"}],"internalType":"struct Faucet.TokenConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"getTokenIdByKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintUsdValue","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canOnlyMintOnce","type":"bool"}],"name":"setCanOnlyMintOnce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintUsdValue","type":"uint256"}],"name":"setMintUsdValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"priceFeedAddr","type":"address"}],"name":"setPriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenConfigs","outputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"priceFeedAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60803460be57601f6121f938819003918201601f19168301916001600160401b0383118484101760c25780849260209460405283398101031260be57516001600160a01b0381169081900360be57801560ab575f80546001600160a01b031981168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a361271060075561212290816100d78239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c80630461559914610b275780630a43b7d714610b0a5780633b895c9014610ab757806340ddd06e14610a37578063715018a6146109e05780638a003888146109745780638da5cb5b1461094d5780639213ad701461092c578063aa3a51bb146108f4578063b2427ab3146108d3578063bfa87e46146108b6578063c01bd0e914610873578063d1254d68146106b8578063e3424c9314610470578063e39e67b114610446578063f15376861461040e578063f2fde38b14610389578063f3bdd86314610158578063f9f2a7ce1461011b5763fd679d81146100f5575f80fd5b34610117575f36600319011261011757602060ff600654166040519015158152f35b5f80fd5b34610117576020366003190112610117576001600160a01b0361013c610d3e565b165f526004602052602060ff60405f2054166040519015158152f35b346101175761016636610de8565b9190610170610f77565b61017b838284610f00565b5f90815260056020526040902054156101d6579160ff6101cb6101b99460405195869563244df9c160e11b8752606060048801526064870190610f53565b85810360031901602487015290610f53565b911660448301520390fd5b604051610c3780820182811067ffffffffffffffff821117610375578291610f9e8339308152608060208201526102216102136080830187610f53565b828103604084015285610f53565b90606060ff881691015203905ff092831561036a575f546040518594916001600160a01b031661051880830167ffffffffffffffff811184821017610375576020928492611bd5843981520301905ff091821561036a578293600154925f1984146103565760019384018085556040805190996001600160a01b03169661032f9691926102ad84610d54565b8884526020840191838060a01b031682525f5260036020528a5f2092828060a01b0390838060a01b03905116166bffffffffffffffffffffffff60a01b845416178355818060a01b0390511691019060018060a01b03166bffffffffffffffffffffffff60a01b825416179055600154945f52600260205284885f2055610f00565b5f526005602052835f205582519160018060a01b0316825260018060a01b03166020820152f35b634e487b7160e01b5f52601160045260245ffd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b34610117576020366003190112610117576103a2610d3e565b6103aa610f77565b6001600160a01b031680156103fb575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610117576020366003190112610117576001600160a01b0361042f610d3e565b165f526002602052602060405f2054604051908152f35b34610117576020366003190112610117576004355f526005602052602060405f2054604051908152f35b34610117575f3660031901126101175760ff60065416806106a2575b61069357335f52600460205260405f20600160ff1982541617905560015b600154600181018091116103565781101561069157805f52600360205260405f2090604051916104d983610d54565b80546001600160a01b0390811684526001909101541660208301819052604051633fabe5a360e21b81529060a082600481845afa90811561036a576004925f9261065c575b50845160405163313ce56760e01b81529360209185919082906001600160a01b03165afa92831561036a575f93610637575b5060206004916040519283809263313ce56760e01b82525afa801561036a5761059f9361059a925f926105ff575b5061058f6105949160075493610eaa565b610ebe565b90610ecf565b610ee2565b91516001600160a01b0316803b15610117576040516340c10f1960e01b815233600482015260248101939093525f908390604490829084905af191821561036a576001926105ef575b50016104aa565b5f6105f991610d70565b826105e8565b61059491925061062861058f9160203d8111610630575b6106208183610d70565b810190610e91565b92915061057e565b503d610616565b6004919350610654602091823d8111610630576106208183610d70565b939150610550565b61067e91925060a03d811161068a575b6106768183610d70565b810190610e5c565b5050509050908561051e565b503d61066c565b005b630f1283f760e01b5f5260045ffd5b50335f52600460205260ff60405f20541661048c565b34610117576020366003190112610117576106d1610d3e565b6106d9610f77565b60015b600154600181018091116103565781101561069157805f52600360205260405f20906040519161070b83610d54565b80546001600160a01b0390811684526001909101541660208301819052604051633fabe5a360e21b81529060a082600481845afa90811561036a576004925f9261084e575b50845160405163313ce56760e01b81529360209185919082906001600160a01b03165afa92831561036a575f93610829575b5060206004916040519283809263313ce56760e01b82525afa801561036a576107c09361059a925f926105ff575061058f6105949160075493610eaa565b91516001600160a01b0316803b15610117576040516340c10f1960e01b81526001600160a01b038516600482015260248101939093525f908390604490829084905af191821561036a57600192610819575b50016106dc565b5f61082391610d70565b83610812565b6004919350610846602091823d8111610630576106208183610d70565b939150610782565b61086791925060a03d811161068a576106768183610d70565b50505090509086610750565b34610117576020366003190112610117576004355f5260036020526040805f2060018060a01b03815416906001808060a01b039101541682519182526020820152f35b34610117575f366003190112610117576020600154604051908152f35b346101175760206108ec6108e636610de8565b91610f00565b604051908152f35b34610117576020366003190112610117576004358015158091036101175761091a610f77565b60ff8019600654169116176006555f80f35b3461011757602036600319011261011757610945610f77565b600435600755005b34610117575f366003190112610117575f546040516001600160a01b039091168152602090f35b34610117576020366003190112610117575f602060405161099481610d54565b82815201526004355f5260036020526040805f2081516109b381610d54565b81546001600160a01b03908116808352600190930154811660209283019081528451938452511690820152f35b34610117575f366003190112610117576109f8610f77565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461011757606036600319011261011757610a50610d3e565b610a58610d28565b610a60610f77565b6001600160a01b0316803b15610117576040516340c10f1960e01b81526001600160a01b038316600482015260448035602483015290915f918391829084905af1801561036a57610aad57005b5f61069191610d70565b3461011757604036600319011261011757610ad0610d28565b610ad8610f77565b6004355f90815260036020526040902060010180546001600160a01b0319166001600160a01b03909216919091179055005b34610117575f366003190112610117576020600754604051908152f35b346101175760203660031901126101175760043560ff6006541680610d12575b61069357335f52600460205260405f20600160ff1982541617905560015b600154600181018091116103565781101561069157805f52600360205260405f209060405191610b9483610d54565b80546001600160a01b0390811684526001909101541660208301819052604051633fabe5a360e21b81529060a082600481845afa90811561036a576004925f92610ced575b50845160405163313ce56760e01b81529360209185919082906001600160a01b03165afa90811561036a576004935f92610ccb575b506020906040519485809263313ce56760e01b82525afa801561036a5761058f61059a92610c4792610c4d965f91610cad575b50610eaa565b86610ecf565b91516001600160a01b0316803b15610117576040516340c10f1960e01b815233600482015260248101939093525f908390604490829084905af191821561036a57600192610c9d575b5001610b65565b5f610ca791610d70565b83610c96565b610cc5915060203d8111610630576106208183610d70565b8a610c41565b6020919250610ce690823d8111610630576106208183610d70565b9190610c0e565b610d0691925060a03d811161068a576106768183610d70565b50505090509086610bd9565b50335f52600460205260ff60405f205416610b47565b602435906001600160a01b038216820361011757565b600435906001600160a01b038216820361011757565b6040810190811067ffffffffffffffff82111761037557604052565b90601f8019910116810190811067ffffffffffffffff82111761037557604052565b81601f820112156101175780359067ffffffffffffffff82116103755760405192610dc7601f8401601f191660200185610d70565b8284526020838301011161011757815f926020809301838601378301015290565b9060606003198301126101175760043567ffffffffffffffff81116101175782610e1491600401610d92565b916024359067ffffffffffffffff821161011757610e3491600401610d92565b9060443560ff811681036101175790565b519069ffffffffffffffffffff8216820361011757565b908160a091031261011757610e7081610e45565b91602082015191604081015191610e8e608060608401519301610e45565b90565b90816020910312610117575160ff811681036101175790565b9060ff8091169116019060ff821161035657565b60ff16604d811161035657600a0a90565b8181029291811591840414171561035657565b8115610eec570490565b634e487b7160e01b5f52601260045260245ffd5b916001602092610f4d928460405195869381808601998051918291018b5e8501908282015f8152815193849201905e01019060ff60f81b9060f81b16815203601e19810184520182610d70565b51902090565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b5f546001600160a01b03163303610f8a57565b63118cdaa760e01b5f523360045260245ffdfe60a0604052346103a757610c3780380380610019816103ab565b9283398101906080818303126103a75780516001600160a01b038116908190036103a75760208201516001600160401b0381116103a7578361005c9184016103d0565b60408301519093906001600160401b0381116103a7576060916100809185016103d0565b92015160ff811681036103a75783516001600160401b0381116102b857600354600181811c9116801561039d575b602082101461029a57601f811161033a575b50602094601f82116001146102d7579481929394955f926102cc575b50508160011b915f199060031b1c1916176003555b82516001600160401b0381116102b857600454600181811c911680156102ae575b602082101461029a57601f8111610237575b506020601f82116001146101d457819293945f926101c9575b50508160011b915f199060031b1c1916176004555b81156101b657600580546001600160a01b03198116841790915560405192906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360805261081590816104228239608051816104460152f35b631e4fbdf760e01b5f525f60045260245ffd5b015190505f8061013d565b601f1982169060045f52805f20915f5b81811061021f57509583600195969710610207575b505050811b01600455610152565b01515f1960f88460031b161c191690555f80806101f9565b9192602060018192868b0151815501940192016101e4565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c81019160208410610290575b601f0160051c01905b8181106102855750610124565b5f8155600101610278565b909150819061026f565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610112565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100dc565b601f1982169560035f52805f20915f5b8881106103225750836001959697981061030a575b505050811b016003556100f1565b01515f1960f88460031b161c191690555f80806102fc565b919260206001819286850151815501940192016102e7565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c81019160208410610393575b601f0160051c01905b81811061038857506100c0565b5f815560010161037b565b9091508190610372565b90607f16906100ae565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102b857604052565b81601f820112156103a7578051906001600160401b0382116102b8576103ff601f8301601f19166020016103ab565b92828452602083830101116103a757815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde03146105e957508063095ea7b31461056757806318160ddd1461054a57806323b872dd1461046a578063313ce5671461042d57806340c10f191461038b57806370a0823114610354578063715018a6146102f95780638da5cb5b146102d157806395d89b41146101b6578063a9059cbb14610185578063dd62ed3e146101355763f2fde38b146100ab575f80fd5b34610131576020366003190112610131576100c46106e2565b6100cc6107b8565b6001600160a01b0316801561011e57600580546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b346101315760403660031901126101315761014e6106e2565b6101566106f8565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b34610131576040366003190112610131576101ab6101a16106e2565b602435903361070e565b602060405160018152f35b34610131575f366003190112610131576040515f6004548060011c906001811680156102c7575b6020831081146102b3578285529081156102975750600114610242575b50819003601f01601f191681019067ffffffffffffffff82118183101761022e5761022a829182604052826106b8565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b828210610281575060209150820101826101fa565b600181602092548385880101520191019061026c565b90506020925060ff191682840152151560051b820101826101fa565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101dd565b34610131575f366003190112610131576005546040516001600160a01b039091168152602090f35b34610131575f366003190112610131576103116107b8565b600580546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610131576020366003190112610131576001600160a01b036103756106e2565b165f525f602052602060405f2054604051908152f35b34610131576040366003190112610131576103a46106e2565b6001600160a01b0316602435811561041a57600254908082018092116104065760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b34610131575f36600319011261013157602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610131576060366003190112610131576104836106e2565b61048b6106f8565b6001600160a01b0382165f8181526001602081815260408084203385529091529091205491936044359392909181016104ca575b506101ab935061070e565b83811061052f57841561051c573315610509576101ab945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846104bf565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610131575f366003190112610131576020600254604051908152f35b34610131576040366003190112610131576105806106e2565b60243590331561051c576001600160a01b031690811561050957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610131575f366003190112610131575f6003548060011c906001811680156106ae575b6020831081146102b35782855290811561029757506001146106595750819003601f01601f191681019067ffffffffffffffff82118183101761022e5761022a829182604052826106b8565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b828210610698575060209150820101826101fa565b6001816020925483858801015201910190610683565b91607f169161060d565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361013157565b602435906001600160a01b038216820361013157565b6001600160a01b03169081156107a5576001600160a01b031691821561041a57815f525f60205260405f205481811061078c57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b6005546001600160a01b031633036107cc57565b63118cdaa760e01b5f523360045260245ffdfea2646970667358221220ca252708294b6cc5cfac0887e3aa01a3e0e5a2570f040acf88a4b51f83d1d0b564736f6c634300081b003360803460b857601f61051838819003918201601f19168301916001600160401b0383118484101760bc5780849260209460405283398101031260b857516001600160a01b0381169081900360b857801560a5575f80546001600160a01b031981168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a361044790816100d18239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c908163313ce567146103bc5750806354fd4d50146103a1578063715018a61461034a5780637284e416146102d65780638da5cb5b146102af5780639276e261146101bc5780639a6fc8f51461017a578063f2fde38b146100f15763feaf968c1461007f575f80fd5b346100ed575f3660031901126100ed576001546002546003546004546005546100e9946001600160501b0390811694939291165b604080516001600160501b03968716815260208101959095528401929092526060830152909116608082015290819060a0820190565b0390f35b5f80fd5b346100ed5760203660031901126100ed576004356001600160a01b038116908190036100ed5761011f6103eb565b8015610167575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b346100ed5760203660031901126100ed576101936103d5565b506001546002546003546004546005546100e9946001600160501b0390811694939291166100b3565b346100ed5760a03660031901126100ed5760405160a0810181811067ffffffffffffffff82111761029b576040526101f26103d5565b815260208101906024358252604081019060443582526060810160643581526084356001600160501b03811681036100ed576001600160501b03602092818560807f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f97019485526102616103eb565b51169687831960015416176001555195866002555160035551918260045551166001600160501b03196005541617600555604051908152a3005b634e487b7160e01b5f52604160045260245ffd5b346100ed575f3660031901126100ed575f546040516001600160a01b039091168152602090f35b346100ed575f3660031901126100ed576040516040810181811067ffffffffffffffff82111761029b57604052600b8152604060208201916a54657374204f7261636c6560a81b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b346100ed575f3660031901126100ed576103626103eb565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100ed575f3660031901126100ed57602060405160018152f35b346100ed575f3660031901126100ed5780600860209252f35b600435906001600160501b03821682036100ed57565b5f546001600160a01b031633036103fe57565b63118cdaa760e01b5f523360045260245ffdfea2646970667358221220d7d30919d1f39a5937d74b81652727bc147b889132351f6cbbe2382234a5f48764736f6c634300081b0033a26469706673582212204b0be519685886908f7c2b62e684dc6ad58ab0154ebbb4d7a144b3fddd669b8564736f6c634300081b0033000000000000000000000000e355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b
Deployed Bytecode
0x60806040526004361015610011575f80fd5b5f3560e01c80630461559914610b275780630a43b7d714610b0a5780633b895c9014610ab757806340ddd06e14610a37578063715018a6146109e05780638a003888146109745780638da5cb5b1461094d5780639213ad701461092c578063aa3a51bb146108f4578063b2427ab3146108d3578063bfa87e46146108b6578063c01bd0e914610873578063d1254d68146106b8578063e3424c9314610470578063e39e67b114610446578063f15376861461040e578063f2fde38b14610389578063f3bdd86314610158578063f9f2a7ce1461011b5763fd679d81146100f5575f80fd5b34610117575f36600319011261011757602060ff600654166040519015158152f35b5f80fd5b34610117576020366003190112610117576001600160a01b0361013c610d3e565b165f526004602052602060ff60405f2054166040519015158152f35b346101175761016636610de8565b9190610170610f77565b61017b838284610f00565b5f90815260056020526040902054156101d6579160ff6101cb6101b99460405195869563244df9c160e11b8752606060048801526064870190610f53565b85810360031901602487015290610f53565b911660448301520390fd5b604051610c3780820182811067ffffffffffffffff821117610375578291610f9e8339308152608060208201526102216102136080830187610f53565b828103604084015285610f53565b90606060ff881691015203905ff092831561036a575f546040518594916001600160a01b031661051880830167ffffffffffffffff811184821017610375576020928492611bd5843981520301905ff091821561036a578293600154925f1984146103565760019384018085556040805190996001600160a01b03169661032f9691926102ad84610d54565b8884526020840191838060a01b031682525f5260036020528a5f2092828060a01b0390838060a01b03905116166bffffffffffffffffffffffff60a01b845416178355818060a01b0390511691019060018060a01b03166bffffffffffffffffffffffff60a01b825416179055600154945f52600260205284885f2055610f00565b5f526005602052835f205582519160018060a01b0316825260018060a01b03166020820152f35b634e487b7160e01b5f52601160045260245ffd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b34610117576020366003190112610117576103a2610d3e565b6103aa610f77565b6001600160a01b031680156103fb575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610117576020366003190112610117576001600160a01b0361042f610d3e565b165f526002602052602060405f2054604051908152f35b34610117576020366003190112610117576004355f526005602052602060405f2054604051908152f35b34610117575f3660031901126101175760ff60065416806106a2575b61069357335f52600460205260405f20600160ff1982541617905560015b600154600181018091116103565781101561069157805f52600360205260405f2090604051916104d983610d54565b80546001600160a01b0390811684526001909101541660208301819052604051633fabe5a360e21b81529060a082600481845afa90811561036a576004925f9261065c575b50845160405163313ce56760e01b81529360209185919082906001600160a01b03165afa92831561036a575f93610637575b5060206004916040519283809263313ce56760e01b82525afa801561036a5761059f9361059a925f926105ff575b5061058f6105949160075493610eaa565b610ebe565b90610ecf565b610ee2565b91516001600160a01b0316803b15610117576040516340c10f1960e01b815233600482015260248101939093525f908390604490829084905af191821561036a576001926105ef575b50016104aa565b5f6105f991610d70565b826105e8565b61059491925061062861058f9160203d8111610630575b6106208183610d70565b810190610e91565b92915061057e565b503d610616565b6004919350610654602091823d8111610630576106208183610d70565b939150610550565b61067e91925060a03d811161068a575b6106768183610d70565b810190610e5c565b5050509050908561051e565b503d61066c565b005b630f1283f760e01b5f5260045ffd5b50335f52600460205260ff60405f20541661048c565b34610117576020366003190112610117576106d1610d3e565b6106d9610f77565b60015b600154600181018091116103565781101561069157805f52600360205260405f20906040519161070b83610d54565b80546001600160a01b0390811684526001909101541660208301819052604051633fabe5a360e21b81529060a082600481845afa90811561036a576004925f9261084e575b50845160405163313ce56760e01b81529360209185919082906001600160a01b03165afa92831561036a575f93610829575b5060206004916040519283809263313ce56760e01b82525afa801561036a576107c09361059a925f926105ff575061058f6105949160075493610eaa565b91516001600160a01b0316803b15610117576040516340c10f1960e01b81526001600160a01b038516600482015260248101939093525f908390604490829084905af191821561036a57600192610819575b50016106dc565b5f61082391610d70565b83610812565b6004919350610846602091823d8111610630576106208183610d70565b939150610782565b61086791925060a03d811161068a576106768183610d70565b50505090509086610750565b34610117576020366003190112610117576004355f5260036020526040805f2060018060a01b03815416906001808060a01b039101541682519182526020820152f35b34610117575f366003190112610117576020600154604051908152f35b346101175760206108ec6108e636610de8565b91610f00565b604051908152f35b34610117576020366003190112610117576004358015158091036101175761091a610f77565b60ff8019600654169116176006555f80f35b3461011757602036600319011261011757610945610f77565b600435600755005b34610117575f366003190112610117575f546040516001600160a01b039091168152602090f35b34610117576020366003190112610117575f602060405161099481610d54565b82815201526004355f5260036020526040805f2081516109b381610d54565b81546001600160a01b03908116808352600190930154811660209283019081528451938452511690820152f35b34610117575f366003190112610117576109f8610f77565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461011757606036600319011261011757610a50610d3e565b610a58610d28565b610a60610f77565b6001600160a01b0316803b15610117576040516340c10f1960e01b81526001600160a01b038316600482015260448035602483015290915f918391829084905af1801561036a57610aad57005b5f61069191610d70565b3461011757604036600319011261011757610ad0610d28565b610ad8610f77565b6004355f90815260036020526040902060010180546001600160a01b0319166001600160a01b03909216919091179055005b34610117575f366003190112610117576020600754604051908152f35b346101175760203660031901126101175760043560ff6006541680610d12575b61069357335f52600460205260405f20600160ff1982541617905560015b600154600181018091116103565781101561069157805f52600360205260405f209060405191610b9483610d54565b80546001600160a01b0390811684526001909101541660208301819052604051633fabe5a360e21b81529060a082600481845afa90811561036a576004925f92610ced575b50845160405163313ce56760e01b81529360209185919082906001600160a01b03165afa90811561036a576004935f92610ccb575b506020906040519485809263313ce56760e01b82525afa801561036a5761058f61059a92610c4792610c4d965f91610cad575b50610eaa565b86610ecf565b91516001600160a01b0316803b15610117576040516340c10f1960e01b815233600482015260248101939093525f908390604490829084905af191821561036a57600192610c9d575b5001610b65565b5f610ca791610d70565b83610c96565b610cc5915060203d8111610630576106208183610d70565b8a610c41565b6020919250610ce690823d8111610630576106208183610d70565b9190610c0e565b610d0691925060a03d811161068a576106768183610d70565b50505090509086610bd9565b50335f52600460205260ff60405f205416610b47565b602435906001600160a01b038216820361011757565b600435906001600160a01b038216820361011757565b6040810190811067ffffffffffffffff82111761037557604052565b90601f8019910116810190811067ffffffffffffffff82111761037557604052565b81601f820112156101175780359067ffffffffffffffff82116103755760405192610dc7601f8401601f191660200185610d70565b8284526020838301011161011757815f926020809301838601378301015290565b9060606003198301126101175760043567ffffffffffffffff81116101175782610e1491600401610d92565b916024359067ffffffffffffffff821161011757610e3491600401610d92565b9060443560ff811681036101175790565b519069ffffffffffffffffffff8216820361011757565b908160a091031261011757610e7081610e45565b91602082015191604081015191610e8e608060608401519301610e45565b90565b90816020910312610117575160ff811681036101175790565b9060ff8091169116019060ff821161035657565b60ff16604d811161035657600a0a90565b8181029291811591840414171561035657565b8115610eec570490565b634e487b7160e01b5f52601260045260245ffd5b916001602092610f4d928460405195869381808601998051918291018b5e8501908282015f8152815193849201905e01019060ff60f81b9060f81b16815203601e19810184520182610d70565b51902090565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b5f546001600160a01b03163303610f8a57565b63118cdaa760e01b5f523360045260245ffdfe60a0604052346103a757610c3780380380610019816103ab565b9283398101906080818303126103a75780516001600160a01b038116908190036103a75760208201516001600160401b0381116103a7578361005c9184016103d0565b60408301519093906001600160401b0381116103a7576060916100809185016103d0565b92015160ff811681036103a75783516001600160401b0381116102b857600354600181811c9116801561039d575b602082101461029a57601f811161033a575b50602094601f82116001146102d7579481929394955f926102cc575b50508160011b915f199060031b1c1916176003555b82516001600160401b0381116102b857600454600181811c911680156102ae575b602082101461029a57601f8111610237575b506020601f82116001146101d457819293945f926101c9575b50508160011b915f199060031b1c1916176004555b81156101b657600580546001600160a01b03198116841790915560405192906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a360805261081590816104228239608051816104460152f35b631e4fbdf760e01b5f525f60045260245ffd5b015190505f8061013d565b601f1982169060045f52805f20915f5b81811061021f57509583600195969710610207575b505050811b01600455610152565b01515f1960f88460031b161c191690555f80806101f9565b9192602060018192868b0151815501940192016101e4565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c81019160208410610290575b601f0160051c01905b8181106102855750610124565b5f8155600101610278565b909150819061026f565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610112565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100dc565b601f1982169560035f52805f20915f5b8881106103225750836001959697981061030a575b505050811b016003556100f1565b01515f1960f88460031b161c191690555f80806102fc565b919260206001819286850151815501940192016102e7565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c81019160208410610393575b601f0160051c01905b81811061038857506100c0565b5f815560010161037b565b9091508190610372565b90607f16906100ae565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102b857604052565b81601f820112156103a7578051906001600160401b0382116102b8576103ff601f8301601f19166020016103ab565b92828452602083830101116103a757815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde03146105e957508063095ea7b31461056757806318160ddd1461054a57806323b872dd1461046a578063313ce5671461042d57806340c10f191461038b57806370a0823114610354578063715018a6146102f95780638da5cb5b146102d157806395d89b41146101b6578063a9059cbb14610185578063dd62ed3e146101355763f2fde38b146100ab575f80fd5b34610131576020366003190112610131576100c46106e2565b6100cc6107b8565b6001600160a01b0316801561011e57600580546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b346101315760403660031901126101315761014e6106e2565b6101566106f8565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b34610131576040366003190112610131576101ab6101a16106e2565b602435903361070e565b602060405160018152f35b34610131575f366003190112610131576040515f6004548060011c906001811680156102c7575b6020831081146102b3578285529081156102975750600114610242575b50819003601f01601f191681019067ffffffffffffffff82118183101761022e5761022a829182604052826106b8565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b828210610281575060209150820101826101fa565b600181602092548385880101520191019061026c565b90506020925060ff191682840152151560051b820101826101fa565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101dd565b34610131575f366003190112610131576005546040516001600160a01b039091168152602090f35b34610131575f366003190112610131576103116107b8565b600580546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610131576020366003190112610131576001600160a01b036103756106e2565b165f525f602052602060405f2054604051908152f35b34610131576040366003190112610131576103a46106e2565b6001600160a01b0316602435811561041a57600254908082018092116104065760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef915f9360025584845283825260408420818154019055604051908152a3005b634e487b7160e01b5f52601160045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b34610131575f36600319011261013157602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610131576060366003190112610131576104836106e2565b61048b6106f8565b6001600160a01b0382165f8181526001602081815260408084203385529091529091205491936044359392909181016104ca575b506101ab935061070e565b83811061052f57841561051c573315610509576101ab945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846104bf565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610131575f366003190112610131576020600254604051908152f35b34610131576040366003190112610131576105806106e2565b60243590331561051c576001600160a01b031690811561050957335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610131575f366003190112610131575f6003548060011c906001811680156106ae575b6020831081146102b35782855290811561029757506001146106595750819003601f01601f191681019067ffffffffffffffff82118183101761022e5761022a829182604052826106b8565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b828210610698575060209150820101826101fa565b6001816020925483858801015201910190610683565b91607f169161060d565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361013157565b602435906001600160a01b038216820361013157565b6001600160a01b03169081156107a5576001600160a01b031691821561041a57815f525f60205260405f205481811061078c57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b634b637e8f60e11b5f525f60045260245ffd5b6005546001600160a01b031633036107cc57565b63118cdaa760e01b5f523360045260245ffdfea2646970667358221220ca252708294b6cc5cfac0887e3aa01a3e0e5a2570f040acf88a4b51f83d1d0b564736f6c634300081b003360803460b857601f61051838819003918201601f19168301916001600160401b0383118484101760bc5780849260209460405283398101031260b857516001600160a01b0381169081900360b857801560a5575f80546001600160a01b031981168317825560405192916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a361044790816100d18239f35b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c908163313ce567146103bc5750806354fd4d50146103a1578063715018a61461034a5780637284e416146102d65780638da5cb5b146102af5780639276e261146101bc5780639a6fc8f51461017a578063f2fde38b146100f15763feaf968c1461007f575f80fd5b346100ed575f3660031901126100ed576001546002546003546004546005546100e9946001600160501b0390811694939291165b604080516001600160501b03968716815260208101959095528401929092526060830152909116608082015290819060a0820190565b0390f35b5f80fd5b346100ed5760203660031901126100ed576004356001600160a01b038116908190036100ed5761011f6103eb565b8015610167575f80546001600160a01b03198116831782556001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3005b631e4fbdf760e01b5f525f60045260245ffd5b346100ed5760203660031901126100ed576101936103d5565b506001546002546003546004546005546100e9946001600160501b0390811694939291166100b3565b346100ed5760a03660031901126100ed5760405160a0810181811067ffffffffffffffff82111761029b576040526101f26103d5565b815260208101906024358252604081019060443582526060810160643581526084356001600160501b03811681036100ed576001600160501b03602092818560807f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f97019485526102616103eb565b51169687831960015416176001555195866002555160035551918260045551166001600160501b03196005541617600555604051908152a3005b634e487b7160e01b5f52604160045260245ffd5b346100ed575f3660031901126100ed575f546040516001600160a01b039091168152602090f35b346100ed575f3660031901126100ed576040516040810181811067ffffffffffffffff82111761029b57604052600b8152604060208201916a54657374204f7261636c6560a81b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b346100ed575f3660031901126100ed576103626103eb565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100ed575f3660031901126100ed57602060405160018152f35b346100ed575f3660031901126100ed5780600860209252f35b600435906001600160501b03821682036100ed57565b5f546001600160a01b031633036103fe57565b63118cdaa760e01b5f523360045260245ffdfea2646970667358221220d7d30919d1f39a5937d74b81652727bc147b889132351f6cbbe2382234a5f48764736f6c634300081b0033a26469706673582212204b0be519685886908f7c2b62e684dc6ad58ab0154ebbb4d7a144b3fddd669b8564736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b
-----Decoded View---------------
Arg [0] : adminAddr (address): 0xE355d5D8aa52EF0FbbD037C4a3C5E6Fd659cf46B
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e355d5d8aa52ef0fbbd037c4a3c5e6fd659cf46b
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.