Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12434153 | 1049 days ago | IN | Create: Swan | 0 ETH | 0.20061708 |
Loading...
Loading
Contract Name:
Swan
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-14 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; 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 virtual 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 This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and * total supply at the time are recorded for later access. * * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be * used to create an efficient ERC20 forking mechanism. * * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id * and the account address. * * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. * * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient * alternative consider {ERC20Votes}. * * ==== Gas Costs * * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much * smaller since identical balances in subsequent snapshots are stored as a single entry. * * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent * transfers will have normal cost until the next snapshot, and so on. */ /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.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 Context, IERC20, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `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); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); 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); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += 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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += 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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev 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 { } } /** * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and * total supply at the time are recorded for later access. * * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be * used to create an efficient ERC20 forking mechanism. * * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id * and the account address. * * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it * return `block.number` will trigger the creation of snapshot at the begining of each new block. When overridding this * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. * * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient * alternative consider {ERC20Votes}. * * ==== Gas Costs * * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much * smaller since identical balances in subsequent snapshots are stored as a single entry. * * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent * transfers will have normal cost until the next snapshot, and so on. */ abstract contract ERC20Snapshot is ERC20 { // Inspired by Jordi Baylina's MiniMeToken to record historical balances: // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol 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; /** * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. */ event Snapshot(uint256 id); /** * @dev Creates a new snapshot and returns its snapshot id. * * Emits a {Snapshot} event that contains the same id. * * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a * set of accounts, for example using {AccessControl}, or it may be open to the public. * * [WARNING] * ==== * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, * you must consider that it can potentially be used by attackers in two ways. * * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs * section above. * * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. * ==== */ function _snapshot() internal virtual returns (uint256) { _currentSnapshotId.increment(); uint256 currentId = _getCurrentSnapshotId(); emit Snapshot(currentId); return currentId; } /** * @dev Get the current snapshotId */ function _getCurrentSnapshotId() internal view virtual returns (uint256) { return _currentSnapshotId.current(); } /** * @dev Retrieves the balance of `account` at the time `snapshotId` was created. */ function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); return snapshotted ? value : balanceOf(account); } /** * @dev Retrieves the total supply at the time `snapshotId` was created. */ function totalSupplyAt(uint256 snapshotId) public view virtual returns(uint256) { (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); return snapshotted ? value : totalSupply(); } // Update balance and/or total supply snapshots before the values are modified. This is implemented // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // mint _updateAccountSnapshot(to); _updateTotalSupplySnapshot(); } else if (to == address(0)) { // burn _updateAccountSnapshot(from); _updateTotalSupplySnapshot(); } else { // transfer _updateAccountSnapshot(from); _updateAccountSnapshot(to); } } function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { require(snapshotId > 0, "ERC20Snapshot: id is 0"); require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); // 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. 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 = _getCurrentSnapshotId(); 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]; } } } /** * @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); } } /** * @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; } } } /** * @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;` */ library Counters { 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 { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } contract Swan is ERC20Snapshot, Ownable { using SafeMath for uint256; uint256 public constant burnRate = 10; uint256 public constant bonusRate = 10; address public crossTokenAddress; address public governanceAddress; address public bonusAddress; constructor() ERC20("Swan Swap", "SWAN") { _mint(msg.sender, 90000000000000000); crossTokenAddress = msg.sender; governanceAddress = msg.sender; bonusAddress = msg.sender; } function _transfer(address sender, address recipient, uint256 amount) internal virtual override { uint256 burnAmount = amount.mul(burnRate).div(10000); uint256 bonusAmount = amount.mul(bonusRate).div(10000); uint256 transferAmount = amount.sub(burnAmount).sub(bonusAmount); _burn(sender, burnAmount); super._transfer(sender, bonusAddress, bonusAmount); super._transfer(sender, recipient, transferAmount); } function burn(uint256 amount) public { _burn(msg.sender, amount); } function burnFrom(address account, uint256 amount) public { uint256 currentAllowance = allowance(account, msg.sender); require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance"); _approve(account, msg.sender, currentAllowance - amount); _burn(account, amount); } function snapshot() public onlyOwner returns (uint256) { return _snapshot(); } function crossSwap(uint256 amount) public { require(msg.sender == crossTokenAddress, "FORBIDDEN"); require(msg.sender != owner(), "FORBIDDEN"); _mint(msg.sender, amount); } function crossBurn(address account, uint256 amount) public { require(msg.sender == crossTokenAddress, "FORBIDDEN"); require(msg.sender != owner(), "FORBIDDEN"); _burn(account, amount); } function decimals() public view virtual override returns (uint8) { return 0; } function setCrossTokenAddress(address _crossTokenAddress) public { require(msg.sender == crossTokenAddress, "FORBIDDEN"); crossTokenAddress = _crossTokenAddress; } function setGovernanceAddress(address _governanceAddress) public { require(msg.sender == governanceAddress, "FORBIDDEN"); governanceAddress = _governanceAddress; } function setBonusTokenAddress(address _bonusAddress) public { require(msg.sender == bonusAddress, "FORBIDDEN"); bonusAddress = _bonusAddress; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"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":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"crossBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"crossSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crossTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"governanceAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusAddress","type":"address"}],"name":"setBonusTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_crossTokenAddress","type":"address"}],"name":"setCrossTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governanceAddress","type":"address"}],"name":"setGovernanceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","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"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600981526805377616e20537761760bc1b60208083019182528351808501909452600484526329aba0a760e11b9084015281519192916200005f916003916200039d565b508051620000759060049060208401906200039d565b50505060006200008a6200011e60201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000ec3367013fbe85edc9000062000122565b600a8054336001600160a01b03199182168117909255600b8054821683179055600c805490911690911790556200050b565b3390565b6001600160a01b038216620001545760405162461bcd60e51b81526004016200014b9062000443565b60405180910390fd5b6200016260008383620001f6565b806002600082825462000176919062000483565b90915550506001600160a01b03821660009081526020819052604081208054839290620001a590849062000483565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620001ea9085906200047a565b60405180910390a35050565b6200020e8383836200026860201b620007111760201c565b6001600160a01b038316620002385762000228826200026d565b620002326200029e565b62000268565b6001600160a01b038216620002525762000228836200026d565b6200025d836200026d565b62000268826200026d565b505050565b6001600160a01b03811660009081526005602052604090206200029b906200029583620002b0565b620002cf565b50565b620002ae6006620002956200031e565b565b6001600160a01b0381166000908152602081905260409020545b919050565b6000620002db62000324565b905080620002e98462000342565b101562000268578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b60025490565b60006200033d60086200039960201b620009db1760201c565b905090565b80546000906200035557506000620002ca565b8154829062000367906001906200049e565b815481106200038657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050620002ca565b5490565b828054620003ab90620004b8565b90600052602060002090601f016020900481019282620003cf57600085556200041a565b82601f10620003ea57805160ff19168380011785556200041a565b828001600101855582156200041a579182015b828111156200041a578251825591602001919060010190620003fd565b50620004289291506200042c565b5090565b5b808211156200042857600081556001016200042d565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60008219821115620004995762000499620004f5565b500190565b600082821015620004b357620004b3620004f5565b500390565b600281046001821680620004cd57607f821691505b60208210811415620004ef57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b61179d806200051b6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063a457c2d711610097578063bed9985011610071578063bed9985014610292578063cfc1625414610364578063dd62ed3e14610377578063f8e5958a1461038a576101c4565b8063a457c2d71461032b578063a9059cbb1461033e578063a94661e314610351576101c4565b80639711715a116100d35780639711715a14610300578063981b24d0146103085780639b3cacce1461031b578063a381de5414610323576101c4565b80638da5cb5b146102dd578063928c3ce2146102e557806395d89b41146102f8576101c4565b80634ee2cd7e1161016657806370a082311161014057806370a082311461029a578063715018a6146102ad578063795053d3146102b557806379cc6790146102ca576101c4565b80634ee2cd7e1461026c578063589a9e6e1461027f5780635af123f414610292576101c4565b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f578063395093511461024457806342966c6814610257576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610207575b600080fd5b6101d161039d565b6040516101de9190611282565b60405180910390f35b6101fa6101f5366004611222565b61042f565b6040516101de9190611277565b61020f61044d565b6040516101de9190611673565b6101fa61022a3660046111e7565b610453565b6102376104f3565b6040516101de919061167c565b6101fa610252366004611222565b6104f8565b61026a61026536600461124b565b610547565b005b61020f61027a366004611222565b610554565b61026a61028d366004611222565b61059d565b61020f61060e565b61020f6102a836600461119b565b610613565b61026a610632565b6102bd6106bb565b6040516101de9190611263565b61026a6102d8366004611222565b6106ca565b6102bd610716565b61026a6102f336600461119b565b610725565b6101d1610771565b61020f610780565b61020f61031636600461124b565b6107ce565b6102bd6107fe565b6102bd61080d565b6101fa610339366004611222565b61081c565b6101fa61034c366004611222565b610897565b61026a61035f36600461119b565b6108ab565b61026a61037236600461119b565b6108f7565b61020f6103853660046111b5565b610943565b61026a61039836600461124b565b61096e565b6060600380546103ac906116ec565b80601f01602080910402602001604051908101604052809291908181526020018280546103d8906116ec565b80156104255780601f106103fa57610100808354040283529160200191610425565b820191906000526020600020905b81548152906001019060200180831161040857829003601f168201915b5050505050905090565b600061044361043c6109df565b84846109e3565b5060015b92915050565b60025490565b6000610460848484610a97565b6001600160a01b0384166000908152600160205260408120816104816109df565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156104cd5760405162461bcd60e51b81526004016104c49061143c565b60405180910390fd5b6104e8856104d96109df565b6104e386856116d5565b6109e3565b506001949350505050565b600090565b60006104436105056109df565b8484600160006105136109df565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546104e3919061168a565b6105513382610b14565b50565b6001600160a01b03821660009081526005602052604081208190819061057b908590610bfa565b91509150816105925761058d85610613565b610594565b805b95945050505050565b600a546001600160a01b031633146105c75760405162461bcd60e51b81526004016104c490611419565b6105cf610716565b6001600160a01b0316336001600160a01b031614156106005760405162461bcd60e51b81526004016104c490611419565b61060a8282610b14565b5050565b600a81565b6001600160a01b0381166000908152602081905260409020545b919050565b61063a6109df565b6001600160a01b031661064b610716565b6001600160a01b0316146106715760405162461bcd60e51b81526004016104c490611484565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600b546001600160a01b031681565b60006106d68333610943565b9050818110156106f85760405162461bcd60e51b81526004016104c4906114b9565b61070783336104e385856116d5565b6107118383610b14565b505050565b6009546001600160a01b031690565b600a546001600160a01b0316331461074f5760405162461bcd60e51b81526004016104c490611419565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600480546103ac906116ec565b600061078a6109df565b6001600160a01b031661079b610716565b6001600160a01b0316146107c15760405162461bcd60e51b81526004016104c490611484565b6107c9610ca6565b905090565b60008060006107de846006610bfa565b91509150816107f4576107ef61044d565b6107f6565b805b949350505050565b600a546001600160a01b031681565b600c546001600160a01b031681565b6000806001600061082b6109df565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156108775760405162461bcd60e51b81526004016104c4906115f7565b61088d6108826109df565b856104e386856116d5565b5060019392505050565b60006104436108a46109df565b8484610a97565b600c546001600160a01b031633146108d55760405162461bcd60e51b81526004016104c490611419565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146109215760405162461bcd60e51b81526004016104c490611419565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a546001600160a01b031633146109985760405162461bcd60e51b81526004016104c490611419565b6109a0610716565b6001600160a01b0316336001600160a01b031614156109d15760405162461bcd60e51b81526004016104c490611419565b6105513382610cfa565b5490565b3390565b6001600160a01b038316610a095760405162461bcd60e51b81526004016104c490611583565b6001600160a01b038216610a2f5760405162461bcd60e51b81526004016104c490611391565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a8a908590611673565b60405180910390a3505050565b6000610ab0612710610aaa84600a610dba565b90610dcd565b90506000610ac5612710610aaa85600a610dba565b90506000610add82610ad78686610dd9565b90610dd9565b9050610ae98684610b14565b600c54610b019087906001600160a01b031684610de5565b610b0c868683610de5565b505050505050565b6001600160a01b038216610b3a5760405162461bcd60e51b81526004016104c4906114fd565b610b4682600083610f0d565b6001600160a01b03821660009081526020819052604090205481811015610b7f5760405162461bcd60e51b81526004016104c49061134f565b610b8982826116d5565b6001600160a01b03841660009081526020819052604081209190915560028054849290610bb79084906116d5565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610a8a908690611673565b60008060008411610c1d5760405162461bcd60e51b81526004016104c4906115c7565b610c25610f65565b841115610c445760405162461bcd60e51b81526004016104c4906112d5565b6000610c508486610f71565b8454909150811415610c69576000809250925050610c9f565b6001846001018281548110610c8e57634e487b7160e01b600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6000610cb26008611050565b6000610cbc610f65565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610ced9190611673565b60405180910390a1905090565b6001600160a01b038216610d205760405162461bcd60e51b81526004016104c49061163c565b610d2c60008383610f0d565b8060026000828254610d3e919061168a565b90915550506001600160a01b03821660009081526020819052604081208054839290610d6b90849061168a565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610dae908590611673565b60405180910390a35050565b6000610dc682846116b6565b9392505050565b6000610dc682846116a2565b6000610dc682846116d5565b6001600160a01b038316610e0b5760405162461bcd60e51b81526004016104c49061153e565b6001600160a01b038216610e315760405162461bcd60e51b81526004016104c49061130c565b610e3c838383610f0d565b6001600160a01b03831660009081526020819052604090205481811015610e755760405162461bcd60e51b81526004016104c4906113d3565b610e7f82826116d5565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290610eb590849061168a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610eff9190611673565b60405180910390a350505050565b610f18838383610711565b6001600160a01b038316610f3c57610f2f82611059565b610f37611083565b610711565b6001600160a01b038216610f5357610f2f83611059565b610f5c83611059565b61071182611059565b60006107c960086109db565b8154600090610f8257506000610447565b82546000905b80821015610fec576000610f9c8383611092565b905084868281548110610fbf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115610fd857809150610fe6565b610fe381600161168a565b92505b50610f88565b60008211801561102f575083856110046001856116d5565b8154811061102257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154145b156110485761103f6001836116d5565b92505050610447565b509050610447565b80546001019055565b6001600160a01b03811660009081526005602052604090206105519061107e83610613565b6110e9565b611090600661107e61044d565b565b600060026110a08184611727565b6110ab600286611727565b6110b5919061168a565b6110bf91906116a2565b6110ca6002846116a2565b6110d56002866116a2565b6110df919061168a565b610dc6919061168a565b60006110f3610f65565b9050806110ff84611133565b1015610711578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b80546000906111445750600061062d565b81548290611154906001906116d5565b8154811061117257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905061062d565b80356001600160a01b038116811461062d57600080fd5b6000602082840312156111ac578081fd5b610dc682611184565b600080604083850312156111c7578081fd5b6111d083611184565b91506111de60208401611184565b90509250929050565b6000806000606084860312156111fb578081fd5b61120484611184565b925061121260208501611184565b9150604084013590509250925092565b60008060408385031215611234578182fd5b61123d83611184565b946020939093013593505050565b60006020828403121561125c578081fd5b5035919050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b818110156112ae57858101830151858201604001528201611292565b818111156112bf5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252600990820152682327a92124a22222a760b91b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526016908201527504552433230536e617073686f743a20696420697320360541b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b6000821982111561169d5761169d61173b565b500190565b6000826116b1576116b1611751565b500490565b60008160001904831182151516156116d0576116d061173b565b500290565b6000828210156116e7576116e761173b565b500390565b60028104600182168061170057607f821691505b6020821081141561172157634e487b7160e01b600052602260045260246000fd5b50919050565b60008261173657611736611751565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea26469706673582212204c8b02d81614d241b67f7a0f9d1b0fbb700119f68a18287fca06d588754b1d2e64736f6c63430008010033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638da5cb5b116100f9578063a457c2d711610097578063bed9985011610071578063bed9985014610292578063cfc1625414610364578063dd62ed3e14610377578063f8e5958a1461038a576101c4565b8063a457c2d71461032b578063a9059cbb1461033e578063a94661e314610351576101c4565b80639711715a116100d35780639711715a14610300578063981b24d0146103085780639b3cacce1461031b578063a381de5414610323576101c4565b80638da5cb5b146102dd578063928c3ce2146102e557806395d89b41146102f8576101c4565b80634ee2cd7e1161016657806370a082311161014057806370a082311461029a578063715018a6146102ad578063795053d3146102b557806379cc6790146102ca576101c4565b80634ee2cd7e1461026c578063589a9e6e1461027f5780635af123f414610292576101c4565b806323b872dd116101a257806323b872dd1461021c578063313ce5671461022f578063395093511461024457806342966c6814610257576101c4565b806306fdde03146101c9578063095ea7b3146101e757806318160ddd14610207575b600080fd5b6101d161039d565b6040516101de9190611282565b60405180910390f35b6101fa6101f5366004611222565b61042f565b6040516101de9190611277565b61020f61044d565b6040516101de9190611673565b6101fa61022a3660046111e7565b610453565b6102376104f3565b6040516101de919061167c565b6101fa610252366004611222565b6104f8565b61026a61026536600461124b565b610547565b005b61020f61027a366004611222565b610554565b61026a61028d366004611222565b61059d565b61020f61060e565b61020f6102a836600461119b565b610613565b61026a610632565b6102bd6106bb565b6040516101de9190611263565b61026a6102d8366004611222565b6106ca565b6102bd610716565b61026a6102f336600461119b565b610725565b6101d1610771565b61020f610780565b61020f61031636600461124b565b6107ce565b6102bd6107fe565b6102bd61080d565b6101fa610339366004611222565b61081c565b6101fa61034c366004611222565b610897565b61026a61035f36600461119b565b6108ab565b61026a61037236600461119b565b6108f7565b61020f6103853660046111b5565b610943565b61026a61039836600461124b565b61096e565b6060600380546103ac906116ec565b80601f01602080910402602001604051908101604052809291908181526020018280546103d8906116ec565b80156104255780601f106103fa57610100808354040283529160200191610425565b820191906000526020600020905b81548152906001019060200180831161040857829003601f168201915b5050505050905090565b600061044361043c6109df565b84846109e3565b5060015b92915050565b60025490565b6000610460848484610a97565b6001600160a01b0384166000908152600160205260408120816104816109df565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156104cd5760405162461bcd60e51b81526004016104c49061143c565b60405180910390fd5b6104e8856104d96109df565b6104e386856116d5565b6109e3565b506001949350505050565b600090565b60006104436105056109df565b8484600160006105136109df565b6001600160a01b03908116825260208083019390935260409182016000908120918b16815292529020546104e3919061168a565b6105513382610b14565b50565b6001600160a01b03821660009081526005602052604081208190819061057b908590610bfa565b91509150816105925761058d85610613565b610594565b805b95945050505050565b600a546001600160a01b031633146105c75760405162461bcd60e51b81526004016104c490611419565b6105cf610716565b6001600160a01b0316336001600160a01b031614156106005760405162461bcd60e51b81526004016104c490611419565b61060a8282610b14565b5050565b600a81565b6001600160a01b0381166000908152602081905260409020545b919050565b61063a6109df565b6001600160a01b031661064b610716565b6001600160a01b0316146106715760405162461bcd60e51b81526004016104c490611484565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b600b546001600160a01b031681565b60006106d68333610943565b9050818110156106f85760405162461bcd60e51b81526004016104c4906114b9565b61070783336104e385856116d5565b6107118383610b14565b505050565b6009546001600160a01b031690565b600a546001600160a01b0316331461074f5760405162461bcd60e51b81526004016104c490611419565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600480546103ac906116ec565b600061078a6109df565b6001600160a01b031661079b610716565b6001600160a01b0316146107c15760405162461bcd60e51b81526004016104c490611484565b6107c9610ca6565b905090565b60008060006107de846006610bfa565b91509150816107f4576107ef61044d565b6107f6565b805b949350505050565b600a546001600160a01b031681565b600c546001600160a01b031681565b6000806001600061082b6109df565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156108775760405162461bcd60e51b81526004016104c4906115f7565b61088d6108826109df565b856104e386856116d5565b5060019392505050565b60006104436108a46109df565b8484610a97565b600c546001600160a01b031633146108d55760405162461bcd60e51b81526004016104c490611419565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b031633146109215760405162461bcd60e51b81526004016104c490611419565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600a546001600160a01b031633146109985760405162461bcd60e51b81526004016104c490611419565b6109a0610716565b6001600160a01b0316336001600160a01b031614156109d15760405162461bcd60e51b81526004016104c490611419565b6105513382610cfa565b5490565b3390565b6001600160a01b038316610a095760405162461bcd60e51b81526004016104c490611583565b6001600160a01b038216610a2f5760405162461bcd60e51b81526004016104c490611391565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a8a908590611673565b60405180910390a3505050565b6000610ab0612710610aaa84600a610dba565b90610dcd565b90506000610ac5612710610aaa85600a610dba565b90506000610add82610ad78686610dd9565b90610dd9565b9050610ae98684610b14565b600c54610b019087906001600160a01b031684610de5565b610b0c868683610de5565b505050505050565b6001600160a01b038216610b3a5760405162461bcd60e51b81526004016104c4906114fd565b610b4682600083610f0d565b6001600160a01b03821660009081526020819052604090205481811015610b7f5760405162461bcd60e51b81526004016104c49061134f565b610b8982826116d5565b6001600160a01b03841660009081526020819052604081209190915560028054849290610bb79084906116d5565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610a8a908690611673565b60008060008411610c1d5760405162461bcd60e51b81526004016104c4906115c7565b610c25610f65565b841115610c445760405162461bcd60e51b81526004016104c4906112d5565b6000610c508486610f71565b8454909150811415610c69576000809250925050610c9f565b6001846001018281548110610c8e57634e487b7160e01b600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b6000610cb26008611050565b6000610cbc610f65565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610ced9190611673565b60405180910390a1905090565b6001600160a01b038216610d205760405162461bcd60e51b81526004016104c49061163c565b610d2c60008383610f0d565b8060026000828254610d3e919061168a565b90915550506001600160a01b03821660009081526020819052604081208054839290610d6b90849061168a565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610dae908590611673565b60405180910390a35050565b6000610dc682846116b6565b9392505050565b6000610dc682846116a2565b6000610dc682846116d5565b6001600160a01b038316610e0b5760405162461bcd60e51b81526004016104c49061153e565b6001600160a01b038216610e315760405162461bcd60e51b81526004016104c49061130c565b610e3c838383610f0d565b6001600160a01b03831660009081526020819052604090205481811015610e755760405162461bcd60e51b81526004016104c4906113d3565b610e7f82826116d5565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290610eb590849061168a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610eff9190611673565b60405180910390a350505050565b610f18838383610711565b6001600160a01b038316610f3c57610f2f82611059565b610f37611083565b610711565b6001600160a01b038216610f5357610f2f83611059565b610f5c83611059565b61071182611059565b60006107c960086109db565b8154600090610f8257506000610447565b82546000905b80821015610fec576000610f9c8383611092565b905084868281548110610fbf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115610fd857809150610fe6565b610fe381600161168a565b92505b50610f88565b60008211801561102f575083856110046001856116d5565b8154811061102257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154145b156110485761103f6001836116d5565b92505050610447565b509050610447565b80546001019055565b6001600160a01b03811660009081526005602052604090206105519061107e83610613565b6110e9565b611090600661107e61044d565b565b600060026110a08184611727565b6110ab600286611727565b6110b5919061168a565b6110bf91906116a2565b6110ca6002846116a2565b6110d56002866116a2565b6110df919061168a565b610dc6919061168a565b60006110f3610f65565b9050806110ff84611133565b1015610711578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b80546000906111445750600061062d565b81548290611154906001906116d5565b8154811061117257634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905061062d565b80356001600160a01b038116811461062d57600080fd5b6000602082840312156111ac578081fd5b610dc682611184565b600080604083850312156111c7578081fd5b6111d083611184565b91506111de60208401611184565b90509250929050565b6000806000606084860312156111fb578081fd5b61120484611184565b925061121260208501611184565b9150604084013590509250925092565b60008060408385031215611234578182fd5b61123d83611184565b946020939093013593505050565b60006020828403121561125c578081fd5b5035919050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b818110156112ae57858101830151858201604001528201611292565b818111156112bf5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b6020808252600990820152682327a92124a22222a760b91b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526016908201527504552433230536e617073686f743a20696420697320360541b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b6000821982111561169d5761169d61173b565b500190565b6000826116b1576116b1611751565b500490565b60008160001904831182151516156116d0576116d061173b565b500290565b6000828210156116e7576116e761173b565b500390565b60028104600182168061170057607f821691505b6020821081141561172157634e487b7160e01b600052602260045260246000fd5b50919050565b60008261173657611736611751565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea26469706673582212204c8b02d81614d241b67f7a0f9d1b0fbb700119f68a18287fca06d588754b1d2e64736f6c63430008010033
Deployed Bytecode Sourcemap
37724:2667:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10063:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12230:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11183:108::-;;;:::i;:::-;;;;;;;:::i;12881:422::-;;;;;;:::i;:::-;;:::i;39720:92::-;;;:::i;:::-;;;;;;;:::i;13712:215::-;;;;;;:::i;:::-;;:::i;38794:81::-;;;;;;:::i;:::-;;:::i;:::-;;23687:266;;;;;;:::i;:::-;;:::i;39505:206::-;;;;;;:::i;:::-;;:::i;37866:38::-;;;:::i;11354:127::-;;;;;;:::i;:::-;;:::i;5747:148::-;;;:::i;37962:32::-;;;:::i;:::-;;;;;;;:::i;38883:320::-;;;;;;:::i;:::-;;:::i;5096:87::-;;;:::i;39824:186::-;;;;;;:::i;:::-;;:::i;10282:104::-;;;:::i;39209:83::-;;;:::i;24057:233::-;;;;;;:::i;:::-;;:::i;37917:32::-;;;:::i;38007:27::-;;;:::i;14430:377::-;;;;;;:::i;:::-;;:::i;11694:175::-;;;;;;:::i;:::-;;:::i;40220:166::-;;;;;;:::i;:::-;;:::i;40022:186::-;;;;;;:::i;:::-;;:::i;11932:151::-;;;;;;:::i;:::-;;:::i;39301:198::-;;;;;;:::i;:::-;;:::i;10063:100::-;10117:13;10150:5;10143:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10063:100;:::o;12230:169::-;12313:4;12330:39;12339:12;:10;:12::i;:::-;12353:7;12362:6;12330:8;:39::i;:::-;-1:-1:-1;12387:4:0;12230:169;;;;;:::o;11183:108::-;11271:12;;11183:108;:::o;12881:422::-;12987:4;13004:36;13014:6;13022:9;13033:6;13004:9;:36::i;:::-;-1:-1:-1;;;;;13080:19:0;;13053:24;13080:19;;;:11;:19;;;;;13053:24;13100:12;:10;:12::i;:::-;-1:-1:-1;;;;;13080:33:0;-1:-1:-1;;;;;13080:33:0;;;;;;;;;;;;;13053:60;;13152:6;13132:16;:26;;13124:79;;;;-1:-1:-1;;;13124:79:0;;;;;;;:::i;:::-;;;;;;;;;13214:57;13223:6;13231:12;:10;:12::i;:::-;13245:25;13264:6;13245:16;:25;:::i;:::-;13214:8;:57::i;:::-;-1:-1:-1;13291:4:0;;12881:422;-1:-1:-1;;;;12881:422:0:o;39720:92::-;39778:5;39720:92;:::o;13712:215::-;13800:4;13817:80;13826:12;:10;:12::i;:::-;13840:7;13886:10;13849:11;:25;13861:12;:10;:12::i;:::-;-1:-1:-1;;;;;13849:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;13849:25:0;;;:34;;;;;;;;;;:47;;;;:::i;38794:81::-;38842:25;38848:10;38860:6;38842:5;:25::i;:::-;38794:81;:::o;23687:266::-;-1:-1:-1;;;;;23851:33:0;;23774:7;23851:33;;;:24;:33;;;;;23774:7;;;;23830:55;;23839:10;;23830:8;:55::i;:::-;23794:91;;;;23905:11;:40;;23927:18;23937:7;23927:9;:18::i;:::-;23905:40;;;23919:5;23905:40;23898:47;23687:266;-1:-1:-1;;;;;23687:266:0:o;39505:206::-;39597:17;;-1:-1:-1;;;;;39597:17:0;39583:10;:31;39575:53;;;;-1:-1:-1;;;39575:53:0;;;;;;;:::i;:::-;39655:7;:5;:7::i;:::-;-1:-1:-1;;;;;39641:21:0;:10;-1:-1:-1;;;;;39641:21:0;;;39633:43;;;;-1:-1:-1;;;39633:43:0;;;;;;;:::i;:::-;39681:22;39687:7;39696:6;39681:5;:22::i;:::-;39505:206;;:::o;37866:38::-;37902:2;37866:38;:::o;11354:127::-;-1:-1:-1;;;;;11455:18:0;;11428:7;11455:18;;;;;;;;;;;11354:127;;;;:::o;5747:148::-;5327:12;:10;:12::i;:::-;-1:-1:-1;;;;;5316:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5316:23:0;;5308:68;;;;-1:-1:-1;;;5308:68:0;;;;;;;:::i;:::-;5838:6:::1;::::0;5817:40:::1;::::0;5854:1:::1;::::0;-1:-1:-1;;;;;5838:6:0::1;::::0;5817:40:::1;::::0;5854:1;;5817:40:::1;5868:6;:19:::0;;-1:-1:-1;;;;;;5868:19:0::1;::::0;;5747:148::o;37962:32::-;;;-1:-1:-1;;;;;37962:32:0;;:::o;38883:320::-;38952:24;38979:30;38989:7;38998:10;38979:9;:30::i;:::-;38952:57;;39048:6;39028:16;:26;;39020:75;;;;-1:-1:-1;;;39020:75:0;;;;;;;:::i;:::-;39106:56;39115:7;39124:10;39136:25;39155:6;39136:16;:25;:::i;39106:56::-;39173:22;39179:7;39188:6;39173:5;:22::i;:::-;38883:320;;;:::o;5096:87::-;5169:6;;-1:-1:-1;;;;;5169:6:0;5096:87;:::o;39824:186::-;39922:17;;-1:-1:-1;;;;;39922:17:0;39908:10;:31;39900:53;;;;-1:-1:-1;;;39900:53:0;;;;;;;:::i;:::-;39964:17;:38;;-1:-1:-1;;;;;;39964:38:0;-1:-1:-1;;;;;39964:38:0;;;;;;;;;;39824:186::o;10282:104::-;10338:13;10371:7;10364:14;;;;;:::i;39209:83::-;39255:7;5327:12;:10;:12::i;:::-;-1:-1:-1;;;;;5316:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;5316:23:0;;5308:68;;;;-1:-1:-1;;;5308:68:0;;;;;;;:::i;:::-;39276:11:::1;:9;:11::i;:::-;39269:18;;39209:83:::0;:::o;24057:233::-;24128:7;24149:16;24167:13;24184:43;24193:10;24205:21;24184:8;:43::i;:::-;24148:79;;;;24247:11;:35;;24269:13;:11;:13::i;:::-;24247:35;;;24261:5;24247:35;24240:42;24057:233;-1:-1:-1;;;;24057:233:0:o;37917:32::-;;;-1:-1:-1;;;;;37917:32:0;;:::o;38007:27::-;;;-1:-1:-1;;;;;38007:27:0;;:::o;14430:377::-;14523:4;14540:24;14567:11;:25;14579:12;:10;:12::i;:::-;-1:-1:-1;;;;;14567:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;14567:25:0;;;:34;;;;;;;;;;;-1:-1:-1;14620:35:0;;;;14612:85;;;;-1:-1:-1;;;14612:85:0;;;;;;;:::i;:::-;14708:67;14717:12;:10;:12::i;:::-;14731:7;14740:34;14759:15;14740:16;:34;:::i;14708:67::-;-1:-1:-1;14795:4:0;;14430:377;-1:-1:-1;;;14430:377:0:o;11694:175::-;11780:4;11797:42;11807:12;:10;:12::i;:::-;11821:9;11832:6;11797:9;:42::i;40220:166::-;40313:12;;-1:-1:-1;;;;;40313:12:0;40299:10;:26;40291:48;;;;-1:-1:-1;;;40291:48:0;;;;;;;:::i;:::-;40350:12;:28;;-1:-1:-1;;;;;;40350:28:0;-1:-1:-1;;;;;40350:28:0;;;;;;;;;;40220:166::o;40022:186::-;40120:17;;-1:-1:-1;;;;;40120:17:0;40106:10;:31;40098:53;;;;-1:-1:-1;;;40098:53:0;;;;;;;:::i;:::-;40162:17;:38;;-1:-1:-1;;;;;;40162:38:0;-1:-1:-1;;;;;40162:38:0;;;;;;;;;;40022:186::o;11932:151::-;-1:-1:-1;;;;;12048:18:0;;;12021:7;12048:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11932:151::o;39301:198::-;39376:17;;-1:-1:-1;;;;;39376:17:0;39362:10;:31;39354:53;;;;-1:-1:-1;;;39354:53:0;;;;;;;:::i;:::-;39434:7;:5;:7::i;:::-;-1:-1:-1;;;;;39420:21:0;:10;-1:-1:-1;;;;;39420:21:0;;;39412:43;;;;-1:-1:-1;;;39412:43:0;;;;;;;:::i;:::-;39466:25;39472:10;39484:6;39466:5;:25::i;30455:114::-;30547:14;;30455:114::o;3740:98::-;3820:10;3740:98;:::o;17791:346::-;-1:-1:-1;;;;;17893:19:0;;17885:68;;;;-1:-1:-1;;;17885:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17972:21:0;;17964:68;;;;-1:-1:-1;;;17964:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18045:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;18097:32;;;;;18075:6;;18097:32;:::i;:::-;;;;;;;;17791:346;;;:::o;38285:498::-;38392:18;38413:31;38438:5;38413:20;:6;37851:2;38413:10;:20::i;:::-;:24;;:31::i;:::-;38392:52;-1:-1:-1;38455:19:0;38477:32;38503:5;38477:21;:6;37902:2;38477:10;:21::i;:32::-;38455:54;-1:-1:-1;38530:22:0;38555:39;38455:54;38555:22;:6;38566:10;38555;:22::i;:::-;:26;;:39::i;:::-;38530:64;;38616:25;38622:6;38630:10;38616:5;:25::i;:::-;38688:12;;38664:50;;38680:6;;-1:-1:-1;;;;;38688:12:0;38702:11;38664:15;:50::i;:::-;38725;38741:6;38749:9;38760:14;38725:15;:50::i;:::-;38285:498;;;;;;:::o;16859:494::-;-1:-1:-1;;;;;16943:21:0;;16935:67;;;;-1:-1:-1;;;16935:67:0;;;;;;;:::i;:::-;17015:49;17036:7;17053:1;17057:6;17015:20;:49::i;:::-;-1:-1:-1;;;;;17102:18:0;;17077:22;17102:18;;;;;;;;;;;17139:24;;;;17131:71;;;;-1:-1:-1;;;17131:71:0;;;;;;;:::i;:::-;17234:23;17251:6;17234:14;:23;:::i;:::-;-1:-1:-1;;;;;17213:18:0;;:9;:18;;;;;;;;;;:44;;;;17268:12;:22;;17284:6;;17213:9;17268:22;;17284:6;;17268:22;:::i;:::-;;;;-1:-1:-1;;17308:37:0;;17334:1;;-1:-1:-1;;;;;17308:37:0;;;;;;;17338:6;;17308:37;:::i;25057:1633::-;25155:4;25161:7;25207:1;25194:10;:14;25186:49;;;;-1:-1:-1;;;25186:49:0;;;;;;;:::i;:::-;25268:23;:21;:23::i;:::-;25254:10;:37;;25246:79;;;;-1:-1:-1;;;25246:79:0;;;;;;;:::i;:::-;26464:13;26480:40;:9;26509:10;26480:28;:40::i;:::-;26546:20;;26464:56;;-1:-1:-1;26537:29:0;;26533:150;;;26591:5;26598:1;26583:17;;;;;;;26533:150;26641:4;26647:9;:16;;26664:5;26647:23;;;;;;-1:-1:-1;;;26647:23:0;;;;;;;;;;;;;;;;;26633:38;;;;;25057:1633;;;;;;:::o;23159:223::-;23206:7;23226:30;:18;:28;:30::i;:::-;23269:17;23289:23;:21;:23::i;:::-;23269:43;;23328:19;23337:9;23328:19;;;;;;:::i;:::-;;;;;;;;23365:9;-1:-1:-1;23159:223:0;:::o;16188:338::-;-1:-1:-1;;;;;16272:21:0;;16264:65;;;;-1:-1:-1;;;16264:65:0;;;;;;;:::i;:::-;16342:49;16371:1;16375:7;16384:6;16342:20;:49::i;:::-;16420:6;16404:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;16437:18:0;;:9;:18;;;;;;;;;;:28;;16459:6;;16437:9;:28;;16459:6;;16437:28;:::i;:::-;;;;-1:-1:-1;;16481:37:0;;-1:-1:-1;;;;;16481:37:0;;;16498:1;;16481:37;;;;16511:6;;16481:37;:::i;:::-;;;;;;;;16188:338;;:::o;34397:98::-;34455:7;34482:5;34486:1;34482;:5;:::i;:::-;34475:12;34397:98;-1:-1:-1;;;34397:98:0:o;34796:::-;34854:7;34881:5;34885:1;34881;:5;:::i;34040:98::-;34098:7;34125:5;34129:1;34125;:5;:::i;15297:604::-;-1:-1:-1;;;;;15403:20:0;;15395:70;;;;-1:-1:-1;;;15395:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15484:23:0;;15476:71;;;;-1:-1:-1;;;15476:71:0;;;;;;;:::i;:::-;15560:47;15581:6;15589:9;15600:6;15560:20;:47::i;:::-;-1:-1:-1;;;;;15644:17:0;;15620:21;15644:17;;;;;;;;;;;15680:23;;;;15672:74;;;;-1:-1:-1;;;15672:74:0;;;;;;;:::i;:::-;15777:22;15793:6;15777:13;:22;:::i;:::-;-1:-1:-1;;;;;15757:17:0;;;:9;:17;;;;;;;;;;;:42;;;;15810:20;;;;;;;;:30;;15834:6;;15757:9;15810:30;;15834:6;;15810:30;:::i;:::-;;;;;;;;15875:9;-1:-1:-1;;;;;15858:35:0;15867:6;-1:-1:-1;;;;;15858:35:0;;15886:6;15858:35;;;;;;:::i;:::-;;;;;;;;15297:604;;;;:::o;24507:542::-;24614:44;24641:4;24647:2;24651:6;24614:26;:44::i;:::-;-1:-1:-1;;;;;24673:18:0;;24669:373;;24721:26;24744:2;24721:22;:26::i;:::-;24758:28;:26;:28::i;:::-;24669:373;;;-1:-1:-1;;;;;24806:16:0;;24802:240;;24852:28;24875:4;24852:22;:28::i;24802:240::-;24967:28;24990:4;24967:22;:28::i;:::-;25006:26;25029:2;25006:22;:26::i;23448:127::-;23512:7;23539:28;:18;:26;:28::i;28797:918::-;28910:12;;28886:7;;28906:58;;-1:-1:-1;28951:1:0;28944:8;;28906:58;29017:12;;28976:11;;29042:424;29055:4;29049:3;:10;29042:424;;;29076:11;29090:23;29103:3;29108:4;29090:12;:23::i;:::-;29076:37;;29347:7;29334:5;29340:3;29334:10;;;;;;-1:-1:-1;;;29334:10:0;;;;;;;;;;;;;;;;;:20;29330:125;;;29382:3;29375:10;;29330:125;;;29432:7;:3;29438:1;29432:7;:::i;:::-;29426:13;;29330:125;29042:424;;;;29592:1;29586:3;:7;:36;;;;-1:-1:-1;29615:7:0;29597:5;29603:7;29609:1;29603:3;:7;:::i;:::-;29597:14;;;;;;-1:-1:-1;;;29597:14:0;;;;;;;;;;;;;;;;;:25;29586:36;29582:126;;;29646:7;29652:1;29646:3;:7;:::i;:::-;29639:14;;;;;;29582:126;-1:-1:-1;29693:3:0;-1:-1:-1;29686:10:0;;30577:127;30666:19;;30684:1;30666:19;;;30577:127::o;26698:146::-;-1:-1:-1;;;;;26782:33:0;;;;;;:24;:33;;;;;26766:70;;26817:18;26807:7;26817:9;:18::i;:::-;26766:15;:70::i;26852:118::-;26909:53;26925:21;26948:13;:11;:13::i;26909:53::-;26852:118::o;28087:194::-;28149:7;28271:1;28262:5;28271:1;28262;:5;:::i;:::-;28254;28258:1;28254;:5;:::i;:::-;:13;;;;:::i;:::-;28253:19;;;;:::i;:::-;28243:5;28247:1;28243;:5;:::i;:::-;28233;28237:1;28233;:5;:::i;:::-;28232:17;;;;:::i;:::-;:41;;;;:::i;26978:310::-;27073:17;27093:23;:21;:23::i;:::-;27073:43;-1:-1:-1;27073:43:0;27131:30;27147:9;27131:15;:30::i;:::-;:42;27127:154;;;27190:29;;;;;;;;-1:-1:-1;27190:29:0;;;;;;;;;;;;;;27234:16;;;:35;;;;;;;;;;;;;;;26978:310::o;27296:212::-;27390:10;;27366:7;;27386:115;;-1:-1:-1;27429:1:0;27422:8;;27386:115;27474:10;;27470:3;;27474:14;;27487:1;;27474:14;:::i;:::-;27470:19;;;;;;-1:-1:-1;;;27470:19:0;;;;;;;;;;;;;;;;;27463:26;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:266::-;;;1152:2;1140:9;1131:7;1127:23;1123:32;1120:2;;;1173:6;1165;1158:22;1120:2;1201:31;1222:9;1201:31;:::i;:::-;1191:41;1279:2;1264:18;;;;1251:32;;-1:-1:-1;;;1110:179:1:o;1294:190::-;;1406:2;1394:9;1385:7;1381:23;1377:32;1374:2;;;1427:6;1419;1412:22;1374:2;-1:-1:-1;1455:23:1;;1364:120;-1:-1:-1;1364:120:1:o;1489:203::-;-1:-1:-1;;;;;1653:32:1;;;;1635:51;;1623:2;1608:18;;1590:102::o;1697:187::-;1862:14;;1855:22;1837:41;;1825:2;1810:18;;1792:92::o;1889:603::-;;2030:2;2059;2048:9;2041:21;2091:6;2085:13;2134:6;2129:2;2118:9;2114:18;2107:34;2159:4;2172:140;2186:6;2183:1;2180:13;2172:140;;;2281:14;;;2277:23;;2271:30;2247:17;;;2266:2;2243:26;2236:66;2201:10;;2172:140;;;2330:6;2327:1;2324:13;2321:2;;;2400:4;2395:2;2386:6;2375:9;2371:22;2367:31;2360:45;2321:2;-1:-1:-1;2476:2:1;2455:15;-1:-1:-1;;2451:29:1;2436:45;;;;2483:2;2432:54;;2010:482;-1:-1:-1;;;2010:482:1:o;2497:353::-;2699:2;2681:21;;;2738:2;2718:18;;;2711:30;2777:31;2772:2;2757:18;;2750:59;2841:2;2826:18;;2671:179::o;2855:399::-;3057:2;3039:21;;;3096:2;3076:18;;;3069:30;3135:34;3130:2;3115:18;;3108:62;-1:-1:-1;;;3201:2:1;3186:18;;3179:33;3244:3;3229:19;;3029:225::o;3259:398::-;3461:2;3443:21;;;3500:2;3480:18;;;3473:30;3539:34;3534:2;3519:18;;3512:62;-1:-1:-1;;;3605:2:1;3590:18;;3583:32;3647:3;3632:19;;3433:224::o;3662:398::-;3864:2;3846:21;;;3903:2;3883:18;;;3876:30;3942:34;3937:2;3922:18;;3915:62;-1:-1:-1;;;4008:2:1;3993:18;;3986:32;4050:3;4035:19;;3836:224::o;4065:402::-;4267:2;4249:21;;;4306:2;4286:18;;;4279:30;4345:34;4340:2;4325:18;;4318:62;-1:-1:-1;;;4411:2:1;4396:18;;4389:36;4457:3;4442:19;;4239:228::o;4472:332::-;4674:2;4656:21;;;4713:1;4693:18;;;4686:29;-1:-1:-1;;;4746:2:1;4731:18;;4724:39;4795:2;4780:18;;4646:158::o;4809:404::-;5011:2;4993:21;;;5050:2;5030:18;;;5023:30;5089:34;5084:2;5069:18;;5062:62;-1:-1:-1;;;5155:2:1;5140:18;;5133:38;5203:3;5188:19;;4983:230::o;5218:356::-;5420:2;5402:21;;;5439:18;;;5432:30;5498:34;5493:2;5478:18;;5471:62;5565:2;5550:18;;5392:182::o;5579:400::-;5781:2;5763:21;;;5820:2;5800:18;;;5793:30;5859:34;5854:2;5839:18;;5832:62;-1:-1:-1;;;5925:2:1;5910:18;;5903:34;5969:3;5954:19;;5753:226::o;5984:397::-;6186:2;6168:21;;;6225:2;6205:18;;;6198:30;6264:34;6259:2;6244:18;;6237:62;-1:-1:-1;;;6330:2:1;6315:18;;6308:31;6371:3;6356:19;;6158:223::o;6386:401::-;6588:2;6570:21;;;6627:2;6607:18;;;6600:30;6666:34;6661:2;6646:18;;6639:62;-1:-1:-1;;;6732:2:1;6717:18;;6710:35;6777:3;6762:19;;6560:227::o;6792:400::-;6994:2;6976:21;;;7033:2;7013:18;;;7006:30;7072:34;7067:2;7052:18;;7045:62;-1:-1:-1;;;7138:2:1;7123:18;;7116:34;7182:3;7167:19;;6966:226::o;7197:346::-;7399:2;7381:21;;;7438:2;7418:18;;;7411:30;-1:-1:-1;;;7472:2:1;7457:18;;7450:52;7534:2;7519:18;;7371:172::o;7548:401::-;7750:2;7732:21;;;7789:2;7769:18;;;7762:30;7828:34;7823:2;7808:18;;7801:62;-1:-1:-1;;;7894:2:1;7879:18;;7872:35;7939:3;7924:19;;7722:227::o;7954:355::-;8156:2;8138:21;;;8195:2;8175:18;;;8168:30;8234:33;8229:2;8214:18;;8207:61;8300:2;8285:18;;8128:181::o;8314:177::-;8460:25;;;8448:2;8433:18;;8415:76::o;8496:184::-;8668:4;8656:17;;;;8638:36;;8626:2;8611:18;;8593:87::o;8685:128::-;;8756:1;8752:6;8749:1;8746:13;8743:2;;;8762:18;;:::i;:::-;-1:-1:-1;8798:9:1;;8733:80::o;8818:120::-;;8884:1;8874:2;;8889:18;;:::i;:::-;-1:-1:-1;8923:9:1;;8864:74::o;8943:168::-;;9049:1;9045;9041:6;9037:14;9034:1;9031:21;9026:1;9019:9;9012:17;9008:45;9005:2;;;9056:18;;:::i;:::-;-1:-1:-1;9096:9:1;;8995:116::o;9116:125::-;;9184:1;9181;9178:8;9175:2;;;9189:18;;:::i;:::-;-1:-1:-1;9226:9:1;;9165:76::o;9246:380::-;9331:1;9321:12;;9378:1;9368:12;;;9389:2;;9443:4;9435:6;9431:17;9421:27;;9389:2;9496;9488:6;9485:14;9465:18;9462:38;9459:2;;;9542:10;9537:3;9533:20;9530:1;9523:31;9577:4;9574:1;9567:15;9605:4;9602:1;9595:15;9459:2;;9301:325;;;:::o;9631:112::-;;9689:1;9679:2;;9694:18;;:::i;:::-;-1:-1:-1;9728:9:1;;9669:74::o;9748:127::-;9809:10;9804:3;9800:20;9797:1;9790:31;9840:4;9837:1;9830:15;9864:4;9861:1;9854:15;9880:127;9941:10;9936:3;9932:20;9929:1;9922:31;9972:4;9969:1;9962:15;9996:4;9993:1;9986:15
Swarm Source
ipfs://4c8b02d81614d241b67f7a0f9d1b0fbb700119f68a18287fca06d588754b1d2e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.