Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 48 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 15639948 | 767 days ago | IN | 0 ETH | 0.00182375 | ||||
Withdraw | 13809117 | 1056 days ago | IN | 0 ETH | 0.0041667 | ||||
Withdraw | 13388226 | 1122 days ago | IN | 0 ETH | 0.00563266 | ||||
Deposit | 13189518 | 1153 days ago | IN | 0 ETH | 0.00424911 | ||||
Deposit | 13189512 | 1153 days ago | IN | 0 ETH | 0.01220321 | ||||
Withdraw | 13167204 | 1156 days ago | IN | 0 ETH | 0.00261101 | ||||
Approve | 13141731 | 1160 days ago | IN | 0 ETH | 0.00585916 | ||||
Deposit | 12911670 | 1196 days ago | IN | 0 ETH | 0.00351688 | ||||
Deposit | 12904211 | 1197 days ago | IN | 0 ETH | 0.00300157 | ||||
Withdraw | 12891514 | 1199 days ago | IN | 0 ETH | 0.00150642 | ||||
Deposit | 12891267 | 1199 days ago | IN | 0 ETH | 0.00067199 | ||||
Deposit | 12891267 | 1199 days ago | IN | 0 ETH | 0.00185824 | ||||
Deposit | 12878604 | 1201 days ago | IN | 0 ETH | 0.00531679 | ||||
Withdraw | 12842583 | 1207 days ago | IN | 0 ETH | 0.0024018 | ||||
Deposit | 12833032 | 1208 days ago | IN | 0 ETH | 0.00427783 | ||||
Deposit | 12796095 | 1214 days ago | IN | 0 ETH | 0.00218617 | ||||
Deposit | 12770885 | 1218 days ago | IN | 0 ETH | 0.00133161 | ||||
Withdraw | 12746183 | 1222 days ago | IN | 0 ETH | 0.00110487 | ||||
Deposit | 12744938 | 1222 days ago | IN | 0 ETH | 0.00165112 | ||||
Withdraw | 12741790 | 1223 days ago | IN | 0 ETH | 0.00130978 | ||||
Withdraw | 12739689 | 1223 days ago | IN | 0 ETH | 0.00119694 | ||||
Deposit | 12730052 | 1224 days ago | IN | 0 ETH | 0.00324123 | ||||
Deposit | 12721737 | 1226 days ago | IN | 0 ETH | 0.00220126 | ||||
Deposit | 12695428 | 1230 days ago | IN | 0 ETH | 0.00096844 | ||||
Withdraw | 12692273 | 1230 days ago | IN | 0 ETH | 0.00061098 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
fDAI
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-30 */ // fDAI the first auto rewarding DAI ecosystem. // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } modifier nonReentrant() { require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); _status = _ENTERED; _; _status = _NOT_ENTERED; } } // File: openzeppelin-solidity\contracts\token\ERC20\IERC20.sol /** * @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-solidity\contracts\utils\Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function ceil(uint a, uint m) internal pure returns (uint r) { return (a + m - 1) / m * m; } } contract fDAI is IERC20, ReentrancyGuard { using Address for address; using SafeMath for uint256; enum TxType { FromExcluded, ToExcluded, BothExcluded, Standard } mapping (address => uint256) private rDaiBalance; mapping (address => uint256) private tDaiBalance; mapping (address => mapping (address => uint256)) private _allowances; EnumerableSet.AddressSet excluded; uint256 private tDaiSupply; uint256 private rDaiSupply; uint256 private feesAccrued; string private _name = 'FEG Wrapped DAI'; string private _symbol = 'fDAI'; uint8 private _decimals = 18; address private op; address private op2; address public DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; event Deposit(address indexed dst, uint amount); event Withdrawal(address indexed src, uint amount); constructor () { op = address(0x4c9BC793716e8dC05d1F48D8cA8f84318Ec3043C); op2 = op; EnumerableSet.add(excluded, address(0)); // stablity - zen. emit Transfer(address(0), msg.sender, 0); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return tDaiSupply; } function balanceOf(address account) public view override returns (uint256) { if (EnumerableSet.contains(excluded, account)) return tDaiBalance[account]; (uint256 r, uint256 t) = currentSupply(); return (rDaiBalance[account] * t) / r; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(msg.sender, 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(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] - subtractedValue); return true; } function isExcluded(address account) public view returns (bool) { return EnumerableSet.contains(excluded, account); } function totalFees() public view returns (uint256) { return feesAccrued; } function ClaimOPfee() public { require (msg.sender == op); uint256 transferToAmount = (IERC20(DAI).balanceOf(address(this))) - (tDaiSupply); _pushUnderlying(DAI, op, transferToAmount); tDaiSupply -= transferToAmount; } function deposit(uint256 _amount) public { require(_amount > 0, "can't deposit nothing"); _pullUnderlying(DAI, msg.sender, _amount); (uint256 r, uint256 t) = currentSupply(); uint256 fee = _amount / 100; uint256 df = fee / 10; uint256 net = fee != 0 ? (_amount - (fee)) : _amount; tDaiSupply += _amount; if(isExcluded(msg.sender)){ tDaiBalance[msg.sender] += (_amount- fee); } feesAccrued += df; rDaiBalance[op] += ((df * r) / t); rDaiSupply += (((net + df) * r) / t); rDaiBalance[msg.sender] += ((net * r) / t); emit Deposit(msg.sender, _amount); } function _pullUnderlying(address erc20, address from, uint amount) internal nonReentrant { bool xfer = IERC20(erc20).transferFrom(from, address(this), amount); require(xfer, "ERR_ERC20_FALSE"); } function withdraw(uint256 _amount) public { require(balanceOf(msg.sender) >= _amount && _amount <= totalSupply(), "invalid _amount"); (uint256 r, uint256 t) = currentSupply(); uint256 fee = _amount / 100; uint256 wf = fee / 10; uint256 net = _amount - fee; if(isExcluded(msg.sender)) { tDaiBalance[msg.sender] -= _amount; rDaiBalance[msg.sender] -= ((_amount * r) / t); } else { rDaiBalance[msg.sender] -= ((_amount * r) / t); } tDaiSupply -= (net + wf); rDaiSupply -= (((net + wf) * r ) / t); rDaiBalance[op] += ((wf * r) / t); feesAccrued += wf; _pushUnderlying(DAI, msg.sender, net); emit Withdrawal(msg.sender, net); } function _pushUnderlying(address erc20, address to, uint amount) internal nonReentrant { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer, "ERR_ERC20_FALSE"); } function rDaiToEveryone(uint256 amt) public { require(!isExcluded(msg.sender), "not allowed"); (uint256 r, uint256 t) = currentSupply(); rDaiBalance[msg.sender] -= ((amt * r) / t); rDaiSupply -= ((amt * r) / t); feesAccrued += amt; } function excludeFromFees(address account) external { require(msg.sender == op2, "op only"); require(!EnumerableSet.contains(excluded, account), "address excluded"); if(rDaiBalance[account] > 0) { (uint256 r, uint256 t) = currentSupply(); tDaiBalance[account] = (rDaiBalance[account] * (t)) / (r); } EnumerableSet.add(excluded, account); } function includeInFees(address account) external { require(msg.sender == op2, "op only"); require(EnumerableSet.contains(excluded, account), "address excluded"); tDaiBalance[account] = 0; EnumerableSet.remove(excluded, account); } function tDaiFromrDai(uint256 rDaiAmount) external view returns (uint256) { (uint256 r, uint256 t) = currentSupply(); return (rDaiAmount * t) / r; } function _approve(address owner, address spender, uint256 amount) private { 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 getTtype(address sender, address recipient) internal view returns (TxType t) { bool isSenderExcluded = EnumerableSet.contains(excluded, sender); bool isRecipientExcluded = EnumerableSet.contains(excluded, recipient); if (isSenderExcluded && !isRecipientExcluded) { t = TxType.FromExcluded; } else if (!isSenderExcluded && isRecipientExcluded) { t = TxType.ToExcluded; } else if (!isSenderExcluded && !isRecipientExcluded) { t = TxType.Standard; } else if (isSenderExcluded && isRecipientExcluded) { t = TxType.BothExcluded; } else { t = TxType.Standard; } return t; } function _transfer(address sender, address recipient, uint256 amt) private { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(amt > 0, "Transfer amt must be greater than zero"); (uint256 r, uint256 t) = currentSupply(); uint256 fee = amt / 100; TxType tt = getTtype(sender, recipient); if (tt == TxType.ToExcluded) { rDaiBalance[sender] -= ((amt * r) / t); tDaiBalance[recipient] += (amt - fee); rDaiBalance[recipient] += (((amt - fee) * r) / t); } else if (tt == TxType.FromExcluded) { tDaiBalance[sender] -= (amt); rDaiBalance[sender] -= ((amt * r) / t); rDaiBalance[recipient] += (((amt - fee) * r) / t); } else if (tt == TxType.BothExcluded) { tDaiBalance[sender] -= (amt); rDaiBalance[sender] -= ((amt * r) / t); tDaiBalance[recipient] += (amt - fee); rDaiBalance[recipient] += (((amt - fee) * r) / t); } else { rDaiBalance[sender] -= ((amt * r) / t); rDaiBalance[recipient] += (((amt - fee) * r) / t); } rDaiSupply -= ((fee * r) / t); feesAccrued += fee; emit Transfer(sender, recipient, amt - fee); } function currentSupply() public view returns(uint256, uint256) { if(rDaiSupply == 0 || tDaiSupply == 0) return (1000000000, 1); uint256 rSupply = rDaiSupply; uint256 tSupply = tDaiSupply; for (uint256 i = 0; i < EnumerableSet.length(excluded); i++) { if (rDaiBalance[EnumerableSet.at(excluded, i)] > rSupply || tDaiBalance[EnumerableSet.at(excluded, i)] > tSupply) return (rDaiSupply, tDaiSupply); rSupply -= (rDaiBalance[EnumerableSet.at(excluded, i)]); tSupply -= (tDaiBalance[EnumerableSet.at(excluded, i)]); } if (rSupply < rDaiSupply / tDaiSupply) return (rDaiSupply, tDaiSupply); return (rSupply, tSupply); } function setOp(address opper, address opper2) external { require(msg.sender == op, "only op can call"); op = opper; op2 = opper2; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"ClaimOPfee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"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":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","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":"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":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"rDaiToEveryone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"opper","type":"address"},{"internalType":"address","name":"opper2","type":"address"}],"name":"setOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rDaiAmount","type":"uint256"}],"name":"tDaiFromrDai","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":"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":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600f60808190526e46454720577261707065642044414960881b60a0908152620000329160099190620001c5565b50604080518082019091526004808252636644414960e01b60209092019182526200006091600a91620001c5565b50600b805460ff19166012179055600d80546001600160a01b031916736b175474e89094c44da98b954eedeac495271d0f179055348015620000a157600080fd5b5060016000908155600b8054744c9bc793716e8dc05d1f48d8ca8f84318ec3043c00610100600160a81b03199091161790819055600c80546001600160a01b0319166101009092046001600160a01b0316919091179055620001159060049062000f3f62000153602090811b91909117901c565b50604051600080825233917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620002a8565b60006200016a836001600160a01b03841662000173565b90505b92915050565b6000818152600183016020526040812054620001bc575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200016d565b5060006200016d565b828054620001d3906200026b565b90600052602060002090601f016020900481019282620001f7576000855562000242565b82601f106200021257805160ff191683800117855562000242565b8280016001018555821562000242579182015b828111156200024257825182559160200191906001019062000225565b506200025092915062000254565b5090565b5b8082111562000250576000815560010162000255565b600181811c908216806200028057607f821691505b60208210811415620002a257634e487b7160e01b600052602260045260246000fd5b50919050565b611bfd80620002b86000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063b6b55f251161007c578063b6b55f251461029c578063cba0e996146102af578063d8331430146102c2578063dd62ed3e146102d5578063e0bab4c41461030e578063e57f14e11461033957600080fd5b806370a0823114610236578063771282f6146102495780638d40109a1461026657806395d89b411461026e578063a457c2d714610276578063a9059cbb1461028957600080fd5b806323b872dd1161011557806323b872dd146101c25780632b414264146101d55780632bae9623146101e85780632e1a7d4d146101fb578063313ce5671461020e578063395093511461022357600080fd5b806306fdde0314610152578063095ea7b31461017057806313114a9d1461019357806316a2f82a146101a557806318160ddd146101ba575b600080fd5b61015a61034c565b6040516101679190611a9a565b60405180910390f35b61018361017e366004611a21565b6103de565b6040519015158152602001610167565b6008545b604051908152602001610167565b6101b86101b336600461199a565b6103f5565b005b600654610197565b6101836101d03660046119e6565b6104b0565b6101b86101e33660046119b4565b610502565b6101b86101f6366004611a6a565b61058c565b6101b8610209366004611a6a565b610663565b600b5460405160ff9091168152602001610167565b610183610231366004611a21565b6108b2565b61019761024436600461199a565b6108e9565b61025161095f565b60408051928352602083019190915201610167565b6101b8610acd565b61015a610bb3565b610183610284366004611a21565b610bc2565b610183610297366004611a21565b610bf9565b6101b86102aa366004611a6a565b610c06565b6101836102bd36600461199a565b610e05565b6101976102d0366004611a6a565b610e12565b6101976102e33660046119b4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600d54610321906001600160a01b031681565b6040516001600160a01b039091168152602001610167565b6101b861034736600461199a565b610e2f565b60606009805461035b90611b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461038790611b5b565b80156103d45780601f106103a9576101008083540402835291602001916103d4565b820191906000526020600020905b8154815290600101906020018083116103b757829003601f168201915b5050505050905090565b60006103eb338484610f5b565b5060015b92915050565b600c546001600160a01b0316331461043e5760405162461bcd60e51b81526020600482015260076024820152666f70206f6e6c7960c81b60448201526064015b60405180910390fd5b61044960048261107f565b6104885760405162461bcd60e51b815260206004820152601060248201526f1859191c995cdcc8195e18db1d59195960821b6044820152606401610435565b6001600160a01b0381166000908152600260205260408120556104ac6004826110a1565b5050565b60006104bd8484846110b6565b6001600160a01b0384166000908152600360209081526040808320338085529252909120546104f89186916104f3908690611b44565b610f5b565b5060019392505050565b600b5461010090046001600160a01b031633146105545760405162461bcd60e51b815260206004820152601060248201526f1bdb9b1e481bdc0818d85b8818d85b1b60821b6044820152606401610435565b600b8054610100600160a81b0319166101006001600160a01b0394851602179055600c80546001600160a01b03191691909216179055565b61059533610e05565b156105d05760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610435565b6000806105db61095f565b9092509050806105eb8385611b25565b6105f59190611b05565b3360009081526001602052604081208054909190610614908490611b44565b909155508190506106258385611b25565b61062f9190611b05565b600760008282546106409190611b44565b9250508190555082600860008282546106599190611aed565b9091555050505050565b8061066d336108e9565b1015801561067d57506006548111155b6106bb5760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a590817d85b5bdd5b9d608a1b6044820152606401610435565b6000806106c661095f565b909250905060006106d8606485611b05565b905060006106e7600a83611b05565b905060006106f58387611b44565b905061070033610e05565b15610769573360009081526002602052604081208054889290610724908490611b44565b909155508490506107358688611b25565b61073f9190611b05565b336000908152600160205260408120805490919061075e908490611b44565b909155506107a39050565b836107748688611b25565b61077e9190611b05565b336000908152600160205260408120805490919061079d908490611b44565b90915550505b6107ad8282611aed565b600660008282546107be9190611b44565b90915550849050856107d08484611aed565b6107da9190611b25565b6107e49190611b05565b600760008282546107f59190611b44565b909155508490506108068684611b25565b6108109190611b05565b600b5461010090046001600160a01b03166000908152600160205260408120805490919061083f908490611aed565b9250508190555081600860008282546108589190611aed565b9091555050600d54610874906001600160a01b0316338361151a565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65906020015b60405180910390a2505050505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916103eb9185906104f3908690611aed565b60006108f660048361107f565b1561091757506001600160a01b031660009081526002602052604090205490565b60008061092261095f565b6001600160a01b0386166000908152600160205260409020549193509150829061094d908390611b25565b6109579190611b05565b949350505050565b600080600754600014806109735750600654155b156109855750633b9aca009160019150565b60075460065460005b6109986004611643565b811015610a9c5782600160006109af60048561164d565b6001600160a01b03166001600160a01b03168152602001908152602001600020541180610a0a575081600260006109e760048561164d565b6001600160a01b03166001600160a01b0316815260200190815260200160002054115b15610a2057600754600654945094505050509091565b60016000610a2f60048461164d565b6001600160a01b03168152602081019190915260400160002054610a539084611b44565b925060026000610a6460048461164d565b6001600160a01b03168152602081019190915260400160002054610a889083611b44565b915080610a9481611b96565b91505061098e565b50600654600754610aad9190611b05565b821015610ac4576007546006549350935050509091565b90939092509050565b600b5461010090046001600160a01b03163314610ae957600080fd5b600654600d546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b699190611a82565b610b739190611b44565b600d54600b54919250610b99916001600160a01b0391821691610100909104168361151a565b8060066000828254610bab9190611b44565b909155505050565b6060600a805461035b90611b5b565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916103eb9185906104f3908690611b44565b60006103eb3384846110b6565b60008111610c4e5760405162461bcd60e51b815260206004820152601560248201527463616e2774206465706f736974206e6f7468696e6760581b6044820152606401610435565b600d54610c65906001600160a01b03163383611659565b600080610c7061095f565b90925090506000610c82606485611b05565b90506000610c91600a83611b05565b9050600082610ca05785610caa565b610caa8387611b44565b90508560066000828254610cbe9190611aed565b90915550610ccd905033610e05565b15610d0157610cdc8387611b44565b3360009081526002602052604081208054909190610cfb908490611aed565b90915550505b8160086000828254610d139190611aed565b90915550849050610d248684611b25565b610d2e9190611b05565b600b5461010090046001600160a01b031660009081526001602052604081208054909190610d5d908490611aed565b9091555084905085610d6f8484611aed565b610d799190611b25565b610d839190611b05565b60076000828254610d949190611aed565b90915550849050610da58683611b25565b610daf9190611b05565b3360009081526001602052604081208054909190610dce908490611aed565b909155505060405186815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020016108a2565b60006103ef60048361107f565b6000806000610e1f61095f565b90925090508161094d8286611b25565b600c546001600160a01b03163314610e735760405162461bcd60e51b81526020600482015260076024820152666f70206f6e6c7960c81b6044820152606401610435565b610e7e60048261107f565b15610ebe5760405162461bcd60e51b815260206004820152601060248201526f1859191c995cdcc8195e18db1d59195960821b6044820152606401610435565b6001600160a01b03811660009081526001602052604090205415610f3857600080610ee761095f565b6001600160a01b03851660009081526001602052604090205491935091508290610f12908390611b25565b610f1c9190611b05565b6001600160a01b03841660009081526002602052604090205550505b6104ac6004825b6000610f54836001600160a01b0384166116ee565b9392505050565b6001600160a01b038316610fbd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610435565b6001600160a01b03821661101e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610435565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526001830160205260408120541515610f54565b6000610f54836001600160a01b03841661173d565b6001600160a01b03831661111a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610435565b6001600160a01b03821661117c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610435565b600081116111db5760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657220616d74206d7573742062652067726561746572207468616044820152656e207a65726f60d01b6064820152608401610435565b6000806111e661095f565b909250905060006111f8606485611b05565b90506000611206878761185a565b9050600181600381111561122a57634e487b7160e01b600052602160045260246000fd5b14156112fe578261123b8587611b25565b6112459190611b05565b6001600160a01b0388166000908152600160205260408120805490919061126d908490611b44565b9091555061127d90508286611b44565b6001600160a01b038716600090815260026020526040812080549091906112a5908490611aed565b90915550839050846112b78488611b44565b6112c19190611b25565b6112cb9190611b05565b6001600160a01b038716600090815260016020526040812080549091906112f3908490611aed565b909155506114839050565b600081600381111561132057634e487b7160e01b600052602160045260246000fd5b1415611391576001600160a01b0387166000908152600260205260408120805487929061134e908490611b44565b9091555083905061135f8587611b25565b6113699190611b05565b6001600160a01b038816600090815260016020526040812080549091906112a5908490611b44565b60028160038111156113b357634e487b7160e01b600052602160045260246000fd5b14156113f2576001600160a01b038716600090815260026020526040812080548792906113e1908490611b44565b9091555083905061123b8587611b25565b826113fd8587611b25565b6114079190611b05565b6001600160a01b0388166000908152600160205260408120805490919061142f908490611b44565b90915550839050846114418488611b44565b61144b9190611b25565b6114559190611b05565b6001600160a01b0387166000908152600160205260408120805490919061147d908490611aed565b90915550505b8261148e8584611b25565b6114989190611b05565b600760008282546114a99190611b44565b9250508190555081600860008282546114c29190611aed565b90915550506001600160a01b038087169088167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6115008589611b44565b60405190815260200160405180910390a350505050505050565b6002600054141561156d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610435565b6002600090815560405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044015b602060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f79190611a4a565b9050806116385760405162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b6044820152606401610435565b505060016000555050565b60006103ef825490565b6000610f5483836118ea565b600260005414156116ac5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610435565b600260009081556040516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490528516906323b872dd906064016115a5565b6000818152600183016020526040812054611735575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103ef565b5060006103ef565b60008181526001830160205260408120548015611850576000611761600183611b44565b855490915060009061177590600190611b44565b9050600086600001828154811061179c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106117cd57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556117e4836001611aed565b6000828152600189016020526040902055865487908061181457634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506103ef565b60009150506103ef565b60008061186860048561107f565b9050600061187760048561107f565b9050818015611884575080155b1561189257600092506118e2565b8115801561189d5750805b156118ab57600192506118e2565b811580156118b7575080155b156118c557600392506118e2565b8180156118cf5750805b156118dd57600292506118e2565b600392505b505092915050565b815460009082106119485760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610435565b82600001828154811061196b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b80356001600160a01b038116811461199557600080fd5b919050565b6000602082840312156119ab578081fd5b610f548261197e565b600080604083850312156119c6578081fd5b6119cf8361197e565b91506119dd6020840161197e565b90509250929050565b6000806000606084860312156119fa578081fd5b611a038461197e565b9250611a116020850161197e565b9150604084013590509250925092565b60008060408385031215611a33578182fd5b611a3c8361197e565b946020939093013593505050565b600060208284031215611a5b578081fd5b81518015158114610f54578182fd5b600060208284031215611a7b578081fd5b5035919050565b600060208284031215611a93578081fd5b5051919050565b6000602080835283518082850152825b81811015611ac657858101830151858201604001528201611aaa565b81811115611ad75783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115611b0057611b00611bb1565b500190565b600082611b2057634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611b3f57611b3f611bb1565b500290565b600082821015611b5657611b56611bb1565b500390565b600181811c90821680611b6f57607f821691505b60208210811415611b9057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611baa57611baa611bb1565b5060010190565b634e487b7160e01b600052601160045260246000fdfea264697066735822122038d793d1732753697409b1545fa71ca8c81a4112009880a851b17e5479c4bc1364736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063b6b55f251161007c578063b6b55f251461029c578063cba0e996146102af578063d8331430146102c2578063dd62ed3e146102d5578063e0bab4c41461030e578063e57f14e11461033957600080fd5b806370a0823114610236578063771282f6146102495780638d40109a1461026657806395d89b411461026e578063a457c2d714610276578063a9059cbb1461028957600080fd5b806323b872dd1161011557806323b872dd146101c25780632b414264146101d55780632bae9623146101e85780632e1a7d4d146101fb578063313ce5671461020e578063395093511461022357600080fd5b806306fdde0314610152578063095ea7b31461017057806313114a9d1461019357806316a2f82a146101a557806318160ddd146101ba575b600080fd5b61015a61034c565b6040516101679190611a9a565b60405180910390f35b61018361017e366004611a21565b6103de565b6040519015158152602001610167565b6008545b604051908152602001610167565b6101b86101b336600461199a565b6103f5565b005b600654610197565b6101836101d03660046119e6565b6104b0565b6101b86101e33660046119b4565b610502565b6101b86101f6366004611a6a565b61058c565b6101b8610209366004611a6a565b610663565b600b5460405160ff9091168152602001610167565b610183610231366004611a21565b6108b2565b61019761024436600461199a565b6108e9565b61025161095f565b60408051928352602083019190915201610167565b6101b8610acd565b61015a610bb3565b610183610284366004611a21565b610bc2565b610183610297366004611a21565b610bf9565b6101b86102aa366004611a6a565b610c06565b6101836102bd36600461199a565b610e05565b6101976102d0366004611a6a565b610e12565b6101976102e33660046119b4565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600d54610321906001600160a01b031681565b6040516001600160a01b039091168152602001610167565b6101b861034736600461199a565b610e2f565b60606009805461035b90611b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461038790611b5b565b80156103d45780601f106103a9576101008083540402835291602001916103d4565b820191906000526020600020905b8154815290600101906020018083116103b757829003601f168201915b5050505050905090565b60006103eb338484610f5b565b5060015b92915050565b600c546001600160a01b0316331461043e5760405162461bcd60e51b81526020600482015260076024820152666f70206f6e6c7960c81b60448201526064015b60405180910390fd5b61044960048261107f565b6104885760405162461bcd60e51b815260206004820152601060248201526f1859191c995cdcc8195e18db1d59195960821b6044820152606401610435565b6001600160a01b0381166000908152600260205260408120556104ac6004826110a1565b5050565b60006104bd8484846110b6565b6001600160a01b0384166000908152600360209081526040808320338085529252909120546104f89186916104f3908690611b44565b610f5b565b5060019392505050565b600b5461010090046001600160a01b031633146105545760405162461bcd60e51b815260206004820152601060248201526f1bdb9b1e481bdc0818d85b8818d85b1b60821b6044820152606401610435565b600b8054610100600160a81b0319166101006001600160a01b0394851602179055600c80546001600160a01b03191691909216179055565b61059533610e05565b156105d05760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610435565b6000806105db61095f565b9092509050806105eb8385611b25565b6105f59190611b05565b3360009081526001602052604081208054909190610614908490611b44565b909155508190506106258385611b25565b61062f9190611b05565b600760008282546106409190611b44565b9250508190555082600860008282546106599190611aed565b9091555050505050565b8061066d336108e9565b1015801561067d57506006548111155b6106bb5760405162461bcd60e51b815260206004820152600f60248201526e1a5b9d985b1a590817d85b5bdd5b9d608a1b6044820152606401610435565b6000806106c661095f565b909250905060006106d8606485611b05565b905060006106e7600a83611b05565b905060006106f58387611b44565b905061070033610e05565b15610769573360009081526002602052604081208054889290610724908490611b44565b909155508490506107358688611b25565b61073f9190611b05565b336000908152600160205260408120805490919061075e908490611b44565b909155506107a39050565b836107748688611b25565b61077e9190611b05565b336000908152600160205260408120805490919061079d908490611b44565b90915550505b6107ad8282611aed565b600660008282546107be9190611b44565b90915550849050856107d08484611aed565b6107da9190611b25565b6107e49190611b05565b600760008282546107f59190611b44565b909155508490506108068684611b25565b6108109190611b05565b600b5461010090046001600160a01b03166000908152600160205260408120805490919061083f908490611aed565b9250508190555081600860008282546108589190611aed565b9091555050600d54610874906001600160a01b0316338361151a565b60405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65906020015b60405180910390a2505050505050565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916103eb9185906104f3908690611aed565b60006108f660048361107f565b1561091757506001600160a01b031660009081526002602052604090205490565b60008061092261095f565b6001600160a01b0386166000908152600160205260409020549193509150829061094d908390611b25565b6109579190611b05565b949350505050565b600080600754600014806109735750600654155b156109855750633b9aca009160019150565b60075460065460005b6109986004611643565b811015610a9c5782600160006109af60048561164d565b6001600160a01b03166001600160a01b03168152602001908152602001600020541180610a0a575081600260006109e760048561164d565b6001600160a01b03166001600160a01b0316815260200190815260200160002054115b15610a2057600754600654945094505050509091565b60016000610a2f60048461164d565b6001600160a01b03168152602081019190915260400160002054610a539084611b44565b925060026000610a6460048461164d565b6001600160a01b03168152602081019190915260400160002054610a889083611b44565b915080610a9481611b96565b91505061098e565b50600654600754610aad9190611b05565b821015610ac4576007546006549350935050509091565b90939092509050565b600b5461010090046001600160a01b03163314610ae957600080fd5b600654600d546040516370a0823160e01b8152306004820152600092916001600160a01b0316906370a082319060240160206040518083038186803b158015610b3157600080fd5b505afa158015610b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b699190611a82565b610b739190611b44565b600d54600b54919250610b99916001600160a01b0391821691610100909104168361151a565b8060066000828254610bab9190611b44565b909155505050565b6060600a805461035b90611b5b565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916103eb9185906104f3908690611b44565b60006103eb3384846110b6565b60008111610c4e5760405162461bcd60e51b815260206004820152601560248201527463616e2774206465706f736974206e6f7468696e6760581b6044820152606401610435565b600d54610c65906001600160a01b03163383611659565b600080610c7061095f565b90925090506000610c82606485611b05565b90506000610c91600a83611b05565b9050600082610ca05785610caa565b610caa8387611b44565b90508560066000828254610cbe9190611aed565b90915550610ccd905033610e05565b15610d0157610cdc8387611b44565b3360009081526002602052604081208054909190610cfb908490611aed565b90915550505b8160086000828254610d139190611aed565b90915550849050610d248684611b25565b610d2e9190611b05565b600b5461010090046001600160a01b031660009081526001602052604081208054909190610d5d908490611aed565b9091555084905085610d6f8484611aed565b610d799190611b25565b610d839190611b05565b60076000828254610d949190611aed565b90915550849050610da58683611b25565b610daf9190611b05565b3360009081526001602052604081208054909190610dce908490611aed565b909155505060405186815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020016108a2565b60006103ef60048361107f565b6000806000610e1f61095f565b90925090508161094d8286611b25565b600c546001600160a01b03163314610e735760405162461bcd60e51b81526020600482015260076024820152666f70206f6e6c7960c81b6044820152606401610435565b610e7e60048261107f565b15610ebe5760405162461bcd60e51b815260206004820152601060248201526f1859191c995cdcc8195e18db1d59195960821b6044820152606401610435565b6001600160a01b03811660009081526001602052604090205415610f3857600080610ee761095f565b6001600160a01b03851660009081526001602052604090205491935091508290610f12908390611b25565b610f1c9190611b05565b6001600160a01b03841660009081526002602052604090205550505b6104ac6004825b6000610f54836001600160a01b0384166116ee565b9392505050565b6001600160a01b038316610fbd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610435565b6001600160a01b03821661101e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610435565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526001830160205260408120541515610f54565b6000610f54836001600160a01b03841661173d565b6001600160a01b03831661111a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610435565b6001600160a01b03821661117c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610435565b600081116111db5760405162461bcd60e51b815260206004820152602660248201527f5472616e7366657220616d74206d7573742062652067726561746572207468616044820152656e207a65726f60d01b6064820152608401610435565b6000806111e661095f565b909250905060006111f8606485611b05565b90506000611206878761185a565b9050600181600381111561122a57634e487b7160e01b600052602160045260246000fd5b14156112fe578261123b8587611b25565b6112459190611b05565b6001600160a01b0388166000908152600160205260408120805490919061126d908490611b44565b9091555061127d90508286611b44565b6001600160a01b038716600090815260026020526040812080549091906112a5908490611aed565b90915550839050846112b78488611b44565b6112c19190611b25565b6112cb9190611b05565b6001600160a01b038716600090815260016020526040812080549091906112f3908490611aed565b909155506114839050565b600081600381111561132057634e487b7160e01b600052602160045260246000fd5b1415611391576001600160a01b0387166000908152600260205260408120805487929061134e908490611b44565b9091555083905061135f8587611b25565b6113699190611b05565b6001600160a01b038816600090815260016020526040812080549091906112a5908490611b44565b60028160038111156113b357634e487b7160e01b600052602160045260246000fd5b14156113f2576001600160a01b038716600090815260026020526040812080548792906113e1908490611b44565b9091555083905061123b8587611b25565b826113fd8587611b25565b6114079190611b05565b6001600160a01b0388166000908152600160205260408120805490919061142f908490611b44565b90915550839050846114418488611b44565b61144b9190611b25565b6114559190611b05565b6001600160a01b0387166000908152600160205260408120805490919061147d908490611aed565b90915550505b8261148e8584611b25565b6114989190611b05565b600760008282546114a99190611b44565b9250508190555081600860008282546114c29190611aed565b90915550506001600160a01b038087169088167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6115008589611b44565b60405190815260200160405180910390a350505050505050565b6002600054141561156d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610435565b6002600090815560405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044015b602060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f79190611a4a565b9050806116385760405162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b6044820152606401610435565b505060016000555050565b60006103ef825490565b6000610f5483836118ea565b600260005414156116ac5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610435565b600260009081556040516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018490528516906323b872dd906064016115a5565b6000818152600183016020526040812054611735575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103ef565b5060006103ef565b60008181526001830160205260408120548015611850576000611761600183611b44565b855490915060009061177590600190611b44565b9050600086600001828154811061179c57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050808760000184815481106117cd57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001556117e4836001611aed565b6000828152600189016020526040902055865487908061181457634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506103ef565b60009150506103ef565b60008061186860048561107f565b9050600061187760048561107f565b9050818015611884575080155b1561189257600092506118e2565b8115801561189d5750805b156118ab57600192506118e2565b811580156118b7575080155b156118c557600392506118e2565b8180156118cf5750805b156118dd57600292506118e2565b600392505b505092915050565b815460009082106119485760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610435565b82600001828154811061196b57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b80356001600160a01b038116811461199557600080fd5b919050565b6000602082840312156119ab578081fd5b610f548261197e565b600080604083850312156119c6578081fd5b6119cf8361197e565b91506119dd6020840161197e565b90509250929050565b6000806000606084860312156119fa578081fd5b611a038461197e565b9250611a116020850161197e565b9150604084013590509250925092565b60008060408385031215611a33578182fd5b611a3c8361197e565b946020939093013593505050565b600060208284031215611a5b578081fd5b81518015158114610f54578182fd5b600060208284031215611a7b578081fd5b5035919050565b600060208284031215611a93578081fd5b5051919050565b6000602080835283518082850152825b81811015611ac657858101830151858201604001528201611aaa565b81811115611ad75783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115611b0057611b00611bb1565b500190565b600082611b2057634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611b3f57611b3f611bb1565b500290565b600082821015611b5657611b56611bb1565b500390565b600181811c90821680611b6f57607f821691505b60208210811415611b9057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611baa57611baa611bb1565b5060010190565b634e487b7160e01b600052601160045260246000fdfea264697066735822122038d793d1732753697409b1545fa71ca8c81a4112009880a851b17e5479c4bc1364736f6c63430008040033
Deployed Bytecode Sourcemap
23314:10080:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24439:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25422:159;;;;;;:::i;:::-;;:::i;:::-;;;3008:14:1;;3001:22;2983:41;;2971:2;2956:18;25422:159:0;2938:92:1;26446:88:0;26515:11;;26446:88;;;8980:25:1;;;8968:2;8953:18;26446:88:0;8935:76:1;29546:271:0;;;;;;:::i;:::-;;:::i;:::-;;24716:98;24796:10;;24716:98;;25589:262;;;;;;:::i;:::-;;:::i;33228:163::-;;;;;;:::i;:::-;;:::i;28833:283::-;;;;;;:::i;:::-;;:::i;27798:793::-;;;;;;:::i;:::-;;:::i;24625:83::-;24691:9;;24625:83;;24691:9;;;;9411:36:1;;9399:2;9384:18;24625:83:0;9366:87:1;25859:211:0;;;;;;:::i;:::-;;:::i;24822:268::-;;;;;;:::i;:::-;;:::i;32495:721::-;;;:::i;:::-;;;;9190:25:1;;;9246:2;9231:18;;9224:34;;;;9163:18;32495:721:0;9145:119:1;26546:277:0;;;:::i;24530:87::-;;;:::i;26078:221::-;;;;;;:::i;:::-;;:::i;25098:165::-;;;;;;:::i;:::-;;:::i;26835:696::-;;;;;;:::i;:::-;;:::i;26307:131::-;;;;;;:::i;:::-;;:::i;29829:171::-;;;;;;:::i;:::-;;:::i;25271:143::-;;;;;;:::i;:::-;-1:-1:-1;;;;;25379:18:0;;;25352:7;25379:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;25271:143;24011:63;;;;;-1:-1:-1;;;;;24011:63:0;;;;;;-1:-1:-1;;;;;2140:32:1;;;2122:51;;2110:2;2095:18;24011:63:0;2077:102:1;29124:414:0;;;;;;:::i;:::-;;:::i;24439:83::-;24476:13;24509:5;24502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24439:83;:::o;25422:159::-;25497:4;25514:37;25523:10;25535:7;25544:6;25514:8;:37::i;:::-;-1:-1:-1;25569:4:0;25422:159;;;;;:::o;29546:271::-;29628:3;;-1:-1:-1;;;;;29628:3:0;29614:10;:17;29606:37;;;;-1:-1:-1;;;29606:37:0;;6090:2:1;29606:37:0;;;6072:21:1;6129:1;6109:18;;;6102:29;-1:-1:-1;;;6147:18:1;;;6140:37;6194:18;;29606:37:0;;;;;;;;;29662:41;29685:8;29695:7;29662:22;:41::i;:::-;29654:70;;;;-1:-1:-1;;;29654:70:0;;5405:2:1;29654:70:0;;;5387:21:1;5444:2;5424:18;;;5417:30;-1:-1:-1;;;5463:18:1;;;5456:46;5519:18;;29654:70:0;5377:166:1;29654:70:0;-1:-1:-1;;;;;29735:20:0;;29758:1;29735:20;;;:11;:20;;;;;:24;29770:39;29791:8;29747:7;29770:20;:39::i;:::-;;29546:271;:::o;25589:262::-;25687:4;25704:36;25714:6;25722:9;25733:6;25704:9;:36::i;:::-;-1:-1:-1;;;;;25780:19:0;;;;;;:11;:19;;;;;;;;25768:10;25780:31;;;;;;;;;25751:70;;25760:6;;25780:40;;25814:6;;25780:40;:::i;:::-;25751:8;:70::i;:::-;-1:-1:-1;25839:4:0;25589:262;;;;;:::o;33228:163::-;33316:2;;;;;-1:-1:-1;;;;;33316:2:0;33302:10;:16;33294:45;;;;-1:-1:-1;;;33294:45:0;;7175:2:1;33294:45:0;;;7157:21:1;7214:2;7194:18;;;7187:30;-1:-1:-1;;;7233:18:1;;;7226:46;7289:18;;33294:45:0;7147:166:1;33294:45:0;33350:2;:10;;-1:-1:-1;;;;;;33350:10:0;;-1:-1:-1;;;;;33350:10:0;;;;;;;33371:3;:12;;-1:-1:-1;;;;;;33371:12:0;;;;;;;;33228:163::o;28833:283::-;28897:22;28908:10;28897;:22::i;:::-;28896:23;28888:47;;;;-1:-1:-1;;;28888:47:0;;5750:2:1;28888:47:0;;;5732:21:1;5789:2;5769:18;;;5762:30;-1:-1:-1;;;5808:18:1;;;5801:41;5859:18;;28888:47:0;5722:161:1;28888:47:0;28947:9;28958;28971:15;:13;:15::i;:::-;28946:40;;-1:-1:-1;28946:40:0;-1:-1:-1;28946:40:0;29026:7;28946:40;29026:3;:7;:::i;:::-;29025:13;;;;:::i;:::-;29009:10;28997:23;;;;:11;:23;;;;;:42;;:23;;;:42;;;;;:::i;:::-;;;;-1:-1:-1;29077:1:0;;-1:-1:-1;29066:7:0;29072:1;29066:3;:7;:::i;:::-;29065:13;;;;:::i;:::-;29050:10;;:29;;;;;;;:::i;:::-;;;;;;;;29105:3;29090:11;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;28833:283:0:o;27798:793::-;27885:7;27860:21;27870:10;27860:9;:21::i;:::-;:32;;:60;;;;-1:-1:-1;24796:10:0;;27896:7;:24;;27860:60;27852:88;;;;-1:-1:-1;;;27852:88:0;;6425:2:1;27852:88:0;;;6407:21:1;6464:2;6444:18;;;6437:30;-1:-1:-1;;;6483:18:1;;;6476:45;6538:18;;27852:88:0;6397:165:1;27852:88:0;27952:9;27963;27976:15;:13;:15::i;:::-;27951:40;;-1:-1:-1;27951:40:0;-1:-1:-1;28002:11:0;28016:13;28026:3;28016:7;:13;:::i;:::-;28002:27;-1:-1:-1;28040:10:0;28053:8;28059:2;28002:27;28053:8;:::i;:::-;28040:21;-1:-1:-1;28072:11:0;28086:13;28096:3;28086:7;:13;:::i;:::-;28072:27;;28113:22;28124:10;28113;:22::i;:::-;28110:228;;;28164:10;28152:23;;;;:11;:23;;;;;:34;;28179:7;;28152:23;:34;;28179:7;;28152:34;:::i;:::-;;;;-1:-1:-1;28245:1:0;;-1:-1:-1;28230:11:0;28240:1;28230:7;:11;:::i;:::-;28229:17;;;;:::i;:::-;28213:10;28201:23;;;;:11;:23;;;;;:46;;:23;;;:46;;;;;:::i;:::-;;;;-1:-1:-1;28110:228:0;;-1:-1:-1;28110:228:0;;28324:1;28309:11;28319:1;28309:7;:11;:::i;:::-;28308:17;;;;:::i;:::-;28292:10;28280:23;;;;:11;:23;;;;;:46;;:23;;;:46;;;;;:::i;:::-;;;;-1:-1:-1;;28110:228:0;28363:8;28369:2;28363:3;:8;:::i;:::-;28348:10;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;28418:1:0;;-1:-1:-1;28412:1:0;28400:8;28406:2;28400:3;:8;:::i;:::-;28399:14;;;;:::i;:::-;28398:21;;;;:::i;:::-;28383:10;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;28462:1:0;;-1:-1:-1;28452:6:0;28457:1;28452:2;:6;:::i;:::-;28451:12;;;;:::i;:::-;28443:2;;;;;-1:-1:-1;;;;;28443:2:0;28431:15;;;;:11;:15;;;;;:33;;:15;;;:33;;;;;:::i;:::-;;;;;;;;28490:2;28475:11;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;28519:3:0;;28503:37;;-1:-1:-1;;;;;28519:3:0;28524:10;28536:3;28503:15;:37::i;:::-;28556:27;;8980:25:1;;;28567:10:0;;28556:27;;8968:2:1;8953:18;28556:27:0;;;;;;;;27798:793;;;;;;:::o;25859:211::-;25973:10;25947:4;25994:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;25994:32:0;;;;;;;;;;25947:4;;25964:76;;25985:7;;25994:45;;26029:10;;25994:45;:::i;24822:268::-;24888:7;24912:41;24935:8;24945:7;24912:22;:41::i;:::-;24908:74;;;-1:-1:-1;;;;;;24962:20:0;;;;;:11;:20;;;;;;;24822:268::o;24908:74::-;24994:9;25005;25018:15;:13;:15::i;:::-;-1:-1:-1;;;;;25052:20:0;;;;;;:11;:20;;;;;;24993:40;;-1:-1:-1;24993:40:0;-1:-1:-1;24993:40:0;;25052:24;;24993:40;;25052:24;:::i;:::-;25051:31;;;;:::i;:::-;25044:38;24822:268;-1:-1:-1;;;;24822:268:0:o;32495:721::-;32540:7;32549;32572:10;;32586:1;32572:15;:34;;;-1:-1:-1;32591:10:0;;:15;32572:34;32569:61;;;-1:-1:-1;32616:10:0;;32628:1;;-1:-1:-1;32495:721:0:o;32569:61::-;32659:10;;32698;;32641:15;32719:373;32743:30;32764:8;32743:20;:30::i;:::-;32739:1;:34;32719:373;;;32844:7;32799:11;:42;32811:29;32828:8;32838:1;32811:16;:29::i;:::-;-1:-1:-1;;;;;32799:42:0;-1:-1:-1;;;;;32799:42:0;;;;;;;;;;;;;:52;:108;;;;32900:7;32855:11;:42;32867:29;32884:8;32894:1;32867:16;:29::i;:::-;-1:-1:-1;;;;;32855:42:0;-1:-1:-1;;;;;32855:42:0;;;;;;;;;;;;;:52;32799:108;32795:145;;;32917:10;;32929;;32909:31;;;;;;;32495:721;;:::o;32795:145::-;32967:11;:42;32979:29;32996:8;33006:1;32979:16;:29::i;:::-;-1:-1:-1;;;;;32967:42:0;;;;;;;;;;;;-1:-1:-1;32967:42:0;;32955:55;;;;:::i;:::-;;;33037:11;:42;33049:29;33066:8;33076:1;33049:16;:29::i;:::-;-1:-1:-1;;;;;33037:42:0;;;;;;;;;;;;-1:-1:-1;33037:42:0;;33025:55;;;;:::i;:::-;;-1:-1:-1;32775:3:0;;;;:::i;:::-;;;;32719:373;;;;33129:10;;33116;;:23;;;;:::i;:::-;33106:7;:33;33102:70;;;33149:10;;33161;;33141:31;;;;;;32495:721;;:::o;33102:70::-;33191:7;;33200;;-1:-1:-1;32495:721:0;-1:-1:-1;32495:721:0:o;26546:277::-;26609:2;;;;;-1:-1:-1;;;;;26609:2:0;26595:10;:16;26586:26;;;;;;26692:10;;26658:3;;26651:36;;-1:-1:-1;;;26651:36:0;;26681:4;26651:36;;;2122:51:1;26623:24:0;;26692:10;-1:-1:-1;;;;;26658:3:0;;26651:21;;2095:18:1;;26651:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26650:53;;;;:::i;:::-;26730:3;;26735:2;;26623:80;;-1:-1:-1;26714:42:0;;-1:-1:-1;;;;;26730:3:0;;;;;26735:2;;;;26623:80;26714:15;:42::i;:::-;26781:16;26767:10;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;26546:277:0:o;24530:87::-;24569:13;24602:7;24595:14;;;;;:::i;26078:221::-;26197:10;26171:4;26218:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;26218:32:0;;;;;;;;;;26171:4;;26188:81;;26209:7;;26218:50;;26253:15;;26218:50;:::i;25098:165::-;25176:4;25193:40;25203:10;25215:9;25226:6;25193:9;:40::i;26835:696::-;26906:1;26896:7;:11;26888:45;;;;-1:-1:-1;;;26888:45:0;;4652:2:1;26888:45:0;;;4634:21:1;4691:2;4671:18;;;4664:30;-1:-1:-1;;;4710:18:1;;;4703:51;4771:18;;26888:45:0;4624:171:1;26888:45:0;26960:3;;26944:41;;-1:-1:-1;;;;;26960:3:0;26965:10;26977:7;26944:15;:41::i;:::-;26997:9;27008;27021:15;:13;:15::i;:::-;26996:40;;-1:-1:-1;26996:40:0;-1:-1:-1;27047:11:0;27061:13;27071:3;27061:7;:13;:::i;:::-;27047:27;-1:-1:-1;27086:10:0;27099:8;27105:2;27047:27;27099:8;:::i;:::-;27086:21;-1:-1:-1;27118:11:0;27132:8;:38;;27163:7;27132:38;;;27144:15;27155:3;27144:7;:15;:::i;:::-;27118:52;;27195:7;27181:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;27216:22:0;;-1:-1:-1;27227:10:0;27216;:22::i;:::-;27213:94;;;27282:12;27291:3;27282:7;:12;:::i;:::-;27266:10;27254:23;;;;:11;:23;;;;;:41;;:23;;;:41;;;;;:::i;:::-;;;;-1:-1:-1;;27213:94:0;27333:2;27318:11;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;27377:1:0;;-1:-1:-1;27367:6:0;27372:1;27367:2;:6;:::i;:::-;27366:12;;;;:::i;:::-;27358:2;;;;;-1:-1:-1;;;;;27358:2:0;27346:15;;;;:11;:15;;;;;:33;;:15;;;:33;;;;;:::i;:::-;;;;-1:-1:-1;27424:1:0;;-1:-1:-1;27419:1:0;27407:8;27413:2;27407:3;:8;:::i;:::-;27406:14;;;;:::i;:::-;27405:20;;;;:::i;:::-;27390:10;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;27477:1:0;;-1:-1:-1;27466:7:0;27472:1;27466:3;:7;:::i;:::-;27465:13;;;;:::i;:::-;27449:10;27437:23;;;;:11;:23;;;;;:42;;:23;;;:42;;;;;:::i;:::-;;;;-1:-1:-1;;27495:28:0;;8980:25:1;;;27503:10:0;;27495:28;;8968:2:1;8953:18;27495:28:0;8935:76:1;26307:131:0;26365:4;26389:41;26412:8;26422:7;26389:22;:41::i;29829:171::-;29894:7;29915:9;29926;29939:15;:13;:15::i;:::-;29914:40;;-1:-1:-1;29914:40:0;-1:-1:-1;29914:40:0;29973:14;29914:40;29973:10;:14;:::i;29124:414::-;29208:3;;-1:-1:-1;;;;;29208:3:0;29194:10;:17;29186:37;;;;-1:-1:-1;;;29186:37:0;;6090:2:1;29186:37:0;;;6072:21:1;6129:1;6109:18;;;6102:29;-1:-1:-1;;;6147:18:1;;;6140:37;6194:18;;29186:37:0;6062:156:1;29186:37:0;29243:41;29266:8;29276:7;29243:22;:41::i;:::-;29242:42;29234:71;;;;-1:-1:-1;;;29234:71:0;;5405:2:1;29234:71:0;;;5387:21:1;5444:2;5424:18;;;5417:30;-1:-1:-1;;;5463:18:1;;;5456:46;5519:18;;29234:71:0;5377:166:1;29234:71:0;-1:-1:-1;;;;;29319:20:0;;29342:1;29319:20;;;:11;:20;;;;;;:24;29316:168;;29361:9;29372;29385:15;:13;:15::i;:::-;-1:-1:-1;;;;;29439:20:0;;;;;;:11;:20;;;;;;29360:40;;-1:-1:-1;29360:40:0;-1:-1:-1;29360:40:0;;29439:26;;29360:40;;29439:26;:::i;:::-;29438:34;;;;:::i;:::-;-1:-1:-1;;;;;29415:20:0;;;;;;:11;:20;;;;;:57;-1:-1:-1;;29316:168:0;29494:36;29512:8;29522:7;5964:152;6034:4;6058:50;6063:3;-1:-1:-1;;;;;6083:23:0;;6058:4;:50::i;:::-;6051:57;5964:152;-1:-1:-1;;;5964:152:0:o;30010:337::-;-1:-1:-1;;;;;30103:19:0;;30095:68;;;;-1:-1:-1;;;30095:68:0;;7520:2:1;30095:68:0;;;7502:21:1;7559:2;7539:18;;;7532:30;7598:34;7578:18;;;7571:62;-1:-1:-1;;;7649:18:1;;;7642:34;7693:19;;30095:68:0;7492:226:1;30095:68:0;-1:-1:-1;;;;;30182:21:0;;30174:68;;;;-1:-1:-1;;;30174:68:0;;5002:2:1;30174:68:0;;;4984:21:1;5041:2;5021:18;;;5014:30;5080:34;5060:18;;;5053:62;-1:-1:-1;;;5131:18:1;;;5124:32;5173:19;;30174:68:0;4974:224:1;30174:68:0;-1:-1:-1;;;;;30255:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30307:32;;8980:25:1;;;30307:32:0;;8953:18:1;30307:32:0;;;;;;;30010:337;;;:::o;6536:167::-;-1:-1:-1;;;;;6670:23:0;;6616:4;3345:19;;;:12;;;:19;;;;;;:24;;6640:55;3248:129;6292:158;6365:4;6389:53;6397:3;-1:-1:-1;;;;;6417:23:0;;6389:7;:53::i;31088:1399::-;-1:-1:-1;;;;;31182:20:0;;31174:70;;;;-1:-1:-1;;;31174:70:0;;6769:2:1;31174:70:0;;;6751:21:1;6808:2;6788:18;;;6781:30;6847:34;6827:18;;;6820:62;-1:-1:-1;;;6898:18:1;;;6891:35;6943:19;;31174:70:0;6741:227:1;31174:70:0;-1:-1:-1;;;;;31263:23:0;;31255:71;;;;-1:-1:-1;;;31255:71:0;;4248:2:1;31255:71:0;;;4230:21:1;4287:2;4267:18;;;4260:30;4326:34;4306:18;;;4299:62;-1:-1:-1;;;4377:18:1;;;4370:33;4420:19;;31255:71:0;4220:225:1;31255:71:0;31351:1;31345:3;:7;31337:58;;;;-1:-1:-1;;;31337:58:0;;8629:2:1;31337:58:0;;;8611:21:1;8668:2;8648:18;;;8641:30;8707:34;8687:18;;;8680:62;-1:-1:-1;;;8758:18:1;;;8751:36;8804:19;;31337:58:0;8601:228:1;31337:58:0;31407:9;31418;31431:15;:13;:15::i;:::-;31406:40;;-1:-1:-1;31406:40:0;-1:-1:-1;31457:11:0;31471:9;31477:3;31471;:9;:::i;:::-;31457:23;;31491:9;31503:27;31512:6;31520:9;31503:8;:27::i;:::-;31491:39;-1:-1:-1;31551:17:0;31545:2;:23;;;;;;-1:-1:-1;;;31545:23:0;;;;;;;;;;31541:815;;;31621:1;31610:7;31616:1;31610:3;:7;:::i;:::-;31609:13;;;;:::i;:::-;-1:-1:-1;;;;;31585:19:0;;;;;;:11;:19;;;;;:38;;:19;;;:38;;;;;:::i;:::-;;;;-1:-1:-1;31665:9:0;;-1:-1:-1;31671:3:0;31665;:9;:::i;:::-;-1:-1:-1;;;;;31638:22:0;;;;;;:11;:22;;;;;:37;;:22;;;:37;;;;;:::i;:::-;;;;-1:-1:-1;31737:1:0;;-1:-1:-1;31732:1:0;31719:9;31725:3;31719;:9;:::i;:::-;31718:15;;;;:::i;:::-;31717:21;;;;:::i;:::-;-1:-1:-1;;;;;31690:22:0;;;;;;:11;:22;;;;;:49;;:22;;;:49;;;;;:::i;:::-;;;;-1:-1:-1;31541:815:0;;-1:-1:-1;31541:815:0;;31767:19;31761:2;:25;;;;;;-1:-1:-1;;;31761:25:0;;;;;;;;;;31757:599;;;-1:-1:-1;;;;;31803:19:0;;;;;;:11;:19;;;;;:28;;31827:3;;31803:19;:28;;31827:3;;31803:28;:::i;:::-;;;;-1:-1:-1;31882:1:0;;-1:-1:-1;31871:7:0;31877:1;31871:3;:7;:::i;:::-;31870:13;;;;:::i;:::-;-1:-1:-1;;;;;31846:19:0;;;;;;:11;:19;;;;;:38;;:19;;;:38;;;;;:::i;31757:599::-;31976:19;31970:2;:25;;;;;;-1:-1:-1;;;31970:25:0;;;;;;;;;;31966:390;;;-1:-1:-1;;;;;32012:19:0;;;;;;:11;:19;;;;;:28;;32036:3;;32012:19;:28;;32036:3;;32012:28;:::i;:::-;;;;-1:-1:-1;32091:1:0;;-1:-1:-1;32080:7:0;32086:1;32080:3;:7;:::i;31966:390::-;32278:1;32267:7;32273:1;32267:3;:7;:::i;:::-;32266:13;;;;:::i;:::-;-1:-1:-1;;;;;32242:19:0;;;;;;:11;:19;;;;;:38;;:19;;;:38;;;;;:::i;:::-;;;;-1:-1:-1;32342:1:0;;-1:-1:-1;32337:1:0;32324:9;32330:3;32324;:9;:::i;:::-;32323:15;;;;:::i;:::-;32322:21;;;;:::i;:::-;-1:-1:-1;;;;;32295:22:0;;;;;;:11;:22;;;;;:49;;:22;;;:49;;;;;:::i;:::-;;;;-1:-1:-1;;31966:390:0;32394:1;32383:7;32389:1;32383:3;:7;:::i;:::-;32382:13;;;;:::i;:::-;32366:10;;:30;;;;;;;:::i;:::-;;;;;;;;32422:3;32407:11;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;32441:38:0;;;;;;;32469:9;32475:3;32469;:9;:::i;:::-;32441:38;;8980:25:1;;;8968:2;8953:18;32441:38:0;;;;;;;31088:1399;;;;;;;:::o;28603:218::-;9157:1;9308:7;;:19;;9300:63;;;;-1:-1:-1;;;9300:63:0;;8269:2:1;9300:63:0;;;8251:21:1;8308:2;8288:18;;;8281:30;8347:33;8327:18;;;8320:61;8398:18;;9300:63:0;8241:181:1;9300:63:0;9157:1;9376:7;:18;;;28736:34:::1;::::0;-1:-1:-1;;;28736:34:0;;-1:-1:-1;;;;;2756:32:1;;;28736:34:0::1;::::0;::::1;2738:51:1::0;2805:18;;;2798:34;;;28736:22:0;::::1;::::0;::::1;::::0;2711:18:1;;28736:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28724:46;;28789:4;28781:32;;;::::0;-1:-1:-1;;;28781:32:0;;7925:2:1;28781:32:0::1;::::0;::::1;7907:21:1::0;7964:2;7944:18;;;7937:30;-1:-1:-1;;;7983:18:1;;;7976:45;8038:18;;28781:32:0::1;7897:165:1::0;28781:32:0::1;-1:-1:-1::0;;9113:1:0;9421:7;:22;-1:-1:-1;;28603:218:0:o;6789:117::-;6852:7;6879:19;6887:3;3546:18;;3463:109;7250:158;7324:7;7375:22;7379:3;7391:5;7375:3;:22::i;27539:241::-;9157:1;9308:7;;:19;;9300:63;;;;-1:-1:-1;;;9300:63:0;;8269:2:1;9300:63:0;;;8251:21:1;8308:2;8288:18;;;8281:30;8347:33;8327:18;;;8320:61;8398:18;;9300:63:0;8241:181:1;9300:63:0;9157:1;9376:7;:18;;;27674:55:::1;::::0;-1:-1:-1;;;27674:55:0;;-1:-1:-1;;;;;2442:15:1;;;27674:55:0::1;::::0;::::1;2424:34:1::0;27715:4:0::1;2474:18:1::0;;;2467:43;2526:18;;;2519:34;;;27674:26:0;::::1;::::0;::::1;::::0;2359:18:1;;27674:55:0::1;2341:218:1::0;1028:414:0;1091:4;3345:19;;;:12;;;:19;;;;;;1108:327;;-1:-1:-1;1151:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;1334:18;;1312:19;;;:12;;;:19;;;;;;:40;;;;1367:11;;1108:327;-1:-1:-1;1418:5:0;1411:12;;1618:1544;1684:4;1823:19;;;:12;;;:19;;;;;;1859:15;;1855:1300;;2221:21;2245:14;2258:1;2245:10;:14;:::i;:::-;2294:18;;2221:38;;-1:-1:-1;2274:17:0;;2294:22;;2315:1;;2294:22;:::i;:::-;2274:42;;2561:17;2581:3;:11;;2593:9;2581:22;;;;;;-1:-1:-1;;;2581:22:0;;;;;;;;;;;;;;;;;2561:42;;2727:9;2698:3;:11;;2710:13;2698:26;;;;;;-1:-1:-1;;;2698:26:0;;;;;;;;;;;;;;;;;;:38;2830:17;:13;2846:1;2830:17;:::i;:::-;2804:23;;;;:12;;;:23;;;;;:43;2956:17;;2804:3;;2956:17;;;-1:-1:-1;;;2956:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;3051:3;:12;;:19;3064:5;3051:19;;;;;;;;;;;3044:26;;;3094:4;3087:11;;;;;;;;1855:1300;3138:5;3131:12;;;;;30355:727;30431:8;30452:21;30476:40;30499:8;30509:6;30476:22;:40::i;:::-;30452:64;;30527:24;30554:43;30577:8;30587:9;30554:22;:43::i;:::-;30527:70;;30612:16;:40;;;;;30633:19;30632:20;30612:40;30608:448;;;30673:19;30669:23;;30608:448;;;30715:16;30714:17;:40;;;;;30735:19;30714:40;30710:346;;;30775:17;30771:21;;30710:346;;;30815:16;30814:17;:41;;;;;30836:19;30835:20;30814:41;30810:246;;;30876:15;30872:19;;30810:246;;;30913:16;:39;;;;;30933:19;30913:39;30909:147;;;30973:19;30969:23;;30909:147;;;31029:15;31025:19;;30909:147;31066:8;;30355:727;;;;:::o;3916:204::-;4011:18;;3983:7;;4011:26;-1:-1:-1;4003:73:0;;;;-1:-1:-1;;;4003:73:0;;3845:2:1;4003:73:0;;;3827:21:1;3884:2;3864:18;;;3857:30;3923:34;3903:18;;;3896:62;-1:-1:-1;;;3974:18:1;;;3967:32;4016:19;;4003:73:0;3817:224:1;4003:73:0;4094:3;:11;;4106:5;4094:18;;;;;;-1:-1:-1;;;4094:18:0;;;;;;;;;;;;;;;;;4087:25;;3916:204;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;1079:6;1087;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:1:o;1280:297::-;1347:6;1400:2;1388:9;1379:7;1375:23;1371:32;1368:2;;;1421:6;1413;1406:22;1368:2;1458:9;1452:16;1511:5;1504:13;1497:21;1490:5;1487:32;1477:2;;1538:6;1530;1523:22;1582:190;1641:6;1694:2;1682:9;1673:7;1669:23;1665:32;1662:2;;;1715:6;1707;1700:22;1662:2;-1:-1:-1;1743:23:1;;1652:120;-1:-1:-1;1652:120:1:o;1777:194::-;1847:6;1900:2;1888:9;1879:7;1875:23;1871:32;1868:2;;;1921:6;1913;1906:22;1868:2;-1:-1:-1;1949:16:1;;1858:113;-1:-1:-1;1858:113:1:o;3035:603::-;3147:4;3176:2;3205;3194:9;3187:21;3237:6;3231:13;3280:6;3275:2;3264:9;3260:18;3253:34;3305:4;3318:140;3332:6;3329:1;3326:13;3318:140;;;3427:14;;;3423:23;;3417:30;3393:17;;;3412:2;3389:26;3382:66;3347:10;;3318:140;;;3476:6;3473:1;3470:13;3467:2;;;3546:4;3541:2;3532:6;3521:9;3517:22;3513:31;3506:45;3467:2;-1:-1:-1;3622:2:1;3601:15;-1:-1:-1;;3597:29:1;3582:45;;;;3629:2;3578:54;;3156:482;-1:-1:-1;;;3156:482:1:o;9458:128::-;9498:3;9529:1;9525:6;9522:1;9519:13;9516:2;;;9535:18;;:::i;:::-;-1:-1:-1;9571:9:1;;9506:80::o;9591:217::-;9631:1;9657;9647:2;;-1:-1:-1;;;9682:31:1;;9736:4;9733:1;9726:15;9764:4;9689:1;9754:15;9647:2;-1:-1:-1;9793:9:1;;9637:171::o;9813:168::-;9853:7;9919:1;9915;9911:6;9907:14;9904:1;9901:21;9896:1;9889:9;9882:17;9878:45;9875:2;;;9926:18;;:::i;:::-;-1:-1:-1;9966:9:1;;9865:116::o;9986:125::-;10026:4;10054:1;10051;10048:8;10045:2;;;10059:18;;:::i;:::-;-1:-1:-1;10096:9:1;;10035:76::o;10116:380::-;10195:1;10191:12;;;;10238;;;10259:2;;10313:4;10305:6;10301:17;10291:27;;10259:2;10366;10358:6;10355:14;10335:18;10332:38;10329:2;;;10412:10;10407:3;10403:20;10400:1;10393:31;10447:4;10444:1;10437:15;10475:4;10472:1;10465:15;10329:2;;10171:325;;;:::o;10501:135::-;10540:3;-1:-1:-1;;10561:17:1;;10558:2;;;10581:18;;:::i;:::-;-1:-1:-1;10628:1:1;10617:13;;10548:88::o;10641:127::-;10702:10;10697:3;10693:20;10690:1;10683:31;10733:4;10730:1;10723:15;10757:4;10754:1;10747:15
Swarm Source
ipfs://38d793d1732753697409b1545fa71ca8c81a4112009880a851b17e5479c4bc13
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1 | 740.4557 | $742.68 |
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.