Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
FsToken
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-23 */ // File: @openzeppelin/upgrades/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/math/Math.sol pragma solidity ^0.5.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Arrays.sol pragma solidity ^0.5.0; /** * @dev Collection of functions related to array types. */ library Arrays { /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid] > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1] == element) { return low - 1; } else { return low; } } } // File: @openzeppelin/contracts-ethereum-package/contracts/drafts/Counters.sol pragma solidity ^0.5.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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); } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Initializable, Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/drafts/ERC20Snapshot.sol pragma solidity ^0.5.0; /** * @title ERC20 token with snapshots. * @dev Inspired by Jordi Baylina's * https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol[MiniMeToken] * to record historical balances. * * When a snapshot is made, the balances and total supply at the time of the snapshot are recorded for later * access. * * To make a snapshot, call the {snapshot} function, which will emit the {Snapshot} event and return a snapshot id. * To get the total supply from a snapshot, call the function {totalSupplyAt} with the snapshot id. * To get the balance of an account from a snapshot, call the {balanceOfAt} function with the snapshot id and the * account address. * @author Validity Labs AG <[email protected]> */ contract ERC20Snapshot is Initializable, ERC20 { using SafeMath for uint256; using Arrays for uint256[]; using Counters for Counters.Counter; // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a // Snapshot struct, but that would impede usage of functions that work on an array. struct Snapshots { uint256[] ids; uint256[] values; } mapping (address => Snapshots) private _accountBalanceSnapshots; Snapshots private _totalSupplySnapshots; // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. Counters.Counter private _currentSnapshotId; event Snapshot(uint256 id); // Creates a new snapshot id. Balances are only stored in snapshots on demand: unless a snapshot was taken, a // balance change will not be recorded. This means the extra added cost of storing snapshotted balances is only paid // when required, but is also flexible enough that it allows for e.g. daily snapshots. function snapshot() public returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _currentSnapshotId.current(); emit Snapshot(currentId); return currentId; } function balanceOfAt(address account, uint256 snapshotId) public view returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : balanceOf(account); } function totalSupplyAt(uint256 snapshotId) public view returns(uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } // _transfer, _mint and _burn are the only functions where the balances are modified, so it is there that the // snapshots are updated. Note that the update happens _before_ the balance change, with the pre-modified value. // The same is true for the total supply and _mint and _burn. function _transfer(address from, address to, uint256 value) internal { _updateAccountSnapshot(from); _updateAccountSnapshot(to); super._transfer(from, to, value); } function _mint(address account, uint256 value) internal { _updateAccountSnapshot(account); _updateTotalSupplySnapshot(); super._mint(account, value); } function _burn(address account, uint256 value) internal { _updateAccountSnapshot(account); _updateTotalSupplySnapshot(); super._burn(account, value); } // When a valid snapshot is queried, there are three possibilities: // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds // to this id is the current one. // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the // requested id, and its value is the one to return. // c) More snapshots were created after the requested one, and the queried value was later modified. There will be // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is // larger than the requested one. // // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does // exactly this. function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); // solhint-disable-next-line max-line-length require(snapshotId <= _currentSnapshotId.current(), "ERC20Snapshot: nonexistent id"); uint256 index = snapshots.ids.findUpperBound(snapshotId); if (index == snapshots.ids.length) { return (false, 0); } else { return (true, snapshots.values[index]); } } function _updateAccountSnapshot(address account) private { _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); } function _updateTotalSupplySnapshot() private { _updateSnapshot(_totalSupplySnapshots, totalSupply()); } function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { uint256 currentId = _currentSnapshotId.current(); if (_lastSnapshotId(snapshots.ids) < currentId) { snapshots.ids.push(currentId); snapshots.values.push(currentValue); } } function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { if (ids.length == 0) { return 0; } else { return ids[ids.length - 1]; } } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Burnable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ contract ERC20Burnable is Initializable, Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public { _burn(_msgSender(), amount); } /** * @dev See {ERC20-_burnFrom}. */ function burnFrom(address account, uint256 amount) public { _burnFrom(account, amount); } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: @openzeppelin/contracts-ethereum-package/contracts/access/roles/MinterRole.sol pragma solidity ^0.5.0; contract MinterRole is Initializable, Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; function initialize(address sender) public initializer { if (!isMinter(sender)) { _addMinter(sender); } } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20Mintable.sol pragma solidity ^0.5.0; /** * @dev Extension of {ERC20} that adds a set of accounts with the {MinterRole}, * which have permission to mint (create) new tokens as they see fit. * * At construction, the deployer of the contract is the only minter. */ contract ERC20Mintable is Initializable, ERC20, MinterRole { function initialize(address sender) public initializer { MinterRole.initialize(sender); } /** * @dev See {ERC20-_mint}. * * Requirements: * * - the caller must have the {MinterRole}. */ function mint(address account, uint256 amount) public onlyMinter returns (bool) { _mint(account, amount); return true; } uint256[50] private ______gap; } // File: contracts/FSToken/FsToken.sol pragma solidity ^0.5.17; // The 'code' of FsToken. // The token is non transferable. // Note: Any changes to the layout of storage have to work with the proxy. // To be safe here updates should only be additive to storage and needs to make sure // that none of the base classes change their storage layout. contract FsToken is Initializable, ERC20Snapshot, ERC20Mintable, ERC20Burnable { constructor() public {} function initialize(address sender) public initializer { if (!isMinter(sender)) { _addMinter(sender); } } function name() public pure returns (string memory) { return "Futureswap Token"; } function symbol() public pure returns (string memory) { return "FST"; } function decimals() public pure returns (uint8) { return 18; } function burnFst() public { _burn(address(this), balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"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":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","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"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"burnFst","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"snapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506115fa806100206000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806379cc6790116100b8578063986502751161007c57806398650275146103c2578063a457c2d7146103ca578063a9059cbb146103f6578063aa271e1a14610422578063c4d66de814610448578063dd62ed3e1461046e57610142565b806379cc67901461034357806395d89b411461036f5780639711715a14610377578063981b24d01461037f578063983b2d561461039c57610142565b8063345125ab1161010a578063345125ab14610272578063395093511461027c57806340c10f19146102a857806342966c68146102d45780634ee2cd7e146102f157806370a082311461031d57610142565b806306fdde0314610147578063095ea7b3146101c457806318160ddd1461020457806323b872dd1461021e578063313ce56714610254575b600080fd5b61014f61049c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b0381351690602001356104c6565b604080519115158252519081900360200190f35b61020c6104e4565b60408051918252519081900360200190f35b6101f06004803603606081101561023457600080fd5b506001600160a01b038135811691602081013590911690604001356104ea565b61025c610577565b6040805160ff9092168252519081900360200190f35b61027a61057c565b005b6101f06004803603604081101561029257600080fd5b506001600160a01b038135169060200135610590565b6101f0600480360360408110156102be57600080fd5b506001600160a01b0381351690602001356105e4565b61027a600480360360208110156102ea57600080fd5b503561063b565b61020c6004803603604081101561030757600080fd5b506001600160a01b03813516906020013561064f565b61020c6004803603602081101561033357600080fd5b50356001600160a01b0316610698565b61027a6004803603604081101561035957600080fd5b506001600160a01b0381351690602001356106b7565b61014f6106c5565b61020c6106e2565b61020c6004803603602081101561039557600080fd5b5035610736565b61027a600480360360208110156103b257600080fd5b50356001600160a01b0316610766565b61027a6107b5565b6101f0600480360360408110156103e057600080fd5b506001600160a01b0381351690602001356107c5565b6101f06004803603604081101561040c57600080fd5b506001600160a01b038135169060200135610833565b6101f06004803603602081101561043857600080fd5b50356001600160a01b0316610847565b61027a6004803603602081101561045e57600080fd5b50356001600160a01b031661085a565b61020c6004803603604081101561048457600080fd5b506001600160a01b0381358116916020013516610912565b60408051808201909152601081526f233aba3ab932b9bbb0b8102a37b5b2b760811b602082015290565b60006104da6104d361093d565b8484610941565b5060015b92915050565b60355490565b60006104f7848484610a2d565b61056d8461050361093d565b6105688560405180606001604052806028815260200161147b602891396001600160a01b038a1660009081526034602052604081209061054161093d565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610a4f16565b610941565b5060019392505050565b601290565b61058e3061058930610698565b610ae6565b565b60006104da61059d61093d565b8461056885603460006105ae61093d565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610b0116565b60006105f66105f161093d565b610847565b6106315760405162461bcd60e51b815260040180806020018281038252603081526020018061142a6030913960400191505060405180910390fd5b6104da8383610b62565b61064c61064661093d565b82610ae6565b50565b6001600160a01b038216600090815260686020526040812081908190610676908590610b7d565b915091508161068d5761068885610698565b61068f565b805b95945050505050565b6001600160a01b0381166000908152603360205260409020545b919050565b6106c18282610c80565b5050565b6040805180820190915260038152621194d560ea1b602082015290565b60006106ee606b610cd4565b60006106fa606b610cdd565b6040805182815290519192507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67919081900360200190a1905090565b6000806000610746846069610b7d565b915091508161075c576107576104e4565b61075e565b805b949350505050565b6107716105f161093d565b6107ac5760405162461bcd60e51b815260040180806020018281038252603081526020018061142a6030913960400191505060405180910390fd5b61064c81610ce1565b61058e6107c061093d565b610d29565b60006104da6107d261093d565b84610568856040518060600160405280602581526020016115a160259139603460006107fc61093d565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610a4f16565b60006104da61084061093d565b8484610a2d565b60006104de609e8363ffffffff610d7116565b600054610100900460ff16806108735750610873610dd8565b80610881575060005460ff16155b6108bc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806114c5602e913960400191505060405180910390fd5b600054610100900460ff161580156108e7576000805460ff1961ff0019909116610100171660011790555b6108f082610847565b6108fd576108fd82610ce1565b80156106c1576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166109865760405162461bcd60e51b815260040180806020018281038252602481526020018061157d6024913960400191505060405180910390fd5b6001600160a01b0382166109cb5760405162461bcd60e51b81526004018080602001828103825260228152602001806113e26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b610a3683610dde565b610a3f82610dde565b610a4a838383610e08565b505050565b60008184841115610ade5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610aa3578181015183820152602001610a8b565b50505050905090810190601f168015610ad05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b610aef82610dde565b610af7610f54565b6106c18282610f61565b600082820183811015610b5b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b6b82610dde565b610b73610f54565b6106c1828261104b565b60008060008411610bce576040805162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b604482015290519081900360640190fd5b610bd8606b610cdd565b841115610c2c576040805162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000604482015290519081900360640190fd5b6000610c3e848663ffffffff61112b16565b8454909150811415610c57575060009150819050610c79565b6001846001018281548110610c6857fe5b906000526020600020015492509250505b9250929050565b610c8a8282610ae6565b6106c182610c9661093d565b610568846040518060600160405280602481526020016114f3602491396001600160a01b03881660009081526034602052604081209061054161093d565b80546001019055565b5490565b610cf2609e8263ffffffff6111cc16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b610d3a609e8263ffffffff61124d16565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b038216610db85760405162461bcd60e51b81526004018080602001828103825260228152602001806114a36022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b303b1590565b6001600160a01b038116600090815260686020526040902061064c90610e0383610698565b6112b4565b6001600160a01b038316610e4d5760405162461bcd60e51b81526004018080602001828103825260258152602001806115586025913960400191505060405180910390fd5b6001600160a01b038216610e925760405162461bcd60e51b815260040180806020018281038252602381526020018061139d6023913960400191505060405180910390fd5b610ed581604051806060016040528060268152602001611404602691396001600160a01b038616600090815260336020526040902054919063ffffffff610a4f16565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610f0a908263ffffffff610b0116565b6001600160a01b03808416600081815260336020908152604091829020949094558051858152905191939287169260008051602061151783398151915292918290030190a3505050565b61058e6069610e036104e4565b6001600160a01b038216610fa65760405162461bcd60e51b81526004018080602001828103825260218152602001806115376021913960400191505060405180910390fd5b610fe9816040518060600160405280602281526020016113c0602291396001600160a01b038516600090815260336020526040902054919063ffffffff610a4f16565b6001600160a01b038316600090815260336020526040902055603554611015908263ffffffff61130016565b6035556040805182815290516000916001600160a01b038516916000805160206115178339815191529181900360200190a35050565b6001600160a01b0382166110a6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6035546110b9908263ffffffff610b0116565b6035556001600160a01b0382166000908152603360205260409020546110e5908263ffffffff610b0116565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391926000805160206115178339815191529281900390910190a35050565b815460009061113c575060006104de565b82546000905b8082101561118b5760006111568383611342565b90508486828154811061116557fe5b9060005260206000200154111561117e57809150611185565b8060010192505b50611142565b6000821180156111b35750838560018403815481106111a657fe5b9060005260206000200154145b156111c457506000190190506104de565b5090506104de565b6111d68282610d71565b15611228576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6112578282610d71565b6112925760405162461bcd60e51b815260040180806020018281038252602181526020018061145a6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006112c0606b610cdd565b9050806112cc84611367565b1015610a4a578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6000610b5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610a4f565b6000600280830660028506018161135557fe5b04600283046002850401019392505050565b8054600090611378575060006106b2565b81548290600019810190811061138a57fe5b906000526020600020015490506106b256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820b57be0c2e5e7e5c3ebf0f8266dc5efec7f68f3e72e260172588dc8bf5b70f20764736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806379cc6790116100b8578063986502751161007c57806398650275146103c2578063a457c2d7146103ca578063a9059cbb146103f6578063aa271e1a14610422578063c4d66de814610448578063dd62ed3e1461046e57610142565b806379cc67901461034357806395d89b411461036f5780639711715a14610377578063981b24d01461037f578063983b2d561461039c57610142565b8063345125ab1161010a578063345125ab14610272578063395093511461027c57806340c10f19146102a857806342966c68146102d45780634ee2cd7e146102f157806370a082311461031d57610142565b806306fdde0314610147578063095ea7b3146101c457806318160ddd1461020457806323b872dd1461021e578063313ce56714610254575b600080fd5b61014f61049c565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b0381351690602001356104c6565b604080519115158252519081900360200190f35b61020c6104e4565b60408051918252519081900360200190f35b6101f06004803603606081101561023457600080fd5b506001600160a01b038135811691602081013590911690604001356104ea565b61025c610577565b6040805160ff9092168252519081900360200190f35b61027a61057c565b005b6101f06004803603604081101561029257600080fd5b506001600160a01b038135169060200135610590565b6101f0600480360360408110156102be57600080fd5b506001600160a01b0381351690602001356105e4565b61027a600480360360208110156102ea57600080fd5b503561063b565b61020c6004803603604081101561030757600080fd5b506001600160a01b03813516906020013561064f565b61020c6004803603602081101561033357600080fd5b50356001600160a01b0316610698565b61027a6004803603604081101561035957600080fd5b506001600160a01b0381351690602001356106b7565b61014f6106c5565b61020c6106e2565b61020c6004803603602081101561039557600080fd5b5035610736565b61027a600480360360208110156103b257600080fd5b50356001600160a01b0316610766565b61027a6107b5565b6101f0600480360360408110156103e057600080fd5b506001600160a01b0381351690602001356107c5565b6101f06004803603604081101561040c57600080fd5b506001600160a01b038135169060200135610833565b6101f06004803603602081101561043857600080fd5b50356001600160a01b0316610847565b61027a6004803603602081101561045e57600080fd5b50356001600160a01b031661085a565b61020c6004803603604081101561048457600080fd5b506001600160a01b0381358116916020013516610912565b60408051808201909152601081526f233aba3ab932b9bbb0b8102a37b5b2b760811b602082015290565b60006104da6104d361093d565b8484610941565b5060015b92915050565b60355490565b60006104f7848484610a2d565b61056d8461050361093d565b6105688560405180606001604052806028815260200161147b602891396001600160a01b038a1660009081526034602052604081209061054161093d565b6001600160a01b03168152602081019190915260400160002054919063ffffffff610a4f16565b610941565b5060019392505050565b601290565b61058e3061058930610698565b610ae6565b565b60006104da61059d61093d565b8461056885603460006105ae61093d565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff610b0116565b60006105f66105f161093d565b610847565b6106315760405162461bcd60e51b815260040180806020018281038252603081526020018061142a6030913960400191505060405180910390fd5b6104da8383610b62565b61064c61064661093d565b82610ae6565b50565b6001600160a01b038216600090815260686020526040812081908190610676908590610b7d565b915091508161068d5761068885610698565b61068f565b805b95945050505050565b6001600160a01b0381166000908152603360205260409020545b919050565b6106c18282610c80565b5050565b6040805180820190915260038152621194d560ea1b602082015290565b60006106ee606b610cd4565b60006106fa606b610cdd565b6040805182815290519192507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67919081900360200190a1905090565b6000806000610746846069610b7d565b915091508161075c576107576104e4565b61075e565b805b949350505050565b6107716105f161093d565b6107ac5760405162461bcd60e51b815260040180806020018281038252603081526020018061142a6030913960400191505060405180910390fd5b61064c81610ce1565b61058e6107c061093d565b610d29565b60006104da6107d261093d565b84610568856040518060600160405280602581526020016115a160259139603460006107fc61093d565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff610a4f16565b60006104da61084061093d565b8484610a2d565b60006104de609e8363ffffffff610d7116565b600054610100900460ff16806108735750610873610dd8565b80610881575060005460ff16155b6108bc5760405162461bcd60e51b815260040180806020018281038252602e8152602001806114c5602e913960400191505060405180910390fd5b600054610100900460ff161580156108e7576000805460ff1961ff0019909116610100171660011790555b6108f082610847565b6108fd576108fd82610ce1565b80156106c1576000805461ff00191690555050565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166109865760405162461bcd60e51b815260040180806020018281038252602481526020018061157d6024913960400191505060405180910390fd5b6001600160a01b0382166109cb5760405162461bcd60e51b81526004018080602001828103825260228152602001806113e26022913960400191505060405180910390fd5b6001600160a01b03808416600081815260346020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b610a3683610dde565b610a3f82610dde565b610a4a838383610e08565b505050565b60008184841115610ade5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610aa3578181015183820152602001610a8b565b50505050905090810190601f168015610ad05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b610aef82610dde565b610af7610f54565b6106c18282610f61565b600082820183811015610b5b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b610b6b82610dde565b610b73610f54565b6106c1828261104b565b60008060008411610bce576040805162461bcd60e51b815260206004820152601660248201527504552433230536e617073686f743a20696420697320360541b604482015290519081900360640190fd5b610bd8606b610cdd565b841115610c2c576040805162461bcd60e51b815260206004820152601d60248201527f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000604482015290519081900360640190fd5b6000610c3e848663ffffffff61112b16565b8454909150811415610c57575060009150819050610c79565b6001846001018281548110610c6857fe5b906000526020600020015492509250505b9250929050565b610c8a8282610ae6565b6106c182610c9661093d565b610568846040518060600160405280602481526020016114f3602491396001600160a01b03881660009081526034602052604081209061054161093d565b80546001019055565b5490565b610cf2609e8263ffffffff6111cc16565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b610d3a609e8263ffffffff61124d16565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60006001600160a01b038216610db85760405162461bcd60e51b81526004018080602001828103825260228152602001806114a36022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b303b1590565b6001600160a01b038116600090815260686020526040902061064c90610e0383610698565b6112b4565b6001600160a01b038316610e4d5760405162461bcd60e51b81526004018080602001828103825260258152602001806115586025913960400191505060405180910390fd5b6001600160a01b038216610e925760405162461bcd60e51b815260040180806020018281038252602381526020018061139d6023913960400191505060405180910390fd5b610ed581604051806060016040528060268152602001611404602691396001600160a01b038616600090815260336020526040902054919063ffffffff610a4f16565b6001600160a01b038085166000908152603360205260408082209390935590841681522054610f0a908263ffffffff610b0116565b6001600160a01b03808416600081815260336020908152604091829020949094558051858152905191939287169260008051602061151783398151915292918290030190a3505050565b61058e6069610e036104e4565b6001600160a01b038216610fa65760405162461bcd60e51b81526004018080602001828103825260218152602001806115376021913960400191505060405180910390fd5b610fe9816040518060600160405280602281526020016113c0602291396001600160a01b038516600090815260336020526040902054919063ffffffff610a4f16565b6001600160a01b038316600090815260336020526040902055603554611015908263ffffffff61130016565b6035556040805182815290516000916001600160a01b038516916000805160206115178339815191529181900360200190a35050565b6001600160a01b0382166110a6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6035546110b9908263ffffffff610b0116565b6035556001600160a01b0382166000908152603360205260409020546110e5908263ffffffff610b0116565b6001600160a01b03831660008181526033602090815260408083209490945583518581529351929391926000805160206115178339815191529281900390910190a35050565b815460009061113c575060006104de565b82546000905b8082101561118b5760006111568383611342565b90508486828154811061116557fe5b9060005260206000200154111561117e57809150611185565b8060010192505b50611142565b6000821180156111b35750838560018403815481106111a657fe5b9060005260206000200154145b156111c457506000190190506104de565b5090506104de565b6111d68282610d71565b15611228576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6112578282610d71565b6112925760405162461bcd60e51b815260040180806020018281038252602181526020018061145a6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60006112c0606b610cdd565b9050806112cc84611367565b1015610a4a578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6000610b5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610a4f565b6000600280830660028506018161135557fe5b04600283046002850401019392505050565b8054600090611378575060006106b2565b81548290600019810190811061138a57fe5b906000526020600020015490506106b256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820b57be0c2e5e7e5c3ebf0f8266dc5efec7f68f3e72e260172588dc8bf5b70f20764736f6c63430005110032
Deployed Bytecode Sourcemap
34688:641:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34688:641:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34954:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;34954:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18410:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18410:152:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;17431:91;;;:::i;:::-;;;;;;;;;;;;;;;;19034:304;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19034:304:0;;;;;;;;;;;;;;;;;:::i;35151:76::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35235:91;;;:::i;:::-;;19747:210;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19747:210:0;;;;;;;;:::i;34135:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;34135:143:0;;;;;;;;:::i;30814:83::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30814:83:0;;:::i;26406:258::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26406:258:0;;;;;;;;:::i;17585:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17585:110:0;-1:-1:-1;;;;;17585:110:0;;:::i;30959:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30959:103:0;;;;;;;;:::i;35058:85::-;;;:::i;26181:217::-;;;:::i;26672:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26672:225:0;;:::i;32967:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32967:92:0;-1:-1:-1;;;;;32967:92:0;;:::i;33067:79::-;;;:::i;20460:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20460:261:0;;;;;;;;:::i;17908:158::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17908:158:0;;;;;;;;:::i;32850:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32850:109:0;-1:-1:-1;;;;;32850:109:0;;:::i;34805:141::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34805:141:0;-1:-1:-1;;;;;34805:141:0;;:::i;18129:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18129:134:0;;;;;;;;;;:::i;34954:96::-;35017:25;;;;;;;;;;;;-1:-1:-1;;;35017:25:0;;;;34954:96;:::o;18410:152::-;18476:4;18493:39;18502:12;:10;:12::i;:::-;18516:7;18525:6;18493:8;:39::i;:::-;-1:-1:-1;18550:4:0;18410:152;;;;;:::o;17431:91::-;17502:12;;17431:91;:::o;19034:304::-;19123:4;19140:36;19150:6;19158:9;19169:6;19140:9;:36::i;:::-;19187:121;19196:6;19204:12;:10;:12::i;:::-;19218:89;19256:6;19218:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19218:19:0;;;;;;:11;:19;;;;;;19238:12;:10;:12::i;:::-;-1:-1:-1;;;;;19218:33:0;;;;;;;;;;;;-1:-1:-1;19218:33:0;;;:89;;:37;:89;:::i;:::-;19187:8;:121::i;:::-;-1:-1:-1;19326:4:0;19034:304;;;;;:::o;35151:76::-;35217:2;35151:76;:::o;35235:91::-;35272:46;35286:4;35293:24;35311:4;35293:9;:24::i;:::-;35272:5;:46::i;:::-;35235:91::o;19747:210::-;19827:4;19844:83;19853:12;:10;:12::i;:::-;19867:7;19876:50;19915:10;19876:11;:25;19888:12;:10;:12::i;:::-;-1:-1:-1;;;;;19876:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19876:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;34135:143::-;34209:4;32747:22;32756:12;:10;:12::i;:::-;32747:8;:22::i;:::-;32739:83;;;;-1:-1:-1;;;32739:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34226:22;34232:7;34241:6;34226:5;:22::i;30814:83::-;30862:27;30868:12;:10;:12::i;:::-;30882:6;30862:5;:27::i;:::-;30814:83;:::o;26406:258::-;-1:-1:-1;;;;;26562:33:0;;26485:7;26562:33;;;:24;:33;;;;;26485:7;;;;26541:55;;26550:10;;26541:8;:55::i;:::-;26505:91;;;;26616:11;:40;;26638:18;26648:7;26638:9;:18::i;:::-;26616:40;;;26630:5;26616:40;26609:47;26406:258;-1:-1:-1;;;;;26406:258:0:o;17585:110::-;-1:-1:-1;;;;;17669:18:0;;17642:7;17669:18;;;:9;:18;;;;;;17585:110;;;;:::o;30959:103::-;31028:26;31038:7;31047:6;31028:9;:26::i;:::-;30959:103;;:::o;35058:85::-;35123:12;;;;;;;;;;;;-1:-1:-1;;;35123:12:0;;;;35058:85;:::o;26181:217::-;26217:7;26237:30;:18;:28;:30::i;:::-;26280:17;26300:28;:18;:26;:28::i;:::-;26344:19;;;;;;;;26280:48;;-1:-1:-1;26344:19:0;;;;;;;;;;26381:9;-1:-1:-1;26181:217:0;:::o;26672:225::-;26735:7;26756:16;26774:13;26791:43;26800:10;26812:21;26791:8;:43::i;:::-;26755:79;;;;26854:11;:35;;26876:13;:11;:13::i;:::-;26854:35;;;26868:5;26854:35;26847:42;26672:225;-1:-1:-1;;;;26672:225:0:o;32967:92::-;32747:22;32756:12;:10;:12::i;32747:22::-;32739:83;;;;-1:-1:-1;;;32739:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33032:19;33043:7;33032:10;:19::i;33067:79::-;33111:27;33125:12;:10;:12::i;:::-;33111:13;:27::i;20460:261::-;20545:4;20562:129;20571:12;:10;:12::i;:::-;20585:7;20594:96;20633:15;20594:96;;;;;;;;;;;;;;;;;:11;:25;20606:12;:10;:12::i;:::-;-1:-1:-1;;;;;20594:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20594:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;17908:158::-;17977:4;17994:42;18004:12;:10;:12::i;:::-;18018:9;18029:6;17994:9;:42::i;32850:109::-;32906:4;32930:21;:8;32943:7;32930:21;:12;:21;:::i;34805:141::-;1118:12;;;;;;;;:31;;;1134:15;:13;:15::i;:::-;1118:47;;;-1:-1:-1;1154:11:0;;;;1153:12;1118:47;1110:106;;;;-1:-1:-1;;;1110:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1225:19;1248:12;;;;;;1247:13;1267:83;;;;1296:12;:19;;-1:-1:-1;;;;1296:19:0;;;;;1324:18;1311:4;1324:18;;;1267:83;34876:16;34885:6;34876:8;:16::i;:::-;34871:68;;34909:18;34920:6;34909:10;:18::i;:::-;1372:14;1368:57;;;1412:5;1397:20;;-1:-1:-1;;1397:20:0;;;34805:141;;:::o;18129:134::-;-1:-1:-1;;;;;18228:18:0;;;18201:7;18228:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;18129:134::o;12571:98::-;12651:10;12571:98;:::o;23391:338::-;-1:-1:-1;;;;;23485:19:0;;23477:68;;;;-1:-1:-1;;;23477:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23564:21:0;;23556:68;;;;-1:-1:-1;;;23556:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23637:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23689:32;;;;;;;;;;;;;;;;;23391:338;;;:::o;27205:198::-;27285:28;27308:4;27285:22;:28::i;:::-;27324:26;27347:2;27324:22;:26::i;:::-;27363:32;27379:4;27385:2;27389:5;27363:15;:32::i;:::-;27205:198;;;:::o;4011:192::-;4097:7;4133:12;4125:6;;;;4117:29;;;;-1:-1:-1;;;4117:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4117:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4169:5:0;;;4011:192::o;27604:185::-;27671:31;27694:7;27671:22;:31::i;:::-;27713:28;:26;:28::i;:::-;27754:27;27766:7;27775:5;27754:11;:27::i;3082:181::-;3140:7;3172:5;;;3196:6;;;;3188:46;;;;;-1:-1:-1;;;3188:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3254:1;3082:181;-1:-1:-1;;;3082:181:0:o;27411:185::-;27478:31;27501:7;27478:22;:31::i;:::-;27520:28;:26;:28::i;:::-;27561:27;27573:7;27582:5;27561:11;:27::i;28869:566::-;28967:4;28973:7;29019:1;29006:10;:14;28998:49;;;;;-1:-1:-1;;;28998:49:0;;;;;;;;;;;;-1:-1:-1;;;28998:49:0;;;;;;;;;;;;;;;29134:28;:18;:26;:28::i;:::-;29120:10;:42;;29112:84;;;;;-1:-1:-1;;;29112:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29209:13;29225:40;:9;29254:10;29225:40;:28;:40;:::i;:::-;29291:20;;29209:56;;-1:-1:-1;29282:29:0;;29278:150;;;-1:-1:-1;29336:5:0;;-1:-1:-1;29336:5:0;;-1:-1:-1;29328:17:0;;29278:150;29386:4;29392:9;:16;;29409:5;29392:23;;;;;;;;;;;;;;;;29378:38;;;;;28869:566;;;;;;:::o;23915:232::-;23987:22;23993:7;24002:6;23987:5;:22::i;:::-;24020:119;24029:7;24038:12;:10;:12::i;:::-;24052:86;24091:6;24052:86;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24052:20:0;;;;;;:11;:20;;;;;;24073:12;:10;:12::i;11361:181::-;11515:19;;11533:1;11515:19;;;11361:181::o;11239:114::-;11331:14;;11239:114::o;33154:122::-;33211:21;:8;33224:7;33211:21;:12;:21;:::i;:::-;33248:20;;-1:-1:-1;;;;;33248:20:0;;;;;;;;33154:122;:::o;33284:130::-;33344:24;:8;33360:7;33344:24;:15;:24;:::i;:::-;33384:22;;-1:-1:-1;;;;;33384:22:0;;;;;;;;33284:130;:::o;31997:203::-;32069:4;-1:-1:-1;;;;;32094:21:0;;32086:68;;;;-1:-1:-1;;;32086:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32172:20:0;:11;:20;;;;;;;;;;;;;;;31997:203::o;1519:508::-;1936:4;1982:17;2014:7;1519:508;:::o;29443:146::-;-1:-1:-1;;;;;29527:33:0;;;;;;:24;:33;;;;;29511:70;;29562:18;29552:7;29562:9;:18::i;:::-;29511:15;:70::i;21211:471::-;-1:-1:-1;;;;;21309:20:0;;21301:70;;;;-1:-1:-1;;;21301:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21390:23:0;;21382:71;;;;-1:-1:-1;;;21382:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21486;21508:6;21486:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21486:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;21466:17:0;;;;;;;:9;:17;;;;;;:91;;;;21591:20;;;;;;;:32;;21616:6;21591:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;21568:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;21639:35;;;;;;;21568:20;;21639:35;;;;-1:-1:-1;;;;;;;;;;;21639:35:0;;;;;;;;21211:471;;;:::o;29597:118::-;29654:53;29670:21;29693:13;:11;:13::i;22603:348::-;-1:-1:-1;;;;;22679:21:0;;22671:67;;;;-1:-1:-1;;;22671:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22772:68;22795:6;22772:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22772:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;22751:18:0;;;;;;:9;:18;;;;;:89;22866:12;;:24;;22883:6;22866:24;:16;:24;:::i;:::-;22851:12;:39;22906:37;;;;;;;;22932:1;;-1:-1:-1;;;;;22906:37:0;;;-1:-1:-1;;;;;;;;;;;22906:37:0;;;;;;;;22603:348;;:::o;21963:308::-;-1:-1:-1;;;;;22039:21:0;;22031:65;;;;;-1:-1:-1;;;22031:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22124:12;;:24;;22141:6;22124:24;:16;:24;:::i;:::-;22109:12;:39;-1:-1:-1;;;;;22180:18:0;;;;;;:9;:18;;;;;;:30;;22203:6;22180:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;22159:18:0;;;;;;:9;:18;;;;;;;;:51;;;;22226:37;;;;;;;22159:18;;;;-1:-1:-1;;;;;;;;;;;22226:37:0;;;;;;;;;21963:308;;:::o;9173:918::-;9286:12;;9262:7;;9282:58;;-1:-1:-1;9327:1:0;9320:8;;9282:58;9393:12;;9352:11;;9418:424;9431:4;9425:3;:10;9418:424;;;9452:11;9466:23;9479:3;9484:4;9466:12;:23::i;:::-;9452:37;;9723:7;9710:5;9716:3;9710:10;;;;;;;;;;;;;;;;:20;9706:125;;;9758:3;9751:10;;9706:125;;;9808:3;9814:1;9808:7;9802:13;;9706:125;9418:424;;;;9968:1;9962:3;:7;:36;;;;;9991:7;9973:5;9985:1;9979:3;:7;9973:14;;;;;;;;;;;;;;;;:25;9962:36;9958:126;;;-1:-1:-1;;;10022:7:0;;-1:-1:-1;10015:14:0;;9958:126;-1:-1:-1;10069:3:0;-1:-1:-1;10062:10:0;;31461:178;31539:18;31543:4;31549:7;31539:3;:18::i;:::-;31538:19;31530:63;;;;;-1:-1:-1;;;31530:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31604:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;31604:27:0;31627:4;31604:27;;;31461:178::o;31719:183::-;31799:18;31803:4;31809:7;31799:3;:18::i;:::-;31791:64;;;;-1:-1:-1;;;31791:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31866:20:0;31889:5;31866:20;;;;;;;;;;;:28;;-1:-1:-1;;31866:28:0;;;31719:183::o;29723:315::-;29818:17;29838:28;:18;:26;:28::i;:::-;29818:48;-1:-1:-1;29818:48:0;29881:30;29897:9;29881:15;:30::i;:::-;:42;29877:154;;;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;29940:29:0;;;;;;;;;;;;;;29984:16;;;27:10:-1;;23:18;;;45:23;;29984:35:0;;;;;;;;29723:315::o;3538:136::-;3596:7;3623:43;3627:1;3630;3623:43;;;;;;;;;;;;;;;;;:3;:43::i;8355:193::-;8417:7;8538:1;;8529;:5;8525:1;8521;:5;:13;8520:19;;;;;;8514:1;8510;:5;8504:1;8500;:5;8499:17;:41;;8355:193;-1:-1:-1;;;8355:193:0:o;30046:212::-;30140:10;;30116:7;;30136:115;;-1:-1:-1;30179:1:0;30172:8;;30136:115;30224:10;;30220:3;;-1:-1:-1;;30224:14:0;;;30220:19;;;;;;;;;;;;;;30213:26;;;
Swarm Source
bzzr://b57be0c2e5e7e5c3ebf0f8266dc5efec7f68f3e72e260172588dc8bf5b70f207
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.