Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Factory | 768560 | 47 days ago | IN | 0 S | 0.00003064 |
Latest 6 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
3285118 | 25 days ago | Contract Creation | 0 S | |||
3187110 | 26 days ago | Contract Creation | 0 S | |||
3186998 | 26 days ago | Contract Creation | 0 S | |||
3186644 | 26 days ago | Contract Creation | 0 S | |||
1370064 | 43 days ago | Contract Creation | 0 S | |||
919010 | 46 days ago | Contract Creation | 0 S |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
GBTFactory
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; interface IGumBallFactory { function getTreasury() external view returns (address); } interface IXGBT { function balanceOf(address account) external view returns (uint256); function notifyRewardAmount(address _rewardsToken, uint256 reward) external; } interface IGBT { function getXGBT() external view returns (address); function getFactory() external view returns (address); function artistTreasury() external view returns (address); } contract GBTFees is ReentrancyGuard { using SafeERC20 for IERC20; address internal immutable _GBT; address internal immutable _BASE; uint256 public constant TREASURY = 200; uint256 public constant GUMBAR = 400; uint256 public constant ARTIST = 400; uint256 public constant REWARD = 10; uint256 public constant DIVISOR = 1000; event Distribute(address indexed user); constructor(address __GBT, address __BASE) { _GBT = __GBT; _BASE = __BASE; } function distributeReward() external view returns (uint256) { return IERC20(_BASE).balanceOf(address(this)) * REWARD / DIVISOR; } function distributeFees() external nonReentrant { uint256 balanceGBT = IERC20(_GBT).balanceOf(address(this)); uint256 balanceBASE = IERC20(_BASE).balanceOf(address(this)); uint256 reward = balanceBASE * REWARD / DIVISOR; balanceBASE -= reward; address treasury = IGumBallFactory(IGBT(_GBT).getFactory()).getTreasury(); address artist = IGBT(_GBT).artistTreasury(); address _xgbt = IGBT(_GBT).getXGBT(); // Distribute GBT IERC20(_GBT).safeApprove(_xgbt, 0); IERC20(_GBT).safeApprove(_xgbt, balanceGBT * GUMBAR / DIVISOR); IXGBT(_xgbt).notifyRewardAmount(_GBT, balanceGBT * GUMBAR / DIVISOR); IERC20(_GBT).safeTransfer(artist, balanceGBT * ARTIST / DIVISOR); IERC20(_GBT).safeTransfer(treasury, balanceGBT * TREASURY / DIVISOR); // Distribute BASE IERC20(_BASE).safeApprove(_xgbt, 0); IERC20(_BASE).safeApprove(_xgbt, balanceBASE * GUMBAR / DIVISOR); IXGBT(_xgbt).notifyRewardAmount(_BASE, balanceBASE * GUMBAR / DIVISOR); IERC20(_BASE).safeTransfer(artist, balanceBASE * ARTIST / DIVISOR); IERC20(_BASE).safeTransfer(treasury, balanceBASE * TREASURY / DIVISOR); IERC20(_BASE).safeTransfer(msg.sender, reward); emit Distribute(msg.sender); } } contract GBT is ERC20, ReentrancyGuard { using SafeERC20 for IERC20; // Bonding Curve Variables address public immutable BASE_TOKEN; uint256 public immutable reserveVirtualBASE; uint256 public reserveRealBASE; uint256 public reserveGBT; uint256 public immutable initial_totalSupply; // Addresses address public XGBT; address public artist; address public artistTreasury; address public immutable fees; // Fee Contract address public immutable factory; // Affiliates mapping(address => address) public referrals; // account => affiliate // Allowlist Variables mapping(address => uint256) public allowlist; uint256 public immutable start; uint256 public immutable delay; bool public open; // Borrow Variables uint256 public borrowedTotalBASE; mapping(address => uint256) public borrowedBASE; // Fee uint256 public immutable fee; uint256 public constant AFFILIATE = 100; uint256 public constant DIVISOR = 1000; // Events event Buy(address indexed user, address indexed to, uint256 amount, address indexed affiliate); event Sell(address indexed user, address indexed to, uint256 amount, address indexed affiliate); event Borrow(address indexed user, uint256 amount); event Repay(address indexed user, uint256 amount); event AllowListUpdated(address[] accounts, uint256 amount); event XGBTSet(address indexed _XGBT); event ChangeArtist(address newArtist); event ChangeArtistTreasury(address newArtistTreasury); event AffiliateSet(address indexed account, address indexed affiliate); event MarketOpened(uint256 _timestamp); constructor( string memory _name, string memory _symbol, address _baseToken, uint256 _initialVirtualBASE, uint256 _supplyGBT, address _artist, address _factory, uint256 _delay, uint256 _fee ) ERC20(_name, _symbol) { require(_fee <= 100, "Redemption fee too high"); require(_fee >= 25, "Redemption fee too low"); BASE_TOKEN = _baseToken; artist = _artist; artistTreasury = _artist; factory = _factory; reserveVirtualBASE = _initialVirtualBASE; reserveRealBASE = 0; initial_totalSupply = _supplyGBT; reserveGBT = _supplyGBT; start = block.timestamp; delay = _delay; fee = _fee; open = false; fees = address(new GBTFees(address(this), BASE_TOKEN)); _mint(address(this), _supplyGBT); } ////////////////// ///// Public ///// ////////////////// /** @dev returns the current price of {GBT} */ function currentPrice() external view returns (uint256) { return ((reserveVirtualBASE + reserveRealBASE) * 1e18) / reserveGBT; } /** @dev returns the allowance @param user can borrow */ function borrowCredit(address account) external view returns (uint256) { uint256 borrowPowerGBT = IXGBT(XGBT).balanceOf(account); if (borrowPowerGBT == 0) { return 0; } uint256 borrowTotalBASE = (reserveVirtualBASE * totalSupply() / (totalSupply() - borrowPowerGBT)) - reserveVirtualBASE; uint256 borrowableBASE = borrowTotalBASE - borrowedBASE[account]; return borrowableBASE; } /** @dev returns amount borrowed by @param user */ function debt(address account) external view returns (uint256) { return borrowedBASE[account]; } function baseBal() external view returns (uint256) { return IERC20(BASE_TOKEN).balanceOf(address(this)); } function gbtBal() external view returns (uint256) { return IERC20(address(this)).balanceOf(address(this)); } function getFactory() external view returns (address) { return factory; } function getXGBT() external view returns (address) { return XGBT; } function getFees() external view returns (address) { return fees; } function getArtist() external view returns (address) { return artist; } function initSupply() external view returns (uint256) { return initial_totalSupply; } function floorPrice() external view returns (uint256) { return (reserveVirtualBASE * 1e18) / totalSupply(); } function mustStayGBT(address account) external view returns (uint256) { uint256 accountBorrowedBASE = borrowedBASE[account]; if (accountBorrowedBASE == 0) { return 0; } uint256 amount = totalSupply() - (reserveVirtualBASE * totalSupply() / (accountBorrowedBASE + reserveVirtualBASE)); return amount; } //////////////////// ///// External ///// //////////////////// /** @dev Buy function. User spends {BASE} and receives {GBT} * @param _amountBASE is the amount of the {BASE} being spent * @param _minGBT is the minimum amount of {GBT} out * @param expireTimestamp is the expire time on txn * * If a delay was set on the proxy deployment and has not elapsed: * 1. the user must be whitelisted by the protocol to call the function * 2. the whitelisted user cannont buy more than 1 GBT until the delay has elapsed */ function buy(uint256 _amountBASE, uint256 _minGBT, uint256 expireTimestamp, address to, address affiliate) external nonReentrant { require(expireTimestamp == 0 || expireTimestamp >= block.timestamp, "Expired"); require(_amountBASE > 0, "Amount cannot be zero"); address account = msg.sender; if (referrals[to] == address(0) && affiliate != address(0)) { referrals[to] = affiliate; emit AffiliateSet(to, affiliate); } uint256 feeAmountBASE = _amountBASE * fee / DIVISOR; uint256 oldReserveBASE = reserveVirtualBASE + reserveRealBASE; uint256 newReserveBASE = oldReserveBASE + _amountBASE - feeAmountBASE; uint256 oldReserveGBT = reserveGBT; uint256 newReserveGBT = oldReserveBASE * oldReserveGBT / newReserveBASE; uint256 outGBT = oldReserveGBT - newReserveGBT; require(outGBT > _minGBT, "Less than Min"); if (start + delay >= block.timestamp) { require(open, "Market not open yet"); require(outGBT <= allowlist[to], "Allowlist amount overflow"); allowlist[to] -= outGBT; } reserveRealBASE = newReserveBASE - reserveVirtualBASE; reserveGBT = newReserveGBT; if (referrals[to] == address(0)) { IERC20(BASE_TOKEN).safeTransferFrom(account, fees, feeAmountBASE); } else { IERC20(BASE_TOKEN).safeTransferFrom(account, referrals[to], feeAmountBASE * AFFILIATE / DIVISOR); IERC20(BASE_TOKEN).safeTransferFrom(account, fees, feeAmountBASE - (feeAmountBASE * AFFILIATE / DIVISOR)); } IERC20(BASE_TOKEN).safeTransferFrom(account, address(this), _amountBASE - feeAmountBASE); IERC20(address(this)).safeTransfer(to, outGBT); emit Buy(account, to, _amountBASE, referrals[to]); } /** @dev Sell function. User sells their {GBT} token for {BASE} * @param _amountGBT is the amount of {GBT} in * @param _minETH is the minimum amount of {ETH} out * @param expireTimestamp is the expire time on txn */ function sell(uint256 _amountGBT, uint256 _minETH, uint256 expireTimestamp, address to) external nonReentrant { require(expireTimestamp == 0 || expireTimestamp >= block.timestamp, "Expired"); require(_amountGBT > 0, "Amount cannot be zero"); address account = msg.sender; uint256 feeAmountGBT = _amountGBT * fee / DIVISOR; uint256 oldReserveGBT = reserveGBT; uint256 newReserveGBT = reserveGBT + _amountGBT - feeAmountGBT; uint256 oldReserveBASE = reserveVirtualBASE + reserveRealBASE; uint256 newReserveBASE = oldReserveBASE * oldReserveGBT / newReserveGBT; uint256 outBASE = oldReserveBASE - newReserveBASE; require(outBASE > _minETH, "Less than Min"); reserveRealBASE = newReserveBASE - reserveVirtualBASE; reserveGBT = newReserveGBT; if (referrals[to] == address(0)) { IERC20(address(this)).safeTransferFrom(account, fees, feeAmountGBT); } else { IERC20(address(this)).safeTransferFrom(account, referrals[to], feeAmountGBT * AFFILIATE / DIVISOR); IERC20(address(this)).safeTransferFrom(account, fees, feeAmountGBT - (feeAmountGBT * AFFILIATE / DIVISOR)); } IERC20(address(this)).safeTransferFrom(account, address(this), _amountGBT - feeAmountGBT); IERC20(BASE_TOKEN).safeTransfer(to, outBASE); emit Sell(account, to, _amountGBT, referrals[to]); } /** @dev User borrows an amount of {BASE} equal to @param _amount */ function borrowSome(uint256 _amount) external nonReentrant { require(_amount > 0, "!Zero"); address account = msg.sender; uint256 borrowPowerGBT = IXGBT(XGBT).balanceOf(account); uint256 borrowTotalBASE = (reserveVirtualBASE * totalSupply() / (totalSupply() - borrowPowerGBT)) - reserveVirtualBASE; uint256 borrowableBASE = borrowTotalBASE - borrowedBASE[account]; require(borrowableBASE >= _amount, "Borrow Underflow"); borrowedBASE[account] += _amount; borrowedTotalBASE += _amount; IERC20(BASE_TOKEN).safeTransfer(account, _amount); emit Borrow(account, _amount); } /** @dev User borrows the maximum amount of {BASE} their locked {XGBT} will allow */ function borrowMax() external nonReentrant { address account = msg.sender; uint256 borrowPowerGBT = IXGBT(XGBT).balanceOf(account); uint256 borrowTotalBASE = (reserveVirtualBASE * totalSupply() / (totalSupply() - borrowPowerGBT)) - reserveVirtualBASE; uint256 borrowableBASE = borrowTotalBASE - borrowedBASE[account]; borrowedBASE[account] += borrowableBASE; borrowedTotalBASE += borrowableBASE; IERC20(BASE_TOKEN).safeTransfer(account, borrowableBASE); emit Borrow(account, borrowableBASE); } /** @dev User repays a portion of their debt equal to @param _amount */ function repaySome(uint256 _amount) external nonReentrant { require(_amount > 0, "!Zero"); address account = msg.sender; borrowedBASE[account] -= _amount; borrowedTotalBASE -= _amount; IERC20(BASE_TOKEN).safeTransferFrom(account, address(this), _amount); emit Repay(account, _amount); } /** @dev User repays their debt and opens unlocking of {XGBT} */ function repayMax() external nonReentrant { address account = msg.sender; uint256 amountRepayBASE = borrowedBASE[account]; borrowedBASE[account] = 0; borrowedTotalBASE -= amountRepayBASE; IERC20(BASE_TOKEN).safeTransferFrom(account, address(this), amountRepayBASE); emit Repay(account, amountRepayBASE); } //////////////////// //// Restricted //// //////////////////// function updateAllowlist(address[] memory accounts, uint256 amount) external { require(msg.sender == factory || msg.sender == artist, "!AUTH"); for (uint256 i = 0; i < accounts.length; i++) { allowlist[accounts[i]] = amount; } emit AllowListUpdated(accounts, amount); } function setXGBT(address _XGBT) external OnlyFactory { XGBT = _XGBT; emit XGBTSet(_XGBT); } function setArtist(address _artist) external { require(msg.sender == artist, "!AUTH"); artist = _artist; emit ChangeArtist(_artist); } function setArtistTreasury(address _artistTreasury) external { require(msg.sender == artist, "!AUTH"); artistTreasury = _artistTreasury; emit ChangeArtistTreasury(_artistTreasury); } function openMarket() external { require(msg.sender == artist, "!AUTH"); open = true; emit MarketOpened(block.timestamp); } modifier OnlyFactory() { require(msg.sender == factory, "!AUTH"); _; } } contract GBTFactory { address public factory; address public lastGBT; event FactorySet(address indexed _factory); constructor() { factory = msg.sender; } function setFactory(address _factory) external OnlyFactory { factory = _factory; emit FactorySet(_factory); } function createGBT( string memory _name, string memory _symbol, address _baseToken, uint256 _initialVirtualBASE, uint256 _supplyGBT, address _artist, address _factory, uint256 _delay, uint256 _fee ) external OnlyFactory returns (address) { GBT newGBT = new GBT(_name, _symbol, _baseToken, _initialVirtualBASE, _supplyGBT, _artist, _factory, _delay, _fee); lastGBT = address(newGBT); return lastGBT; } modifier OnlyFactory() { require(msg.sender == factory, "!AUTH"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.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}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * 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]. * * 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 ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * 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 override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 value {ERC20} uses, unless this function is * 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 override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override 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 `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` 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 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * 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 `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `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. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` 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. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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 v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_factory","type":"address"}],"name":"FactorySet","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"uint256","name":"_initialVirtualBASE","type":"uint256"},{"internalType":"uint256","name":"_supplyGBT","type":"uint256"},{"internalType":"address","name":"_artist","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"uint256","name":"_delay","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"createGBT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastGBT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"setFactory","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080806040523461002857600080546001600160a01b03191633179055613de0908161002e8239f35b600080fdfe604060808152600490813610156200001657600080fd5b600091823560e01c9081635bb4780814620002265781639a1e5e5d14620000aa57508063c45a015514620000815763d1eb2022146200005457600080fd5b346200007d57816003193601126200007d5760015490516001600160a01b039091168152602090f35b5080fd5b50346200007d57816003193601126200007d57905490516001600160a01b039091168152602090f35b8383346200007d5761012080600319360112620002225767ffffffffffffffff9084358281116200021e57620000e4903690870162000297565b6024358381116200021a57620000fe903690880162000297565b6001600160a01b039360443585811693919290849003620002165760a43590868216809203620002125760c435928784168094036200020e5762000147888b5416331462000319565b885196613a1a80890196871189881017620001fb576200018e92899897969594926200017f92620003918b398088528701906200034e565b9085820360208701526200034e565b93888401526064356060840152608435608084015260a083015260c082015260e43560e082015261010061010435910152039084f08015620001ef57602093501690816bffffffffffffffffffffffff60a01b600154161760015551908152f35b505051903d90823e3d90fd5b634e487b7160e01b8c5260418d5260248cfd5b8980fd5b8880fd5b8780fd5b8580fd5b8480fd5b8280fd5b8390346200007d5760203660031901126200007d57356001600160a01b038181169182900362000222578190620002638454918216331462000319565b6001600160a01b0319161782557f1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b18280a280f35b81601f82011215620002fe5780359067ffffffffffffffff92838311620003035760405193601f8401601f19908116603f0116850190811185821017620003035760405282845260208383010111620002fe57816000926020809301838601378301015290565b600080fd5b634e487b7160e01b600052604160045260246000fd5b156200032157565b60405162461bcd60e51b815260206004820152600560248201526404282aaa8960db1b6044820152606490fd5b919082519283825260005b8481106200037b575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016200035956fe60406101808152346200067f5762003a1a9081380380620000208162000684565b9384398201906101209182848203126200067f5783516001600160401b0392908381116200067f578262000056918701620006aa565b9160209081870151908582116200067f5762000074918801620006aa565b90620000828388016200071c565b916060880151946080890151936200009d60a08b016200071c565b90620000ac60c08c016200071c565b9860e08c015198610100809d01519a85519583871162000570576003805497600192838a811c9a16801562000674575b8c8b10146200065e5781908c601f9b8c811162000605575b50508c908b8311600114620005925760009262000586575b505060001982841b1c191690831b1781555b88519085821162000570576004998a548481811c9116801562000565575b8d8210146200055057908c828c86959411620004f5575b50508c908b84116001146200047b576000936200046f575b505082841b92600019911b1c19161788555b60055560648c116200042c5760198c10620003e9578360805260018060a01b0380951660018060a01b031981816009541617600955600a541617600a558d5260a05260006006558660c05286600755428b52610140988952610160998a5260ff19600d5416600d55875191610ec68084019284841090841117620003d457918484928b9462002b54853930835216888201520301906000f08015620003c9571660e05230156200038a5750600254908382018092116200037557506000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160025530835282815284832084815401905584519384523093a35192612422948562000732863960805185818161053801528181610917015281816109470152818161099101528181610f0b015281816113fd015281816117bc0152611917015260a05185818161046b015281816107e301528181610f840152818161117b01528181611357015281816116490152818161187f01528181611c810152611e6a015260c05185611b36015260e051858181610501015281816105db015281816108f401528181610a150152611b6f015251848181610d1401528181610e510152611aef015251838181610711015261086d01525182818161084c015261122901525181818161036a0152818161042801526107ba0152f35b601190634e487b7160e01b6000525260246000fd5b60649285519262461bcd60e51b845283015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b86513d6000823e3d90fd5b604187634e487b7160e01b6000525260246000fd5b895162461bcd60e51b8152808801899052601660248201527f526564656d7074696f6e2066656520746f6f206c6f77000000000000000000006044820152606490fd5b895162461bcd60e51b8152808801899052601760248201527f526564656d7074696f6e2066656520746f6f20686967680000000000000000006044820152606490fd5b0151915038806200016b565b859450908d92918d601f1986169060005284600020946000905b828210620004d15750508511620004b6575b50505050811b0188556200017d565b01519060f884600019921b161c1916905538808080620004a7565b9192939697829195968886015181550196019301908f918897969594939262000495565b90919293508c6000528b826000209181870160051c830193871062000546575b91879187969594930160051c01915b8281106200053657508e915062000153565b6000815586955087910162000524565b9250819262000515565b60228c634e487b7160e01b6000525260246000fd5b90607f16906200013c565b634e487b7160e01b600052604160045260246000fd5b0151905038806200010c565b859350908d91601f1984168660005283600020936000905b828210620005e35750508411620005ca575b505050811b0181556200011e565b015160001983861b60f8161c19169055388080620005bc565b91929395968291958786015181550195019301908f91889695949392620005aa565b90919250846000528b826000209181860160051c830193861062000654575b918791869594930160051c01915b8281106200064457508e9150620000f4565b6000815585945087910162000632565b9250819262000624565b634e487b7160e01b600052602260045260246000fd5b99607f1699620000dc565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200057057604052565b919080601f840112156200067f5782516001600160401b0381116200057057602090620006e0601f8201601f1916830162000684565b928184528282870101116200067f5760005b8181106200070857508260009394955001015290565b8581018301518482018401528201620006f2565b51906001600160a01b03821682036200067f5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde03146119585750816308ef2b4c146118e8578163095ea7b3146118be57816309c59056146118a25781630a4d82ff146118675781630eebdf4f146118415781631630185d1461180a57816318160ddd146117eb578163210663e4146117a757816323b872dd146116dd57816326faf313146115be5781632c24550b14611595578163313ce567146115795781633410fe6e1461155c5781633606f5b9146114fc57816339509351146114ac5781633e9943f5146112e257816343bc1612146103295781634c35dfcc1461126b578163539fb54d14611021578163562626871461124c5781635c59c7b7146106cb5781636a42b8f81461121157816370a08231146111da57816388cc58e4146106f45781638d4a9989146111bb5781639363c8121461115e57816395d89b411461105957816397d63f93146107345781639af1d35a146106245781639b6c56ec146110215781639ca423b314610fe65781639d1b464a14610f6a5781639d23814814610eb45781639d352a2c14610e28578163a2df92a814610c88578163a381cea214610c69578163a457c2d714610bc1578163a7cd52cb14610b89578163a9059cbb14610b58578163ba002b7014610739578163bbb42e5a14610734578163be9a6555146106f9578163c45a0155146106f4578163c4f95492146106cb578163ce98fd671461069e578163d4c9753314610629578163db8d55f114610624578163dc234f5a146103d6578163dd62ed3e1461038d578163ddca3f4314610352578163e094826b14610329578163f97f0f721461029d575063fcfff16f1461027757600080fd5b3461029957816003193601126102995760209060ff600d541690519015158152f35b5080fd5b919050346103135782600319360112610313578051916370a0823160e01b83523090830152602082602481305afa91821561031f5783926102e3575b6020838351908152f35b9091506020813d602011610317575b816102ff60209383611b9e565b8101031261031357602092505190386102d9565b8280fd5b3d91506102f2565b81513d85823e3d90fd5b50503461029957816003193601126102995760095490516001600160a01b039091168152602090f35b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610299578060031936011261029957806020926103ab611a92565b6103b3611aad565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b905034610313576080366003190112610313578035604435916104136103fa611ac3565b93610403611fa7565b8015908115610619575b50611d86565b61041e821515611dbc565b6103e8928361044d7f000000000000000000000000000000000000000000000000000000000000000085611bd6565b049060075491610466816104618786611d11565b611bff565b6104c17f00000000000000000000000000000000000000000000000000000000000000006104b36104ac846104a76104a060065486611d11565b998a611bd6565b611c0c565b8097611bff565b956104616024358811611e00565b6006556007556001600160a01b03828116808a52600b602052888a20549097919590861691908261059d575050509061053561052d8361052761055d96957f00000000000000000000000000000000000000000000000000000000000000003330611ffd565b87611bff565b303330611ffd565b837f0000000000000000000000000000000000000000000000000000000000000000166121c6565b828552600b602052838520541692519081527fb05b00f99b958181a350955550cd5b6087b7919ea3833b76d486bd3ffc5a22e760203392a4600160055580f35b6064840290848204606414851517156106065750926106016105d9610535946105d361052d9561055d9a99980480923330611ffd565b83611bff565b7f00000000000000000000000000000000000000000000000000000000000000003330611ffd565b610527565b634e487b7160e01b8c526011905260248bfd5b90504211153861040d565b611b59565b5050346102995760203660031901126102995760207fe850629c16d7958ddc02de8972e4be307d7597f28d755b2ab53114cdeafd12e591610668611a92565b60095491906001600160a01b03906106833383861614611d1e565b1680926001600160601b0360a01b161760095551908152a180f35b505034610299576020366003190112610299576020906106c46106bf611a92565b611e3c565b9051908152f35b50503461029957816003193601126102995760085490516001600160a01b039091168152602090f35b611ad9565b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b611b1e565b9050346103135760a03660031901126103135780356044359161075a611ac3565b926001600160a01b0360843581811693919290849003610b545761078090610403611fa7565b61078b841515611dbc565b81851694858852602093600b855287892080548581161580610b4b575b610b10575b5050506103e891826107df7f000000000000000000000000000000000000000000000000000000000000000088611bd6565b04907f00000000000000000000000000000000000000000000000000000000000000009361080f60065486611d11565b61081d846104618b84611d11565b95610839610832886104a76007548096611bd6565b8093611bff565b966108476024358911611e00565b6108917f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611d11565b421115610a54575b906108a391611bff565b600655600755888b52600b8752898b20548616908161098e57505050916109729161096c6109428561093c7f42606569cfe1db2e12d3138169b7740b0cab50c2907574b402b0bbde170c86a49998977f0000000000000000000000000000000000000000000000000000000000000000338a7f000000000000000000000000000000000000000000000000000000000000000016611ffd565b89611bff565b3033877f000000000000000000000000000000000000000000000000000000000000000016611ffd565b306121c6565b848752600b8252858720541694519283523392a4600160055580f35b867f00000000000000000000000000000000000000000000000000000000000000001692606485029085820460641486151715610a41575093610a3c6109729694610a1261096c95610a0c610942967f42606569cfe1db2e12d3138169b7740b0cab50c2907574b402b0bbde170c86a49e9d9c9a0480923386611ffd565b84611bff565b907f0000000000000000000000000000000000000000000000000000000000000000903390611ffd565b61093c565b634e487b7160e01b8e526011905260248dfd5b60ff600d541615610ad7578c8e8d8152600c8c5220548811610a9457906108a3918d8f8e8152600c8d5220610a8a8a8254611bff565b9055909150610899565b8c5162461bcd60e51b81528086018b9052601960248201527f416c6c6f776c69737420616d6f756e74206f766572666c6f77000000000000006044820152606490fd5b8c5162461bcd60e51b81528086018b9052601360248201527213585c9ad95d081b9bdd081bdc195b881e595d606a1b6044820152606490fd5b6001600160a01b03191682179055867f2ed9076138ae3eae90b938672a5f6a8a6c8344fcb761da922e964686dc4c6acf8a80a33880806107ad565b508215156107a8565b8780fd5b505034610299578060031936011261029957602090610b82610b78611a92565b6024359033612058565b5160018152f35b5050346102995760203660031901126102995760209181906001600160a01b03610bb1611a92565b168152600c845220549051908152f35b90508234610c665782600319360112610c6657610bdc611a92565b918360243592338152600160205281812060018060a01b0386168252602052205490828210610c1557602085610b828585038733611ea5565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b505034610299578160031936011261029957602090600e549051908152f35b90503461031357816003193601126103135780359167ffffffffffffffff91828411610e245736602385011215610e245783810135928311610e1157506005928260051b93602091835194610cdf84880187611b9e565b85528285016024819783010191368311610e0d57602401905b828210610dea575050602435946001600160a01b0392909150337f00000000000000000000000000000000000000000000000000000000000000008416148015610ddd575b610d4690611d1e565b875b8251811015610d6f57808486600193851b86010151168a52600c865287878b205501610d48565b50509290869492918051948186019186525180915260608501969186905b828210610dc457877f07afd67b9b5cc9395ba64dd4d31ce88463ab97e14981c16b8ded38347065cf8688808c8a8a8301520390a180f35b8351811689529784019792840192600190910190610d8d565b5060095483163314610d3d565b81356001600160a01b0381168103610e09578152908401908401610cf8565b8980fd5b8880fd5b634e487b7160e01b855260419052602484fd5b8480fd5b8334610c66576020366003190112610c6657610e42611a92565b6001600160a01b0390610e78337f0000000000000000000000000000000000000000000000000000000000000000841614611d1e565b16806001600160601b0360a01b60085416176008557f72b559e9277e4b56dea025a26f511fbe91c1b8315429aefd0cd88ba0be4bc9098280a280f35b905034610313576020366003190112610313573590610ed1611fa7565b610edc821515611d52565b338352600f602052808320610ef2838254611bff565b9055610f0082600e54611bff565b600e55610f388230337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd565b519081527f5c16de4f8b59bd9caf0f49a545f25819a895ed223294290b408242e72a59423160203392a2600160055580f35b828434610c665780600319360112610c6657610fa86006547f0000000000000000000000000000000000000000000000000000000000000000611d11565b92670de0b6b3a764000093848102948186041490151715610fd3576020836106c48660075490611c0c565b634e487b7160e01b825260119052602490fd5b505034610299576020366003190112610299576020916001600160a01b0390829082611010611a92565b168152600b85522054169051908152f35b5050346102995760203660031901126102995760209181906001600160a01b03611049611a92565b168152600f845220549051908152f35b83833461029957816003193601126102995780519180938054916001908360011c9260018516948515611154575b60209586861081146111415785895290811561111d57506001146110c5575b6110c187876110b7828c0383611b9e565b5191829182611a49565b0390f35b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b82841061110a57505050826110c1946110b7928201019486806110a6565b80548685018801529286019281016110ec565b60ff19168887015250505050151560051b83010192506110b7826110c186806110a6565b634e487b7160e01b845260228352602484fd5b93607f1693611087565b828434610c665780600319360112610c6657670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000000000000081810294918115918604141715610fd3576020836106c48660025490611c0c565b5050346102995781600319360112610299576020906006549051908152f35b5050346102995760203660031901126102995760209181906001600160a01b03611202611a92565b16815280845220549051908152f35b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102995781600319360112610299576020906007549051908152f35b5050346102995760203660031901126102995760207fccb29ded675e506e3720dce9c9fc8f358f7f902b5a39dcf394969ef773222d52916112aa611a92565b6009546001600160a01b0391906112c49083163314611d1e565b1690816001600160601b0360a01b600a541617600a5551908152a180f35b9190503461031357602090816003193601126114a857823592611303611fa7565b61130e841515611d52565b60085482516370a0823160e01b815233818401526001600160a01b03929185908290602490829087165afa90811561149e579086918891611467575b506113946113a5916104617f00000000000000000000000000000000000000000000000000000000000000009161138e600254916113888386611bd6565b92611bff565b90611c0c565b338952600f87528589205490611bff565b10611431575090611422847fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a367509493338852600f85528388206113e8838254611d11565b90556113f682600e54611d11565b600e5533907f0000000000000000000000000000000000000000000000000000000000000000166121c6565b519283523392a2600160055580f35b825162461bcd60e51b8152908101849052601060248201526f426f72726f7720556e646572666c6f7760801b6044820152606490fd5b809250868092503d8311611497575b6114808183611b9e565b810103126114935751859061139461134a565b8680fd5b503d611476565b84513d89823e3d90fd5b8380fd5b505034610299578060031936011261029957610b826020926114f56114cf611a92565b338352600186528483206001600160a01b03821684528652918490205460243590611d11565b9033611ea5565b50503461029957816003193601126102995760207f877332afc4cf5a3b3ce30a19161c7d2e263703799bec37d80f6bbbf4199e59c79161154760018060a01b03600954163314611d1e565b600160ff19600d541617600d5551428152a180f35b505034610299578160031936011261029957602090516103e88152f35b5050346102995781600319360112610299576020905160128152f35b505034610299578160031936011261029957600a5490516001600160a01b039091168152602090f35b919050346103135782600319360112610313576115d9611fa7565b60085481516370a0823160e01b815233938101939093526001600160a01b03929160209182908490602490829088165afa9283156116d35785936116a2575b5061142261168b61167a7fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750956104617f00000000000000000000000000000000000000000000000000000000000000009161138e600254916113888386611bd6565b338852600f85528388205490611bff565b8095338852600f85528388206113e8838254611d11565b92508183813d83116116cc575b6116b98183611b9e565b81010312610e2457915191611422611618565b503d6116af565b81513d87823e3d90fd5b83915034610299576060366003190112610299576116f9611a92565b611701611aad565b91846044359460018060a01b03841681526001602052818120338252602052205490600019820361173b575b602086610b82878787612058565b848210611764575091839161175960209695610b8295033383611ea5565b91939481935061172d565b606490602087519162461bcd60e51b8352820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152fd5b505034610299578160031936011261029957517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346102995781600319360112610299576020906002549051908152f35b505034610299578160031936011261029957611824611fa7565b338252600f602052808220908282549255610f0082600e54611bff565b505034610299576020366003190112610299576020906106c4611862611a92565b611c2c565b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102995781600319360112610299576020905160648152f35b505034610299578060031936011261029957602090610b826118de611a92565b6024359033611ea5565b9190503461031357826003193601126103135780516370a0823160e01b815230928101929092526020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561031f5783926102e3576020838351908152f35b929150346114a857836003193601126114a857600354600181811c9186908281168015611a3f575b6020958686108214611a2c5750848852908115611a0a57506001146119b1575b6110c186866110b7828b0383611b9e565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106119f757505050826110c1946110b79282010194386119a0565b80548685018801529286019281016119da565b60ff191687860152505050151560051b83010192506110b7826110c1386119a0565b634e487b7160e01b845260229052602483fd5b93607f1693611980565b6020808252825181830181905290939260005b828110611a7e57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501611a5c565b600435906001600160a01b0382168203611aa857565b600080fd5b602435906001600160a01b0382168203611aa857565b606435906001600160a01b0382168203611aa857565b34611aa8576000366003190112611aa8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34611aa8576000366003190112611aa85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34611aa8576000366003190112611aa8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff821117611bc057604052565b634e487b7160e01b600052604160045260246000fd5b81810292918115918404141715611be957565b634e487b7160e01b600052601160045260246000fd5b91908203918211611be957565b8115611c16570490565b634e487b7160e01b600052601260045260246000fd5b6008546040516370a0823160e01b81526001600160a01b03928316600482018190529092909160209184916024918391165afa918215611d0557600092611cd1575b508115611cca57611cb2611cc7926104617f00000000000000000000000000000000000000000000000000000000000000009161138e600254916113888386611bd6565b90600052600f60205260406000205490611bff565b90565b5050600090565b9091506020813d602011611cfd575b81611ced60209383611b9e565b81010312611aa857519038611c6e565b3d9150611ce0565b6040513d6000823e3d90fd5b91908201809211611be957565b15611d2557565b60405162461bcd60e51b815260206004820152600560248201526404282aaa8960db1b6044820152606490fd5b15611d5957565b60405162461bcd60e51b8152602060048201526005602482015264215a65726f60d81b6044820152606490fd5b15611d8d57565b60405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b6044820152606490fd5b15611dc357565b60405162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b6044820152606490fd5b15611e0757565b60405162461bcd60e51b815260206004820152600d60248201526c2632b9b9903a3430b71026b4b760991b6044820152606490fd5b6001600160a01b03166000908152600f60205260409020548015611e9f57611cc790611e996002549161138e7f0000000000000000000000000000000000000000000000000000000000000000611e938582611bd6565b92611d11565b90611bff565b50600090565b6001600160a01b03908116918215611f565716918215611f065760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b600260055414611fb8576002600555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b6040516323b872dd60e01b60208201526001600160a01b03928316602482015292909116604483015260648083019390935291815260a081019181831067ffffffffffffffff841117611bc05761205692604052612212565b565b6001600160a01b039081169182156121735716918215612122576000828152806020526040812054918083106120ce57604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152608081019167ffffffffffffffff831182841017611bc057612056926040525b60018060a01b0316906040516040810167ffffffffffffffff9082811082821117611bc0576040526020938483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858401526000808587829751910182855af1903d1561234c573d92831161233857906122ad939291604051926122a088601f19601f8401160185611b9e565b83523d868885013e612357565b8051806122bb575b50505050565b818491810103126102995782015190811591821503610c6657506122e1578080806122b5565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b634e487b7160e01b85526041600452602485fd5b906122ad9392506060915b919290156123b9575081511561236b575090565b3b156123745790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156123cc5750805190602001fd5b60405162461bcd60e51b81529081906123e89060048301611a49565b0390fdfea2646970667358221220e26b80508421dc443d37fddcf345e50bbad194b66f43c5717fda786e3c9e9fed64736f6c6343000818003360c0346100e757601f610ec638819003918201601f19168301916001600160401b038311848410176100ec5780849260409485528339810103126100e757610052602061004b83610102565b9201610102565b90600160005560805260a052604051610daf9081610117823960805181818160c701528181610183015281816102030152818161025201528181610291015281816102dd015281816103310152818161038e01526103e4015260a0518181816101140152818161040f01528181610468015281816104bc01528181610515015281816105720152818161059b015261081a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100e75756fe608080604052600436101561001357600080fd5b600090813560e01c9081632d2c5565146108e7575080633410fe6e146108ca57806368fe61ac146107e85780638f73c5ae146107ed578063acf4094a146107e8578063bb57ad201461008c5763cab34c081461006e57600080fd5b346100895780600319360112610089576020604051600a8152f35b80fd5b503461008957806003193601126100895760028154146107a357600281556040516370a0823160e01b808252306004830152906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610766578391610771575b506040519182523060048301526020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561076657839261072e575b50600a820291808304600a14811517156105f457806103e884048103116105f457604051632233163960e21b8152916020836004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315610706576004936020918791610711575b50604051631d8cf42560e11b815294859182906001600160a01b03165afa9283156107065785936106e5575b50604051632c24550b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156106da5786916106bb575b50604051635c59c7b760e01b8152916020836004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9283156106b057879361067f575b506102be837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661098f565b6101908102818104610190148215171561062f5761030a6103e88204857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109e3565b6001600160a01b0384163b1561067b5760405163b66503cf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526103e882046024820152888180604481010381836001600160a01b038a165af1801561067057610657575b506103bb906103e89004837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b27565b8060c881020460c8148115171561064357610409906103e860c890910204856001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610b27565b61043c827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661098f565b6103e88504838114929084036101908181029182041484171561062f576103e8900490879061049583827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109e3565b6001600160a01b0381163b1561062b5760405163b66503cf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526024810184905290829082908183816044810103926001600160a01b03165af1801561062057610608575b506105429290507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b27565b6103e8840490910360c8818102929183041417156105f457916105976103e892836105c895049060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016610b27565b04337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b27565b337f2ab0d312ec5eef312bf327c57a266c37191bf9c85aeea6c7d67c3a2db9f05bb78280a26001815580f35b634e487b7160e01b84526011600452602484fd5b61061190610924565b61061c57863861050c565b8680fd5b6040513d84823e3d90fd5b5080fd5b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b6103bb91986106686103e892610924565b989150610381565b6040513d8b823e3d90fd5b8780fd5b6106a291935060203d6020116106a9575b61069a818361094e565b810190610970565b913861028a565b503d610690565b6040513d89823e3d90fd5b6106d4915060203d6020116106a95761069a818361094e565b3861023b565b6040513d88823e3d90fd5b6106ff91935060203d6020116106a95761069a818361094e565b91386101ed565b6040513d87823e3d90fd5b6107289150823d84116106a95761069a818361094e565b386101c1565b9091506020813d60201161075e575b8161074a6020938361094e565b8101031261075a5751903861014c565b8280fd5b3d915061073d565b6040513d85823e3d90fd5b90506020813d60201161079b575b8161078c6020938361094e565b8101031261075a5751386100ff565b3d915061077f565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b610902565b50346100895780600319360112610089576040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9182156108bd578192610889575b50600a820291808304600a1490151715610875576020826103e860405191048152f35b634e487b7160e01b81526011600452602490fd5b9091506020813d6020116108b5575b816108a56020938361094e565b8101031261062b57519038610852565b3d9150610898565b50604051903d90823e3d90fd5b503461008957806003193601126100895760206040516103e88152f35b90503461062b578160031936011261062b578060c860209252f35b3461091f57600036600319011261091f5760206040516101908152f35b600080fd5b67ffffffffffffffff811161093857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761093857604052565b9081602091031261091f57516001600160a01b038116810361091f5790565b60405163095ea7b360e01b60208201526001600160a01b0390921660248301526000604480840191909152825260808201919067ffffffffffffffff831182841017610938576109e192604052610b60565b565b91909181158015610aa1575b15610a3d5760405163095ea7b360e01b60208201526001600160a01b03909316602484015260448301919091526109e19190610a3882606481015b03601f19810184528361094e565b610b60565b60405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608490fd5b50604051636eb1769f60e11b81523060048201526001600160a01b0384811660248301526020908290604490829086165afa908115610b1b57600091610ae9575b50156109ef565b90506020813d602011610b13575b81610b046020938361094e565b8101031261091f575138610ae2565b3d9150610af7565b6040513d6000823e3d90fd5b60405163a9059cbb60e01b60208201526001600160a01b03909216602483015260448201929092526109e191610a388260648101610a2a565b60018060a01b0316906040516040810167ffffffffffffffff9082811082821117610938576040526020938483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858401526000808587829751910182855af1903d15610c9a573d928311610c865790610bfb93929160405192610bee88601f19601f840116018561094e565b83523d868885013e610ca5565b805180610c09575b50505050565b8184918101031261062b57820151908115918215036100895750610c2f57808080610c03565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b634e487b7160e01b85526041600452602485fd5b90610bfb9392506060915b91929015610d075750815115610cb9575090565b3b15610cc25790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610d1a5750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b828510610d60575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610d3d56fea2646970667358221220f2cc2fab55e524ce7ba69a79b74f585af499bd0a9ee8c99d547e1dbae9fd932264736f6c63430008180033a2646970667358221220611fed6c3b5cac148db9c5faa5315757135af7df3e7a9043ed86579494801ab364736f6c63430008180033
Deployed Bytecode
0x604060808152600490813610156200001657600080fd5b600091823560e01c9081635bb4780814620002265781639a1e5e5d14620000aa57508063c45a015514620000815763d1eb2022146200005457600080fd5b346200007d57816003193601126200007d5760015490516001600160a01b039091168152602090f35b5080fd5b50346200007d57816003193601126200007d57905490516001600160a01b039091168152602090f35b8383346200007d5761012080600319360112620002225767ffffffffffffffff9084358281116200021e57620000e4903690870162000297565b6024358381116200021a57620000fe903690880162000297565b6001600160a01b039360443585811693919290849003620002165760a43590868216809203620002125760c435928784168094036200020e5762000147888b5416331462000319565b885196613a1a80890196871189881017620001fb576200018e92899897969594926200017f92620003918b398088528701906200034e565b9085820360208701526200034e565b93888401526064356060840152608435608084015260a083015260c082015260e43560e082015261010061010435910152039084f08015620001ef57602093501690816bffffffffffffffffffffffff60a01b600154161760015551908152f35b505051903d90823e3d90fd5b634e487b7160e01b8c5260418d5260248cfd5b8980fd5b8880fd5b8780fd5b8580fd5b8480fd5b8280fd5b8390346200007d5760203660031901126200007d57356001600160a01b038181169182900362000222578190620002638454918216331462000319565b6001600160a01b0319161782557f1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b18280a280f35b81601f82011215620002fe5780359067ffffffffffffffff92838311620003035760405193601f8401601f19908116603f0116850190811185821017620003035760405282845260208383010111620002fe57816000926020809301838601378301015290565b600080fd5b634e487b7160e01b600052604160045260246000fd5b156200032157565b60405162461bcd60e51b815260206004820152600560248201526404282aaa8960db1b6044820152606490fd5b919082519283825260005b8481106200037b575050826000602080949584010152601f8019910116010190565b6020818301810151848301820152016200035956fe60406101808152346200067f5762003a1a9081380380620000208162000684565b9384398201906101209182848203126200067f5783516001600160401b0392908381116200067f578262000056918701620006aa565b9160209081870151908582116200067f5762000074918801620006aa565b90620000828388016200071c565b916060880151946080890151936200009d60a08b016200071c565b90620000ac60c08c016200071c565b9860e08c015198610100809d01519a85519583871162000570576003805497600192838a811c9a16801562000674575b8c8b10146200065e5781908c601f9b8c811162000605575b50508c908b8311600114620005925760009262000586575b505060001982841b1c191690831b1781555b88519085821162000570576004998a548481811c9116801562000565575b8d8210146200055057908c828c86959411620004f5575b50508c908b84116001146200047b576000936200046f575b505082841b92600019911b1c19161788555b60055560648c116200042c5760198c10620003e9578360805260018060a01b0380951660018060a01b031981816009541617600955600a541617600a558d5260a05260006006558660c05286600755428b52610140988952610160998a5260ff19600d5416600d55875191610ec68084019284841090841117620003d457918484928b9462002b54853930835216888201520301906000f08015620003c9571660e05230156200038a5750600254908382018092116200037557506000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9160025530835282815284832084815401905584519384523093a35192612422948562000732863960805185818161053801528181610917015281816109470152818161099101528181610f0b015281816113fd015281816117bc0152611917015260a05185818161046b015281816107e301528181610f840152818161117b01528181611357015281816116490152818161187f01528181611c810152611e6a015260c05185611b36015260e051858181610501015281816105db015281816108f401528181610a150152611b6f015251848181610d1401528181610e510152611aef015251838181610711015261086d01525182818161084c015261122901525181818161036a0152818161042801526107ba0152f35b601190634e487b7160e01b6000525260246000fd5b60649285519262461bcd60e51b845283015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b86513d6000823e3d90fd5b604187634e487b7160e01b6000525260246000fd5b895162461bcd60e51b8152808801899052601660248201527f526564656d7074696f6e2066656520746f6f206c6f77000000000000000000006044820152606490fd5b895162461bcd60e51b8152808801899052601760248201527f526564656d7074696f6e2066656520746f6f20686967680000000000000000006044820152606490fd5b0151915038806200016b565b859450908d92918d601f1986169060005284600020946000905b828210620004d15750508511620004b6575b50505050811b0188556200017d565b01519060f884600019921b161c1916905538808080620004a7565b9192939697829195968886015181550196019301908f918897969594939262000495565b90919293508c6000528b826000209181870160051c830193871062000546575b91879187969594930160051c01915b8281106200053657508e915062000153565b6000815586955087910162000524565b9250819262000515565b60228c634e487b7160e01b6000525260246000fd5b90607f16906200013c565b634e487b7160e01b600052604160045260246000fd5b0151905038806200010c565b859350908d91601f1984168660005283600020936000905b828210620005e35750508411620005ca575b505050811b0181556200011e565b015160001983861b60f8161c19169055388080620005bc565b91929395968291958786015181550195019301908f91889695949392620005aa565b90919250846000528b826000209181860160051c830193861062000654575b918791869594930160051c01915b8281106200064457508e9150620000f4565b6000815585945087910162000632565b9250819262000624565b634e487b7160e01b600052602260045260246000fd5b99607f1699620000dc565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200057057604052565b919080601f840112156200067f5782516001600160401b0381116200057057602090620006e0601f8201601f1916830162000684565b928184528282870101116200067f5760005b8181106200070857508260009394955001015290565b8581018301518482018401528201620006f2565b51906001600160a01b03821682036200067f5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde03146119585750816308ef2b4c146118e8578163095ea7b3146118be57816309c59056146118a25781630a4d82ff146118675781630eebdf4f146118415781631630185d1461180a57816318160ddd146117eb578163210663e4146117a757816323b872dd146116dd57816326faf313146115be5781632c24550b14611595578163313ce567146115795781633410fe6e1461155c5781633606f5b9146114fc57816339509351146114ac5781633e9943f5146112e257816343bc1612146103295781634c35dfcc1461126b578163539fb54d14611021578163562626871461124c5781635c59c7b7146106cb5781636a42b8f81461121157816370a08231146111da57816388cc58e4146106f45781638d4a9989146111bb5781639363c8121461115e57816395d89b411461105957816397d63f93146107345781639af1d35a146106245781639b6c56ec146110215781639ca423b314610fe65781639d1b464a14610f6a5781639d23814814610eb45781639d352a2c14610e28578163a2df92a814610c88578163a381cea214610c69578163a457c2d714610bc1578163a7cd52cb14610b89578163a9059cbb14610b58578163ba002b7014610739578163bbb42e5a14610734578163be9a6555146106f9578163c45a0155146106f4578163c4f95492146106cb578163ce98fd671461069e578163d4c9753314610629578163db8d55f114610624578163dc234f5a146103d6578163dd62ed3e1461038d578163ddca3f4314610352578163e094826b14610329578163f97f0f721461029d575063fcfff16f1461027757600080fd5b3461029957816003193601126102995760209060ff600d541690519015158152f35b5080fd5b919050346103135782600319360112610313578051916370a0823160e01b83523090830152602082602481305afa91821561031f5783926102e3575b6020838351908152f35b9091506020813d602011610317575b816102ff60209383611b9e565b8101031261031357602092505190386102d9565b8280fd5b3d91506102f2565b81513d85823e3d90fd5b50503461029957816003193601126102995760095490516001600160a01b039091168152602090f35b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610299578060031936011261029957806020926103ab611a92565b6103b3611aad565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b905034610313576080366003190112610313578035604435916104136103fa611ac3565b93610403611fa7565b8015908115610619575b50611d86565b61041e821515611dbc565b6103e8928361044d7f000000000000000000000000000000000000000000000000000000000000000085611bd6565b049060075491610466816104618786611d11565b611bff565b6104c17f00000000000000000000000000000000000000000000000000000000000000006104b36104ac846104a76104a060065486611d11565b998a611bd6565b611c0c565b8097611bff565b956104616024358811611e00565b6006556007556001600160a01b03828116808a52600b602052888a20549097919590861691908261059d575050509061053561052d8361052761055d96957f00000000000000000000000000000000000000000000000000000000000000003330611ffd565b87611bff565b303330611ffd565b837f0000000000000000000000000000000000000000000000000000000000000000166121c6565b828552600b602052838520541692519081527fb05b00f99b958181a350955550cd5b6087b7919ea3833b76d486bd3ffc5a22e760203392a4600160055580f35b6064840290848204606414851517156106065750926106016105d9610535946105d361052d9561055d9a99980480923330611ffd565b83611bff565b7f00000000000000000000000000000000000000000000000000000000000000003330611ffd565b610527565b634e487b7160e01b8c526011905260248bfd5b90504211153861040d565b611b59565b5050346102995760203660031901126102995760207fe850629c16d7958ddc02de8972e4be307d7597f28d755b2ab53114cdeafd12e591610668611a92565b60095491906001600160a01b03906106833383861614611d1e565b1680926001600160601b0360a01b161760095551908152a180f35b505034610299576020366003190112610299576020906106c46106bf611a92565b611e3c565b9051908152f35b50503461029957816003193601126102995760085490516001600160a01b039091168152602090f35b611ad9565b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b611b1e565b9050346103135760a03660031901126103135780356044359161075a611ac3565b926001600160a01b0360843581811693919290849003610b545761078090610403611fa7565b61078b841515611dbc565b81851694858852602093600b855287892080548581161580610b4b575b610b10575b5050506103e891826107df7f000000000000000000000000000000000000000000000000000000000000000088611bd6565b04907f00000000000000000000000000000000000000000000000000000000000000009361080f60065486611d11565b61081d846104618b84611d11565b95610839610832886104a76007548096611bd6565b8093611bff565b966108476024358911611e00565b6108917f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611d11565b421115610a54575b906108a391611bff565b600655600755888b52600b8752898b20548616908161098e57505050916109729161096c6109428561093c7f42606569cfe1db2e12d3138169b7740b0cab50c2907574b402b0bbde170c86a49998977f0000000000000000000000000000000000000000000000000000000000000000338a7f000000000000000000000000000000000000000000000000000000000000000016611ffd565b89611bff565b3033877f000000000000000000000000000000000000000000000000000000000000000016611ffd565b306121c6565b848752600b8252858720541694519283523392a4600160055580f35b867f00000000000000000000000000000000000000000000000000000000000000001692606485029085820460641486151715610a41575093610a3c6109729694610a1261096c95610a0c610942967f42606569cfe1db2e12d3138169b7740b0cab50c2907574b402b0bbde170c86a49e9d9c9a0480923386611ffd565b84611bff565b907f0000000000000000000000000000000000000000000000000000000000000000903390611ffd565b61093c565b634e487b7160e01b8e526011905260248dfd5b60ff600d541615610ad7578c8e8d8152600c8c5220548811610a9457906108a3918d8f8e8152600c8d5220610a8a8a8254611bff565b9055909150610899565b8c5162461bcd60e51b81528086018b9052601960248201527f416c6c6f776c69737420616d6f756e74206f766572666c6f77000000000000006044820152606490fd5b8c5162461bcd60e51b81528086018b9052601360248201527213585c9ad95d081b9bdd081bdc195b881e595d606a1b6044820152606490fd5b6001600160a01b03191682179055867f2ed9076138ae3eae90b938672a5f6a8a6c8344fcb761da922e964686dc4c6acf8a80a33880806107ad565b508215156107a8565b8780fd5b505034610299578060031936011261029957602090610b82610b78611a92565b6024359033612058565b5160018152f35b5050346102995760203660031901126102995760209181906001600160a01b03610bb1611a92565b168152600c845220549051908152f35b90508234610c665782600319360112610c6657610bdc611a92565b918360243592338152600160205281812060018060a01b0386168252602052205490828210610c1557602085610b828585038733611ea5565b608490602086519162461bcd60e51b8352820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152fd5b80fd5b505034610299578160031936011261029957602090600e549051908152f35b90503461031357816003193601126103135780359167ffffffffffffffff91828411610e245736602385011215610e245783810135928311610e1157506005928260051b93602091835194610cdf84880187611b9e565b85528285016024819783010191368311610e0d57602401905b828210610dea575050602435946001600160a01b0392909150337f00000000000000000000000000000000000000000000000000000000000000008416148015610ddd575b610d4690611d1e565b875b8251811015610d6f57808486600193851b86010151168a52600c865287878b205501610d48565b50509290869492918051948186019186525180915260608501969186905b828210610dc457877f07afd67b9b5cc9395ba64dd4d31ce88463ab97e14981c16b8ded38347065cf8688808c8a8a8301520390a180f35b8351811689529784019792840192600190910190610d8d565b5060095483163314610d3d565b81356001600160a01b0381168103610e09578152908401908401610cf8565b8980fd5b8880fd5b634e487b7160e01b855260419052602484fd5b8480fd5b8334610c66576020366003190112610c6657610e42611a92565b6001600160a01b0390610e78337f0000000000000000000000000000000000000000000000000000000000000000841614611d1e565b16806001600160601b0360a01b60085416176008557f72b559e9277e4b56dea025a26f511fbe91c1b8315429aefd0cd88ba0be4bc9098280a280f35b905034610313576020366003190112610313573590610ed1611fa7565b610edc821515611d52565b338352600f602052808320610ef2838254611bff565b9055610f0082600e54611bff565b600e55610f388230337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611ffd565b519081527f5c16de4f8b59bd9caf0f49a545f25819a895ed223294290b408242e72a59423160203392a2600160055580f35b828434610c665780600319360112610c6657610fa86006547f0000000000000000000000000000000000000000000000000000000000000000611d11565b92670de0b6b3a764000093848102948186041490151715610fd3576020836106c48660075490611c0c565b634e487b7160e01b825260119052602490fd5b505034610299576020366003190112610299576020916001600160a01b0390829082611010611a92565b168152600b85522054169051908152f35b5050346102995760203660031901126102995760209181906001600160a01b03611049611a92565b168152600f845220549051908152f35b83833461029957816003193601126102995780519180938054916001908360011c9260018516948515611154575b60209586861081146111415785895290811561111d57506001146110c5575b6110c187876110b7828c0383611b9e565b5191829182611a49565b0390f35b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b82841061110a57505050826110c1946110b7928201019486806110a6565b80548685018801529286019281016110ec565b60ff19168887015250505050151560051b83010192506110b7826110c186806110a6565b634e487b7160e01b845260228352602484fd5b93607f1693611087565b828434610c665780600319360112610c6657670de0b6b3a76400007f000000000000000000000000000000000000000000000000000000000000000081810294918115918604141715610fd3576020836106c48660025490611c0c565b5050346102995781600319360112610299576020906006549051908152f35b5050346102995760203660031901126102995760209181906001600160a01b03611202611a92565b16815280845220549051908152f35b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102995781600319360112610299576020906007549051908152f35b5050346102995760203660031901126102995760207fccb29ded675e506e3720dce9c9fc8f358f7f902b5a39dcf394969ef773222d52916112aa611a92565b6009546001600160a01b0391906112c49083163314611d1e565b1690816001600160601b0360a01b600a541617600a5551908152a180f35b9190503461031357602090816003193601126114a857823592611303611fa7565b61130e841515611d52565b60085482516370a0823160e01b815233818401526001600160a01b03929185908290602490829087165afa90811561149e579086918891611467575b506113946113a5916104617f00000000000000000000000000000000000000000000000000000000000000009161138e600254916113888386611bd6565b92611bff565b90611c0c565b338952600f87528589205490611bff565b10611431575090611422847fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a367509493338852600f85528388206113e8838254611d11565b90556113f682600e54611d11565b600e5533907f0000000000000000000000000000000000000000000000000000000000000000166121c6565b519283523392a2600160055580f35b825162461bcd60e51b8152908101849052601060248201526f426f72726f7720556e646572666c6f7760801b6044820152606490fd5b809250868092503d8311611497575b6114808183611b9e565b810103126114935751859061139461134a565b8680fd5b503d611476565b84513d89823e3d90fd5b8380fd5b505034610299578060031936011261029957610b826020926114f56114cf611a92565b338352600186528483206001600160a01b03821684528652918490205460243590611d11565b9033611ea5565b50503461029957816003193601126102995760207f877332afc4cf5a3b3ce30a19161c7d2e263703799bec37d80f6bbbf4199e59c79161154760018060a01b03600954163314611d1e565b600160ff19600d541617600d5551428152a180f35b505034610299578160031936011261029957602090516103e88152f35b5050346102995781600319360112610299576020905160128152f35b505034610299578160031936011261029957600a5490516001600160a01b039091168152602090f35b919050346103135782600319360112610313576115d9611fa7565b60085481516370a0823160e01b815233938101939093526001600160a01b03929160209182908490602490829088165afa9283156116d35785936116a2575b5061142261168b61167a7fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750956104617f00000000000000000000000000000000000000000000000000000000000000009161138e600254916113888386611bd6565b338852600f85528388205490611bff565b8095338852600f85528388206113e8838254611d11565b92508183813d83116116cc575b6116b98183611b9e565b81010312610e2457915191611422611618565b503d6116af565b81513d87823e3d90fd5b83915034610299576060366003190112610299576116f9611a92565b611701611aad565b91846044359460018060a01b03841681526001602052818120338252602052205490600019820361173b575b602086610b82878787612058565b848210611764575091839161175960209695610b8295033383611ea5565b91939481935061172d565b606490602087519162461bcd60e51b8352820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152fd5b505034610299578160031936011261029957517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346102995781600319360112610299576020906002549051908152f35b505034610299578160031936011261029957611824611fa7565b338252600f602052808220908282549255610f0082600e54611bff565b505034610299576020366003190112610299576020906106c4611862611a92565b611c2c565b505034610299578160031936011261029957602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102995781600319360112610299576020905160648152f35b505034610299578060031936011261029957602090610b826118de611a92565b6024359033611ea5565b9190503461031357826003193601126103135780516370a0823160e01b815230928101929092526020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561031f5783926102e3576020838351908152f35b929150346114a857836003193601126114a857600354600181811c9186908281168015611a3f575b6020958686108214611a2c5750848852908115611a0a57506001146119b1575b6110c186866110b7828b0383611b9e565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106119f757505050826110c1946110b79282010194386119a0565b80548685018801529286019281016119da565b60ff191687860152505050151560051b83010192506110b7826110c1386119a0565b634e487b7160e01b845260229052602483fd5b93607f1693611980565b6020808252825181830181905290939260005b828110611a7e57505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501611a5c565b600435906001600160a01b0382168203611aa857565b600080fd5b602435906001600160a01b0382168203611aa857565b606435906001600160a01b0382168203611aa857565b34611aa8576000366003190112611aa8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34611aa8576000366003190112611aa85760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34611aa8576000366003190112611aa8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff821117611bc057604052565b634e487b7160e01b600052604160045260246000fd5b81810292918115918404141715611be957565b634e487b7160e01b600052601160045260246000fd5b91908203918211611be957565b8115611c16570490565b634e487b7160e01b600052601260045260246000fd5b6008546040516370a0823160e01b81526001600160a01b03928316600482018190529092909160209184916024918391165afa918215611d0557600092611cd1575b508115611cca57611cb2611cc7926104617f00000000000000000000000000000000000000000000000000000000000000009161138e600254916113888386611bd6565b90600052600f60205260406000205490611bff565b90565b5050600090565b9091506020813d602011611cfd575b81611ced60209383611b9e565b81010312611aa857519038611c6e565b3d9150611ce0565b6040513d6000823e3d90fd5b91908201809211611be957565b15611d2557565b60405162461bcd60e51b815260206004820152600560248201526404282aaa8960db1b6044820152606490fd5b15611d5957565b60405162461bcd60e51b8152602060048201526005602482015264215a65726f60d81b6044820152606490fd5b15611d8d57565b60405162461bcd60e51b8152602060048201526007602482015266115e1c1a5c995960ca1b6044820152606490fd5b15611dc357565b60405162461bcd60e51b8152602060048201526015602482015274416d6f756e742063616e6e6f74206265207a65726f60581b6044820152606490fd5b15611e0757565b60405162461bcd60e51b815260206004820152600d60248201526c2632b9b9903a3430b71026b4b760991b6044820152606490fd5b6001600160a01b03166000908152600f60205260409020548015611e9f57611cc790611e996002549161138e7f0000000000000000000000000000000000000000000000000000000000000000611e938582611bd6565b92611d11565b90611bff565b50600090565b6001600160a01b03908116918215611f565716918215611f065760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b600260055414611fb8576002600555565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b6040516323b872dd60e01b60208201526001600160a01b03928316602482015292909116604483015260648083019390935291815260a081019181831067ffffffffffffffff841117611bc05761205692604052612212565b565b6001600160a01b039081169182156121735716918215612122576000828152806020526040812054918083106120ce57604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152608081019167ffffffffffffffff831182841017611bc057612056926040525b60018060a01b0316906040516040810167ffffffffffffffff9082811082821117611bc0576040526020938483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858401526000808587829751910182855af1903d1561234c573d92831161233857906122ad939291604051926122a088601f19601f8401160185611b9e565b83523d868885013e612357565b8051806122bb575b50505050565b818491810103126102995782015190811591821503610c6657506122e1578080806122b5565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b634e487b7160e01b85526041600452602485fd5b906122ad9392506060915b919290156123b9575081511561236b575090565b3b156123745790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156123cc5750805190602001fd5b60405162461bcd60e51b81529081906123e89060048301611a49565b0390fdfea2646970667358221220e26b80508421dc443d37fddcf345e50bbad194b66f43c5717fda786e3c9e9fed64736f6c6343000818003360c0346100e757601f610ec638819003918201601f19168301916001600160401b038311848410176100ec5780849260409485528339810103126100e757610052602061004b83610102565b9201610102565b90600160005560805260a052604051610daf9081610117823960805181818160c701528181610183015281816102030152818161025201528181610291015281816102dd015281816103310152818161038e01526103e4015260a0518181816101140152818161040f01528181610468015281816104bc01528181610515015281816105720152818161059b015261081a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100e75756fe608080604052600436101561001357600080fd5b600090813560e01c9081632d2c5565146108e7575080633410fe6e146108ca57806368fe61ac146107e85780638f73c5ae146107ed578063acf4094a146107e8578063bb57ad201461008c5763cab34c081461006e57600080fd5b346100895780600319360112610089576020604051600a8152f35b80fd5b503461008957806003193601126100895760028154146107a357600281556040516370a0823160e01b808252306004830152906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610766578391610771575b506040519182523060048301526020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa91821561076657839261072e575b50600a820291808304600a14811517156105f457806103e884048103116105f457604051632233163960e21b8152916020836004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa928315610706576004936020918791610711575b50604051631d8cf42560e11b815294859182906001600160a01b03165afa9283156107065785936106e5575b50604051632c24550b60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156106da5786916106bb575b50604051635c59c7b760e01b8152916020836004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9283156106b057879361067f575b506102be837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661098f565b6101908102818104610190148215171561062f5761030a6103e88204857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109e3565b6001600160a01b0384163b1561067b5760405163b66503cf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526103e882046024820152888180604481010381836001600160a01b038a165af1801561067057610657575b506103bb906103e89004837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b27565b8060c881020460c8148115171561064357610409906103e860c890910204856001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610b27565b61043c827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661098f565b6103e88504838114929084036101908181029182041484171561062f576103e8900490879061049583827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166109e3565b6001600160a01b0381163b1561062b5760405163b66503cf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526024810184905290829082908183816044810103926001600160a01b03165af1801561062057610608575b506105429290507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b27565b6103e8840490910360c8818102929183041417156105f457916105976103e892836105c895049060018060a01b037f000000000000000000000000000000000000000000000000000000000000000016610b27565b04337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b27565b337f2ab0d312ec5eef312bf327c57a266c37191bf9c85aeea6c7d67c3a2db9f05bb78280a26001815580f35b634e487b7160e01b84526011600452602484fd5b61061190610924565b61061c57863861050c565b8680fd5b6040513d84823e3d90fd5b5080fd5b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b6103bb91986106686103e892610924565b989150610381565b6040513d8b823e3d90fd5b8780fd5b6106a291935060203d6020116106a9575b61069a818361094e565b810190610970565b913861028a565b503d610690565b6040513d89823e3d90fd5b6106d4915060203d6020116106a95761069a818361094e565b3861023b565b6040513d88823e3d90fd5b6106ff91935060203d6020116106a95761069a818361094e565b91386101ed565b6040513d87823e3d90fd5b6107289150823d84116106a95761069a818361094e565b386101c1565b9091506020813d60201161075e575b8161074a6020938361094e565b8101031261075a5751903861014c565b8280fd5b3d915061073d565b6040513d85823e3d90fd5b90506020813d60201161079b575b8161078c6020938361094e565b8101031261075a5751386100ff565b3d915061077f565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b610902565b50346100895780600319360112610089576040516370a0823160e01b8152306004820152906020826024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9182156108bd578192610889575b50600a820291808304600a1490151715610875576020826103e860405191048152f35b634e487b7160e01b81526011600452602490fd5b9091506020813d6020116108b5575b816108a56020938361094e565b8101031261062b57519038610852565b3d9150610898565b50604051903d90823e3d90fd5b503461008957806003193601126100895760206040516103e88152f35b90503461062b578160031936011261062b578060c860209252f35b3461091f57600036600319011261091f5760206040516101908152f35b600080fd5b67ffffffffffffffff811161093857604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff82111761093857604052565b9081602091031261091f57516001600160a01b038116810361091f5790565b60405163095ea7b360e01b60208201526001600160a01b0390921660248301526000604480840191909152825260808201919067ffffffffffffffff831182841017610938576109e192604052610b60565b565b91909181158015610aa1575b15610a3d5760405163095ea7b360e01b60208201526001600160a01b03909316602484015260448301919091526109e19190610a3882606481015b03601f19810184528361094e565b610b60565b60405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608490fd5b50604051636eb1769f60e11b81523060048201526001600160a01b0384811660248301526020908290604490829086165afa908115610b1b57600091610ae9575b50156109ef565b90506020813d602011610b13575b81610b046020938361094e565b8101031261091f575138610ae2565b3d9150610af7565b6040513d6000823e3d90fd5b60405163a9059cbb60e01b60208201526001600160a01b03909216602483015260448201929092526109e191610a388260648101610a2a565b60018060a01b0316906040516040810167ffffffffffffffff9082811082821117610938576040526020938483527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564858401526000808587829751910182855af1903d15610c9a573d928311610c865790610bfb93929160405192610bee88601f19601f840116018561094e565b83523d868885013e610ca5565b805180610c09575b50505050565b8184918101031261062b57820151908115918215036100895750610c2f57808080610c03565b6084906040519062461bcd60e51b82526004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152fd5b634e487b7160e01b85526041600452602485fd5b90610bfb9392506060915b91929015610d075750815115610cb9575090565b3b15610cc25790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610d1a5750805190602001fd5b6040519062461bcd60e51b82528160208060048301528251908160248401526000935b828510610d60575050604492506000838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610d3d56fea2646970667358221220f2cc2fab55e524ce7ba69a79b74f585af499bd0a9ee8c99d547e1dbae9fd932264736f6c63430008180033a2646970667358221220611fed6c3b5cac148db9c5faa5315757135af7df3e7a9043ed86579494801ab364736f6c63430008180033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.