Source Code
Overview
GLMR Balance
GLMR Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 217 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 686032 | 1401 days ago | IN | 0 GLMR | 0.00473324 | ||||
| Approve | 685994 | 1401 days ago | IN | 0 GLMR | 0.00477988 | ||||
| Approve | 685927 | 1401 days ago | IN | 0 GLMR | 0.00477988 | ||||
| Transfer | 228309 | 1467 days ago | IN | 0 GLMR | 0.0014954 | ||||
| Transfer | 228288 | 1467 days ago | IN | 0 GLMR | 0.0014966 | ||||
| Transfer | 228242 | 1467 days ago | IN | 0 GLMR | 0.001496 | ||||
| Transfer | 227995 | 1467 days ago | IN | 0 GLMR | 0.0014948 | ||||
| Transfer | 227944 | 1467 days ago | IN | 0 GLMR | 0.0014948 | ||||
| Transfer | 227911 | 1467 days ago | IN | 0 GLMR | 0.0014948 | ||||
| Approve | 225818 | 1467 days ago | IN | 0 GLMR | 0.00127245 | ||||
| Approve | 225817 | 1467 days ago | IN | 0 GLMR | 0.00127245 | ||||
| Approve | 225307 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221997 | 1468 days ago | IN | 0 GLMR | 0.00127245 | ||||
| Approve | 221308 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221220 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221139 | 1468 days ago | IN | 0 GLMR | 0.00127245 | ||||
| Approve | 221107 | 1468 days ago | IN | 0 GLMR | 0.0044245 | ||||
| Approve | 221089 | 1468 days ago | IN | 0 GLMR | 0.0025333 | ||||
| Approve | 221084 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221058 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221044 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221028 | 1468 days ago | IN | 0 GLMR | 0.0044533 | ||||
| Approve | 221025 | 1468 days ago | IN | 0 GLMR | 0.0089066 | ||||
| Approve | 221022 | 1468 days ago | IN | 0 GLMR | 0.0025333 | ||||
| Approve | 221022 | 1468 days ago | IN | 0 GLMR | 0.0044533 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FigToken
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-01-18
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
interface IERC20 {
/**
* @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 `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);
/**
* @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 Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
/**
* @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
* ====
*/
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly {codehash := extcodehash(account)}
return (codehash != accountHash && codehash != 0x0);
}
/**
* @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");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(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 functionCall(target, data, "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");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value : weiValue}(data);
if (success) {
return returndata;
} else {
// 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
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view 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 {_setupDecimals} is
* called.
*
* 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 returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, 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}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), 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};
*
* Requirements:
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is 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:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, 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
*
* - `to` 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 = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(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);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
*
* This is 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 Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @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 to 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 {}
}
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
abstract contract DelegateERC20 is ERC20 {
using SafeMath for uint256;
// @notice A record of each accounts delegate
mapping (address => address) internal _delegates;
/// @notice A checkpoint for marking number of votes from a given block
struct Checkpoint {
uint32 fromBlock;
uint256 votes;
}
/// @notice A record of votes checkpoints for each account, by index
mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
/// @notice The number of checkpoints for each account
mapping (address => uint32) public numCheckpoints;
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
/// @notice The EIP-712 typehash for the delegation struct used by the contract
bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");
/// @notice A record of states for signing / validating signatures
mapping (address => uint) public nonces;
// support delegates mint
function _mint(address account, uint256 amount) internal override virtual {
super._mint(account, amount);
// add delegates to the minter
_moveDelegates(address(0), _delegates[account], amount);
}
function _transfer(address sender, address recipient, uint256 amount) internal override virtual {
super._transfer(sender, recipient, amount);
_moveDelegates(_delegates[sender], _delegates[recipient], amount);
}
/**
* @notice Delegate votes from `msg.sender` to `delegatee`
* @param delegatee The address to delegate votes to
*/
function delegate(address delegatee) external {
return _delegate(msg.sender, delegatee);
}
/**
* @notice Delegates votes from signatory to `delegatee`
* @param delegatee The address to delegate votes to
* @param nonce The contract state required to match the signature
* @param expiry The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function delegateBySig(
address delegatee,
uint nonce,
uint expiry,
uint8 v,
bytes32 r,
bytes32 s
)
external
{
bytes32 domainSeparator = keccak256(
abi.encode(
DOMAIN_TYPEHASH,
keccak256(bytes(name())),
getChainId(),
address(this)
)
);
bytes32 structHash = keccak256(
abi.encode(
DELEGATION_TYPEHASH,
delegatee,
nonce,
expiry
)
);
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
domainSeparator,
structHash
)
);
address signatory = ecrecover(digest, v, r, s);
require(signatory != address(0), "FigToken::delegateBySig: invalid signature");
require(nonce == nonces[signatory]++, "FigToken::delegateBySig: invalid nonce");
require(block.timestamp <= expiry, "FigToken::delegateBySig: signature expired");
return _delegate(signatory, delegatee);
}
/**
* @notice Gets the current votes balance for `account`
* @param account The address to get votes balance
* @return The number of current votes for `account`
*/
function getCurrentVotes(address account)
external
view
returns (uint256)
{
uint32 nCheckpoints = numCheckpoints[account];
return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
}
/**
* @notice Determine the prior number of votes for an account as of a block number
* @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
* @param account The address of the account to check
* @param blockNumber The block number to get the vote balance at
* @return The number of votes the account had as of the given block
*/
function getPriorVotes(address account, uint blockNumber)
external
view
returns (uint256)
{
require(blockNumber < block.number, "FigToken::getPriorVotes: not yet determined");
uint32 nCheckpoints = numCheckpoints[account];
if (nCheckpoints == 0) {
return 0;
}
// First check most recent balance
if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
return checkpoints[account][nCheckpoints - 1].votes;
}
// Next check implicit zero balance
if (checkpoints[account][0].fromBlock > blockNumber) {
return 0;
}
uint32 lower = 0;
uint32 upper = nCheckpoints - 1;
while (upper > lower) {
uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
Checkpoint memory cp = checkpoints[account][center];
if (cp.fromBlock == blockNumber) {
return cp.votes;
} else if (cp.fromBlock < blockNumber) {
lower = center;
} else {
upper = center - 1;
}
}
return checkpoints[account][lower].votes;
}
function _delegate(address delegator, address delegatee)
internal
{
address currentDelegate = _delegates[delegator];
uint256 delegatorBalance = balanceOf(delegator); // balance of underlying balances (not scaled);
_delegates[delegator] = delegatee;
_moveDelegates(currentDelegate, delegatee, delegatorBalance);
emit DelegateChanged(delegator, currentDelegate, delegatee);
}
function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
if (srcRep != dstRep && amount > 0) {
if (srcRep != address(0)) {
// decrease old representative
uint32 srcRepNum = numCheckpoints[srcRep];
uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
uint256 srcRepNew = srcRepOld.sub(amount);
_writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
}
if (dstRep != address(0)) {
// increase new representative
uint32 dstRepNum = numCheckpoints[dstRep];
uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
uint256 dstRepNew = dstRepOld.add(amount);
_writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
}
}
}
function _writeCheckpoint(
address delegatee,
uint32 nCheckpoints,
uint256 oldVotes,
uint256 newVotes
)
internal
{
uint32 blockNumber = safe32(block.number, "FigToken::_writeCheckpoint: block number exceeds 32 bits");
if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
} else {
checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
numCheckpoints[delegatee] = nCheckpoints + 1;
}
emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
}
function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
require(n < 2**32, errorMessage);
return uint32(n);
}
function getChainId() internal view returns (uint) {
uint256 chainId;
assembly { chainId := chainid() }
return chainId;
}
/// @notice An event thats emitted when an account changes its delegate
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
/// @notice An event thats emitted when a delegate account's vote balance changes
event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
}
contract FigToken is DelegateERC20, Ownable {
using SafeMath for uint256;
uint256 private constant maxSupply = 100000000 * 1e18; // the total supply
uint256 private constant preMineSupply = 10000000 * 1e18;
using EnumerableSet for EnumerableSet.AddressSet;
EnumerableSet.AddressSet private _minters;
constructor() ERC20("FigSwap Token", "FIG"){
_mint(msg.sender, preMineSupply);
}
// mint with max supply
function mint(address _to, uint256 _amount) public onlyMinter returns (bool) {
if (_amount.add(totalSupply()) > maxSupply) {
return false;
}
_mint(_to, _amount);
return true;
}
function addMinter(address _addMinter) public onlyOwner returns (bool) {
require(_addMinter != address(0), "FigToken: _addMinter is the zero address");
return EnumerableSet.add(_minters, _addMinter);
}
function delMinter(address _delMinter) public onlyOwner returns (bool) {
require(_delMinter != address(0), "FigToken: _delMinter is the zero address");
return EnumerableSet.remove(_minters, _delMinter);
}
function getMinterLength() public view returns (uint256) {
return EnumerableSet.length(_minters);
}
function isMinter(address account) public view returns (bool) {
return EnumerableSet.contains(_minters, account);
}
function getMinter(uint256 _index) public view onlyOwner returns (address){
require(_index <= getMinterLength() - 1, "FigToken: index out of bounds");
return EnumerableSet.at(_minters, _index);
}
// modifier for mint function
modifier onlyMinter() {
require(isMinter(msg.sender), "caller is not the minter");
_;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addMinter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delMinter","type":"address"}],"name":"delMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinterLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600d81526020016c2334b3a9bbb0b8102a37b5b2b760991b8152506040518060400160405280600381526020016246494760e81b81525081600390805190602001906200006c929190620006b5565b50805162000082906004906020840190620006b5565b50506005805460ff191660121790555060006200009c3390565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000101336a084595161401484a00000062000107565b6200088c565b6200011e82826200014960201b620010581760201c565b6001600160a01b038083166000908152600660205260408120546200014592168362000249565b5050565b6001600160a01b038216620001a55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620001c181600254620003e160201b620011361790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620001f491839062001136620003e1821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b816001600160a01b0316836001600160a01b0316141580156200026c5750600081115b15620003dc576001600160a01b0383161562000327576001600160a01b03831660009081526008602052604081205463ffffffff169081620002b0576000620002f5565b6001600160a01b038516600090815260076020526040812090620002d660018562000811565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006200031384836200044b60201b620011951790919060201c565b9050620003238684848462000495565b5050505b6001600160a01b03821615620003dc576001600160a01b03821660009081526008602052604081205463ffffffff16908162000365576000620003aa565b6001600160a01b0384166000908152600760205260408120906200038b60018562000811565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000620003c88483620003e160201b620011361790919060201c565b9050620003d88584848462000495565b5050505b505050565b600080620003f08385620007b1565b905083811015620004445760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200019c565b9392505050565b60006200044483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200064360201b60201c565b6000620004bc43604051806060016040528060388152602001620027f26038913962000682565b905060008463ffffffff161180156200051957506001600160a01b038516600090815260076020526040812063ffffffff831691620004fd60018862000811565b63ffffffff908116825260208201929092526040016000205416145b1562000566576001600160a01b038516600090815260076020526040812083916200054660018862000811565b63ffffffff168152602081019190915260400160002060010155620005f8565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600783528581208a851682529092529390209151825463ffffffff191691161781559051600191820155620005c7908590620007cc565b6001600160a01b0386166000908152600860205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b600081848411156200066a5760405162461bcd60e51b81526004016200019c91906200075b565b506000620006798486620007f7565b95945050505050565b6000816401000000008410620006ad5760405162461bcd60e51b81526004016200019c91906200075b565b509192915050565b828054620006c39062000839565b90600052602060002090601f016020900481019282620006e7576000855562000732565b82601f106200070257805160ff191683800117855562000732565b8280016001018555821562000732579182015b828111156200073257825182559160200191906001019062000715565b506200074092915062000744565b5090565b5b8082111562000740576000815560010162000745565b6000602080835283518082850152825b8181101562000789578581018301518582016040015282016200076b565b818111156200079b5783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115620007c757620007c762000876565b500190565b600063ffffffff808316818516808303821115620007ee57620007ee62000876565b01949350505050565b6000828210156200080c576200080c62000876565b500390565b600063ffffffff8381169083168181101562000831576200083162000876565b039392505050565b6002810460018216806200084e57607f821691505b602082108114156200087057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611f56806200089c6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610421578063e7a324dc1461045a578063f1127ed814610481578063f2fde38b146104d8576101cf565b8063a9059cbb146103d5578063aa271e1a146103e8578063b4b5ea57146103fb578063c3cda5201461040e576101cf565b80638da5cb5b116100de5780638da5cb5b1461039657806395d89b41146103a7578063983b2d56146103af578063a457c2d7146103c2576101cf565b8063715018a61461035b578063782d6fe1146103635780637ecebe0014610376576101cf565b8063313ce567116101715780635b7121f81161014b5780635b7121f8146102b75780635c19a95c146102e25780636fcfff45146102f757806370a0823114610332576101cf565b8063313ce5671461027c578063395093511461029157806340c10f19146102a4576101cf565b806318160ddd116101ad57806318160ddd1461022757806320606b701461022f57806323338b881461025657806323b872dd14610269576101cf565b80630323aac7146101d457806306fdde03146101ef578063095ea7b314610204575b600080fd5b6101dc6104eb565b6040519081526020015b60405180910390f35b6101f76104fc565b6040516101e69190611cd6565b610217610212366004611bf9565b61058e565b60405190151581526020016101e6565b6002546101dc565b6101dc7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b610217610264366004611b72565b6105a5565b610217610277366004611bbe565b610655565b60055460405160ff90911681526020016101e6565b61021761029f366004611bf9565b6106be565b6102176102b2366004611bf9565b6106f4565b6102ca6102c5366004611cbe565b610782565b6040516001600160a01b0390911681526020016101e6565b6102f56102f0366004611b72565b61081d565b005b61031d610305366004611b72565b60086020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016101e6565b6101dc610340366004611b72565b6001600160a01b031660009081526020819052604090205490565b6102f561082a565b6101dc610371366004611bf9565b61089e565b6101dc610384366004611b72565b60096020526000908152604090205481565b600a546001600160a01b03166102ca565b6101f7610b07565b6102176103bd366004611b72565b610b16565b6102176103d0366004611bf9565b610bb5565b6102176103e3366004611bf9565b610c04565b6102176103f6366004611b72565b610c11565b6101dc610409366004611b72565b610c1e565b6102f561041c366004611c22565b610c93565b6101dc61042f366004611b8c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101dc7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6104bc61048f366004611c80565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016101e6565b6102f56104e6366004611b72565b610f6d565b60006104f7600b6111d7565b905090565b60606003805461050b90611e09565b80601f016020809104026020016040519081016040528092919081815260200182805461053790611e09565b80156105845780601f1061055957610100808354040283529160200191610584565b820191906000526020600020905b81548152906001019060200180831161056757829003601f168201915b5050505050905090565b600061059b3384846111e1565b5060015b92915050565b600a546000906001600160a01b031633146105db5760405162461bcd60e51b81526004016105d290611d29565b60405180910390fd5b6001600160a01b0382166106425760405162461bcd60e51b815260206004820152602860248201527f466967546f6b656e3a205f64656c4d696e74657220697320746865207a65726f604482015267206164647265737360c01b60648201526084016105d2565b61064d600b83611306565b90505b919050565b600061066284848461131b565b6106b484336106af85604051806060016040528060288152602001611e9c602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061135d565b6111e1565b5060019392505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161059b9185906106af9086611136565b60006106ff33610c11565b61074b5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206d696e746572000000000000000060448201526064016105d2565b6a52b7d2dcc80cd2e400000061076a61076360025490565b8490611136565b11156107785750600061059f565b61059b8383611397565b600a546000906001600160a01b031633146107af5760405162461bcd60e51b81526004016105d290611d29565b60016107b96104eb565b6107c39190611dcd565b8211156108125760405162461bcd60e51b815260206004820152601d60248201527f466967546f6b656e3a20696e646578206f7574206f6620626f756e647300000060448201526064016105d2565b61064d600b836113ca565b61082733826113d6565b50565b600a546001600160a01b031633146108545760405162461bcd60e51b81526004016105d290611d29565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b60004382106109035760405162461bcd60e51b815260206004820152602b60248201527f466967546f6b656e3a3a6765745072696f72566f7465733a206e6f742079657460448201526a0819195d195c9b5a5b995960aa1b60648201526084016105d2565b6001600160a01b03831660009081526008602052604090205463ffffffff168061093157600091505061059f565b6001600160a01b03841660009081526007602052604081208491610956600185611de4565b63ffffffff908116825260208201929092526040016000205416116109bf576001600160a01b038416600090815260076020526040812090610999600184611de4565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061059f565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff168310156109fa57600091505061059f565b600080610a08600184611de4565b90505b8163ffffffff168163ffffffff161115610ad05760006002610a2d8484611de4565b610a379190611d9e565b610a419083611de4565b6001600160a01b038816600090815260076020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152919250871415610aa45760200151945061059f9350505050565b805163ffffffff16871115610abb57819350610ac9565b610ac6600183611de4565b92505b5050610a0b565b506001600160a01b038516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b60606004805461050b90611e09565b600a546000906001600160a01b03163314610b435760405162461bcd60e51b81526004016105d290611d29565b6001600160a01b038216610baa5760405162461bcd60e51b815260206004820152602860248201527f466967546f6b656e3a205f6164644d696e74657220697320746865207a65726f604482015267206164647265737360c01b60648201526084016105d2565b61064d600b83611470565b600061059b33846106af85604051806060016040528060258152602001611efc602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061135d565b600061059b33848461131b565b600061064d600b83611485565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610c49576000610c8c565b6001600160a01b038316600090815260076020526040812090610c6d600184611de4565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610cbe6104fc565b80519060200120610ccc4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015610df8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e6e5760405162461bcd60e51b815260206004820152602a60248201527f466967546f6b656e3a3a64656c656761746542795369673a20696e76616c6964604482015269207369676e617475726560b01b60648201526084016105d2565b6001600160a01b0381166000908152600960205260408120805491610e9283611e44565b919050558914610ef35760405162461bcd60e51b815260206004820152602660248201527f466967546f6b656e3a3a64656c656761746542795369673a20696e76616c6964604482015265206e6f6e636560d01b60648201526084016105d2565b87421115610f565760405162461bcd60e51b815260206004820152602a60248201527f466967546f6b656e3a3a64656c656761746542795369673a207369676e6174756044820152691c9948195e1c1a5c995960b21b60648201526084016105d2565b610f60818b6113d6565b505050505b505050505050565b600a546001600160a01b03163314610f975760405162461bcd60e51b81526004016105d290611d29565b6001600160a01b038116610ffc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105d2565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166110ae5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105d2565b6002546110bb9082611136565b6002556001600160a01b0382166000908152602081905260409020546110e19082611136565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000806111438385611d5e565b905083811015610c8c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105d2565b6000610c8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061135d565b600061064d825490565b6001600160a01b0383166112435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105d2565b6001600160a01b0382166112a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105d2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610c8c836001600160a01b0384166114a7565b6113268383836115c4565b6001600160a01b0380841660009081526006602052604080822054858416835291205461135892918216911683611747565b505050565b600081848411156113815760405162461bcd60e51b81526004016105d29190611cd6565b50600061138e8486611dcd565b95945050505050565b6113a18282611058565b6001600160a01b038083166000908152600660205260408120546113c6921683611747565b5050565b6000610c8c83836118a6565b6001600160a01b03828116600090815260066020818152604080842080548584529190942054929091528484166001600160a01b0319821617909255911690611420828483611747565b826001600160a01b0316826001600160a01b0316856001600160a01b03167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a450505050565b6000610c8c836001600160a01b03841661193a565b6001600160a01b03811660009081526001830160205260408120541515610c8c565b600081815260018301602052604081205480156115ba5760006114cb600183611dcd565b85549091506000906114df90600190611dcd565b9050600086600001828154811061150657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061153757634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561154e836001611d5e565b6000828152600189016020526040902055865487908061157e57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061059f565b600091505061059f565b6001600160a01b0383166116285760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105d2565b6001600160a01b03821661168a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105d2565b6116c781604051806060016040528060268152602001611e76602691396001600160a01b038616600090815260208190526040902054919061135d565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546116f69082611136565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016112f9565b816001600160a01b0316836001600160a01b0316141580156117695750600081115b15611358576001600160a01b0383161561180c576001600160a01b03831660009081526008602052604081205463ffffffff1690816117a95760006117ec565b6001600160a01b0385166000908152600760205260408120906117cd600185611de4565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006117fa8285611195565b905061180886848484611989565b5050505b6001600160a01b03821615611358576001600160a01b03821660009081526008602052604081205463ffffffff16908161184757600061188a565b6001600160a01b03841660009081526007602052604081209061186b600185611de4565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006118988285611136565b9050610f6585848484611989565b815460009082106119045760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016105d2565b82600001828154811061192757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120546119815750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561059f565b50600061059f565b60006119ad43604051806060016040528060388152602001611ec460389139611b2b565b905060008463ffffffff16118015611a0757506001600160a01b038516600090815260076020526040812063ffffffff8316916119eb600188611de4565b63ffffffff908116825260208201929092526040016000205416145b15611a50576001600160a01b03851660009081526007602052604081208391611a31600188611de4565b63ffffffff168152602081019190915260400160002060010155611ae0565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600783528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611aaf908590611d76565b6001600160a01b0386166000908152600860205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410611b535760405162461bcd60e51b81526004016105d29190611cd6565b509192915050565b80356001600160a01b038116811461065057600080fd5b600060208284031215611b83578081fd5b610c8c82611b5b565b60008060408385031215611b9e578081fd5b611ba783611b5b565b9150611bb560208401611b5b565b90509250929050565b600080600060608486031215611bd2578081fd5b611bdb84611b5b565b9250611be960208501611b5b565b9150604084013590509250925092565b60008060408385031215611c0b578182fd5b611c1483611b5b565b946020939093013593505050565b60008060008060008060c08789031215611c3a578182fd5b611c4387611b5b565b95506020870135945060408701359350606087013560ff81168114611c66578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611c92578182fd5b611c9b83611b5b565b9150602083013563ffffffff81168114611cb3578182fd5b809150509250929050565b600060208284031215611ccf578081fd5b5035919050565b6000602080835283518082850152825b81811015611d0257858101830151858201604001528201611ce6565b81811115611d135783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d7157611d71611e5f565b500190565b600063ffffffff808316818516808303821115611d9557611d95611e5f565b01949350505050565b600063ffffffff80841680611dc157634e487b7160e01b83526012600452602483fd5b92169190910492915050565b600082821015611ddf57611ddf611e5f565b500390565b600063ffffffff83811690831681811015611e0157611e01611e5f565b039392505050565b600281046001821680611e1d57607f821691505b60208210811415611e3e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e5857611e58611e5f565b5060010190565b634e487b7160e01b600052601160045260246000fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365466967546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d74db47777678044ab25a502c3add2dd01a67a7547786efbbbb19986cd5c906764736f6c63430008020033466967546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610421578063e7a324dc1461045a578063f1127ed814610481578063f2fde38b146104d8576101cf565b8063a9059cbb146103d5578063aa271e1a146103e8578063b4b5ea57146103fb578063c3cda5201461040e576101cf565b80638da5cb5b116100de5780638da5cb5b1461039657806395d89b41146103a7578063983b2d56146103af578063a457c2d7146103c2576101cf565b8063715018a61461035b578063782d6fe1146103635780637ecebe0014610376576101cf565b8063313ce567116101715780635b7121f81161014b5780635b7121f8146102b75780635c19a95c146102e25780636fcfff45146102f757806370a0823114610332576101cf565b8063313ce5671461027c578063395093511461029157806340c10f19146102a4576101cf565b806318160ddd116101ad57806318160ddd1461022757806320606b701461022f57806323338b881461025657806323b872dd14610269576101cf565b80630323aac7146101d457806306fdde03146101ef578063095ea7b314610204575b600080fd5b6101dc6104eb565b6040519081526020015b60405180910390f35b6101f76104fc565b6040516101e69190611cd6565b610217610212366004611bf9565b61058e565b60405190151581526020016101e6565b6002546101dc565b6101dc7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b610217610264366004611b72565b6105a5565b610217610277366004611bbe565b610655565b60055460405160ff90911681526020016101e6565b61021761029f366004611bf9565b6106be565b6102176102b2366004611bf9565b6106f4565b6102ca6102c5366004611cbe565b610782565b6040516001600160a01b0390911681526020016101e6565b6102f56102f0366004611b72565b61081d565b005b61031d610305366004611b72565b60086020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016101e6565b6101dc610340366004611b72565b6001600160a01b031660009081526020819052604090205490565b6102f561082a565b6101dc610371366004611bf9565b61089e565b6101dc610384366004611b72565b60096020526000908152604090205481565b600a546001600160a01b03166102ca565b6101f7610b07565b6102176103bd366004611b72565b610b16565b6102176103d0366004611bf9565b610bb5565b6102176103e3366004611bf9565b610c04565b6102176103f6366004611b72565b610c11565b6101dc610409366004611b72565b610c1e565b6102f561041c366004611c22565b610c93565b6101dc61042f366004611b8c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6101dc7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6104bc61048f366004611c80565b60076020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016101e6565b6102f56104e6366004611b72565b610f6d565b60006104f7600b6111d7565b905090565b60606003805461050b90611e09565b80601f016020809104026020016040519081016040528092919081815260200182805461053790611e09565b80156105845780601f1061055957610100808354040283529160200191610584565b820191906000526020600020905b81548152906001019060200180831161056757829003601f168201915b5050505050905090565b600061059b3384846111e1565b5060015b92915050565b600a546000906001600160a01b031633146105db5760405162461bcd60e51b81526004016105d290611d29565b60405180910390fd5b6001600160a01b0382166106425760405162461bcd60e51b815260206004820152602860248201527f466967546f6b656e3a205f64656c4d696e74657220697320746865207a65726f604482015267206164647265737360c01b60648201526084016105d2565b61064d600b83611306565b90505b919050565b600061066284848461131b565b6106b484336106af85604051806060016040528060288152602001611e9c602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061135d565b6111e1565b5060019392505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161059b9185906106af9086611136565b60006106ff33610c11565b61074b5760405162461bcd60e51b815260206004820152601860248201527f63616c6c6572206973206e6f7420746865206d696e746572000000000000000060448201526064016105d2565b6a52b7d2dcc80cd2e400000061076a61076360025490565b8490611136565b11156107785750600061059f565b61059b8383611397565b600a546000906001600160a01b031633146107af5760405162461bcd60e51b81526004016105d290611d29565b60016107b96104eb565b6107c39190611dcd565b8211156108125760405162461bcd60e51b815260206004820152601d60248201527f466967546f6b656e3a20696e646578206f7574206f6620626f756e647300000060448201526064016105d2565b61064d600b836113ca565b61082733826113d6565b50565b600a546001600160a01b031633146108545760405162461bcd60e51b81526004016105d290611d29565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b60004382106109035760405162461bcd60e51b815260206004820152602b60248201527f466967546f6b656e3a3a6765745072696f72566f7465733a206e6f742079657460448201526a0819195d195c9b5a5b995960aa1b60648201526084016105d2565b6001600160a01b03831660009081526008602052604090205463ffffffff168061093157600091505061059f565b6001600160a01b03841660009081526007602052604081208491610956600185611de4565b63ffffffff908116825260208201929092526040016000205416116109bf576001600160a01b038416600090815260076020526040812090610999600184611de4565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061059f565b6001600160a01b038416600090815260076020908152604080832083805290915290205463ffffffff168310156109fa57600091505061059f565b600080610a08600184611de4565b90505b8163ffffffff168163ffffffff161115610ad05760006002610a2d8484611de4565b610a379190611d9e565b610a419083611de4565b6001600160a01b038816600090815260076020908152604080832063ffffffff8086168552908352928190208151808301909252805490931680825260019093015491810191909152919250871415610aa45760200151945061059f9350505050565b805163ffffffff16871115610abb57819350610ac9565b610ac6600183611de4565b92505b5050610a0b565b506001600160a01b038516600090815260076020908152604080832063ffffffff9094168352929052206001015491505092915050565b60606004805461050b90611e09565b600a546000906001600160a01b03163314610b435760405162461bcd60e51b81526004016105d290611d29565b6001600160a01b038216610baa5760405162461bcd60e51b815260206004820152602860248201527f466967546f6b656e3a205f6164644d696e74657220697320746865207a65726f604482015267206164647265737360c01b60648201526084016105d2565b61064d600b83611470565b600061059b33846106af85604051806060016040528060258152602001611efc602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061135d565b600061059b33848461131b565b600061064d600b83611485565b6001600160a01b03811660009081526008602052604081205463ffffffff1680610c49576000610c8c565b6001600160a01b038316600090815260076020526040812090610c6d600184611de4565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610cbe6104fc565b80519060200120610ccc4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015610df8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e6e5760405162461bcd60e51b815260206004820152602a60248201527f466967546f6b656e3a3a64656c656761746542795369673a20696e76616c6964604482015269207369676e617475726560b01b60648201526084016105d2565b6001600160a01b0381166000908152600960205260408120805491610e9283611e44565b919050558914610ef35760405162461bcd60e51b815260206004820152602660248201527f466967546f6b656e3a3a64656c656761746542795369673a20696e76616c6964604482015265206e6f6e636560d01b60648201526084016105d2565b87421115610f565760405162461bcd60e51b815260206004820152602a60248201527f466967546f6b656e3a3a64656c656761746542795369673a207369676e6174756044820152691c9948195e1c1a5c995960b21b60648201526084016105d2565b610f60818b6113d6565b505050505b505050505050565b600a546001600160a01b03163314610f975760405162461bcd60e51b81526004016105d290611d29565b6001600160a01b038116610ffc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105d2565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166110ae5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105d2565b6002546110bb9082611136565b6002556001600160a01b0382166000908152602081905260409020546110e19082611136565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000806111438385611d5e565b905083811015610c8c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105d2565b6000610c8c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061135d565b600061064d825490565b6001600160a01b0383166112435760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105d2565b6001600160a01b0382166112a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105d2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000610c8c836001600160a01b0384166114a7565b6113268383836115c4565b6001600160a01b0380841660009081526006602052604080822054858416835291205461135892918216911683611747565b505050565b600081848411156113815760405162461bcd60e51b81526004016105d29190611cd6565b50600061138e8486611dcd565b95945050505050565b6113a18282611058565b6001600160a01b038083166000908152600660205260408120546113c6921683611747565b5050565b6000610c8c83836118a6565b6001600160a01b03828116600090815260066020818152604080842080548584529190942054929091528484166001600160a01b0319821617909255911690611420828483611747565b826001600160a01b0316826001600160a01b0316856001600160a01b03167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a450505050565b6000610c8c836001600160a01b03841661193a565b6001600160a01b03811660009081526001830160205260408120541515610c8c565b600081815260018301602052604081205480156115ba5760006114cb600183611dcd565b85549091506000906114df90600190611dcd565b9050600086600001828154811061150657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061153757634e487b7160e01b600052603260045260246000fd5b60009182526020909120015561154e836001611d5e565b6000828152600189016020526040902055865487908061157e57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061059f565b600091505061059f565b6001600160a01b0383166116285760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105d2565b6001600160a01b03821661168a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105d2565b6116c781604051806060016040528060268152602001611e76602691396001600160a01b038616600090815260208190526040902054919061135d565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546116f69082611136565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016112f9565b816001600160a01b0316836001600160a01b0316141580156117695750600081115b15611358576001600160a01b0383161561180c576001600160a01b03831660009081526008602052604081205463ffffffff1690816117a95760006117ec565b6001600160a01b0385166000908152600760205260408120906117cd600185611de4565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006117fa8285611195565b905061180886848484611989565b5050505b6001600160a01b03821615611358576001600160a01b03821660009081526008602052604081205463ffffffff16908161184757600061188a565b6001600160a01b03841660009081526007602052604081209061186b600185611de4565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006118988285611136565b9050610f6585848484611989565b815460009082106119045760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016105d2565b82600001828154811061192757634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b60008181526001830160205260408120546119815750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561059f565b50600061059f565b60006119ad43604051806060016040528060388152602001611ec460389139611b2b565b905060008463ffffffff16118015611a0757506001600160a01b038516600090815260076020526040812063ffffffff8316916119eb600188611de4565b63ffffffff908116825260208201929092526040016000205416145b15611a50576001600160a01b03851660009081526007602052604081208391611a31600188611de4565b63ffffffff168152602081019190915260400160002060010155611ae0565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600783528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611aaf908590611d76565b6001600160a01b0386166000908152600860205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410611b535760405162461bcd60e51b81526004016105d29190611cd6565b509192915050565b80356001600160a01b038116811461065057600080fd5b600060208284031215611b83578081fd5b610c8c82611b5b565b60008060408385031215611b9e578081fd5b611ba783611b5b565b9150611bb560208401611b5b565b90509250929050565b600080600060608486031215611bd2578081fd5b611bdb84611b5b565b9250611be960208501611b5b565b9150604084013590509250925092565b60008060408385031215611c0b578182fd5b611c1483611b5b565b946020939093013593505050565b60008060008060008060c08789031215611c3a578182fd5b611c4387611b5b565b95506020870135945060408701359350606087013560ff81168114611c66578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611c92578182fd5b611c9b83611b5b565b9150602083013563ffffffff81168114611cb3578182fd5b809150509250929050565b600060208284031215611ccf578081fd5b5035919050565b6000602080835283518082850152825b81811015611d0257858101830151858201604001528201611ce6565b81811115611d135783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d7157611d71611e5f565b500190565b600063ffffffff808316818516808303821115611d9557611d95611e5f565b01949350505050565b600063ffffffff80841680611dc157634e487b7160e01b83526012600452602483fd5b92169190910492915050565b600082821015611ddf57611ddf611e5f565b500390565b600063ffffffff83811690831681811015611e0157611e01611e5f565b039392505050565b600281046001821680611e1d57607f821691505b60208210811415611e3e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e5857611e58611e5f565b5060010190565b634e487b7160e01b600052601160045260246000fdfe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365466967546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d74db47777678044ab25a502c3add2dd01a67a7547786efbbbb19986cd5c906764736f6c63430008020033
Deployed Bytecode Sourcemap
43376:1804:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44550:113;;;:::i;:::-;;;3436:25:1;;;3424:2;3409:18;44550:113:0;;;;;;;;17124:83;;;:::i;:::-;;;;;;;:::i;19230:169::-;;;;;;:::i;:::-;;:::i;:::-;;;3263:14:1;;3256:22;3238:41;;3226:2;3211:18;19230:169:0;3193:92:1;18199:100:0;18279:12;;18199:100;;35574:122;;35616:80;35574:122;;44315:227;;;;;;:::i;:::-;;:::i;19873:321::-;;;;;;:::i;:::-;;:::i;18051:83::-;18117:9;;18051:83;;18117:9;;;;13044:36:1;;13032:2;13017:18;18051:83:0;12999:87:1;20603:218:0;;;;;;:::i;:::-;;:::i;43845:230::-;;;;;;:::i;:::-;;:::i;44808:218::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3054:32:1;;;3036:51;;3024:2;3009:18;44808:218:0;2991:102:1;36688:104:0;;;;;;:::i;:::-;;:::i;:::-;;35452:49;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12611:10:1;12599:23;;;12581:42;;12569:2;12554:18;35452:49:0;12536:93:1;18362:119:0;;;;;;:::i;:::-;-1:-1:-1;;;;;18455:18:0;18428:7;18455:18;;;;;;;;;;;;18362:119;1575:148;;;:::i;39299:1245::-;;;;;;:::i;:::-;;:::i;35988:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;933:79;998:6;;-1:-1:-1;;;;;998:6:0;933:79;;17326:87;;;:::i;44083:224::-;;;;;;:::i;:::-;;:::i;21324:269::-;;;;;;:::i;:::-;;:::i;18694:175::-;;;;;;:::i;:::-;;:::i;44671:129::-;;;;;;:::i;:::-;;:::i;38625:243::-;;;;;;:::i;:::-;;:::i;37226:1198::-;;;;;;:::i;:::-;;:::i;18932:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;19048:18:0;;;19021:7;19048:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18932:151;35790:117;;35836:71;35790:117;;35313:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12836:10:1;12824:23;;;12806:42;;12879:2;12864:18;;12857:34;;;;12779:18;35313:70:0;12761:136:1;1878:244:0;;;;;;:::i;:::-;;:::i;44550:113::-;44598:7;44625:30;44646:8;44625:20;:30::i;:::-;44618:37;;44550:113;:::o;17124:83::-;17161:13;17194:5;17187:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17124:83;:::o;19230:169::-;19313:4;19330:39;173:10;19353:7;19362:6;19330:8;:39::i;:::-;-1:-1:-1;19387:4:0;19230:169;;;;;:::o;44315:227::-;1145:6;;44380:4;;-1:-1:-1;;;;;1145:6:0;173:10;1145:22;1137:67;;;;-1:-1:-1;;;1137:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;44405:24:0;::::1;44397:77;;;::::0;-1:-1:-1;;;44397:77:0;;9443:2:1;44397:77:0::1;::::0;::::1;9425:21:1::0;9482:2;9462:18;;;9455:30;9521:34;9501:18;;;9494:62;-1:-1:-1;;;9572:18:1;;;9565:38;9620:19;;44397:77:0::1;9415:230:1::0;44397:77:0::1;44492:42;44513:8;44523:10;44492:20;:42::i;:::-;44485:49;;1215:1;44315:227:::0;;;:::o;19873:321::-;19979:4;19996:36;20006:6;20014:9;20025:6;19996:9;:36::i;:::-;20043:121;20052:6;173:10;20074:89;20112:6;20074:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20074:19:0;;;;;;:11;:19;;;;;;;;173:10;20074:33;;;;;;;;;;:37;:89::i;:::-;20043:8;:121::i;:::-;-1:-1:-1;20182:4:0;19873:321;;;;;:::o;20603:218::-;173:10;20691:4;20740:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20740:34:0;;;;;;;;;;20691:4;;20708:83;;20731:7;;20740:50;;20779:10;20740:38;:50::i;43845:230::-;43916:4;45108:20;45117:10;45108:8;:20::i;:::-;45100:57;;;;-1:-1:-1;;;45100:57:0;;8729:2:1;45100:57:0;;;8711:21:1;8768:2;8748:18;;;8741:30;8807:26;8787:18;;;8780:54;8851:18;;45100:57:0;8701:174:1;45100:57:0;43497:16:::1;43937:26;43949:13;18279:12:::0;;18199:100;;43949:13:::1;43937:7:::0;;:11:::1;:26::i;:::-;:38;43933:83;;;-1:-1:-1::0;43999:5:0::1;43992:12;;43933:83;44026:19;44032:3;44037:7;44026:5;:19::i;44808:218::-:0;1145:6;;44874:7;;-1:-1:-1;;;;;1145:6:0;173:10;1145:22;1137:67;;;;-1:-1:-1;;;1137:67:0;;;;;;;:::i;:::-;44931:1:::1;44911:17;:15;:17::i;:::-;:21;;;;:::i;:::-;44901:6;:31;;44893:73;;;::::0;-1:-1:-1;;;44893:73:0;;10263:2:1;44893:73:0::1;::::0;::::1;10245:21:1::0;10302:2;10282:18;;;10275:30;10341:31;10321:18;;;10314:59;10390:18;;44893:73:0::1;10235:179:1::0;44893:73:0::1;44984:34;45001:8;45011:6;44984:16;:34::i;36688:104::-:0;36752:32;36762:10;36774:9;36752;:32::i;:::-;36688:104;:::o;1575:148::-;1145:6;;-1:-1:-1;;;;;1145:6:0;173:10;1145:22;1137:67;;;;-1:-1:-1;;;1137:67:0;;;;;;;:::i;:::-;1666:6:::1;::::0;1645:40:::1;::::0;1682:1:::1;::::0;-1:-1:-1;;;;;1666:6:0::1;::::0;1645:40:::1;::::0;1682:1;;1645:40:::1;1696:6;:19:::0;;-1:-1:-1;;;;;;1696:19:0::1;::::0;;1575:148::o;39299:1245::-;39395:7;39442:12;39428:11;:26;39420:82;;;;-1:-1:-1;;;39420:82:0;;10621:2:1;39420:82:0;;;10603:21:1;10660:2;10640:18;;;10633:30;10699:34;10679:18;;;10672:62;-1:-1:-1;;;10750:18:1;;;10743:41;10801:19;;39420:82:0;10593:233:1;39420:82:0;-1:-1:-1;;;;;39537:23:0;;39515:19;39537:23;;;:14;:23;;;;;;;;39575:17;39571:58;;39616:1;39609:8;;;;;39571:58;-1:-1:-1;;;;;39689:20:0;;;;;;:11;:20;;;;;39741:11;;39710:16;39725:1;39710:12;:16;:::i;:::-;39689:38;;;;;;;;;;;;;;;-1:-1:-1;39689:38:0;:48;;:63;39685:147;;-1:-1:-1;;;;;39776:20:0;;;;;;:11;:20;;;;;;39797:16;39812:1;39797:12;:16;:::i;:::-;39776:38;;;;;;;;;;;;;;;:44;;;39769:51;;;;;39685:147;-1:-1:-1;;;;;39893:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;39889:88:0;;;39964:1;39957:8;;;;;39889:88;39989:12;;40031:16;40046:1;40031:12;:16;:::i;:::-;40016:31;;40058:428;40073:5;40065:13;;:5;:13;;;40058:428;;;40095:13;40137:1;40120:13;40128:5;40120;:13;:::i;:::-;40119:19;;;;:::i;:::-;40111:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;40203:20:0;;40180;40203;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;40180:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;40095:43;;-1:-1:-1;40250:27:0;;40246:229;;;40305:8;;;;-1:-1:-1;40298:15:0;;-1:-1:-1;;;;40298:15:0;40246:229;40339:12;;:26;;;-1:-1:-1;40335:140:0;;;40394:6;40386:14;;40335:140;;;40449:10;40458:1;40449:6;:10;:::i;:::-;40441:18;;40335:140;40058:428;;;;;-1:-1:-1;;;;;;40503:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;39299:1245:0;;;;:::o;17326:87::-;17365:13;17398:7;17391:14;;;;;:::i;44083:224::-;1145:6;;44148:4;;-1:-1:-1;;;;;1145:6:0;173:10;1145:22;1137:67;;;;-1:-1:-1;;;1137:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44173:24:0;::::1;44165:77;;;::::0;-1:-1:-1;;;44165:77:0;;6336:2:1;44165:77:0::1;::::0;::::1;6318:21:1::0;6375:2;6355:18;;;6348:30;6414:34;6394:18;;;6387:62;-1:-1:-1;;;6465:18:1;;;6458:38;6513:19;;44165:77:0::1;6308:230:1::0;44165:77:0::1;44260:39;44278:8;44288:10;44260:17;:39::i;21324:269::-:0;21417:4;21434:129;173:10;21457:7;21466:96;21505:15;21466:96;;;;;;;;;;;;;;;;;173:10;21466:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;21466:34:0;;;;;;;;;;;;:38;:96::i;18694:175::-;18780:4;18797:42;173:10;18821:9;18832:6;18797:9;:42::i;44671:129::-;44727:4;44751:41;44774:8;44784:7;44751:22;:41::i;38625:243::-;-1:-1:-1;;;;;38752:23:0;;38705:7;38752:23;;;:14;:23;;;;;;;;38793:16;:67;;38859:1;38793:67;;;-1:-1:-1;;;;;38812:20:0;;;;;;:11;:20;;;;;;38833:16;38848:1;38833:12;:16;:::i;:::-;38812:38;;;;;;;;;;;;;;;:44;;;38793:67;38786:74;38625:243;-1:-1:-1;;;38625:243:0:o;37226:1198::-;37415:23;35616:80;37544:6;:4;:6::i;:::-;37528:24;;;;;;37571:12;42943:9;42833:155;;37571:12;37465:165;;;;;;;4125:25:1;;;;4166:18;;;4159:34;;;;4209:18;;;4202:34;;;;37610:4:0;4252:18:1;;;;4245:60;;;;37465:165:0;;;;;;;;;;4097:19:1;;;37465:165:0;;37441:200;;;;;;35836:71;37699:140;;;3703:25:1;-1:-1:-1;;;;;3764:32:1;;3744:18;;;3737:60;3813:18;;;3806:34;;;3856:18;;;;3849:34;;;37699:140:0;;;;;;;;;;3675:19:1;;;37699:140:0;;;37675:175;;;;;;;-1:-1:-1;;;37904:123:0;;;2751:27:1;2794:11;;;2787:27;;;2830:12;;;2823:28;;;37441:200:0;;-1:-1:-1;;;2867:12:1;;37904:123:0;;;-1:-1:-1;;37904:123:0;;;;;;;;;37880:158;;37904:123;37880:158;;;;38051:17;38071:26;;;;;;;;;4543:25:1;;;4616:4;4604:17;;4584:18;;;4577:45;;;;4638:18;;;4631:34;;;4681:18;;;4674:34;;;37880:158:0;;-1:-1:-1;38051:17:0;38071:26;;4515:19:1;;38071:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38071:26:0;;-1:-1:-1;;38071:26:0;;;-1:-1:-1;;;;;;;38116:23:0;;38108:78;;;;-1:-1:-1;;;38108:78:0;;9852:2:1;38108:78:0;;;9834:21:1;9891:2;9871:18;;;9864:30;9930:34;9910:18;;;9903:62;-1:-1:-1;;;9981:18:1;;;9974:40;10031:19;;38108:78:0;9824:232:1;38108:78:0;-1:-1:-1;;;;;38214:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;38205:5;:28;38197:79;;;;-1:-1:-1;;;38197:79:0;;8322:2:1;38197:79:0;;;8304:21:1;8361:2;8341:18;;;8334:30;8400:34;8380:18;;;8373:62;-1:-1:-1;;;8451:18:1;;;8444:36;8497:19;;38197:79:0;8294:228:1;38197:79:0;38314:6;38295:15;:25;;38287:80;;;;-1:-1:-1;;;38287:80:0;;7555:2:1;38287:80:0;;;7537:21:1;7594:2;7574:18;;;7567:30;7633:34;7613:18;;;7606:62;-1:-1:-1;;;7684:18:1;;;7677:40;7734:19;;38287:80:0;7527:232:1;38287:80:0;38385:31;38395:9;38406;38385;:31::i;:::-;38378:38;;;;37226:1198;;;;;;;:::o;1878:244::-;1145:6;;-1:-1:-1;;;;;1145:6:0;173:10;1145:22;1137:67;;;;-1:-1:-1;;;1137:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1967:22:0;::::1;1959:73;;;::::0;-1:-1:-1;;;1959:73:0;;6745:2:1;1959:73:0::1;::::0;::::1;6727:21:1::0;6784:2;6764:18;;;6757:30;6823:34;6803:18;;;6796:62;-1:-1:-1;;;6874:18:1;;;6867:36;6920:19;;1959:73:0::1;6717:228:1::0;1959:73:0::1;2069:6;::::0;2048:38:::1;::::0;-1:-1:-1;;;;;2048:38:0;;::::1;::::0;2069:6:::1;::::0;2048:38:::1;::::0;2069:6:::1;::::0;2048:38:::1;2097:6;:17:::0;;-1:-1:-1;;;;;;2097:17:0::1;-1:-1:-1::0;;;;;2097:17:0;;;::::1;::::0;;;::::1;::::0;;1878:244::o;22903:378::-;-1:-1:-1;;;;;22987:21:0;;22979:65;;;;-1:-1:-1;;;22979:65:0;;11844:2:1;22979:65:0;;;11826:21:1;11883:2;11863:18;;;11856:30;11922:33;11902:18;;;11895:61;11973:18;;22979:65:0;11816:181:1;22979:65:0;23134:12;;:24;;23151:6;23134:16;:24::i;:::-;23119:12;:39;-1:-1:-1;;;;;23190:18:0;;:9;:18;;;;;;;;;;;:30;;23213:6;23190:22;:30::i;:::-;-1:-1:-1;;;;;23169:18:0;;:9;:18;;;;;;;;;;;:51;;;;23236:37;;3436:25:1;;;23169:18:0;;:9;;23236:37;;3409:18:1;23236:37:0;;;;;;;22903:378;;:::o;5608:181::-;5666:7;;5698:5;5702:1;5698;:5;:::i;:::-;5686:17;;5727:1;5722;:6;;5714:46;;;;-1:-1:-1;;;5714:46:0;;7966:2:1;5714:46:0;;;7948:21:1;8005:2;7985:18;;;7978:30;8044:29;8024:18;;;8017:57;8091:18;;5714:46:0;7938:177:1;6072:136:0;6130:7;6157:43;6161:1;6164;6157:43;;;;;;;;;;;;;;;;;:3;:43::i;32635:117::-;32698:7;32725:19;32733:3;29372:18;;29289:109;24471:346;-1:-1:-1;;;;;24573:19:0;;24565:68;;;;-1:-1:-1;;;24565:68:0;;11439:2:1;24565:68:0;;;11421:21:1;11478:2;11458:18;;;11451:30;11517:34;11497:18;;;11490:62;-1:-1:-1;;;11568:18:1;;;11561:34;11612:19;;24565:68:0;11411:226:1;24565:68:0;-1:-1:-1;;;;;24652:21:0;;24644:68;;;;-1:-1:-1;;;24644:68:0;;7152:2:1;24644:68:0;;;7134:21:1;7191:2;7171:18;;;7164:30;7230:34;7210:18;;;7203:62;-1:-1:-1;;;7281:18:1;;;7274:32;7323:19;;24644:68:0;7124:224:1;24644:68:0;-1:-1:-1;;;;;24725:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24777:32;;3436:25:1;;;24777:32:0;;3409:18:1;24777:32:0;;;;;;;;24471:346;;;:::o;32138:158::-;32211:4;32235:53;32243:3;-1:-1:-1;;;;;32263:23:0;;32235:7;:53::i;36308:233::-;36415:42;36431:6;36439:9;36450:6;36415:15;:42::i;:::-;-1:-1:-1;;;;;36483:18:0;;;;;;;:10;:18;;;;;;;36503:21;;;;;;;;36468:65;;36483:18;;;;36503:21;36526:6;36468:14;:65::i;:::-;36308:233;;;:::o;6511:192::-;6597:7;6633:12;6625:6;;;;6617:29;;;;-1:-1:-1;;;6617:29:0;;;;;;;;:::i;:::-;-1:-1:-1;6657:9:0;6669:5;6673:1;6669;:5;:::i;:::-;6657:17;6511:192;-1:-1:-1;;;;;6511:192:0:o;36069:229::-;36154:28;36166:7;36175:6;36154:11;:28::i;:::-;-1:-1:-1;;;;;36262:19:0;;;36258:1;36262:19;;;:10;:19;;;;;;36235:55;;36262:19;36283:6;36235:14;:55::i;:::-;36069:229;;:::o;33106:158::-;33180:7;33231:22;33235:3;33247:5;33231:3;:22::i;40552:437::-;-1:-1:-1;;;;;40665:21:0;;;40639:23;40665:21;;;:10;:21;;;;;;;;;;18455:18;;;;;;;;40803:21;;;;:33;;;-1:-1:-1;;;;;;40803:33:0;;;;;;40665:21;;;40849:60;40665:21;40803:33;18455:18;40849:14;:60::i;:::-;40971:9;-1:-1:-1;;;;;40927:54:0;40954:15;-1:-1:-1;;;;;40927:54:0;40943:9;-1:-1:-1;;;;;40927:54:0;;;;;;;;;;;40552:437;;;;:::o;31810:152::-;31880:4;31904:50;31909:3;-1:-1:-1;;;;;31929:23:0;;31904:4;:50::i;32382:167::-;-1:-1:-1;;;;;32516:23:0;;32462:4;29171:19;;;:12;;;:19;;;;;;:24;;32486:55;29074:129;27444:1544;27510:4;27649:19;;;:12;;;:19;;;;;;27685:15;;27681:1300;;28047:21;28071:14;28084:1;28071:10;:14;:::i;:::-;28120:18;;28047:38;;-1:-1:-1;28100:17:0;;28120:22;;28141:1;;28120:22;:::i;:::-;28100:42;;28387:17;28407:3;:11;;28419:9;28407:22;;;;;;-1:-1:-1;;;28407:22:0;;;;;;;;;;;;;;;;;28387:42;;28553:9;28524:3;:11;;28536:13;28524:26;;;;;;-1:-1:-1;;;28524:26:0;;;;;;;;;;;;;;;;;;:38;28656:17;:13;28672:1;28656:17;:::i;:::-;28630:23;;;;:12;;;:23;;;;;:43;28782:17;;28630:3;;28782:17;;;-1:-1:-1;;;28782:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;28877:3;:12;;:19;28890:5;28877:19;;;;;;;;;;;28870:26;;;28920:4;28913:11;;;;;;;;27681:1300;28964:5;28957:12;;;;;22083:539;-1:-1:-1;;;;;22189:20:0;;22181:70;;;;-1:-1:-1;;;22181:70:0;;11033:2:1;22181:70:0;;;11015:21:1;11072:2;11052:18;;;11045:30;11111:34;11091:18;;;11084:62;-1:-1:-1;;;11162:18:1;;;11155:35;11207:19;;22181:70:0;11005:227:1;22181:70:0;-1:-1:-1;;;;;22270:23:0;;22262:71;;;;-1:-1:-1;;;22262:71:0;;5932:2:1;22262:71:0;;;5914:21:1;5971:2;5951:18;;;5944:30;6010:34;5990:18;;;5983:62;-1:-1:-1;;;6061:18:1;;;6054:33;6104:19;;22262:71:0;5904:225:1;22262:71:0;22426;22448:6;22426:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22426:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22406:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22531:20;;;;;;;:32;;22556:6;22531:24;:32::i;:::-;-1:-1:-1;;;;;22508:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22579:35;3436:25:1;;;22508:20:0;;22579:35;;;;;;3409:18:1;22579:35:0;3391:76:1;40997:947:0;41103:6;-1:-1:-1;;;;;41093:16:0;:6;-1:-1:-1;;;;;41093:16:0;;;:30;;;;;41122:1;41113:6;:10;41093:30;41089:848;;;-1:-1:-1;;;;;41144:20:0;;;41140:385;;-1:-1:-1;;;;;41252:22:0;;41233:16;41252:22;;;:14;:22;;;;;;;;;41313:13;:60;;41372:1;41313:60;;;-1:-1:-1;;;;;41329:19:0;;;;;;:11;:19;;;;;;41349:13;41361:1;41349:9;:13;:::i;:::-;41329:34;;;;;;;;;;;;;;;:40;;;41313:60;41293:80;-1:-1:-1;41392:17:0;41412:21;41293:80;41426:6;41412:13;:21::i;:::-;41392:41;;41452:57;41469:6;41477:9;41488;41499;41452:16;:57::i;:::-;41140:385;;;;-1:-1:-1;;;;;41545:20:0;;;41541:385;;-1:-1:-1;;;;;41653:22:0;;41634:16;41653:22;;;:14;:22;;;;;;;;;41714:13;:60;;41773:1;41714:60;;;-1:-1:-1;;;;;41730:19:0;;;;;;:11;:19;;;;;;41750:13;41762:1;41750:9;:13;:::i;:::-;41730:34;;;;;;;;;;;;;;;:40;;;41714:60;41694:80;-1:-1:-1;41793:17:0;41813:21;41694:80;41827:6;41813:13;:21::i;:::-;41793:41;;41853:57;41870:6;41878:9;41889;41900;41853:16;:57::i;29752:204::-;29847:18;;29819:7;;29847:26;-1:-1:-1;29839:73:0;;;;-1:-1:-1;;;29839:73:0;;5529:2:1;29839:73:0;;;5511:21:1;5568:2;5548:18;;;5541:30;5607:34;5587:18;;;5580:62;-1:-1:-1;;;5658:18:1;;;5651:32;5700:19;;29839:73:0;5501:224:1;29839:73:0;29930:3;:11;;29942:5;29930:18;;;;;;-1:-1:-1;;;29930:18:0;;;;;;;;;;;;;;;;;29923:25;;29752:204;;;;:::o;26854:414::-;26917:4;29171:19;;;:12;;;:19;;;;;;26934:327;;-1:-1:-1;26977:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;27160:18;;27138:19;;;:12;;;:19;;;;;;:40;;;;27193:11;;26934:327;-1:-1:-1;27244:5:0;27237:12;;41952:704;42127:18;42148:80;42155:12;42148:80;;;;;;;;;;;;;;;;;:6;:80::i;:::-;42127:101;;42260:1;42245:12;:16;;;:85;;;;-1:-1:-1;;;;;;42265:22:0;;;;;;:11;:22;;;;;:65;;;;42288:16;42303:1;42288:12;:16;:::i;:::-;42265:40;;;;;;;;;;;;;;;-1:-1:-1;42265:40:0;:50;;:65;42245:85;42241:339;;;-1:-1:-1;;;;;42347:22:0;;;;;;:11;:22;;;;;42396:8;;42370:16;42385:1;42370:12;:16;:::i;:::-;42347:40;;;;;;;;;;;;;-1:-1:-1;42347:40:0;:46;;:57;42241:339;;;42476:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42437:22:0;;-1:-1:-1;42437:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;42437:72:0;;;;;;;;-1:-1:-1;42437:72:0;;;;42552:16;;42437:36;;42552:16;:::i;:::-;-1:-1:-1;;;;;42524:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;42524:44:0;;;;;;;;;;;;42241:339;42597:51;;;12358:25:1;;;12414:2;12399:18;;12392:34;;;-1:-1:-1;;;;;42597:51:0;;;;;12331:18:1;42597:51:0;;;;;;;41952:704;;;;;:::o;42664:161::-;42739:6;42777:12;42770:5;42766:9;;42758:32;;;;-1:-1:-1;;;42758:32:0;;;;;;;;:::i;:::-;-1:-1:-1;42815:1:0;;42664:161;-1:-1:-1;;42664:161:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:196;;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;;;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;;;;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;;;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:1:o;1280:638::-;;;;;;;1475:3;1463:9;1454:7;1450:23;1446:33;1443:2;;;1497:6;1489;1482:22;1443:2;1525:29;1544:9;1525:29;:::i;:::-;1515:39;;1601:2;1590:9;1586:18;1573:32;1563:42;;1652:2;1641:9;1637:18;1624:32;1614:42;;1706:2;1695:9;1691:18;1678:32;1750:4;1743:5;1739:16;1732:5;1729:27;1719:2;;1775:6;1767;1760:22;1719:2;1433:485;;;;-1:-1:-1;1433:485:1;;1855:3;1840:19;;1827:33;;1907:3;1892:19;;;1879:33;;-1:-1:-1;1433:485:1;-1:-1:-1;;1433:485:1:o;1923:370::-;;;2051:2;2039:9;2030:7;2026:23;2022:32;2019:2;;;2072:6;2064;2057:22;2019:2;2100:29;2119:9;2100:29;:::i;:::-;2090:39;;2179:2;2168:9;2164:18;2151:32;2223:10;2216:5;2212:22;2205:5;2202:33;2192:2;;2254:6;2246;2239:22;2192:2;2282:5;2272:15;;;2009:284;;;;;:::o;2298:190::-;;2410:2;2398:9;2389:7;2385:23;2381:32;2378:2;;;2431:6;2423;2416:22;2378:2;-1:-1:-1;2459:23:1;;2368:120;-1:-1:-1;2368:120:1:o;4719:603::-;;4860:2;4889;4878:9;4871:21;4921:6;4915:13;4964:6;4959:2;4948:9;4944:18;4937:34;4989:4;5002:140;5016:6;5013:1;5010:13;5002:140;;;5111:14;;;5107:23;;5101:30;5077:17;;;5096:2;5073:26;5066:66;5031:10;;5002:140;;;5160:6;5157:1;5154:13;5151:2;;;5230:4;5225:2;5216:6;5205:9;5201:22;5197:31;5190:45;5151:2;-1:-1:-1;5306:2:1;5285:15;-1:-1:-1;;5281:29:1;5266:45;;;;5313:2;5262:54;;4840:482;-1:-1:-1;;;4840:482:1:o;8880:356::-;9082:2;9064:21;;;9101:18;;;9094:30;9160:34;9155:2;9140:18;;9133:62;9227:2;9212:18;;9054:182::o;13091:128::-;;13162:1;13158:6;13155:1;13152:13;13149:2;;;13168:18;;:::i;:::-;-1:-1:-1;13204:9:1;;13139:80::o;13224:228::-;;13291:10;13328:2;13325:1;13321:10;13358:2;13355:1;13351:10;13389:3;13385:2;13381:12;13376:3;13373:21;13370:2;;;13397:18;;:::i;:::-;13433:13;;13271:181;-1:-1:-1;;;;13271:181:1:o;13457:288::-;;13522:10;13559:2;13556:1;13552:10;13581:3;13571:2;;-1:-1:-1;;;13608:31:1;;13662:4;13659:1;13652:15;13690:4;13615:1;13680:15;13571:2;13723:10;;13719:20;;;;;13502:243;-1:-1:-1;;13502:243:1:o;13750:125::-;;13818:1;13815;13812:8;13809:2;;;13823:18;;:::i;:::-;-1:-1:-1;13860:9:1;;13799:76::o;13880:221::-;;13948:10;14008;;;;13978;;14030:12;;;14027:2;;;14045:18;;:::i;:::-;14082:13;;13928:173;-1:-1:-1;;;13928:173:1:o;14106:380::-;14191:1;14181:12;;14238:1;14228:12;;;14249:2;;14303:4;14295:6;14291:17;14281:27;;14249:2;14356;14348:6;14345:14;14325:18;14322:38;14319:2;;;14402:10;14397:3;14393:20;14390:1;14383:31;14437:4;14434:1;14427:15;14465:4;14462:1;14455:15;14319:2;;14161:325;;;:::o;14491:135::-;;-1:-1:-1;;14551:17:1;;14548:2;;;14571:18;;:::i;:::-;-1:-1:-1;14618:1:1;14607:13;;14538:88::o;14631:127::-;14692:10;14687:3;14683:20;14680:1;14673:31;14723:4;14720:1;14713:15;14747:4;14744:1;14737:15
Swarm Source
ipfs://d74db47777678044ab25a502c3add2dd01a67a7547786efbbbb19986cd5c9067
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.