Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 47 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Use Elena Pa... | 12429869 | 1324 days ago | IN | 0 ETH | 0.0285295 | ||||
Add Use Elena Pa... | 12426278 | 1324 days ago | IN | 0 ETH | 0.0442649 | ||||
Add Use Elena Pa... | 12424717 | 1325 days ago | IN | 0 ETH | 0.03138245 | ||||
Protocol Value F... | 12424297 | 1325 days ago | IN | 0 ETH | 0.03720669 | ||||
Grant Role | 12423601 | 1325 days ago | IN | 0 ETH | 0.01466628 | ||||
Protocol Value F... | 12422608 | 1325 days ago | IN | 0 ETH | 0.06400813 | ||||
Protocol Value F... | 12422564 | 1325 days ago | IN | 0 ETH | 0.06894488 | ||||
Protocol Value F... | 12420135 | 1325 days ago | IN | 0 ETH | 0.12391722 | ||||
Protocol Value F... | 12417029 | 1326 days ago | IN | 0 ETH | 0.09900765 | ||||
Protocol Value F... | 12407088 | 1327 days ago | IN | 0 ETH | 0.13053875 | ||||
Add Use Elena Pa... | 12406931 | 1327 days ago | IN | 0 ETH | 0.11109062 | ||||
Protocol Value F... | 12405255 | 1328 days ago | IN | 0 ETH | 0.0630622 | ||||
Add Use Elena Pa... | 12403952 | 1328 days ago | IN | 0 ETH | 0.03198496 | ||||
Protocol Value F... | 12370644 | 1333 days ago | IN | 0 ETH | 0.02680143 | ||||
Protocol Value F... | 12370589 | 1333 days ago | IN | 0 ETH | 0.02806267 | ||||
Protocol Value F... | 12370321 | 1333 days ago | IN | 0 ETH | 0.01860334 | ||||
Protocol Value F... | 12361461 | 1334 days ago | IN | 0 ETH | 0.01639617 | ||||
Add Use Elena Pa... | 12361421 | 1334 days ago | IN | 0 ETH | 0.01170976 | ||||
Protocol Value F... | 12351445 | 1336 days ago | IN | 0 ETH | 0.00914401 | ||||
Add Use Elena Pa... | 12351424 | 1336 days ago | IN | 0 ETH | 0.0085674 | ||||
Protocol Value F... | 12351365 | 1336 days ago | IN | 0 ETH | 0.0088287 | ||||
Protocol Value F... | 12347236 | 1337 days ago | IN | 0 ETH | 0.0116665 | ||||
Protocol Value F... | 12345063 | 1337 days ago | IN | 0 ETH | 0.01229712 | ||||
Protocol Value F... | 12336092 | 1338 days ago | IN | 0 ETH | 0.03026985 | ||||
Protocol Value F... | 12335881 | 1338 days ago | IN | 0 ETH | 0.02112583 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
USEComptrollerPool
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-18 */ //SPDX-License-Identifier: MIT pragma solidity 0.6.11; pragma experimental ABIEncoderV2; // ==================================================================== // ________ _______ // / ____/ /__ ____ ____ _ / ____(_)___ ____ _____ ________ // / __/ / / _ \/ __ \/ __ `/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ // / /___/ / __/ / / / /_/ / / __/ / / / / / /_/ / / / / /__/ __/ // /_____/_/\___/_/ /_/\__,_(_)_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ // // ==================================================================== // ====================== Elena Protocol (USE) ======================== // ==================================================================== // Dapp : https://elena.finance // Twitter : https://twitter.com/ElenaProtocol // Telegram: https://t.me/ElenaFinance // ==================================================================== // File: contracts\@openzeppelin\contracts\math\SafeMath.sol // License: MIT /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts\@openzeppelin\contracts\token\ERC20\IERC20.sol // License: MIT /** * @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: contracts\@openzeppelin\contracts\utils\Address.sol // License: MIT /** * @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) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @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); } } } } // File: contracts\@openzeppelin\contracts\token\ERC20\SafeERC20.sol // License: MIT /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts\@openzeppelin\contracts\utils\EnumerableSet.sol // License: MIT /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ 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]; } // 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(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(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(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(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)); } } // File: contracts\@openzeppelin\contracts\GSN\Context.sol // License: MIT /* * @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. */ abstract contract Context { 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; } } // File: contracts\@openzeppelin\contracts\access\AccessControl.sol // License: MIT /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts\Share\IShareToken.sol // License: MIT interface IShareToken is IERC20 { function pool_mint(address m_address, uint256 m_amount) external; function pool_burn_from(address b_address, uint256 b_amount) external; function burn(uint256 amount) external; } // File: contracts\Oracle\IUniswapPairOracle.sol // License: MIT // Fixed window oracle that recomputes the average price for the entire period once every period // Note that the price average is only guaranteed to be over at least 1 period, but may be over a longer period interface IUniswapPairOracle { function getPairToken(address token) external view returns(address); function containsToken(address token) external view returns(bool); function getSwapTokenReserve(address token) external view returns(uint256); function update() external returns(bool); // Note this will always return 0 before update has been called successfully for the first time. function consult(address token, uint amountIn) external view returns (uint amountOut); } // File: contracts\USE\IUSEStablecoin.sol // License: MIT interface IUSEStablecoin { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function owner_address() external returns (address); function creator_address() external returns (address); function timelock_address() external returns (address); function genesis_supply() external returns (uint256); function refresh_cooldown() external returns (uint256); function price_target() external returns (uint256); function price_band() external returns (uint256); function DEFAULT_ADMIN_ADDRESS() external returns (address); function COLLATERAL_RATIO_PAUSER() external returns (bytes32); function collateral_ratio_paused() external returns (bool); function last_call_time() external returns (uint256); function USEDAIOracle() external returns (IUniswapPairOracle); function USESharesOracle() external returns (IUniswapPairOracle); /* ========== VIEWS ========== */ function use_pools(address a) external view returns (bool); function global_collateral_ratio() external view returns (uint256); function use_price() external view returns (uint256); function share_price() external view returns (uint256); function share_price_in_use() external view returns (uint256); function globalCollateralValue() external view returns (uint256); /* ========== PUBLIC FUNCTIONS ========== */ function refreshCollateralRatio() external; function swapCollateralAmount() external view returns(uint256); function pool_mint(address m_address, uint256 m_amount) external; function pool_burn_from(address b_address, uint256 b_amount) external; function burn(uint256 amount) external; } // File: contracts\USE\Pools\IUSEPool.sol // License: MIT interface IUSEPool { function collatDollarBalance() external view returns (uint256); } // File: contracts\Uniswap\Interfaces\IUniswapV2Pair.sol // License: MIT interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts\Uniswap\Interfaces\IUniswapV2Factory.sol // License: MIT interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts\Uniswap\Interfaces\IUniswapV2Router01.sol // License: MIT interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: contracts\Comptroller\ProtocolValue.sol //License: MIT abstract contract ProtocolValue { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public constant PERCENT = 1e6; struct PCVInfo{ //remove uint256 targetTokenRemoved; uint256 otherTokenRemoved; uint256 liquidityRemoved; //swap uint256 otherTokenIn; uint256 targetTokenOut; //add uint256 targetTokenAdded; uint256 otherTokenAdded; uint256 liquidityAdded; //remain uint256 targetTokenRemain; } event PCVResult(address targetToken,address otherToken,uint256 lpp,uint256 cp,PCVInfo pcv); function _getPair(address router,address token0,address token1) internal view returns(address){ address _factory = IUniswapV2Router01(router).factory(); return IUniswapV2Factory(_factory).getPair(token0,token1); } function _checkOrApproveRouter(address _router,address _token,uint256 _amount) internal{ if(IERC20(_token).allowance(address(this),_router) < _amount){ IERC20(_token).safeApprove(_router,0); IERC20(_token).safeApprove(_router,uint256(-1)); } } function _swapToken(address router,address tokenIn,address tokenOut,uint256 amountIn) internal returns (uint256){ address[] memory path = new address[](2); path[0] = tokenIn; path[1] = tokenOut; uint256 exptime = block.timestamp+60; _checkOrApproveRouter(router,tokenIn,amountIn); return IUniswapV2Router01(router).swapExactTokensForTokens(amountIn,0,path,address(this),exptime)[1]; } function _addLiquidity( address router, address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal returns (uint amountA, uint amountB, uint liquidity){ uint256 exptime = block.timestamp+60; _checkOrApproveRouter(router,tokenA,amountADesired); _checkOrApproveRouter(router,tokenB,amountBDesired); return IUniswapV2Router01(router).addLiquidity(tokenA,tokenB,amountADesired,amountBDesired,amountAMin,amountBMin,address(this), exptime); } function _removeLiquidity( address router, address pair, address tokenA, address tokenB, uint256 lpp ) internal returns (uint amountA, uint amountB,uint256 liquidity){ uint256 exptime = block.timestamp+60; liquidity = IERC20(pair).balanceOf(address(this)).mul(lpp).div(PERCENT); _checkOrApproveRouter(router,pair,liquidity); (amountA, amountB) = IUniswapV2Router01(router).removeLiquidity(tokenA,tokenB,liquidity,0,0,address(this),exptime); } function getOtherToken(address _pair,address _targetToken) public view returns(address){ address token0 = IUniswapV2Pair(_pair).token0(); address token1 = IUniswapV2Pair(_pair).token1(); require(token0 == _targetToken || token1 == _targetToken,"!_targetToken"); return _targetToken == token0 ? token1 : token0; } function _protocolValue(address _router,address _pair,address _targetToken,uint256 _lpp,uint256 _cp) internal returns(uint256){ //only guard _targetToken address otherToken = getOtherToken(_pair,_targetToken); PCVInfo memory pcv = PCVInfo(0,0,0,0,0,0,0,0,0); //removeLiquidity (pcv.targetTokenRemoved,pcv.otherTokenRemoved,pcv.liquidityRemoved) = _removeLiquidity(_router,_pair,_targetToken,otherToken,_lpp); //swap _targetToken pcv.otherTokenIn = pcv.otherTokenRemoved.mul(_cp).div(PERCENT); pcv.targetTokenOut = _swapToken(_router,otherToken,_targetToken,pcv.otherTokenIn); //addLiquidity uint256 otherTokenRemain = (pcv.otherTokenRemoved).sub((pcv.otherTokenIn)); uint256 targetTokenAmount = (pcv.targetTokenRemoved).add(pcv.targetTokenOut); (pcv.targetTokenAdded, pcv.otherTokenAdded, pcv.liquidityAdded) = _addLiquidity(_router, _targetToken,otherToken, targetTokenAmount,otherTokenRemain, 0,otherTokenRemain); pcv.targetTokenRemain = targetTokenAmount.sub(pcv.targetTokenAdded); emit PCVResult(_targetToken,otherToken,_lpp,_cp,pcv); return pcv.targetTokenRemain; } } // File: contracts\Comptroller\USEComptrollerPool.sol // License: MIT contract USEComptrollerPool is IUSEPool,ProtocolValue,AccessControl{ using SafeMath for uint256; using SafeERC20 for IERC20; address public use; address public shares; address public router; bytes32 public constant USE_SHARES_COMPTROLLER = keccak256("USE_SHARES_COMPTROLLER"); constructor() public { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); grantRole(USE_SHARES_COMPTROLLER, _msgSender()); } modifier onlyAuthorized{ require(hasRole(USE_SHARES_COMPTROLLER, msg.sender)); _; } function collatDollarBalance() external view override returns (uint256){ return 0; } function init(address _use,address _shares,address _router) public onlyAuthorized{ use = _use; shares = _shares; router = _router; } function getUseElenaPair() public view returns(address){ return _getPair(router,use,shares); } function _burnUseAndShares() internal{ uint256 _sharesAmount = IERC20(shares).balanceOf(address(this)); uint256 _useAmount = IERC20(use).balanceOf(address(this)); if(_sharesAmount > 0){ IShareToken(shares).burn(_sharesAmount); } if(_useAmount > 0){ IUSEStablecoin(use).burn(_useAmount); } } function addUseElenaPair(uint256 _useAmount,uint256 _sharesAmount) public onlyAuthorized{ IUSEStablecoin(use).pool_mint(address(this),_useAmount); IShareToken(shares).pool_mint(address(this),_sharesAmount); _addLiquidity(router,use,shares,_useAmount,_sharesAmount,0,0); _burnUseAndShares(); } function guardUSEValue(uint256 _lpp) public onlyAuthorized{ address _pair = getUseElenaPair(); _removeLiquidity(router,_pair,use,shares,_lpp); _burnUseAndShares(); } function protocolValueForUSE(uint256 _lpp,uint256 _cp) public onlyAuthorized{ address _pair = getUseElenaPair(); _protocolValue(router,_pair,use,_lpp,_cp); _burnUseAndShares(); } function protocolValueForElena(uint256 _lpp,uint256 _cp) public onlyAuthorized{ address _pair = getUseElenaPair(); _protocolValue(router,_pair,shares,_lpp,_cp); _burnUseAndShares(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"targetToken","type":"address"},{"indexed":false,"internalType":"address","name":"otherToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"lpp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cp","type":"uint256"},{"components":[{"internalType":"uint256","name":"targetTokenRemoved","type":"uint256"},{"internalType":"uint256","name":"otherTokenRemoved","type":"uint256"},{"internalType":"uint256","name":"liquidityRemoved","type":"uint256"},{"internalType":"uint256","name":"otherTokenIn","type":"uint256"},{"internalType":"uint256","name":"targetTokenOut","type":"uint256"},{"internalType":"uint256","name":"targetTokenAdded","type":"uint256"},{"internalType":"uint256","name":"otherTokenAdded","type":"uint256"},{"internalType":"uint256","name":"liquidityAdded","type":"uint256"},{"internalType":"uint256","name":"targetTokenRemain","type":"uint256"}],"indexed":false,"internalType":"struct ProtocolValue.PCVInfo","name":"pcv","type":"tuple"}],"name":"PCVResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USE_SHARES_COMPTROLLER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_useAmount","type":"uint256"},{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"addUseElenaPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collatDollarBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"address","name":"_targetToken","type":"address"}],"name":"getOtherToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUseElenaPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpp","type":"uint256"}],"name":"guardUSEValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_use","type":"address"},{"internalType":"address","name":"_shares","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpp","type":"uint256"},{"internalType":"uint256","name":"_cp","type":"uint256"}],"name":"protocolValueForElena","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpp","type":"uint256"},{"internalType":"uint256","name":"_cp","type":"uint256"}],"name":"protocolValueForUSE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shares","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"use","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200003a60006200002b6001600160e01b036200007d16565b6001600160e01b036200008116565b620000776040516200004c906200025a565b604051908190039020620000686001600160e01b036200007d16565b6001600160e01b036200009a16565b620002d2565b3390565b6200009682826001600160e01b03620000fb16565b5050565b600082815260208190526040902060020154620000d390620000c46001600160e01b036200007d16565b6001600160e01b036200017d16565b620000815760405162461bcd60e51b8152600401620000f29062000283565b60405180910390fd5b600082815260208181526040909120620001209183906200081f620001aa821b17901c565b156200009657620001396001600160e01b036200007d16565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408220620001a191849062000834620001ca821b17901c565b90505b92915050565b6000620001a1836001600160a01b0384166001600160e01b03620001ea16565b6000620001a1836001600160a01b0384166001600160e01b036200024216565b60006200020183836001600160e01b036200024216565b6200023957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001a4565b506000620001a4565b60009081526001919091016020526040902054151590565b7f5553455f5348415245535f434f4d5054524f4c4c455200000000000000000000815260160190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b611edd80620002e26000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635bbf9110116100b8578063a217fddf1161007c578063a217fddf14610254578063b85a8b201461025c578063ca15c87314610264578063d547741f14610277578063d69109371461028a578063f887ea401461029d57610137565b80635bbf9110146101f35780637c09960f146102065780639010d07c1461021957806391d148541461022c578063a0d6a83c1461024c57610137565b80633099fe65116100ff5780633099fe65146101aa578063312c41e8146101b257806336568abe146101c557806348a342f1146101d85780634c97d71a146101eb57610137565b806303314efa1461013c57806317284c941461015a578063184b95591461016f578063248a9ca3146101845780632f2ff15d14610197575b600080fd5b6101446102a5565b6040516101519190611958565b60405180910390f35b6101626102b4565b6040516101519190611ac6565b61018261017d366004611753565b6102b9565b005b610162610192366004611855565b61031e565b6101826101a536600461186d565b610333565b610144610384565b6101826101c0366004611891565b6103af565b6101826101d336600461186d565b610402565b6101826101e6366004611891565b610444565b610144610557565b610182610201366004611891565b610566565b610182610214366004611855565b6105ab565b610144610227366004611891565b6105f5565b61023f61023a36600461186d565b61061c565b6040516101519190611abb565b61016261063a565b610162610651565b610162610656565b610162610272366004611855565b61065d565b61018261028536600461186d565b610674565b61014461029836600461171b565b6106ae565b610144610810565b6002546001600160a01b031681565b600090565b6102d66040516102c890611936565b60405180910390203361061c565b6102df57600080fd5b600180546001600160a01b039485166001600160a01b031991821617909155600280549385169382169390931790925560038054919093169116179055565b60009081526020819052604090206002015490565b6000828152602081905260409020600201546103519061023a610849565b6103765760405162461bcd60e51b815260040161036d90611b44565b60405180910390fd5b610380828261084d565b5050565b6003546001546002546000926103aa926001600160a01b039182169290821691166108bc565b905090565b6103be6040516102c890611936565b6103c757600080fd5b60006103d1610384565b6003546001549192506103f4916001600160a01b039182169184911686866109b1565b506103fd610b34565b505050565b61040a610849565b6001600160a01b0316816001600160a01b03161461043a5760405162461bcd60e51b815260040161036d90611d59565b6103808282610d12565b6104536040516102c890611936565b61045c57600080fd5b600154604051635a7ab59360e11b81526001600160a01b039091169063b4f56b269061048e9030908690600401611aa2565b600060405180830381600087803b1580156104a857600080fd5b505af11580156104bc573d6000803e3d6000fd5b5050600254604051635a7ab59360e11b81526001600160a01b03909116925063b4f56b2691506104f29030908590600401611aa2565b600060405180830381600087803b15801561050c57600080fd5b505af1158015610520573d6000803e3d6000fd5b505060035460015460025461054c94506001600160a01b03928316935090821691168585600080610d81565b505050610380610b34565b6001546001600160a01b031681565b6105756040516102c890611936565b61057e57600080fd5b6000610588610384565b6003546002549192506103f4916001600160a01b039182169184911686866109b1565b6105ba6040516102c890611936565b6105c357600080fd5b60006105cd610384565b60035460015460025492935061054c926001600160a01b039283169285928116911686610e3e565b6000828152602081905260408120610613908363ffffffff610f8616565b90505b92915050565b6000828152602081905260408120610613908363ffffffff61083416565b60405161064690611936565b604051809103902081565b600081565b620f424081565b600081815260208190526040812061061690610f92565b6000828152602081905260409020600201546106929061023a610849565b61043a5760405162461bcd60e51b815260040161036d90611bca565b600080836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ea57600080fd5b505afa1580156106fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072291906116ff565b90506000846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561075f57600080fd5b505afa158015610773573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079791906116ff565b9050836001600160a01b0316826001600160a01b031614806107ca5750836001600160a01b0316816001600160a01b0316145b6107e65760405162461bcd60e51b815260040161036d90611c1a565b816001600160a01b0316846001600160a01b0316146108055781610807565b805b95945050505050565b6003546001600160a01b031681565b6000610613836001600160a01b038416610f9d565b6000610613836001600160a01b038416610fe7565b3390565b600082815260208190526040902061086b908263ffffffff61081f16565b1561038057610878610849565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600080846001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156108f857600080fd5b505afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906116ff565b60405163e6a4390560e01b81529091506001600160a01b0382169063e6a4390590610961908790879060040161196c565b60206040518083038186803b15801561097957600080fd5b505afa15801561098d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080791906116ff565b6000806109be86866106ae565b90506109c86116b3565b604051806101200160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509050610a208888888589610e3e565b604084015260208301819052908252610a5490620f424090610a48908763ffffffff610fff16565b9063ffffffff61103916565b60608201819052610a6a9089908490899061107b565b608082015260608101516020820151600091610a8c919063ffffffff6111b016565b60808301518351919250600091610aa89163ffffffff6111f216565b9050610aba8a89868486600088610d81565b60e086015260c085015260a08401819052610adc90829063ffffffff6111b016565b6101008401526040517fed4fd567979026015287ae173224493c93e878eeb7535e45be431448bffa5e0d90610b1a908a9087908b908b9089906119c6565b60405180910390a150506101000151979650505050505050565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b65903090600401611958565b60206040518083038186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb591906118b2565b6001546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610beb903090600401611958565b60206040518083038186803b158015610c0357600080fd5b505afa158015610c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3b91906118b2565b90508115610ca657600254604051630852cd8d60e31b81526001600160a01b03909116906342966c6890610c73908590600401611ac6565b600060405180830381600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b505050505b801561038057600154604051630852cd8d60e31b81526001600160a01b03909116906342966c6890610cdc908490600401611ac6565b600060405180830381600087803b158015610cf657600080fd5b505af1158015610d0a573d6000803e3d6000fd5b505050505050565b6000828152602081905260409020610d30908263ffffffff61121716565b1561038057610d3d610849565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008080603c4201610d948b8b8a61122c565b610d9f8b8a8961122c565b60405162e8e33760e81b81526001600160a01b038c169063e8e3370090610dd8908d908d908d908d908d908d9030908b90600401611a59565b606060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2a91906118ed565b935093509350509750975097945050505050565b60008060008042603c019050610edd620f4240610a48878b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e819190611958565b60206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed191906118b2565b9063ffffffff610fff16565b9150610eea89898461122c565b604051635d5155ef60e11b81526001600160a01b038a169063baa2abde90610f23908a908a908790600090819030908a90600401611986565b6040805180830381600087803b158015610f3c57600080fd5b505af1158015610f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7491906118ca565b909a9099509197509095505050505050565b600061061383836112e9565b60006106168261132e565b6000610fa98383610fe7565b610fdf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610616565b506000610616565b60009081526001919091016020526040902054151590565b60008261100e57506000610616565b8282028284828161101b57fe5b04146106135760405162461bcd60e51b815260040161036d90611c41565b600061061383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611332565b604080516002808252606080830184526000939092919060208301908036833701905050905084816000815181106110af57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106110dd57fe5b6001600160a01b0390921660209283029190910190910152603c420161110487878661122c565b6040516338ed173960e01b81526001600160a01b038816906338ed173990611139908790600090879030908890600401611da8565b600060405180830381600087803b15801561115357600080fd5b505af1158015611167573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261118f919081019061179d565b60018151811061119b57fe5b6020026020010151925050505b949350505050565b600061061383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611369565b6000828201838110156106135760405162461bcd60e51b815260040161036d90611b93565b6000610613836001600160a01b038416611395565b604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e9061125c903090889060040161196c565b60206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac91906118b2565b10156103fd576112cd6001600160a01b03831684600063ffffffff61145b16565b6103fd6001600160a01b0383168460001963ffffffff61145b16565b8154600090821061130c5760405162461bcd60e51b815260040161036d90611b02565b82600001828154811061131b57fe5b9060005260206000200154905092915050565b5490565b600081836113535760405162461bcd60e51b815260040161036d9190611acf565b50600083858161135f57fe5b0495945050505050565b6000818484111561138d5760405162461bcd60e51b815260040161036d9190611acf565b505050900390565b6000818152600183016020526040812054801561145157835460001980830191908101906000908790839081106113c857fe5b90600052602060002001549050808760000184815481106113e557fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061141557fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610616565b6000915050610616565b8015806114e35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611491903090869060040161196c565b60206040518083038186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e191906118b2565b155b6114ff5760405162461bcd60e51b815260040161036d90611d03565b6103fd8363095ea7b360e01b848460405160240161151e929190611aa2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915260606115a5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115df9092919063ffffffff16565b8051909150156103fd57808060200190518101906115c39190611835565b6103fd5760405162461bcd60e51b815260040161036d90611cb9565b60606111a8848460008560606115f4856116ad565b6116105760405162461bcd60e51b815260040161036d90611c82565b60006060866001600160a01b0316858760405161162d919061191a565b60006040518083038185875af1925050503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b509150915081156116835791506111a89050565b8051156116935780518082602001fd5b8360405162461bcd60e51b815260040161036d9190611acf565b3b151590565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600060208284031215611710578081fd5b815161061381611e8f565b6000806040838503121561172d578081fd5b823561173881611e8f565b9150602083013561174881611e8f565b809150509250929050565b600080600060608486031215611767578081fd5b833561177281611e8f565b9250602084013561178281611e8f565b9150604084013561179281611e8f565b809150509250925092565b600060208083850312156117af578182fd5b825167ffffffffffffffff8111156117c5578283fd5b80840185601f8201126117d6578384fd5b805191506117eb6117e683611e3f565b611e18565b8281528381019082850185850284018601891015611807578687fd5b8693505b8484101561182957805183526001939093019291850191850161180b565b50979650505050505050565b600060208284031215611846578081fd5b81518015158114610613578182fd5b600060208284031215611866578081fd5b5035919050565b6000806040838503121561187f578182fd5b82359150602083013561174881611e8f565b600080604083850312156118a3578182fd5b50508035926020909101359150565b6000602082840312156118c3578081fd5b5051919050565b600080604083850312156118dc578182fd5b505080516020909101519092909150565b600080600060608486031215611901578283fd5b8351925060208401519150604084015190509250925092565b6000825161192c818460208701611e5f565b9190910192915050565b752aa9a2afa9a420a922a9afa1a7a6a82a2927a62622a960511b815260160190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b60006101a08201905060018060a01b03808816835280871660208401525084604083015283606083015282516080830152602083015160a0830152604083015160c0830152606083015160e08301526080830151610100818185015260a085015161012085015260c085015161014085015260e08501516101608501528085015161018085015250509695505050505050565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6000602082528251806020840152611aee816040850160208701611e5f565b601f01601f19169190910160400192915050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b6020808252600d908201526c10afba30b933b2ba2a37b5b2b760991b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015611df75784516001600160a01b031683529383019391830191600101611dd2565b50506001600160a01b03969096166060850152505050608001529392505050565b60405181810167ffffffffffffffff81118282101715611e3757600080fd5b604052919050565b600067ffffffffffffffff821115611e55578081fd5b5060209081020190565b60005b83811015611e7a578181015183820152602001611e62565b83811115611e89576000848401525b50505050565b6001600160a01b0381168114611ea457600080fd5b5056fea264697066735822122019d4c7f716b593fa852300db5bd8268af642dceb36785a78c49809144ca7f8dd64736f6c634300060b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80635bbf9110116100b8578063a217fddf1161007c578063a217fddf14610254578063b85a8b201461025c578063ca15c87314610264578063d547741f14610277578063d69109371461028a578063f887ea401461029d57610137565b80635bbf9110146101f35780637c09960f146102065780639010d07c1461021957806391d148541461022c578063a0d6a83c1461024c57610137565b80633099fe65116100ff5780633099fe65146101aa578063312c41e8146101b257806336568abe146101c557806348a342f1146101d85780634c97d71a146101eb57610137565b806303314efa1461013c57806317284c941461015a578063184b95591461016f578063248a9ca3146101845780632f2ff15d14610197575b600080fd5b6101446102a5565b6040516101519190611958565b60405180910390f35b6101626102b4565b6040516101519190611ac6565b61018261017d366004611753565b6102b9565b005b610162610192366004611855565b61031e565b6101826101a536600461186d565b610333565b610144610384565b6101826101c0366004611891565b6103af565b6101826101d336600461186d565b610402565b6101826101e6366004611891565b610444565b610144610557565b610182610201366004611891565b610566565b610182610214366004611855565b6105ab565b610144610227366004611891565b6105f5565b61023f61023a36600461186d565b61061c565b6040516101519190611abb565b61016261063a565b610162610651565b610162610656565b610162610272366004611855565b61065d565b61018261028536600461186d565b610674565b61014461029836600461171b565b6106ae565b610144610810565b6002546001600160a01b031681565b600090565b6102d66040516102c890611936565b60405180910390203361061c565b6102df57600080fd5b600180546001600160a01b039485166001600160a01b031991821617909155600280549385169382169390931790925560038054919093169116179055565b60009081526020819052604090206002015490565b6000828152602081905260409020600201546103519061023a610849565b6103765760405162461bcd60e51b815260040161036d90611b44565b60405180910390fd5b610380828261084d565b5050565b6003546001546002546000926103aa926001600160a01b039182169290821691166108bc565b905090565b6103be6040516102c890611936565b6103c757600080fd5b60006103d1610384565b6003546001549192506103f4916001600160a01b039182169184911686866109b1565b506103fd610b34565b505050565b61040a610849565b6001600160a01b0316816001600160a01b03161461043a5760405162461bcd60e51b815260040161036d90611d59565b6103808282610d12565b6104536040516102c890611936565b61045c57600080fd5b600154604051635a7ab59360e11b81526001600160a01b039091169063b4f56b269061048e9030908690600401611aa2565b600060405180830381600087803b1580156104a857600080fd5b505af11580156104bc573d6000803e3d6000fd5b5050600254604051635a7ab59360e11b81526001600160a01b03909116925063b4f56b2691506104f29030908590600401611aa2565b600060405180830381600087803b15801561050c57600080fd5b505af1158015610520573d6000803e3d6000fd5b505060035460015460025461054c94506001600160a01b03928316935090821691168585600080610d81565b505050610380610b34565b6001546001600160a01b031681565b6105756040516102c890611936565b61057e57600080fd5b6000610588610384565b6003546002549192506103f4916001600160a01b039182169184911686866109b1565b6105ba6040516102c890611936565b6105c357600080fd5b60006105cd610384565b60035460015460025492935061054c926001600160a01b039283169285928116911686610e3e565b6000828152602081905260408120610613908363ffffffff610f8616565b90505b92915050565b6000828152602081905260408120610613908363ffffffff61083416565b60405161064690611936565b604051809103902081565b600081565b620f424081565b600081815260208190526040812061061690610f92565b6000828152602081905260409020600201546106929061023a610849565b61043a5760405162461bcd60e51b815260040161036d90611bca565b600080836001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156106ea57600080fd5b505afa1580156106fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072291906116ff565b90506000846001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561075f57600080fd5b505afa158015610773573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079791906116ff565b9050836001600160a01b0316826001600160a01b031614806107ca5750836001600160a01b0316816001600160a01b0316145b6107e65760405162461bcd60e51b815260040161036d90611c1a565b816001600160a01b0316846001600160a01b0316146108055781610807565b805b95945050505050565b6003546001600160a01b031681565b6000610613836001600160a01b038416610f9d565b6000610613836001600160a01b038416610fe7565b3390565b600082815260208190526040902061086b908263ffffffff61081f16565b1561038057610878610849565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600080846001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156108f857600080fd5b505afa15801561090c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093091906116ff565b60405163e6a4390560e01b81529091506001600160a01b0382169063e6a4390590610961908790879060040161196c565b60206040518083038186803b15801561097957600080fd5b505afa15801561098d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080791906116ff565b6000806109be86866106ae565b90506109c86116b3565b604051806101200160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509050610a208888888589610e3e565b604084015260208301819052908252610a5490620f424090610a48908763ffffffff610fff16565b9063ffffffff61103916565b60608201819052610a6a9089908490899061107b565b608082015260608101516020820151600091610a8c919063ffffffff6111b016565b60808301518351919250600091610aa89163ffffffff6111f216565b9050610aba8a89868486600088610d81565b60e086015260c085015260a08401819052610adc90829063ffffffff6111b016565b6101008401526040517fed4fd567979026015287ae173224493c93e878eeb7535e45be431448bffa5e0d90610b1a908a9087908b908b9089906119c6565b60405180910390a150506101000151979650505050505050565b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610b65903090600401611958565b60206040518083038186803b158015610b7d57600080fd5b505afa158015610b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb591906118b2565b6001546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610beb903090600401611958565b60206040518083038186803b158015610c0357600080fd5b505afa158015610c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3b91906118b2565b90508115610ca657600254604051630852cd8d60e31b81526001600160a01b03909116906342966c6890610c73908590600401611ac6565b600060405180830381600087803b158015610c8d57600080fd5b505af1158015610ca1573d6000803e3d6000fd5b505050505b801561038057600154604051630852cd8d60e31b81526001600160a01b03909116906342966c6890610cdc908490600401611ac6565b600060405180830381600087803b158015610cf657600080fd5b505af1158015610d0a573d6000803e3d6000fd5b505050505050565b6000828152602081905260409020610d30908263ffffffff61121716565b1561038057610d3d610849565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008080603c4201610d948b8b8a61122c565b610d9f8b8a8961122c565b60405162e8e33760e81b81526001600160a01b038c169063e8e3370090610dd8908d908d908d908d908d908d9030908b90600401611a59565b606060405180830381600087803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2a91906118ed565b935093509350509750975097945050505050565b60008060008042603c019050610edd620f4240610a48878b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e819190611958565b60206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed191906118b2565b9063ffffffff610fff16565b9150610eea89898461122c565b604051635d5155ef60e11b81526001600160a01b038a169063baa2abde90610f23908a908a908790600090819030908a90600401611986565b6040805180830381600087803b158015610f3c57600080fd5b505af1158015610f50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7491906118ca565b909a9099509197509095505050505050565b600061061383836112e9565b60006106168261132e565b6000610fa98383610fe7565b610fdf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610616565b506000610616565b60009081526001919091016020526040902054151590565b60008261100e57506000610616565b8282028284828161101b57fe5b04146106135760405162461bcd60e51b815260040161036d90611c41565b600061061383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611332565b604080516002808252606080830184526000939092919060208301908036833701905050905084816000815181106110af57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106110dd57fe5b6001600160a01b0390921660209283029190910190910152603c420161110487878661122c565b6040516338ed173960e01b81526001600160a01b038816906338ed173990611139908790600090879030908890600401611da8565b600060405180830381600087803b15801561115357600080fd5b505af1158015611167573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261118f919081019061179d565b60018151811061119b57fe5b6020026020010151925050505b949350505050565b600061061383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611369565b6000828201838110156106135760405162461bcd60e51b815260040161036d90611b93565b6000610613836001600160a01b038416611395565b604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e9061125c903090889060040161196c565b60206040518083038186803b15801561127457600080fd5b505afa158015611288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ac91906118b2565b10156103fd576112cd6001600160a01b03831684600063ffffffff61145b16565b6103fd6001600160a01b0383168460001963ffffffff61145b16565b8154600090821061130c5760405162461bcd60e51b815260040161036d90611b02565b82600001828154811061131b57fe5b9060005260206000200154905092915050565b5490565b600081836113535760405162461bcd60e51b815260040161036d9190611acf565b50600083858161135f57fe5b0495945050505050565b6000818484111561138d5760405162461bcd60e51b815260040161036d9190611acf565b505050900390565b6000818152600183016020526040812054801561145157835460001980830191908101906000908790839081106113c857fe5b90600052602060002001549050808760000184815481106113e557fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061141557fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610616565b6000915050610616565b8015806114e35750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611491903090869060040161196c565b60206040518083038186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e191906118b2565b155b6114ff5760405162461bcd60e51b815260040161036d90611d03565b6103fd8363095ea7b360e01b848460405160240161151e929190611aa2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915260606115a5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115df9092919063ffffffff16565b8051909150156103fd57808060200190518101906115c39190611835565b6103fd5760405162461bcd60e51b815260040161036d90611cb9565b60606111a8848460008560606115f4856116ad565b6116105760405162461bcd60e51b815260040161036d90611c82565b60006060866001600160a01b0316858760405161162d919061191a565b60006040518083038185875af1925050503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b509150915081156116835791506111a89050565b8051156116935780518082602001fd5b8360405162461bcd60e51b815260040161036d9190611acf565b3b151590565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600060208284031215611710578081fd5b815161061381611e8f565b6000806040838503121561172d578081fd5b823561173881611e8f565b9150602083013561174881611e8f565b809150509250929050565b600080600060608486031215611767578081fd5b833561177281611e8f565b9250602084013561178281611e8f565b9150604084013561179281611e8f565b809150509250925092565b600060208083850312156117af578182fd5b825167ffffffffffffffff8111156117c5578283fd5b80840185601f8201126117d6578384fd5b805191506117eb6117e683611e3f565b611e18565b8281528381019082850185850284018601891015611807578687fd5b8693505b8484101561182957805183526001939093019291850191850161180b565b50979650505050505050565b600060208284031215611846578081fd5b81518015158114610613578182fd5b600060208284031215611866578081fd5b5035919050565b6000806040838503121561187f578182fd5b82359150602083013561174881611e8f565b600080604083850312156118a3578182fd5b50508035926020909101359150565b6000602082840312156118c3578081fd5b5051919050565b600080604083850312156118dc578182fd5b505080516020909101519092909150565b600080600060608486031215611901578283fd5b8351925060208401519150604084015190509250925092565b6000825161192c818460208701611e5f565b9190910192915050565b752aa9a2afa9a420a922a9afa1a7a6a82a2927a62622a960511b815260160190565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039788168152958716602087015260408601949094526060850192909252608084015290921660a082015260c081019190915260e00190565b60006101a08201905060018060a01b03808816835280871660208401525084604083015283606083015282516080830152602083015160a0830152604083015160c0830152606083015160e08301526080830151610100818185015260a085015161012085015260c085015161014085015260e08501516101608501528085015161018085015250509695505050505050565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b6000602082528251806020840152611aee816040850160208701611e5f565b601f01601f19169190910160400192915050565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526e0818591b5a5b881d1bc819dc985b9d608a1b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526030908201527f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60408201526f2061646d696e20746f207265766f6b6560801b606082015260800190565b6020808252600d908201526c10afba30b933b2ba2a37b5b2b760991b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b81811015611df75784516001600160a01b031683529383019391830191600101611dd2565b50506001600160a01b03969096166060850152505050608001529392505050565b60405181810167ffffffffffffffff81118282101715611e3757600080fd5b604052919050565b600067ffffffffffffffff821115611e55578081fd5b5060209081020190565b60005b83811015611e7a578181015183820152602001611e62565b83811115611e89576000848401525b50505050565b6001600160a01b0381168114611ea457600080fd5b5056fea264697066735822122019d4c7f716b593fa852300db5bd8268af642dceb36785a78c49809144ca7f8dd64736f6c634300060b0033
Deployed Bytecode Sourcemap
50650:2357:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50817:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51233:100;;;:::i;:::-;;;;;;;:::i;51339:165::-;;;;;;:::i;:::-;;:::i;:::-;;32279:114;;;;;;:::i;:::-;;:::i;32653:225::-;;;;;;:::i;:::-;;:::i;51510:114::-;;;:::i;52569:211::-;;;;;;:::i;:::-;;:::i;33854:207::-;;;;;;:::i;:::-;;:::i;52018:334::-;;;;;;:::i;:::-;;:::i;50792:18::-;;;:::i;52787:216::-;;;;;;:::i;:::-;;:::i;52358:205::-;;;;;;:::i;:::-;;:::i;31954:138::-;;;;;;:::i;:::-;;:::i;30919:139::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50874:84::-;;;:::i;29672:49::-;;;:::i;46008:37::-;;;:::i;31230:127::-;;;;;;:::i;:::-;;:::i;33121:228::-;;;;;;:::i;:::-;;:::i;48716:354::-;;;;;;:::i;:::-;;:::i;50845:21::-;;;:::i;50817:::-;;;-1:-1:-1;;;;;50817:21:0;;:::o;51233:100::-;51296:7;51233:100;:::o;51339:165::-;51162:43;50923:35;;;;;:::i;:::-;;;;;;;;51194:10;51162:7;:43::i;:::-;51154:52;;;;;;51432:3:::1;:10:::0;;-1:-1:-1;;;;;51432:10:0;;::::1;-1:-1:-1::0;;;;;;51432:10:0;;::::1;;::::0;;;51453:6:::1;:16:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;51480:6:::1;:16:::0;;;;;::::1;::::0;::::1;;::::0;;51339:165::o;32279:114::-;32336:7;32363:12;;;;;;;;;;:22;;;;32279:114::o;32653:225::-;32745:6;:12;;;;;;;;;;:22;;;32737:45;;32769:12;:10;:12::i;32737:45::-;32729:105;;;;-1:-1:-1;;;32729:105:0;;;;;;;:::i;:::-;;;;;;;;;32845:25;32856:4;32862:7;32845:10;:25::i;:::-;32653:225;;:::o;51510:114::-;51592:6;;;51599:3;51603:6;;51557:7;;51583:27;;-1:-1:-1;;;;;51592:6:0;;;;51599:3;;;;51603:6;51583:8;:27::i;:::-;51576:34;;51510:114;:::o;52569:211::-;51162:43;50923:35;;;;;:::i;51162:43::-;51154:52;;;;;;52656:13:::1;52672:17;:15;:17::i;:::-;52715:6;::::0;;52728:3;52656:33;;-1:-1:-1;52700:41:0::1;::::0;-1:-1:-1;;;;;52715:6:0;;::::1;::::0;52656:33;;52728:3:::1;52732:4:::0;52737:3;52700:14:::1;:41::i;:::-;;52752:19;:17;:19::i;:::-;51217:1;52569:211:::0;;:::o;33854:207::-;33952:12;:10;:12::i;:::-;-1:-1:-1;;;;;33941:23:0;:7;-1:-1:-1;;;;;33941:23:0;;33933:83;;;;-1:-1:-1;;;33933:83:0;;;;;;;:::i;:::-;34027:26;34039:4;34045:7;34027:11;:26::i;52018:334::-;51162:43;50923:35;;;;;:::i;51162:43::-;51154:52;;;;;;52132:3:::1;::::0;52117:55:::1;::::0;-1:-1:-1;;;52117:55:0;;-1:-1:-1;;;;;52132:3:0;;::::1;::::0;52117:29:::1;::::0;:55:::1;::::0;52155:4:::1;::::0;52161:10;;52117:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52195:6:0::1;::::0;52183:58:::1;::::0;-1:-1:-1;;;52183:58:0;;-1:-1:-1;;;;;52195:6:0;;::::1;::::0;-1:-1:-1;52183:29:0::1;::::0;-1:-1:-1;52183:58:0::1;::::0;52221:4:::1;::::0;52227:13;;52183:58:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;52266:6:0::1;::::0;;52273:3;52277:6:::1;::::0;52252:61:::1;::::0;-1:-1:-1;;;;;;52266:6:0;;::::1;::::0;-1:-1:-1;52273:3:0;;::::1;::::0;52277:6:::1;52284:10:::0;52295:13;52266:6:::1;::::0;52252:13:::1;:61::i;:::-;;;;52324:19;:17;:19::i;50792:18::-:0;;;-1:-1:-1;;;;;50792:18:0;;:::o;52787:216::-;51162:43;50923:35;;;;;:::i;51162:43::-;51154:52;;;;;;52876:13:::1;52892:17;:15;:17::i;:::-;52935:6;::::0;52948::::1;::::0;52876:33;;-1:-1:-1;52920:44:0::1;::::0;-1:-1:-1;;;;;52935:6:0;;::::1;::::0;52876:33;;52948:6:::1;52955:4:::0;52960:3;52920:14:::1;:44::i;52358:205::-:0;51162:43;50923:35;;;;;:::i;51162:43::-;51154:52;;;;;;52427:13:::1;52443:17;:15;:17::i;:::-;52495:6;::::0;;52508:3;52512:6:::1;::::0;52427:33;;-1:-1:-1;52478:46:0::1;::::0;-1:-1:-1;;;;;52495:6:0;;::::1;::::0;52427:33;;52508:3;::::1;::::0;52512:6:::1;52519:4:::0;52478:16:::1;:46::i;31954:138::-:0;32027:7;32054:12;;;;;;;;;;:30;;32078:5;32054:30;:23;:30;:::i;:::-;32047:37;;31954:138;;;;;:::o;30919:139::-;30988:4;31012:12;;;;;;;;;;:38;;31042:7;31012:38;:29;:38;:::i;50874:84::-;50923:35;;;;;:::i;:::-;;;;;;;;50874:84;:::o;29672:49::-;29717:4;29672:49;:::o;46008:37::-;46042:3;46008:37;:::o;31230:127::-;31293:7;31320:12;;;;;;;;;;:29;;:27;:29::i;33121:228::-;33214:6;:12;;;;;;;;;;:22;;;33206:45;;33238:12;:10;:12::i;33206:45::-;33198:106;;;;-1:-1:-1;;;33198:106:0;;;;;;;:::i;48716:354::-;48795:7;48814:14;48846:5;-1:-1:-1;;;;;48831:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48814:47;;48872:14;48904:5;-1:-1:-1;;;;;48889:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48872:47;;48949:12;-1:-1:-1;;;;;48939:22:0;:6;-1:-1:-1;;;;;48939:22:0;;:48;;;;48975:12;-1:-1:-1;;;;;48965:22:0;:6;-1:-1:-1;;;;;48965:22:0;;48939:48;48931:73;;;;-1:-1:-1;;;48931:73:0;;;;;;;:::i;:::-;49038:6;-1:-1:-1;;;;;49022:22:0;:12;-1:-1:-1;;;;;49022:22:0;;:40;;49056:6;49022:40;;;49047:6;49022:40;49015:47;48716:354;-1:-1:-1;;;;;48716:354:0:o;50845:21::-;;;-1:-1:-1;;;;;50845:21:0;;:::o;24005:143::-;24075:4;24099:41;24104:3;-1:-1:-1;;;;;24124:14:0;;24099:4;:41::i;24555:158::-;24635:4;24659:46;24669:3;-1:-1:-1;;;;;24689:14:0;;24659:9;:46::i;27625:106::-;27713:10;27625:106;:::o;35089:188::-;35163:6;:12;;;;;;;;;;:33;;35188:7;35163:33;:24;:33;:::i;:::-;35159:111;;;35245:12;:10;:12::i;:::-;-1:-1:-1;;;;;35218:40:0;35236:7;-1:-1:-1;;;;;35218:40:0;35230:4;35218:40;;;;;;;;;;35089:188;;:::o;46565:237::-;46651:7;46670:16;46709:6;-1:-1:-1;;;;;46690:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46744:50;;-1:-1:-1;;;46744:50:0;;46670:56;;-1:-1:-1;;;;;;46744:35:0;;;;;:50;;46780:6;;46787;;46744:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49077:1492::-;49195:7;49250:18;49271:33;49285:5;49291:12;49271:13;:33::i;:::-;49250:54;;49316:18;;:::i;:::-;49338:26;;;;;;;;49346:1;49338:26;;;;49348:1;49338:26;;;;49350:1;49338:26;;;;49352:1;49338:26;;;;49354:1;49338:26;;;;49356:1;49338:26;;;;49358:1;49338:26;;;;49360:1;49338:26;;;;49362:1;49338:26;;;49316:48;;49473:60;49490:7;49498:5;49504:12;49517:10;49528:4;49473:16;:60::i;:::-;49449:20;;;49403:130;49427:21;;;49403:130;;;;;;49592:43;;46042:3;;49592:30;;49618:3;49592:30;:25;:30;:::i;:::-;:34;:43;:34;:43;:::i;:::-;49573:16;;;:62;;;49667:60;;49678:7;;49686:10;;49697:12;;49667:10;:60::i;:::-;49646:18;;;:81;49819:16;;;;49791:21;;;;49762:24;;49790:47;;49791:21;49790:47;:27;:47;:::i;:::-;49905:18;;;;49877:22;;49762:75;;-1:-1:-1;49848:25:0;;49876:48;;;:28;:48;:::i;:::-;49848:76;;50009:370;50023:7;50121:12;50134:10;50235:17;50253:16;50360:1;50362:16;50009:13;:370::i;:::-;49987:18;;;49943:436;49966:19;;;49943:436;49944:20;;;49943:436;;;50414:43;;:17;;:43;:21;:43;:::i;:::-;50390:21;;;:67;50473:47;;;;;;50483:12;;50496:10;;50507:4;;50512:3;;50390;;50473:47;:::i;:::-;;;;;;;;-1:-1:-1;;50538:21:0;;;;49077:1492;-1:-1:-1;;;;;;;49077:1492:0:o;51630:382::-;51710:6;;51703:39;;-1:-1:-1;;;51703:39:0;;51679:21;;-1:-1:-1;;;;;51710:6:0;;51703:24;;:39;;51736:4;;51703:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51781:3;;51774:36;;-1:-1:-1;;;51774:36:0;;51679:63;;-1:-1:-1;51753:18:0;;-1:-1:-1;;;;;51781:3:0;;;;51774:21;;:36;;51804:4;;51774:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51753:57;-1:-1:-1;51830:17:0;;51827:87;;51875:6;;51863:39;;-1:-1:-1;;;51863:39:0;;-1:-1:-1;;;;;51875:6:0;;;;51863:24;;:39;;51888:13;;51863:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51827:87;51927:14;;51924:81;;51972:3;;51957:36;;-1:-1:-1;;;51957:36:0;;-1:-1:-1;;;;;51972:3:0;;;;51957:24;;:36;;51982:10;;51957:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51630:382;;:::o;35283:192::-;35358:6;:12;;;;;;;;;;:36;;35386:7;35358:36;:27;:36;:::i;:::-;35354:114;;;35443:12;:10;:12::i;:::-;-1:-1:-1;;;;;35416:40:0;35434:7;-1:-1:-1;;;;;35416:40:0;35428:4;35416:40;;;;;;;;;;35283:192;;:::o;47565:605::-;47800:12;;;47889:2;47873:15;:18;47902:51;47924:6;47931;47938:14;47902:21;:51::i;:::-;47964;47986:6;47993;48000:14;47964:21;:51::i;:::-;48033:129;;-1:-1:-1;;;48033:129:0;;-1:-1:-1;;;;;48033:39:0;;;;;:129;;48073:6;;48080;;48087:14;;48102;;48117:10;;48128;;48147:4;;48154:7;;48033:129;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48026:136;;;;;;;47565:605;;;;;;;;;;;:::o;48176:534::-;48348:12;48362;48375:17;48404:15;48422;48438:2;48422:18;48404:36;;48463:59;46042:3;48463:46;48505:3;48470:4;-1:-1:-1;;;;;48463:22:0;;48494:4;48463:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;:46;:41;:46;:::i;:59::-;48451:71;;48533:44;48555:6;48562:4;48567:9;48533:21;:44::i;:::-;48609:93;;-1:-1:-1;;;48609:93:0;;-1:-1:-1;;;;;48609:42:0;;;;;:93;;48652:6;;48659;;48666:9;;48676:1;;;;48688:4;;48694:7;;48609:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48588:114;;;;-1:-1:-1;48176:534:0;;-1:-1:-1;48176:534:0;;-1:-1:-1;;;;;;48176:534:0:o;25256:149::-;25330:7;25373:22;25377:3;25389:5;25373:3;:22::i;24797:117::-;24860:7;24887:19;24895:3;24887:7;:19::i;20689:414::-;20752:4;20774:21;20784:3;20789:5;20774:9;:21::i;:::-;20769:327;;-1:-1:-1;20812:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;20995:18;;20973:19;;;:12;;;:19;;;;;;:40;;;;21028:11;;20769:327;-1:-1:-1;21079:5:0;21072:12;;22889:129;22962:4;22986:19;;;:12;;;;;:19;;;;;;:24;;;22889:129::o;3399:467::-;3457:7;3702:6;3698:47;;-1:-1:-1;3732:1:0;3725:8;;3698:47;3767:5;;;3771:1;3767;:5;:1;3791:5;;;;;:10;3783:56;;;;-1:-1:-1;;;3783:56:0;;;;;;;:::i;4340:132::-;4398:7;4425:39;4429:1;4432;4425:39;;;;;;;;;;;;;;;;;:3;:39::i;47114:445::-;47261:16;;;47275:1;47261:16;;;47237:21;47261:16;;;;;47218:7;;47237:21;;47261:16;47275:1;47261:16;;;;;;;;;;-1:-1:-1;47261:16:0;47237:40;;47298:7;47288:4;47293:1;47288:7;;;;;;;;;;;;;:17;-1:-1:-1;;;;;47288:17:0;;;-1:-1:-1;;;;;47288:17:0;;;;;47326:8;47316:4;47321:1;47316:7;;;;;;;;-1:-1:-1;;;;;47316:18:0;;;:7;;;;;;;;;;;:18;47380:2;47364:15;:18;47393:46;47415:6;47422:7;47430:8;47393:21;:46::i;:::-;47458:90;;-1:-1:-1;;;47458:90:0;;-1:-1:-1;;;;;47458:51:0;;;;;:90;;47510:8;;47519:1;;47521:4;;47534;;47540:7;;47458:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47458:90:0;;;;;;;;;;;;:::i;:::-;47549:1;47458:93;;;;;;;;;;;;;;47451:100;;;;47114:445;;;;;;;:::o;2515:136::-;2573:7;2600:43;2604:1;2607;2600:43;;;;;;;;;;;;;;;;;:3;:43::i;2055:179::-;2113:7;2145:5;;;2169:6;;;;2161:46;;;;-1:-1:-1;;;2161:46:0;;;;;;;:::i;24322:149::-;24395:4;24419:44;24427:3;-1:-1:-1;;;;;24447:14:0;;24419:7;:44::i;46808:300::-;46909:47;;-1:-1:-1;;;46909:47:0;;46959:7;;-1:-1:-1;;;;;46909:24:0;;;;;:47;;46942:4;;46948:7;;46909:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;46906:187;;;46982:37;-1:-1:-1;;;;;46982:26:0;;47009:7;47017:1;46982:37;:26;:37;:::i;:::-;47034:47;-1:-1:-1;;;;;47034:26:0;;47061:7;-1:-1:-1;;47034:47:0;:26;:47;:::i;23553:204::-;23648:18;;23620:7;;23648:26;-1:-1:-1;23640:73:0;;;;-1:-1:-1;;;23640:73:0;;;;;;;:::i;:::-;23731:3;:11;;23743:5;23731:18;;;;;;;;;;;;;;;;23724:25;;23553:204;;;;:::o;23102:109::-;23185:18;;23102:109::o;4966:276::-;5052:7;5087:12;5080:5;5072:28;;;;-1:-1:-1;;;5072:28:0;;;;;;;;:::i;:::-;;5111:9;5127:1;5123;:5;;;;;;;4966:276;-1:-1:-1;;;;;4966:276:0:o;2952:190::-;3038:7;3074:12;3066:6;;;;3058:29;;;;-1:-1:-1;;;3058:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;3110:5:0;;;2952:190::o;21277:1528::-;21343:4;21482:19;;;:12;;;:19;;;;;;21516:15;;21512:1286;;21949:18;;-1:-1:-1;;21900:14:0;;;;21949:22;;;;21876:21;;21949:3;;:22;;22232;;;;;;;;;;;;;;22212:42;;22376:9;22347:3;:11;;22359:13;22347:26;;;;;;;;;;;;;;;;;;;:38;;;;22453:23;;;22495:1;22453:12;;;:23;;;;;;22479:17;;;22453:43;;22603:17;;22453:3;;22603:17;;;;;;;;;;;;;;;;;;;;;;22696:3;:12;;:19;22709:5;22696:19;;;;;;;;;;;22689:26;;;22737:4;22730:11;;;;;;;;21512:1286;22781:5;22774:12;;;;;16600:622;16970:10;;;16969:62;;-1:-1:-1;16986:39:0;;-1:-1:-1;;;16986:39:0;;-1:-1:-1;;;;;16986:15:0;;;;;:39;;17010:4;;17017:7;;16986:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;16969:62;16961:152;;;;-1:-1:-1;;;16961:152:0;;;;;;;:::i;:::-;17124:90;17144:5;17174:22;;;17198:7;17207:5;17151:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;17151:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17151:62:0;-1:-1:-1;;;;;;17151:62:0;;;;;;;;;;18662:23;18688:69;18716:4;18688:69;;;;;;;;;;;;;;;;;18696:5;-1:-1:-1;;;;;18688:27:0;;;:69;;;;;:::i;:::-;18772:17;;18662:95;;-1:-1:-1;18772:21:0;18768:224;;18914:10;18903:30;;;;;;;;;;;;:::i;:::-;18895:85;;;;-1:-1:-1;;;18895:85:0;;;;;;;:::i;12946:196::-;13049:12;13081:53;13104:6;13112:4;13118:1;13121:12;14447;14480:18;14491:6;14480:10;:18::i;:::-;14472:60;;;;-1:-1:-1;;;14472:60:0;;;;;;;:::i;:::-;14604:12;14618:23;14645:6;-1:-1:-1;;;;;14645:11:0;14665:8;14676:4;14645:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14603:78;;;;14696:7;14692:593;;;14727:10;-1:-1:-1;14720:17:0;;-1:-1:-1;14720:17:0;14692:593;14841:17;;:21;14837:437;;15102:10;15096:17;15163:15;15150:10;15146:2;15142:19;15135:44;15050:148;15245:12;15238:20;;-1:-1:-1;;;15238:20:0;;;;;;;;:::i;10038:420::-;10403:20;10442:8;;;10038:420::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1581:263::-;;1696:2;1684:9;1675:7;1671:23;1667:32;1664:2;;;-1:-1;;1702:12;1664:2;226:6;220:13;238:33;265:5;238:33;:::i;1851:366::-;;;1972:2;1960:9;1951:7;1947:23;1943:32;1940:2;;;-1:-1;;1978:12;1940:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2030:63;-1:-1;2130:2;2169:22;;72:20;97:33;72:20;97:33;:::i;:::-;2138:63;;;;1934:283;;;;;:::o;2224:491::-;;;;2362:2;2350:9;2341:7;2337:23;2333:32;2330:2;;;-1:-1;;2368:12;2330:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2420:63;-1:-1;2520:2;2559:22;;72:20;97:33;72:20;97:33;:::i;:::-;2528:63;-1:-1;2628:2;2667:22;;72:20;97:33;72:20;97:33;:::i;:::-;2636:63;;;;2324:391;;;;;:::o;2722:392::-;;2862:2;;2850:9;2841:7;2837:23;2833:32;2830:2;;;-1:-1;;2868:12;2830:2;2919:17;2913:24;2957:18;2949:6;2946:30;2943:2;;;-1:-1;;2979:12;2943:2;3081:6;3070:9;3066:22;429:3;422:4;414:6;410:17;406:27;396:2;;-1:-1;;437:12;396:2;477:6;471:13;457:27;;499:80;514:64;571:6;514:64;:::i;:::-;499:80;:::i;:::-;607:21;;;664:14;;;;639:17;;;753;;;744:27;;;;741:36;-1:-1;738:2;;;-1:-1;;780:12;738:2;-1:-1;806:10;;800:217;825:6;822:1;819:13;800:217;;;1518:13;;893:61;;847:1;840:9;;;;;968:14;;;;996;;800:217;;;-1:-1;2999:99;2824:290;-1:-1;;;;;;;2824:290::o;3121:257::-;;3233:2;3221:9;3212:7;3208:23;3204:32;3201:2;;;-1:-1;;3239:12;3201:2;1112:6;1106:13;27966:5;26944:13;26937:21;27944:5;27941:32;27931:2;;-1:-1;;27977:12;3385:241;;3489:2;3477:9;3468:7;3464:23;3460:32;3457:2;;;-1:-1;;3495:12;3457:2;-1:-1;1233:20;;3451:175;-1:-1;3451:175::o;3633:366::-;;;3754:2;3742:9;3733:7;3729:23;3725:32;3722:2;;;-1:-1;;3760:12;3722:2;1246:6;1233:20;3812:63;;3912:2;3955:9;3951:22;72:20;97:33;124:5;97:33;:::i;4006:366::-;;;4127:2;4115:9;4106:7;4102:23;4098:32;4095:2;;;-1:-1;;4133:12;4095:2;-1:-1;;1233:20;;;4285:2;4324:22;;;1370:20;;-1:-1;4089:283::o;4627:263::-;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;-1:-1;;4748:12;4710:2;-1:-1;1518:13;;4704:186;-1:-1;4704:186::o;5270:399::-;;;5402:2;5390:9;5381:7;5377:23;5373:32;5370:2;;;-1:-1;;5408:12;5370:2;-1:-1;;1518:13;;5571:2;5621:22;;;1518:13;;;;;-1:-1;5364:305::o;5676:535::-;;;;5825:2;5813:9;5804:7;5800:23;5796:32;5793:2;;;-1:-1;;5831:12;5793:2;1524:6;1518:13;5883:74;;5994:2;6048:9;6044:22;1518:13;6002:74;;6113:2;6167:9;6163:22;1518:13;6121:74;;5787:424;;;;;:::o;14513:271::-;;7750:5;25701:12;7861:52;7906:6;7901:3;7894:4;7887:5;7883:16;7861:52;:::i;:::-;7925:16;;;;;14647:137;-1:-1;;14647:137::o;14791:381::-;-1:-1;;;9842:45;;9826:2;9906:12;;14980:192::o;15179:222::-;-1:-1;;;;;27111:54;;;;6461:37;;15306:2;15291:18;;15277:124::o;15408:333::-;-1:-1;;;;;27111:54;;;6461:37;;27111:54;;15727:2;15712:18;;6461:37;15563:2;15548:18;;15534:207::o;15748:924::-;-1:-1;;;;;27111:54;;;6461:37;;27111:54;;;16224:2;16209:18;;6461:37;16307:2;16292:18;;7541:37;;;;16398:2;16383:18;;8032:58;;;;16489:3;16474:19;;8032:58;27111:54;;;27122:42;16558:19;;6461:37;16657:3;16642:19;;7541:37;;;;16059:3;16044:19;;16030:642::o;16679:768::-;;16968:3;16957:9;16953:19;16945:27;;2957:18;;27122:42;;;;6491:5;27111:54;6468:3;6461:37;27122:42;6491:5;27111:54;17133:2;17122:9;17118:18;6461:37;;7571:5;17216:2;17205:9;17201:18;7541:37;7571:5;17299:2;17288:9;17284:18;7541:37;12844:16;12838:23;17432:3;17421:9;17417:19;7541:37;17133:2;13015:5;13011:16;13005:23;13082:14;17421:9;13082:14;7541:37;17216:2;13181:5;13177:16;13171:23;13248:14;17421:9;13248:14;7541:37;17299:2;13343:5;13339:16;13333:23;13410:14;17421:9;13410:14;7541:37;17432:3;13507:5;13503:16;13497:23;13574:14;13497:23;13574:14;17421:9;13574:14;7541:37;13082:14;13673:5;13669:16;13663:23;13740:14;17421:9;13740:14;7541:37;13248:14;13838:5;13834:16;13828:23;13905:14;17421:9;13905:14;7541:37;13410:14;14002:5;13998:16;13992:23;14069:14;17421:9;14069:14;7541:37;13574:14;14169:5;14165:18;14159:25;14238:16;17421:9;14238:16;7541:37;;;16939:508;;;;;;;;:::o;17454:1004::-;-1:-1;;;;;27111:54;;;6461:37;;27111:54;;;17942:2;17927:18;;6461:37;18025:2;18010:18;;7541:37;;;;18108:2;18093:18;;7541:37;;;;18191:3;18176:19;;7541:37;;;;27122:42;18260:19;;7541:37;27111:54;;;18359:3;18344:19;;6461:37;18443:3;18428:19;;7541:37;;;;17777:3;17762:19;;17748:710::o;18465:333::-;-1:-1;;;;;27111:54;;;;6461:37;;18784:2;18769:18;;7541:37;18620:2;18605:18;;18591:207::o;18805:210::-;26944:13;;26937:21;7424:34;;18926:2;18911:18;;18897:118::o;19022:222::-;7541:37;;;19149:2;19134:18;;19120:124::o;19251:310::-;;19398:2;19419:17;19412:47;8247:5;25701:12;26245:6;19398:2;19387:9;19383:18;26233:19;8341:52;8386:6;26273:14;19387:9;26273:14;19398:2;8367:5;8363:16;8341:52;:::i;:::-;27740:7;27724:14;-1:-1;;27720:28;8405:39;;;;26273:14;8405:39;;19369:192;-1:-1;;19369:192::o;19568:416::-;19768:2;19782:47;;;8681:2;19753:18;;;26233:19;8717:34;26273:14;;;8697:55;-1:-1;;;8772:12;;;8765:26;8810:12;;;19739:245::o;19991:416::-;20191:2;20205:47;;;9061:2;20176:18;;;26233:19;9097:34;26273:14;;;9077:55;-1:-1;;;9152:12;;;9145:39;9203:12;;;20162:245::o;20414:416::-;20614:2;20628:47;;;9454:2;20599:18;;;26233:19;9490:29;26273:14;;;9470:50;9539:12;;;20585:245::o;20837:416::-;21037:2;21051:47;;;10157:2;21022:18;;;26233:19;10193:34;26273:14;;;10173:55;-1:-1;;;10248:12;;;10241:40;10300:12;;;21008:245::o;21260:416::-;21460:2;21474:47;;;10551:2;21445:18;;;26233:19;-1:-1;;;26273:14;;;10567:36;10622:12;;;21431:245::o;21683:416::-;21883:2;21897:47;;;10873:2;21868:18;;;26233:19;10909:34;26273:14;;;10889:55;-1:-1;;;10964:12;;;10957:25;11001:12;;;21854:245::o;22106:416::-;22306:2;22320:47;;;11252:2;22291:18;;;26233:19;11288:31;26273:14;;;11268:52;11339:12;;;22277:245::o;22529:416::-;22729:2;22743:47;;;11590:2;22714:18;;;26233:19;11626:34;26273:14;;;11606:55;-1:-1;;;11681:12;;;11674:34;11727:12;;;22700:245::o;22952:416::-;23152:2;23166:47;;;11978:2;23137:18;;;26233:19;12014:34;26273:14;;;11994:55;-1:-1;;;12069:12;;;12062:46;12127:12;;;23123:245::o;23375:416::-;23575:2;23589:47;;;12378:2;23560:18;;;26233:19;12414:34;26273:14;;;12394:55;-1:-1;;;12469:12;;;12462:39;12520:12;;;23546:245::o;24027:832::-;;24324:3;24313:9;24309:19;7571:5;7548:3;7541:37;24497:2;27343:24;24497:2;24486:9;24482:18;8032:58;24324:3;24534:2;24523:9;24519:18;24512:48;24574:108;6854:5;25701:12;26245:6;26240:3;26233:19;26273:14;24313:9;26273:14;6866:93;;24497:2;7030:5;25555:14;7042:21;;-1:-1;7069:260;7094:6;7091:1;7088:13;7069:260;;;7155:13;;-1:-1;;;;;27111:54;6461:37;;26088:14;;;;6372;;;;2957:18;7109:9;7069:260;;;-1:-1;;;;;;;27111:54;;;;24761:2;24746:18;;6461:37;-1:-1;;;24844:3;24829:19;7541:37;24566:116;24295:564;-1:-1;;;24295:564::o;24866:256::-;24928:2;24922:9;24954:17;;;25029:18;25014:34;;25050:22;;;25011:62;25008:2;;;25086:1;;25076:12;25008:2;24928;25095:22;24906:216;;-1:-1;24906:216::o;25129:304::-;;25288:18;25280:6;25277:30;25274:2;;;-1:-1;;25310:12;25274:2;-1:-1;25355:4;25343:17;;;25408:15;;25211:222::o;27380:268::-;27445:1;27452:101;27466:6;27463:1;27460:13;27452:101;;;27533:11;;;27527:18;27514:11;;;27507:39;27488:2;27481:10;27452:101;;;27568:6;27565:1;27562:13;27559:2;;;27445:1;27624:6;27619:3;27615:16;27608:27;27559:2;;27429:219;;;:::o;27761:117::-;-1:-1;;;;;27111:54;;27820:35;;27810:2;;27869:1;;27859:12;27810:2;27804:74;:::o
Swarm Source
ipfs://19d4c7f716b593fa852300db5bd8268af642dceb36785a78c49809144ca7f8dd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.