Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RBASE
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-10 */ // File: @openzeppelin/contracts-ethereum-package/contracts/utils/SafeCast.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's uintXX casting operators with added overflow * checks. * * Downcasting from uint256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such 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. * * Can be combined with {SafeMath} to extend it to smaller types, by performing * all math on `uint256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { require(value < 2**255, "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File: @openzeppelin/contracts-ethereum-package/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/GSN/Context.sol pragma solidity ^0.6.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 ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @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. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.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); } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.6.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. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // 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. */ 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/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: contracts/RBASE.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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 {ERC20MinterPauser}. * * 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 ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view 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); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } contract RBASE is ERC20UpgradeSafe, OwnableUpgradeSafe { using SafeCast for int256; using SafeMath for uint256; using Address for address; struct Transaction { bool enabled; address destination; bytes data; } event TransactionFailed(address indexed destination, uint index, bytes data); // Stable ordering is not guaranteed. Transaction[] public transactions; uint256 private _epoch; event LogRebase(uint256 indexed epoch, uint256 totalSupply); mapping (address => uint256) private _rOwned; mapping (address => uint256) private _tOwned; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) private _isExcluded; address[] private _excluded; uint256 private _totalSupply; uint256 private constant MAX = ~uint256(0); uint256 private _rTotal; uint256 private _tFeeTotal; uint256 private constant DECIMALS = 9; uint256 private constant RATE_PRECISION = 10 ** DECIMALS; uint256 public _tFeePercent; uint256 public _tFeeTimestamp; //source address for airdrop funds address public _distribute; //distributor address for air-dropping that can send or receive with no transfer fee address public _distributor; address public _rebaser; uint256 public _limitExpiresTimestamp; uint256 public _limitTransferAmount; uint256 public _limitMaxBalance; uint256 public _limitSellFeePercent; uint256 public _limitTimestamp; function initialize(uint256 initialSupply, address team, address dev, address eco, address distributor) public initializer { __ERC20_init("rbase.finance", "RBASE"); _setupDecimals(uint8(DECIMALS)); __Ownable_init(); _totalSupply = initialSupply; _rTotal = (MAX - (MAX % _totalSupply)); _distribute = eco; _distributor = distributor; _rebaser = _msgSender(); _tFeePercent = 100; //1.00% _tFeeTimestamp = now; _rOwned[_msgSender()] = _rTotal; emit Transfer(address(0), _msgSender(), _totalSupply); excludeAccount(_msgSender()); excludeAccount(team); excludeAccount(dev); excludeAccount(eco); } function setDistributionAddresses(address distribute, address distributor) external onlyOwner() { _distribute = distribute; _distributor = distributor; } function setRebaser(address rebaser) external onlyOwner() { _rebaser = rebaser; } function setTransferFeePercent(uint256 tFeePercent) external onlyOwner() { require(now >= (_tFeeTimestamp + 12 hours), "Transfer fee changes timelocked for 12 hours"); _tFeePercent = tFeePercent; _tFeeTimestamp = now; } function setLimit(uint256 expiresTimestamp, uint256 transferAmount, uint256 maxBalance, uint256 sellFeePercent) external onlyOwner() { require(_limitTimestamp == 0, "Limit changes not allowed"); _limitExpiresTimestamp = expiresTimestamp; _limitTransferAmount = transferAmount; _limitMaxBalance = maxBalance; _limitSellFeePercent = sellFeePercent; _limitTimestamp = now; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function rebase(int256 supplyDelta) external returns (uint256) { require(_msgSender() == owner() || _msgSender() == _rebaser, "Sender not authorized"); _epoch = _epoch.add(1); if (supplyDelta == 0) { emit LogRebase(_epoch, _totalSupply); return _totalSupply; } uint256 uSupplyDelta = (supplyDelta < 0 ? -supplyDelta : supplyDelta).toUint256(); uint256 rate = uSupplyDelta.mul(RATE_PRECISION).div(_totalSupply); uint256 multiplier; if (supplyDelta < 0) { multiplier = RATE_PRECISION.sub(rate); } else { multiplier = RATE_PRECISION.add(rate); } if (supplyDelta < 0) { _totalSupply = _totalSupply.sub(uSupplyDelta); } else { _totalSupply = _totalSupply.add(uSupplyDelta); } if (_totalSupply > MAX) { _totalSupply = MAX; } for (uint256 i = 0; i < _excluded.length; i++) { if(_tOwned[_excluded[i]] > 0) { _tOwned[_excluded[i]] = _tOwned[_excluded[i]].mul(multiplier).div(RATE_PRECISION); } } emit LogRebase(_epoch, _totalSupply); for (uint i = 0; i < transactions.length; i++) { Transaction storage t = transactions[i]; if (t.enabled) { bool result = externalCall(t.destination, t.data); if (!result) { emit TransactionFailed(t.destination, i, t.data); revert("Transaction Failed"); } } } return _totalSupply; } /** * @notice Adds a transaction that gets called for a downstream receiver of rebases * @param destination Address of contract destination * @param data Transaction data payload */ function addTransaction(address destination, bytes memory data) external onlyOwner { transactions.push(Transaction({ enabled: true, destination: destination, data: data })); } /** * @param index Index of transaction to remove. * Transaction ordering may have changed since adding. */ function removeTransaction(uint index) external onlyOwner { require(index < transactions.length, "index out of bounds"); if (index < transactions.length - 1) { transactions[index] = transactions[transactions.length - 1]; } transactions.pop(); } /** * @param index Index of transaction. Transaction ordering may have changed since adding. * @param enabled True for enabled, false for disabled. */ function setTransactionEnabled(uint index, bool enabled) external onlyOwner { require(index < transactions.length, "index must be in range of stored tx list"); transactions[index].enabled = enabled; } /** * @return Number of transactions, both enabled and disabled, in transactions list. */ function transactionsSize() external view returns (uint256) { return transactions.length; } /** * @dev wrapper to call the encoded transactions on downstream consumers. * @param destination Address of destination contract. * @param data The encoded data payload. * @return True on success */ function externalCall(address destination, bytes memory data) internal returns (bool) { bool result; assembly { // solhint-disable-line no-inline-assembly // "Allocate" memory for output // (0x40 is where "free memory" pointer is stored by convention) let outputAddress := mload(0x40) // First 32 bytes are the padded length of data, so exclude that let dataAddress := add(data, 32) result := call( // 34710 is the value that solidity is currently emitting // It includes callGas (700) + callVeryLow (3, to pay for SUB) // + callValueTransferGas (9000) + callNewAccountGas // (25000, in case the destination address does not exist and needs creating) sub(gas(), 34710), destination, 0, // transfer value in wei dataAddress, mload(data), // Size of the input, in bytes. Stored in position 0 of the array. outputAddress, 0 // Output is ignored, therefore the output size is zero ) } return result; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromRefraction(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function isExcluded(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function refract(uint256 tAmount) public { address sender = _msgSender(); require(!_isExcluded[sender], "Excluded addresses cannot call this function"); (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function refractionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) { require(tAmount <= _totalSupply, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount,,,,) = _getValues(tAmount, _tFeePercent); return rAmount; } else { (,uint256 rTransferAmount,,,) = _getValues(tAmount, _tFeePercent); return rTransferAmount; } } function tokenFromRefraction(uint256 rAmount) public view returns(uint256) { require(rAmount <= _rTotal, "Amount must be less than total refractions"); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeAccount(address account) public onlyOwner() { require(!_isExcluded[account], "Account is already excluded"); if(_rOwned[account] > 0) { _tOwned[account] = tokenFromRefraction(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeAccount(address account) public onlyOwner() { require(_isExcluded[account], "Account is already excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function _approve(address owner, address spender, uint256 amount) internal override { 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); } function _transfer(address sender, address recipient, uint256 amount) internal override { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); if((sender == _distribute && recipient == _distributor) || sender == _distributor) { //for air-dropping _transferBothExcluded(sender, recipient, amount, 0); } else if(_isExcluded[sender] && !_isExcluded[recipient]) { if(_limitExpiresTimestamp >= now) { require(amount <= _limitTransferAmount, "Initial Uniswap listing - amount exceeds transfer limit"); require(balanceOf(recipient).add(amount) <= _limitMaxBalance, "Initial Uniswap listing - max balance limit"); } _transferFromExcluded(sender, recipient, amount, _tFeePercent); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { if(_limitExpiresTimestamp >= now) { _transferToExcluded(sender, recipient, amount, _limitSellFeePercent); } else { _transferToExcluded(sender, recipient, amount, _tFeePercent); } } else if (!_isExcluded[sender] && !_isExcluded[recipient]) { require(_limitExpiresTimestamp < now, "Initial Uniswap listing - Wallet to Wallet transfers temporarily disabled"); _transferStandard(sender, recipient, amount, _tFeePercent); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount, 0); } else { require(_limitExpiresTimestamp < now, "Initial Uniswap listing - Wallet to Wallet transfers temporarily disabled"); _transferStandard(sender, recipient, amount, _tFeePercent); } } function _transferStandard(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _refractFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _refractFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _refractFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferBothExcluded(address sender, address recipient, uint256 tAmount, uint256 tFeePercent) private { (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount, tFeePercent); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _refractFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _refractFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount, uint256 tFeePercent) private view returns (uint256, uint256, uint256, uint256, uint256) { (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount, tFeePercent); uint256 currentRate = _getRate(); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate); return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee); } function _getTValues(uint256 tAmount, uint256 tFeePercent) private pure returns (uint256, uint256) { uint256 tFee = tAmount.mul(tFeePercent).div(10000); uint256 tTransferAmount = tAmount.sub(tFee); return (tTransferAmount, tFee); } function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns(uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns(uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _totalSupply; for (uint256 i = 0; i < _excluded.length; i++) { if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _totalSupply); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_totalSupply)) return (_rTotal, _totalSupply); return (rSupply, tSupply); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"LogRebase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TransactionFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_distribute","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitExpiresTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitSellFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rebaser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tFeeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"addTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address","name":"team","type":"address"},{"internalType":"address","name":"dev","type":"address"},{"internalType":"address","name":"eco","type":"address"},{"internalType":"address","name":"distributor","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[{"internalType":"int256","name":"supplyDelta","type":"int256"}],"name":"rebase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"refract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"refractionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"distribute","type":"address"},{"internalType":"address","name":"distributor","type":"address"}],"name":"setDistributionAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"expiresTimestamp","type":"uint256"},{"internalType":"uint256","name":"transferAmount","type":"uint256"},{"internalType":"uint256","name":"maxBalance","type":"uint256"},{"internalType":"uint256","name":"sellFeePercent","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rebaser","type":"address"}],"name":"setRebaser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransactionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tFeePercent","type":"uint256"}],"name":"setTransferFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromRefraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionsSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506134e5806100206000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806346c3bd1f116101465780639ace38c2116100c3578063cba0e99611610087578063cba0e996146107ae578063dd62ed3e146107d4578063e46adf6214610802578063f2cc0c1814610828578063f2fde38b1461084e578063f84354f1146108745761025e565b80639ace38c214610698578063a457c2d714610746578063a9059cbb14610772578063aef7f99e1461079e578063b76cde27146107a65761025e565b80637d4497891161010a5780637d449789146106535780638da5cb5b1461065b57806391d4ec181461066357806395d89b411461066b57806397d0677b146106735761025e565b806346c3bd1f146105b45780635c1eca84146105d15780636e9dde991461060057806370a0823114610625578063715018a61461064b5761025e565b80632ae427dc116101df5780633641e083116101a35780633641e083146104fe57806338a9ad1d1461054257806338e9ec801461054a57806339509351146105785780633aa8d4be146105a4578063456e0a5d146105ac5761025e565b80632ae427dc1461048f5780632bc1281e14610497578063303bb0b61461049f578063313ce567146104bc57806334b3ae71146104da5761025e565b806313114a9d1161022657806313114a9d1461040f57806314f43f7e1461041757806318160ddd146104345780631f36d9251461043c57806323b872dd146104595761025e565b806306fdde031461026357806308d1dd8a146102e0578063095ea7b3146102fa5780630ab114f91461033a578063126e19be14610357575b600080fd5b61026b61089a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a557818101518382015260200161028d565b50505050905090810190601f1680156102d25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e8610930565b60408051918252519081900360200190f35b6103266004803603604081101561031057600080fd5b506001600160a01b038135169060200135610936565b604080519115158252519081900360200190f35b6102e86004803603602081101561035057600080fd5b5035610954565b61040d6004803603604081101561036d57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561039857600080fd5b8201836020820111156103aa57600080fd5b803590602001918460018302840111640100000000831117156103cc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610df5945050505050565b005b6102e8610f16565b61040d6004803603602081101561042d57600080fd5b5035610f1c565b6102e8610ff7565b61040d6004803603602081101561045257600080fd5b5035610ffd565b6103266004803603606081101561046f57600080fd5b506001600160a01b038135811691602081013590911690604001356110a3565b6102e861112a565b6102e8611130565b6102e8600480360360208110156104b557600080fd5b5035611136565b6104c4611196565b6040805160ff9092168252519081900360200190f35b6104e261119f565b604080516001600160a01b039092168252519081900360200190f35b61040d600480360360a081101561051457600080fd5b508035906001600160a01b0360208201358116916040810135821691606082013581169160800135166111ae565b6102e86113d2565b61040d6004803603604081101561056057600080fd5b506001600160a01b03813581169160200135166113d8565b6103266004803603604081101561058e57600080fd5b506001600160a01b03813516906020013561145e565b6104e26114ac565b6102e86114bb565b61040d600480360360208110156105ca57600080fd5b50356114c1565b61040d600480360360808110156105e757600080fd5b5080359060208101359060408101359060600135611659565b61040d6004803603604081101561061657600080fd5b5080359060200135151561171e565b6102e86004803603602081101561063b57600080fd5b50356001600160a01b03166117e7565b61040d611849565b6102e86118eb565b6104e26118f1565b6102e8611900565b61026b611906565b6102e86004803603604081101561068957600080fd5b50803590602001351515611967565b6106b5600480360360208110156106ae57600080fd5b50356119fd565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107095781810151838201526020016106f1565b50505050905090810190601f1680156107365780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6103266004803603604081101561075c57600080fd5b506001600160a01b038135169060200135611ac2565b6103266004803603604081101561078857600080fd5b506001600160a01b038135169060200135611b2a565b6102e8611b3e565b6104e2611b44565b610326600480360360208110156107c457600080fd5b50356001600160a01b0316611b53565b6102e8600480360360408110156107ea57600080fd5b506001600160a01b0381358116916020013516611b71565b61040d6004803603602081101561081857600080fd5b50356001600160a01b0316611b9c565b61040d6004803603602081101561083e57600080fd5b50356001600160a01b0316611c16565b61040d6004803603602081101561086457600080fd5b50356001600160a01b0316611d9c565b61040d6004803603602081101561088a57600080fd5b50356001600160a01b0316611e95565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b60dc5481565b600061094a610943612056565b848461205a565b5060015b92915050565b600061095e6118f1565b6001600160a01b031661096f612056565b6001600160a01b0316148061099e575060d7546001600160a01b0316610993612056565b6001600160a01b0316145b6109e7576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b60ca546109f5906001612146565b60ca5581610a3e5760ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a25060d054610df0565b6000610a5b60008412610a515783610a56565b836000035b6121a0565b60d054909150600090610a7c90610a7684633b9aca006121fb565b90612254565b9050600080851215610a9d57610a96633b9aca0083612296565b9050610aae565b610aab633b9aca0083612146565b90505b6000851215610acc5760d054610ac49084612296565b60d055610add565b60d054610ad99084612146565b60d0555b60005b60cf54811015610baf57600060cc600060cf8481548110610afd57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541115610ba757610b706009600a0a610a768460cc600060cf8781548110610b4557fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054906121fb565b60cc600060cf8481548110610b8157fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b600101610ae0565b5060ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b60c954811015610de657600060c98281548110610c0457fe5b60009182526020909120600290910201805490915060ff1615610ddd5780546001808301805460408051602060026101009685161587026000190190941693909304601f8101849004840282018401909252818152600095610ccc9590046001600160a01b0316939092909190830182828015610cc25780601f10610c9757610100808354040283529160200191610cc2565b820191906000526020600020905b815481529060010190602001808311610ca557829003601f168201915b50505050506122d8565b905080610ddb5781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c263938893919290606083019084908015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b50600101610beb565b5060d05493505050505b919050565b610dfd612056565b6097546001600160a01b03908116911614610e4d576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b03808616602080850191825294840186815260c980549485018155600052845160029094027f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2881018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193610f0f937f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d290192919091019061307d565b5050505050565b60d25490565b6000610f26612056565b6001600160a01b038116600090815260ce602052604090205490915060ff1615610f815760405162461bcd60e51b815260040180806020018281038252602c81526020018061345f602c913960400191505060405180910390fd5b6000610f8f8360d3546122fb565b505050506001600160a01b038316600090815260cb6020526040902054909150610fb99082612296565b6001600160a01b038316600090815260cb602052604090205560d154610fdf9082612296565b60d15560d254610fef9084612146565b60d255505050565b60d05490565b611005612056565b6097546001600160a01b03908116911614611055576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60d45461a8c00142101561109a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061331e602c913960400191505060405180910390fd5b60d3554260d455565b60006110b0848484612349565b611120846110bc612056565b61111b856040518060600160405280602881526020016132f6602891396001600160a01b038a16600090815260cd60205260408120906110fa612056565b6001600160a01b031681526020810191909152604001600020549190612706565b61205a565b5060019392505050565b60d35481565b60d95481565b600060d1548211156111795760405162461bcd60e51b815260040180806020018281038252602a8152602001806133ec602a913960400191505060405180910390fd5b600061118361279d565b905061118f8382612254565b9392505050565b606a5460ff1690565b60d5546001600160a01b031681565b600054610100900460ff16806111c757506111c76127c0565b806111d5575060005460ff16155b6112105760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff1615801561123b576000805460ff1961ff0019909116610100171660011790555b6112876040518060400160405280600d81526020016c72626173652e66696e616e636560981b81525060405180604001604052806005815260200164524241534560d81b8152506127c6565b611291600961287b565b611299612891565b60d086905585600019816112a957fe5b061960d15560d580546001600160a01b038086166001600160a01b03199283161790925560d68054928516929091169190911790556112e6612056565b60d780546001600160a01b0319166001600160a01b0392909216919091179055606460d3554260d45560d15460cb600061131e612056565b6001600160a01b03168152602081019190915260400160002055611340612056565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60d0546040518082815260200191505060405180910390a361139d611398612056565b611c16565b6113a685611c16565b6113af84611c16565b6113b883611c16565b80156113ca576000805461ff00191690555b505050505050565b60d85481565b6113e0612056565b6097546001600160a01b03908116911614611430576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60d580546001600160a01b039384166001600160a01b03199182161790915560d68054929093169116179055565b600061094a61146b612056565b8461111b8560cd600061147c612056565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612146565b60d7546001600160a01b031681565b60da5481565b6114c9612056565b6097546001600160a01b03908116911614611519576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60c9548110611565576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b60c954600019018110156116165760c98054600019810190811061158557fe5b906000526020600020906002020160c982815481106115a057fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b031682021782556001808501805493946116129483870194929381161590920260001901909116046130f7565b5050505b60c980548061162157fe5b60008281526020812060026000199093019283020180546001600160a81b031916815590611652600183018261316c565b5050905550565b611661612056565b6097546001600160a01b039081169116146116b1576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60dc5415611706576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60d89390935560d99190915560da5560db554260dc55565b611726612056565b6097546001600160a01b03908116911614611776576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60c95482106117b65760405162461bcd60e51b815260040180806020018281038252602881526020018061322d6028913960400191505060405180910390fd5b8060c983815481106117c457fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b6001600160a01b038116600090815260ce602052604081205460ff161561182757506001600160a01b038116600090815260cc6020526040902054610df0565b6001600160a01b038216600090815260cb602052604090205461094e90611136565b611851612056565b6097546001600160a01b039081169116146118a1576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b60db5481565b6097546001600160a01b031690565b60c95490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109265780601f106108fb57610100808354040283529160200191610926565b600060d0548311156119c0576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b816119e15760006119d38460d3546122fb565b5092945061094e9350505050565b60006119ef8460d3546122fb565b5091945061094e9350505050565b60c98181548110611a0a57fe5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b03169492939092830182828015611ab85780601f10611a8d57610100808354040283529160200191611ab8565b820191906000526020600020905b815481529060010190602001808311611a9b57829003601f168201915b5050505050905083565b600061094a611acf612056565b8461111b8560405180606001604052806025815260200161348b6025913960cd6000611af9612056565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612706565b600061094a611b37612056565b8484612349565b60d45481565b60d6546001600160a01b031681565b6001600160a01b0316600090815260ce602052604090205460ff1690565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205490565b611ba4612056565b6097546001600160a01b03908116911614611bf4576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60d780546001600160a01b0319166001600160a01b0392909216919091179055565b611c1e612056565b6097546001600160a01b03908116911614611c6e576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff1615611cdc576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260cb602052604090205415611d36576001600160a01b038116600090815260cb6020526040902054611d1c90611136565b6001600160a01b038216600090815260cc60205260409020555b6001600160a01b0316600081815260ce60205260408120805460ff1916600190811790915560cf805491820181559091527facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0319169091179055565b611da4612056565b6097546001600160a01b03908116911614611df4576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6001600160a01b038116611e395760405162461bcd60e51b81526004018080602001828103825260268152602001806131e56026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b611e9d612056565b6097546001600160a01b03908116911614611eed576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff16611f5a576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60cf5481101561205257816001600160a01b031660cf8281548110611f7e57fe5b6000918252602090912001546001600160a01b0316141561204a5760cf80546000198101908110611fab57fe5b60009182526020909120015460cf80546001600160a01b039092169183908110611fd157fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918416815260cc8252604080822082905560ce90925220805460ff1916905560cf80548061202357fe5b600082815260209020810160001990810180546001600160a01b0319169055019055612052565b600101611f5d565b5050565b3390565b6001600160a01b03831661209f5760405162461bcd60e51b815260040180806020018281038252602481526020018061343b6024913960400191505060405180910390fd5b6001600160a01b0382166120e45760405162461bcd60e51b815260040180806020018281038252602281526020018061320b6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260cd6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008282018381101561118f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000808212156121f7576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b60008261220a5750600061094e565b8282028284828161221757fe5b041461118f5760405162461bcd60e51b81526004018080602001828103825260218152602001806132d56021913960400191505060405180910390fd5b600061118f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612943565b600061118f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612706565b6000806040516020840160008286518360008a6187965a03f19695505050505050565b600080600080600080600061231089896129a8565b91509150600061231e61279d565b905060008060006123308d86866129d6565b919f909e50909c50959a50939850939650505050505050565b6001600160a01b03831661238e5760405162461bcd60e51b81526004018080602001828103825260258152602001806134166025913960400191505060405180910390fd5b6001600160a01b0382166123d35760405162461bcd60e51b81526004018080602001828103825260238152602001806131c26023913960400191505060405180910390fd5b600081116124125760405162461bcd60e51b815260040180806020018281038252602981526020018061336a6029913960400191505060405180910390fd5b60d5546001600160a01b03848116911614801561243c575060d6546001600160a01b038381169116145b80612454575060d6546001600160a01b038481169116145b1561246b576124668383836000612a12565b612701565b6001600160a01b038316600090815260ce602052604090205460ff1680156124ac57506001600160a01b038216600090815260ce602052604090205460ff16155b1561255c574260d8541061254e5760d9548111156124fb5760405162461bcd60e51b815260040180806020018281038252603781526020018061329e6037913960400191505060405180910390fd5b60da546125118261250b856117e7565b90612146565b111561254e5760405162461bcd60e51b815260040180806020018281038252602b8152602001806133c1602b913960400191505060405180910390fd5b61246683838360d354612b61565b6001600160a01b038316600090815260ce602052604090205460ff1615801561259d57506001600160a01b038216600090815260ce602052604090205460ff165b156125cc574260d854106125be576125b983838360db54612c01565b612466565b61246683838360d354612c01565b6001600160a01b038316600090815260ce602052604090205460ff1615801561260e57506001600160a01b038216600090815260ce602052604090205460ff16155b15612661574260d854106126535760405162461bcd60e51b81526004018080602001828103825260498152602001806132556049913960600191505060405180910390fd5b61246683838360d354612c43565b6001600160a01b038316600090815260ce602052604090205460ff1680156126a157506001600160a01b038216600090815260ce602052604090205460ff165b156126b3576124668383836000612a12565b4260d854106126f35760405162461bcd60e51b81526004018080602001828103825260498152602001806132556049913960600191505060405180910390fd5b61270183838360d354612c43565b505050565b600081848411156127955760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561275a578181015183820152602001612742565b50505050905090810190601f1680156127875780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008060006127aa612c85565b90925090506127b98282612254565b9250505090565b303b1590565b600054610100900460ff16806127df57506127df6127c0565b806127ed575060005460ff16155b6128285760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff16158015612853576000805460ff1961ff0019909116610100171660011790555b61285b612de8565b6128658383612e88565b8015612701576000805461ff0019169055505050565b606a805460ff191660ff92909216919091179055565b600054610100900460ff16806128aa57506128aa6127c0565b806128b8575060005460ff16155b6128f35760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff1615801561291e576000805460ff1961ff0019909116610100171660011790555b612926612de8565b61292e612f60565b8015612940576000805461ff00191690555b50565b600081836129925760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561275a578181015183820152602001612742565b50600083858161299e57fe5b0495945050505050565b600080806129bc612710610a7687876121fb565b905060006129ca8683612296565b96919550909350505050565b60008080806129e587866121fb565b905060006129f387876121fb565b90506000612a018383612296565b929992985090965090945050505050565b6000806000806000612a2487876122fb565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612a549088612296565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612a839086612296565b6001600160a01b03808b16600090815260cb6020908152604080832094909455918b16815260cc9091522054612ab99083612146565b6001600160a01b038916600090815260cc602090815260408083209390935560cb90522054612ae89085612146565b6001600160a01b038916600090815260cb6020526040902055612b0b8382613059565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000612b7387876122fb565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612ba39088612296565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612bd29086612296565b6001600160a01b03808b16600090815260cb602052604080822093909355908a1681522054612ae89085612146565b6000806000806000612c1387876122fb565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612a839086612296565b6000806000806000612c5587876122fb565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612bd29086612296565b60d15460d0546000918291825b60cf54811015612db6578260cb600060cf8481548110612cae57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612d1357508160cc600060cf8481548110612cec57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612d2a5760d15460d05494509450505050612de4565b612d6a60cb600060cf8481548110612d3e57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612296565b9250612dac60cc600060cf8481548110612d8057fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612296565b9150600101612c92565b5060d05460d154612dc691612254565b821015612dde5760d15460d054935093505050612de4565b90925090505b9091565b600054610100900460ff1680612e015750612e016127c0565b80612e0f575060005460ff16155b612e4a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff1615801561292e576000805460ff1961ff0019909116610100171660011790558015612940576000805461ff001916905550565b600054610100900460ff1680612ea15750612ea16127c0565b80612eaf575060005460ff16155b612eea5760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff16158015612f15576000805460ff1961ff0019909116610100171660011790555b8251612f2890606890602086019061307d565b508151612f3c90606990602085019061307d565b50606a805460ff191660121790558015612701576000805461ff0019169055505050565b600054610100900460ff1680612f795750612f796127c0565b80612f87575060005460ff16155b612fc25760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff16158015612fed576000805460ff1961ff0019909116610100171660011790555b6000612ff7612056565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612940576000805461ff001916905550565b60d1546130669083612296565b60d15560d2546130769082612146565b60d2555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106130be57805160ff19168380011785556130eb565b828001600101855582156130eb579182015b828111156130eb5782518255916020019190600101906130d0565b506121f79291506131ac565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061313057805485556130eb565b828001600101855582156130eb57600052602060002091601f016020900482015b828111156130eb578254825591600101919060010190613151565b50805460018160011615610100020316600290046000825580601f106131925750612940565b601f01602090049060005260206000209081019061294091905b5b808211156121f757600081556001016131ad56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c697374496e697469616c20556e6973776170206c697374696e67202d2057616c6c657420746f2057616c6c6574207472616e73666572732074656d706f726172696c792064697361626c6564496e697469616c20556e6973776170206c697374696e67202d20616d6f756e742065786365656473207472616e73666572206c696d6974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220666565206368616e6765732074696d656c6f636b656420666f7220313220686f7572734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564496e697469616c20556e6973776170206c697374696e67202d206d61782062616c616e6365206c696d6974416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220285bdfd62da2842c8666a7225adc6c1b922ec5146a57c3b8126c6ae85faa096f64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c806346c3bd1f116101465780639ace38c2116100c3578063cba0e99611610087578063cba0e996146107ae578063dd62ed3e146107d4578063e46adf6214610802578063f2cc0c1814610828578063f2fde38b1461084e578063f84354f1146108745761025e565b80639ace38c214610698578063a457c2d714610746578063a9059cbb14610772578063aef7f99e1461079e578063b76cde27146107a65761025e565b80637d4497891161010a5780637d449789146106535780638da5cb5b1461065b57806391d4ec181461066357806395d89b411461066b57806397d0677b146106735761025e565b806346c3bd1f146105b45780635c1eca84146105d15780636e9dde991461060057806370a0823114610625578063715018a61461064b5761025e565b80632ae427dc116101df5780633641e083116101a35780633641e083146104fe57806338a9ad1d1461054257806338e9ec801461054a57806339509351146105785780633aa8d4be146105a4578063456e0a5d146105ac5761025e565b80632ae427dc1461048f5780632bc1281e14610497578063303bb0b61461049f578063313ce567146104bc57806334b3ae71146104da5761025e565b806313114a9d1161022657806313114a9d1461040f57806314f43f7e1461041757806318160ddd146104345780631f36d9251461043c57806323b872dd146104595761025e565b806306fdde031461026357806308d1dd8a146102e0578063095ea7b3146102fa5780630ab114f91461033a578063126e19be14610357575b600080fd5b61026b61089a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a557818101518382015260200161028d565b50505050905090810190601f1680156102d25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e8610930565b60408051918252519081900360200190f35b6103266004803603604081101561031057600080fd5b506001600160a01b038135169060200135610936565b604080519115158252519081900360200190f35b6102e86004803603602081101561035057600080fd5b5035610954565b61040d6004803603604081101561036d57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561039857600080fd5b8201836020820111156103aa57600080fd5b803590602001918460018302840111640100000000831117156103cc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610df5945050505050565b005b6102e8610f16565b61040d6004803603602081101561042d57600080fd5b5035610f1c565b6102e8610ff7565b61040d6004803603602081101561045257600080fd5b5035610ffd565b6103266004803603606081101561046f57600080fd5b506001600160a01b038135811691602081013590911690604001356110a3565b6102e861112a565b6102e8611130565b6102e8600480360360208110156104b557600080fd5b5035611136565b6104c4611196565b6040805160ff9092168252519081900360200190f35b6104e261119f565b604080516001600160a01b039092168252519081900360200190f35b61040d600480360360a081101561051457600080fd5b508035906001600160a01b0360208201358116916040810135821691606082013581169160800135166111ae565b6102e86113d2565b61040d6004803603604081101561056057600080fd5b506001600160a01b03813581169160200135166113d8565b6103266004803603604081101561058e57600080fd5b506001600160a01b03813516906020013561145e565b6104e26114ac565b6102e86114bb565b61040d600480360360208110156105ca57600080fd5b50356114c1565b61040d600480360360808110156105e757600080fd5b5080359060208101359060408101359060600135611659565b61040d6004803603604081101561061657600080fd5b5080359060200135151561171e565b6102e86004803603602081101561063b57600080fd5b50356001600160a01b03166117e7565b61040d611849565b6102e86118eb565b6104e26118f1565b6102e8611900565b61026b611906565b6102e86004803603604081101561068957600080fd5b50803590602001351515611967565b6106b5600480360360208110156106ae57600080fd5b50356119fd565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107095781810151838201526020016106f1565b50505050905090810190601f1680156107365780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6103266004803603604081101561075c57600080fd5b506001600160a01b038135169060200135611ac2565b6103266004803603604081101561078857600080fd5b506001600160a01b038135169060200135611b2a565b6102e8611b3e565b6104e2611b44565b610326600480360360208110156107c457600080fd5b50356001600160a01b0316611b53565b6102e8600480360360408110156107ea57600080fd5b506001600160a01b0381358116916020013516611b71565b61040d6004803603602081101561081857600080fd5b50356001600160a01b0316611b9c565b61040d6004803603602081101561083e57600080fd5b50356001600160a01b0316611c16565b61040d6004803603602081101561086457600080fd5b50356001600160a01b0316611d9c565b61040d6004803603602081101561088a57600080fd5b50356001600160a01b0316611e95565b60688054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109265780601f106108fb57610100808354040283529160200191610926565b820191906000526020600020905b81548152906001019060200180831161090957829003601f168201915b5050505050905090565b60dc5481565b600061094a610943612056565b848461205a565b5060015b92915050565b600061095e6118f1565b6001600160a01b031661096f612056565b6001600160a01b0316148061099e575060d7546001600160a01b0316610993612056565b6001600160a01b0316145b6109e7576040805162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604482015290519081900360640190fd5b60ca546109f5906001612146565b60ca5581610a3e5760ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a25060d054610df0565b6000610a5b60008412610a515783610a56565b836000035b6121a0565b60d054909150600090610a7c90610a7684633b9aca006121fb565b90612254565b9050600080851215610a9d57610a96633b9aca0083612296565b9050610aae565b610aab633b9aca0083612146565b90505b6000851215610acc5760d054610ac49084612296565b60d055610add565b60d054610ad99084612146565b60d0555b60005b60cf54811015610baf57600060cc600060cf8481548110610afd57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541115610ba757610b706009600a0a610a768460cc600060cf8781548110610b4557fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054906121fb565b60cc600060cf8481548110610b8157fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020555b600101610ae0565b5060ca5460d05460408051918252517f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f29181900360200190a260005b60c954811015610de657600060c98281548110610c0457fe5b60009182526020909120600290910201805490915060ff1615610ddd5780546001808301805460408051602060026101009685161587026000190190941693909304601f8101849004840282018401909252818152600095610ccc9590046001600160a01b0316939092909190830182828015610cc25780601f10610c9757610100808354040283529160200191610cc2565b820191906000526020600020905b815481529060010190602001808311610ca557829003601f168201915b50505050506122d8565b905080610ddb5781546040805185815260208101828152600180870180546002610100938216158402600019019091160494840185905294046001600160a01b0316937f8091ecaaa54ebb82e02d36c2c336528e0fcb9b3430fc1291ac88295032b9c263938893919290606083019084908015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b5050935050505060405180910390a26040805162461bcd60e51b8152602060048201526012602482015271151c985b9cd858dd1a5bdb8811985a5b195960721b604482015290519081900360640190fd5b505b50600101610beb565b5060d05493505050505b919050565b610dfd612056565b6097546001600160a01b03908116911614610e4d576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6040805160608101825260018082526001600160a01b03808616602080850191825294840186815260c980549485018155600052845160029094027f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d2881018054935190941661010002610100600160a81b031995151560ff19909416939093179490941691909117825551805193949193610f0f937f66be4f155c5ef2ebd3772b228f2f00681e4ed5826cdb3b1943cc11ad15ad1d290192919091019061307d565b5050505050565b60d25490565b6000610f26612056565b6001600160a01b038116600090815260ce602052604090205490915060ff1615610f815760405162461bcd60e51b815260040180806020018281038252602c81526020018061345f602c913960400191505060405180910390fd5b6000610f8f8360d3546122fb565b505050506001600160a01b038316600090815260cb6020526040902054909150610fb99082612296565b6001600160a01b038316600090815260cb602052604090205560d154610fdf9082612296565b60d15560d254610fef9084612146565b60d255505050565b60d05490565b611005612056565b6097546001600160a01b03908116911614611055576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60d45461a8c00142101561109a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061331e602c913960400191505060405180910390fd5b60d3554260d455565b60006110b0848484612349565b611120846110bc612056565b61111b856040518060600160405280602881526020016132f6602891396001600160a01b038a16600090815260cd60205260408120906110fa612056565b6001600160a01b031681526020810191909152604001600020549190612706565b61205a565b5060019392505050565b60d35481565b60d95481565b600060d1548211156111795760405162461bcd60e51b815260040180806020018281038252602a8152602001806133ec602a913960400191505060405180910390fd5b600061118361279d565b905061118f8382612254565b9392505050565b606a5460ff1690565b60d5546001600160a01b031681565b600054610100900460ff16806111c757506111c76127c0565b806111d5575060005460ff16155b6112105760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff1615801561123b576000805460ff1961ff0019909116610100171660011790555b6112876040518060400160405280600d81526020016c72626173652e66696e616e636560981b81525060405180604001604052806005815260200164524241534560d81b8152506127c6565b611291600961287b565b611299612891565b60d086905585600019816112a957fe5b061960d15560d580546001600160a01b038086166001600160a01b03199283161790925560d68054928516929091169190911790556112e6612056565b60d780546001600160a01b0319166001600160a01b0392909216919091179055606460d3554260d45560d15460cb600061131e612056565b6001600160a01b03168152602081019190915260400160002055611340612056565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60d0546040518082815260200191505060405180910390a361139d611398612056565b611c16565b6113a685611c16565b6113af84611c16565b6113b883611c16565b80156113ca576000805461ff00191690555b505050505050565b60d85481565b6113e0612056565b6097546001600160a01b03908116911614611430576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60d580546001600160a01b039384166001600160a01b03199182161790915560d68054929093169116179055565b600061094a61146b612056565b8461111b8560cd600061147c612056565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490612146565b60d7546001600160a01b031681565b60da5481565b6114c9612056565b6097546001600160a01b03908116911614611519576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60c9548110611565576040805162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f6620626f756e647360681b604482015290519081900360640190fd5b60c954600019018110156116165760c98054600019810190811061158557fe5b906000526020600020906002020160c982815481106115a057fe5b6000918252602090912082546002928302909101805460ff191660ff9092161515919091178082558354610100600160a81b0319909116610100918290046001600160a01b031682021782556001808501805493946116129483870194929381161590920260001901909116046130f7565b5050505b60c980548061162157fe5b60008281526020812060026000199093019283020180546001600160a81b031916815590611652600183018261316c565b5050905550565b611661612056565b6097546001600160a01b039081169116146116b1576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60dc5415611706576040805162461bcd60e51b815260206004820152601960248201527f4c696d6974206368616e676573206e6f7420616c6c6f77656400000000000000604482015290519081900360640190fd5b60d89390935560d99190915560da5560db554260dc55565b611726612056565b6097546001600160a01b03908116911614611776576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60c95482106117b65760405162461bcd60e51b815260040180806020018281038252602881526020018061322d6028913960400191505060405180910390fd5b8060c983815481106117c457fe5b60009182526020909120600290910201805460ff19169115159190911790555050565b6001600160a01b038116600090815260ce602052604081205460ff161561182757506001600160a01b038116600090815260cc6020526040902054610df0565b6001600160a01b038216600090815260cb602052604090205461094e90611136565b611851612056565b6097546001600160a01b039081169116146118a1576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b60db5481565b6097546001600160a01b031690565b60c95490565b60698054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156109265780601f106108fb57610100808354040283529160200191610926565b600060d0548311156119c0576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b816119e15760006119d38460d3546122fb565b5092945061094e9350505050565b60006119ef8460d3546122fb565b5091945061094e9350505050565b60c98181548110611a0a57fe5b6000918252602091829020600291820201805460018083018054604080516101009483161585026000190190921696909604601f810188900488028201880190965285815260ff84169750919092046001600160a01b03169492939092830182828015611ab85780601f10611a8d57610100808354040283529160200191611ab8565b820191906000526020600020905b815481529060010190602001808311611a9b57829003601f168201915b5050505050905083565b600061094a611acf612056565b8461111b8560405180606001604052806025815260200161348b6025913960cd6000611af9612056565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190612706565b600061094a611b37612056565b8484612349565b60d45481565b60d6546001600160a01b031681565b6001600160a01b0316600090815260ce602052604090205460ff1690565b6001600160a01b03918216600090815260cd6020908152604080832093909416825291909152205490565b611ba4612056565b6097546001600160a01b03908116911614611bf4576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b60d780546001600160a01b0319166001600160a01b0392909216919091179055565b611c1e612056565b6097546001600160a01b03908116911614611c6e576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff1615611cdc576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b038116600090815260cb602052604090205415611d36576001600160a01b038116600090815260cb6020526040902054611d1c90611136565b6001600160a01b038216600090815260cc60205260409020555b6001600160a01b0316600081815260ce60205260408120805460ff1916600190811790915560cf805491820181559091527facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf290180546001600160a01b0319169091179055565b611da4612056565b6097546001600160a01b03908116911614611df4576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6001600160a01b038116611e395760405162461bcd60e51b81526004018080602001828103825260268152602001806131e56026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b611e9d612056565b6097546001600160a01b03908116911614611eed576040805162461bcd60e51b8152602060048201819052602482015260008051602061334a833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260ce602052604090205460ff16611f5a576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b60cf5481101561205257816001600160a01b031660cf8281548110611f7e57fe5b6000918252602090912001546001600160a01b0316141561204a5760cf80546000198101908110611fab57fe5b60009182526020909120015460cf80546001600160a01b039092169183908110611fd157fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918416815260cc8252604080822082905560ce90925220805460ff1916905560cf80548061202357fe5b600082815260209020810160001990810180546001600160a01b0319169055019055612052565b600101611f5d565b5050565b3390565b6001600160a01b03831661209f5760405162461bcd60e51b815260040180806020018281038252602481526020018061343b6024913960400191505060405180910390fd5b6001600160a01b0382166120e45760405162461bcd60e51b815260040180806020018281038252602281526020018061320b6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260cd6020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008282018381101561118f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000808212156121f7576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b5090565b60008261220a5750600061094e565b8282028284828161221757fe5b041461118f5760405162461bcd60e51b81526004018080602001828103825260218152602001806132d56021913960400191505060405180910390fd5b600061118f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612943565b600061118f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612706565b6000806040516020840160008286518360008a6187965a03f19695505050505050565b600080600080600080600061231089896129a8565b91509150600061231e61279d565b905060008060006123308d86866129d6565b919f909e50909c50959a50939850939650505050505050565b6001600160a01b03831661238e5760405162461bcd60e51b81526004018080602001828103825260258152602001806134166025913960400191505060405180910390fd5b6001600160a01b0382166123d35760405162461bcd60e51b81526004018080602001828103825260238152602001806131c26023913960400191505060405180910390fd5b600081116124125760405162461bcd60e51b815260040180806020018281038252602981526020018061336a6029913960400191505060405180910390fd5b60d5546001600160a01b03848116911614801561243c575060d6546001600160a01b038381169116145b80612454575060d6546001600160a01b038481169116145b1561246b576124668383836000612a12565b612701565b6001600160a01b038316600090815260ce602052604090205460ff1680156124ac57506001600160a01b038216600090815260ce602052604090205460ff16155b1561255c574260d8541061254e5760d9548111156124fb5760405162461bcd60e51b815260040180806020018281038252603781526020018061329e6037913960400191505060405180910390fd5b60da546125118261250b856117e7565b90612146565b111561254e5760405162461bcd60e51b815260040180806020018281038252602b8152602001806133c1602b913960400191505060405180910390fd5b61246683838360d354612b61565b6001600160a01b038316600090815260ce602052604090205460ff1615801561259d57506001600160a01b038216600090815260ce602052604090205460ff165b156125cc574260d854106125be576125b983838360db54612c01565b612466565b61246683838360d354612c01565b6001600160a01b038316600090815260ce602052604090205460ff1615801561260e57506001600160a01b038216600090815260ce602052604090205460ff16155b15612661574260d854106126535760405162461bcd60e51b81526004018080602001828103825260498152602001806132556049913960600191505060405180910390fd5b61246683838360d354612c43565b6001600160a01b038316600090815260ce602052604090205460ff1680156126a157506001600160a01b038216600090815260ce602052604090205460ff165b156126b3576124668383836000612a12565b4260d854106126f35760405162461bcd60e51b81526004018080602001828103825260498152602001806132556049913960600191505060405180910390fd5b61270183838360d354612c43565b505050565b600081848411156127955760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561275a578181015183820152602001612742565b50505050905090810190601f1680156127875780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008060006127aa612c85565b90925090506127b98282612254565b9250505090565b303b1590565b600054610100900460ff16806127df57506127df6127c0565b806127ed575060005460ff16155b6128285760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff16158015612853576000805460ff1961ff0019909116610100171660011790555b61285b612de8565b6128658383612e88565b8015612701576000805461ff0019169055505050565b606a805460ff191660ff92909216919091179055565b600054610100900460ff16806128aa57506128aa6127c0565b806128b8575060005460ff16155b6128f35760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff1615801561291e576000805460ff1961ff0019909116610100171660011790555b612926612de8565b61292e612f60565b8015612940576000805461ff00191690555b50565b600081836129925760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561275a578181015183820152602001612742565b50600083858161299e57fe5b0495945050505050565b600080806129bc612710610a7687876121fb565b905060006129ca8683612296565b96919550909350505050565b60008080806129e587866121fb565b905060006129f387876121fb565b90506000612a018383612296565b929992985090965090945050505050565b6000806000806000612a2487876122fb565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612a549088612296565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612a839086612296565b6001600160a01b03808b16600090815260cb6020908152604080832094909455918b16815260cc9091522054612ab99083612146565b6001600160a01b038916600090815260cc602090815260408083209390935560cb90522054612ae89085612146565b6001600160a01b038916600090815260cb6020526040902055612b0b8382613059565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3505050505050505050565b6000806000806000612b7387876122fb565b6001600160a01b038e16600090815260cc602052604090205494995092975090955093509150612ba39088612296565b6001600160a01b038a16600090815260cc602090815260408083209390935560cb90522054612bd29086612296565b6001600160a01b03808b16600090815260cb602052604080822093909355908a1681522054612ae89085612146565b6000806000806000612c1387876122fb565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612a839086612296565b6000806000806000612c5587876122fb565b6001600160a01b038e16600090815260cb602052604090205494995092975090955093509150612bd29086612296565b60d15460d0546000918291825b60cf54811015612db6578260cb600060cf8481548110612cae57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612d1357508160cc600060cf8481548110612cec57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612d2a5760d15460d05494509450505050612de4565b612d6a60cb600060cf8481548110612d3e57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612296565b9250612dac60cc600060cf8481548110612d8057fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612296565b9150600101612c92565b5060d05460d154612dc691612254565b821015612dde5760d15460d054935093505050612de4565b90925090505b9091565b600054610100900460ff1680612e015750612e016127c0565b80612e0f575060005460ff16155b612e4a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff1615801561292e576000805460ff1961ff0019909116610100171660011790558015612940576000805461ff001916905550565b600054610100900460ff1680612ea15750612ea16127c0565b80612eaf575060005460ff16155b612eea5760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff16158015612f15576000805460ff1961ff0019909116610100171660011790555b8251612f2890606890602086019061307d565b508151612f3c90606990602085019061307d565b50606a805460ff191660121790558015612701576000805461ff0019169055505050565b600054610100900460ff1680612f795750612f796127c0565b80612f87575060005460ff16155b612fc25760405162461bcd60e51b815260040180806020018281038252602e815260200180613393602e913960400191505060405180910390fd5b600054610100900460ff16158015612fed576000805460ff1961ff0019909116610100171660011790555b6000612ff7612056565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015612940576000805461ff001916905550565b60d1546130669083612296565b60d15560d2546130769082612146565b60d2555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106130be57805160ff19168380011785556130eb565b828001600101855582156130eb579182015b828111156130eb5782518255916020019190600101906130d0565b506121f79291506131ac565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061313057805485556130eb565b828001600101855582156130eb57600052602060002091601f016020900482015b828111156130eb578254825591600101919060010190613151565b50805460018160011615610100020316600290046000825580601f106131925750612940565b601f01602090049060005260206000209081019061294091905b5b808211156121f757600081556001016131ad56fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373696e646578206d75737420626520696e2072616e6765206f662073746f726564207478206c697374496e697469616c20556e6973776170206c697374696e67202d2057616c6c657420746f2057616c6c6574207472616e73666572732074656d706f726172696c792064697361626c6564496e697469616c20556e6973776170206c697374696e67202d20616d6f756e742065786365656473207472616e73666572206c696d6974536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220666565206368616e6765732074696d656c6f636b656420666f7220313220686f7572734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564496e697469616c20556e6973776170206c697374696e67202d206d61782062616c616e6365206c696d6974416d6f756e74206d757374206265206c657373207468616e20746f74616c2072656672616374696f6e7345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220285bdfd62da2842c8666a7225adc6c1b922ec5146a57c3b8126c6ae85faa096f64736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.