Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
Pool
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-09 */ // Sources flattened with hardhat v2.2.1 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @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 on 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { 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 @openzeppelin/contracts/token/ERC20/utils/[email protected] pragma solidity ^0.8.0; /** * @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 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) + value; _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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 @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/interfaces/IShare.sol pragma solidity 0.8.4; pragma experimental ABIEncoderV2; interface IShare { function poolBurnFrom(address _address, uint256 _amount) external; function poolMint(address _address, uint256 m_amount) external; } // File contracts/interfaces/IDollar.sol pragma solidity 0.8.4; interface IDollar { function poolBurnFrom(address _address, uint256 _amount) external; function poolMint(address _address, uint256 m_amount) external; } // File contracts/interfaces/ITreasury.sol pragma solidity 0.8.4; interface ITreasury { function hasPool(address _address) external view returns (bool); function collateralReserve() external view returns (address); function globalCollateralBalance() external view returns (uint256); function globalCollateralValue() external view returns (uint256); function requestTransfer( address token, address receiver, uint256 amount ) external; function info() external view returns ( uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256 ); } // File contracts/interfaces/IOracle.sol pragma solidity 0.8.4; interface IOracle { function consult() external view returns (uint256); } // File contracts/interfaces/IPool.sol pragma solidity 0.8.4; interface IPool { function getCollateralPrice() external view returns (uint256); function unclaimed_pool_collateral() external view returns (uint256); } // File contracts/Pool.sol pragma solidity 0.8.4; contract Pool is Ownable, ReentrancyGuard, Initializable, IPool { using SafeERC20 for ERC20; /* ========== ADDRESSES ================ */ address public oracle; address public collateral; address public dollar; address public treasury; address public share; /* ========== STATE VARIABLES ========== */ mapping(address => uint256) public redeem_share_balances; mapping(address => uint256) public redeem_collateral_balances; uint256 public override unclaimed_pool_collateral; uint256 public unclaimed_pool_share; mapping(address => uint256) public last_redeemed; // Constants for various precisions uint256 private constant PRICE_PRECISION = 1e6; uint256 private constant COLLATERAL_RATIO_PRECISION = 1e6; uint256 private constant COLLATERAL_RATIO_MAX = 1e6; // Number of decimals needed to get to 18 uint256 private missing_decimals; // Number of blocks to wait before being able to collectRedemption() uint256 public redemption_delay = 1; // AccessControl state variables bool public mint_paused = false; bool public redeem_paused = false; /* ========== MODIFIERS ========== */ modifier onlyTreasury() { require(msg.sender == treasury, "!treasury"); _; } /* ========== CONSTRUCTOR ========== */ function initialize( address _dollar, address _share, address _collateral, address _treasury ) external initializer onlyOwner { dollar = _dollar; share = _share; collateral = _collateral; treasury = _treasury; missing_decimals = 18 - ERC20(_collateral).decimals(); } /* ========== VIEWS ========== */ function info() external view returns ( uint256, uint256, uint256, bool, bool ) { return ( unclaimed_pool_collateral, // unclaimed amount of COLLATERAL unclaimed_pool_share, // unclaimed amount of SHARE getCollateralPrice(), // collateral price mint_paused, redeem_paused ); } function collateralReserve() public view returns (address) { return ITreasury(treasury).collateralReserve(); } function getCollateralPrice() public view override returns (uint256) { return IOracle(oracle).consult(); } /* ========== PUBLIC FUNCTIONS ========== */ function mint( uint256 _collateral_amount, uint256 _share_amount, uint256 _dollar_out_min ) external { require(mint_paused == false, "Minting is paused"); (, uint256 _share_price, , uint256 _tcr, , , uint256 _minting_fee, ) = ITreasury(treasury).info(); require(_share_price > 0, "Invalid share price"); uint256 _price_collateral = getCollateralPrice(); uint256 _total_dollar_value = 0; uint256 _required_share_amount = 0; if (_tcr > 0) { uint256 _collateral_value = ((_collateral_amount * (10**missing_decimals)) * _price_collateral) / PRICE_PRECISION; _total_dollar_value = (_collateral_value * COLLATERAL_RATIO_PRECISION) / _tcr; if (_tcr < COLLATERAL_RATIO_MAX) { _required_share_amount = ((_total_dollar_value - _collateral_value) * PRICE_PRECISION) / _share_price; } } else { _total_dollar_value = (_share_amount * _share_price) / PRICE_PRECISION; _required_share_amount = _share_amount; } uint256 _actual_dollar_amount = _total_dollar_value - ((_total_dollar_value * _minting_fee) / PRICE_PRECISION); require(_dollar_out_min <= _actual_dollar_amount, "slippage"); if (_required_share_amount > 0) { require(_required_share_amount <= _share_amount, "Not enough SHARE input"); IShare(share).poolBurnFrom(msg.sender, _required_share_amount); } if (_collateral_amount > 0) { _transferCollateralToReserve(msg.sender, _collateral_amount); } IDollar(dollar).poolMint(msg.sender, _actual_dollar_amount); } function redeem( uint256 _dollar_amount, uint256 _share_out_min, uint256 _collateral_out_min ) external { require(redeem_paused == false, "Redeeming is paused"); (, uint256 _share_price, , , uint256 _ecr, , , uint256 _redemption_fee) = ITreasury(treasury).info(); uint256 _collateral_price = getCollateralPrice(); require(_collateral_price > 0, "Invalid collateral price"); require(_share_price > 0, "Invalid share price"); uint256 _dollar_amount_post_fee = _dollar_amount - ((_dollar_amount * _redemption_fee) / PRICE_PRECISION); uint256 _collateral_output_amount = 0; uint256 _share_output_amount = 0; if (_ecr < COLLATERAL_RATIO_MAX) { uint256 _share_output_value = _dollar_amount_post_fee - ((_dollar_amount_post_fee * _ecr) / PRICE_PRECISION); _share_output_amount = (_share_output_value * PRICE_PRECISION) / _share_price; } if (_ecr > 0) { uint256 _collateral_output_value = ((_dollar_amount_post_fee * _ecr) / PRICE_PRECISION) / (10**missing_decimals); _collateral_output_amount = (_collateral_output_value * PRICE_PRECISION) / _collateral_price; } // Check if collateral balance meets and meet output expectation uint256 _totalCollateralBalance = ITreasury(treasury).globalCollateralBalance(); require(_collateral_output_amount <= _totalCollateralBalance, "<collateralBalance"); require( _collateral_out_min <= _collateral_output_amount && _share_out_min <= _share_output_amount, ">slippage" ); if (_collateral_output_amount > 0) { redeem_collateral_balances[msg.sender] = redeem_collateral_balances[msg.sender] + _collateral_output_amount; unclaimed_pool_collateral = unclaimed_pool_collateral + _collateral_output_amount; } if (_share_output_amount > 0) { redeem_share_balances[msg.sender] = redeem_share_balances[msg.sender] + _share_output_amount; unclaimed_pool_share = unclaimed_pool_share + _share_output_amount; } last_redeemed[msg.sender] = block.number; // Move all external functions to the end IDollar(dollar).poolBurnFrom(msg.sender, _dollar_amount); if (_share_output_amount > 0) { _mintShareToCollateralReserve(_share_output_amount); } } function collectRedemption() external { require( (last_redeemed[msg.sender] + redemption_delay) <= block.number, "<redemption_delay" ); bool _send_share = false; bool _send_collateral = false; uint256 _share_amount; uint256 _collateral_amount; // Use Checks-Effects-Interactions pattern if (redeem_share_balances[msg.sender] > 0) { _share_amount = redeem_share_balances[msg.sender]; redeem_share_balances[msg.sender] = 0; unclaimed_pool_share = unclaimed_pool_share - _share_amount; _send_share = true; } if (redeem_collateral_balances[msg.sender] > 0) { _collateral_amount = redeem_collateral_balances[msg.sender]; redeem_collateral_balances[msg.sender] = 0; unclaimed_pool_collateral = unclaimed_pool_collateral - _collateral_amount; _send_collateral = true; } if (_send_share) { _requestTransferShare(msg.sender, _share_amount); } if (_send_collateral) { _requestTransferCollateral(msg.sender, _collateral_amount); } } /* ========== INTERNAL FUNCTIONS ========== */ function _transferCollateralToReserve(address _sender, uint256 _amount) internal { address _reserve = collateralReserve(); require(_reserve != address(0), "Invalid reserve address"); ERC20(collateral).safeTransferFrom(_sender, _reserve, _amount); } function _mintShareToCollateralReserve(uint256 _amount) internal { address _reserve = collateralReserve(); require(_reserve != address(0), "Invalid reserve address"); IShare(share).poolMint(_reserve, _amount); } function _requestTransferCollateral(address _receiver, uint256 _amount) internal { ITreasury(treasury).requestTransfer(collateral, _receiver, _amount); } function _requestTransferShare(address _receiver, uint256 _amount) internal { ITreasury(treasury).requestTransfer(share, _receiver, _amount); } /* ========== RESTRICTED FUNCTIONS ========== */ function toggleMinting() external onlyOwner { mint_paused = !mint_paused; } function toggleRedeeming() external onlyOwner { redeem_paused = !redeem_paused; } function setOracle(address _oracle) external onlyOwner { require(_oracle != address(0), "Invalid address"); oracle = _oracle; } function setRedemptionDelay(uint256 _redemption_delay) external onlyOwner { redemption_delay = _redemption_delay; } function setTreasury(address _treasury) external onlyOwner { require(_treasury != address(0), "Invalid address"); treasury = _treasury; emit TreasuryChanged(_treasury); } // EVENTS event TreasuryChanged(address indexed newTreasury); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryChanged","type":"event"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectRedemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dollar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"info","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dollar","type":"address"},{"internalType":"address","name":"_share","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"last_redeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collateral_amount","type":"uint256"},{"internalType":"uint256","name":"_share_amount","type":"uint256"},{"internalType":"uint256","name":"_dollar_out_min","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dollar_amount","type":"uint256"},{"internalType":"uint256","name":"_share_out_min","type":"uint256"},{"internalType":"uint256","name":"_collateral_out_min","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"redeem_collateral_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeem_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"redeem_share_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redemption_delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_redemption_delay","type":"uint256"}],"name":"setRedemptionDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRedeeming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimed_pool_collateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimed_pool_share","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001600d55600e805461ffff1916905534801561002057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055611bc6806100756000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063a8d5fd65116100f9578063dc0d2a9811610097578063f2fde38b11610071578063f2fde38b146103c8578063f7683bbc146103db578063f8c8765e146103e3578063ff626c5f146103f657600080fd5b8063dc0d2a9814610382578063f0f44260146103a2578063f1a9ee03146103b557600080fd5b8063c82c4d0e116100d3578063c82c4d0e1461033e578063d0d132f314610347578063d8dfeb4514610367578063daa504851461037a57600080fd5b8063a8d5fd651461030b578063b81922051461031e578063c7d272281461033157600080fd5b806361d027b3116101665780637d55094d116101405780637d55094d146102b75780637dc0d1d0146102bf57806380a66d05146102d85780638da5cb5b146102fa57600080fd5b806361d027b314610289578063715018a61461029c5780637adbf973146102a457600080fd5b8063370158ea116101a2578063370158ea14610202578063465b0c411461023657806351adeb5714610256578063543671351461026957600080fd5b806302acc94b146101c957806312ace5a2146101de57806315128425146101e6575b600080fd5b6101dc6101d736600461188c565b6103ff565b005b6101dc610778565b6101ef600d5481565b6040519081526020015b60405180910390f35b61020a610886565b60408051958652602086019490945292840191909152151560608301521515608082015260a0016101f9565b61023e6108bc565b6040516001600160a01b0390911681526020016101f9565b60045461023e906001600160a01b031681565b6101ef6102773660046117a9565b60076020526000908152604090205481565b60055461023e906001600160a01b031681565b6101dc61093e565b6101dc6102b23660046117a9565b6109b2565b6101dc610a4e565b60025461023e906201000090046001600160a01b031681565b600e546102ea90610100900460ff1681565b60405190151581526020016101f9565b6000546001600160a01b031661023e565b60065461023e906001600160a01b031681565b6101dc61032c36600461188c565b610a8c565b600e546102ea9060ff1681565b6101ef600a5481565b6101ef6103553660046117a9565b60086020526000908152604090205481565b60035461023e906001600160a01b031681565b6101dc610f08565b6101ef6103903660046117a9565b600b6020526000908152604090205481565b6101dc6103b03660046117a9565b610f4f565b6101dc6103c336600461185c565b61100b565b6101dc6103d63660046117a9565b61103a565b6101ef611124565b6101dc6103f13660046117e1565b6111aa565b6101ef60095481565b600e5460ff161561044b5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b60448201526064015b60405180910390fd5b6000806000600560009054906101000a90046001600160a01b03166001600160a01b031663370158ea6040518163ffffffff1660e01b81526004016101006040518083038186803b15801561049f57600080fd5b505afa1580156104b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d791906118b7565b5096505050945050935050600083116105285760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420736861726520707269636560681b6044820152606401610442565b6000610532611124565b905060008084156105c4576000620f424084600c54600a6105539190611a33565b61055d908d611add565b6105679190611add565b61057191906119d0565b905085610581620f424083611add565b61058b91906119d0565b9250620f42408610156105be5786620f42406105a78386611afc565b6105b19190611add565b6105bb91906119d0565b91505b506105e2565b620f42406105d2878a611add565b6105dc91906119d0565b91508790505b6000620f42406105f28685611add565b6105fc91906119d0565b6106069084611afc565b9050808811156106435760405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606401610442565b81156106f757888211156106925760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da0814d2105491481a5b9c1d5d60521b6044820152606401610442565b6006546040516305060b2d60e11b8152336004820152602481018490526001600160a01b0390911690630a0c165a90604401600060405180830381600087803b1580156106de57600080fd5b505af11580156106f2573d6000803e3d6000fd5b505050505b891561070757610707338b611354565b600480546040516306203eab60e11b81523392810192909252602482018390526001600160a01b031690630c407d5690604401600060405180830381600087803b15801561075457600080fd5b505af1158015610768573d6000803e3d6000fd5b5050505050505050505050505050565b600d54336000908152600b60205260409020544391610796916119b8565b11156107d85760405162461bcd60e51b81526020600482015260116024820152703c726564656d7074696f6e5f64656c617960781b6044820152606401610442565b3360009081526007602052604081205481908190819015610820573360009081526007602052604081208054919055600a54909250610818908390611afc565b600a55600193505b336000908152600860205260409020541561086057503360009081526008602052604081208054919055600954610858908290611afc565b600955600192505b83156108705761087033836113cd565b8215610880576108803382611442565b50505050565b6000806000806000600954600a5461089c611124565b600e549298919750955060ff808316955061010090920490911692509050565b6005546040805163465b0c4160e01b815290516000926001600160a01b03169163465b0c41916004808301926020929190829003018186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093991906117c5565b905090565b6000546001600160a01b031633146109685760405162461bcd60e51b815260040161044290611983565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146109dc5760405162461bcd60e51b815260040161044290611983565b6001600160a01b038116610a245760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610442565b600280546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6000546001600160a01b03163314610a785760405162461bcd60e51b815260040161044290611983565b600e805460ff19811660ff90911615179055565b600e54610100900460ff1615610ada5760405162461bcd60e51b815260206004820152601360248201527214995919595b5a5b99c81a5cc81c185d5cd959606a1b6044820152606401610442565b6000806000600560009054906101000a90046001600160a01b03166001600160a01b031663370158ea6040518163ffffffff1660e01b81526004016101006040518083038186803b158015610b2e57600080fd5b505afa158015610b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6691906118b7565b97505050955050509350506000610b7b611124565b905060008111610bcd5760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420636f6c6c61746572616c20707269636500000000000000006044820152606401610442565b60008411610c135760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420736861726520707269636560681b6044820152606401610442565b6000620f4240610c23848a611add565b610c2d91906119d0565b610c379089611afc565b9050600080620f4240861015610c89576000620f4240610c578886611add565b610c6191906119d0565b610c6b9085611afc565b905087610c7b620f424083611add565b610c8591906119d0565b9150505b8515610ce0576000600c54600a610ca09190611a33565b620f4240610cae8987611add565b610cb891906119d0565b610cc291906119d0565b905084610cd2620f424083611add565b610cdc91906119d0565b9250505b60055460408051636912cb4360e01b815290516000926001600160a01b031691636912cb43916004808301926020929190829003018186803b158015610d2557600080fd5b505afa158015610d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5d9190611874565b905080831115610da45760405162461bcd60e51b81526020600482015260126024820152713c636f6c6c61746572616c42616c616e636560701b6044820152606401610442565b828911158015610db45750818a11155b610dec5760405162461bcd60e51b81526020600482015260096024820152683e736c69707061676560b81b6044820152606401610442565b8215610e2f5733600090815260086020526040902054610e0d9084906119b8565b33600090815260086020526040902055600954610e2b9084906119b8565b6009555b8115610e725733600090815260076020526040902054610e509083906119b8565b33600090815260076020526040902055600a54610e6e9083906119b8565b600a555b336000818152600b6020526040908190204390556004805491516305060b2d60e11b815290810192909252602482018d90526001600160a01b031690630a0c165a90604401600060405180830381600087803b158015610ed157600080fd5b505af1158015610ee5573d6000803e3d6000fd5b505050506000821115610efb57610efb82611485565b5050505050505050505050565b6000546001600160a01b03163314610f325760405162461bcd60e51b815260040161044290611983565b600e805461ff001981166101009182900460ff1615909102179055565b6000546001600160a01b03163314610f795760405162461bcd60e51b815260040161044290611983565b6001600160a01b038116610fc15760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610442565b600580546001600160a01b0319166001600160a01b0383169081179091556040517fc714d22a2f08b695f81e7c707058db484aa5b4d6b4c9fd64beb10fe85832f60890600090a250565b6000546001600160a01b031633146110355760405162461bcd60e51b815260040161044290611983565b600d55565b6000546001600160a01b031633146110645760405162461bcd60e51b815260040161044290611983565b6001600160a01b0381166110c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610442565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600060028054906101000a90046001600160a01b03166001600160a01b0316637eeda7036040518163ffffffff1660e01b815260040160206040518083038186803b15801561117257600080fd5b505afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109399190611874565b600254610100900460ff16806111c3575060025460ff16155b6112265760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610442565b600254610100900460ff16158015611248576002805461ffff19166101011790555b6000546001600160a01b031633146112725760405162461bcd60e51b815260040161044290611983565b600480546001600160a01b038088166001600160a01b0319928316178355600680548883169084161790556003805487831690841681179091556005805492871692909316919091179091556040805163313ce56760e01b81529051919263313ce567928282019260209290829003018186803b1580156112f257600080fd5b505afa158015611306573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132a9190611913565b611335906012611b13565b60ff16600c55801561134d576002805461ff00191690555b5050505050565b600061135e6108bc565b90506001600160a01b0381166113b05760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642072657365727665206164647265737360481b6044820152606401610442565b6003546113c8906001600160a01b031684838561151a565b505050565b60055460065460405163a4293ead60e01b81526001600160a01b03918216600482015284821660248201526044810184905291169063a4293ead906064015b600060405180830381600087803b15801561142657600080fd5b505af115801561143a573d6000803e3d6000fd5b505050505050565b60055460035460405163a4293ead60e01b81526001600160a01b03918216600482015284821660248201526044810184905291169063a4293ead9060640161140c565b600061148f6108bc565b90506001600160a01b0381166114e15760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642072657365727665206164647265737360481b6044820152606401610442565b6006546040516306203eab60e11b81526001600160a01b0383811660048301526024820185905290911690630c407d569060440161140c565b604080516001600160a01b038581166024830152848116604483015260648083018590528351808403909101815260849092018352602080830180516001600160e01b03166323b872dd60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610880928792916000916115b291851690849061162f565b8051909150156113c857808060200190518101906115d0919061183c565b6113c85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610442565b606061163e8484600085611648565b90505b9392505050565b6060824710156116a95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610442565b843b6116f75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610442565b600080866001600160a01b031685876040516117139190611934565b60006040518083038185875af1925050503d8060008114611750576040519150601f19603f3d011682016040523d82523d6000602084013e611755565b606091505b5091509150611765828286611770565b979650505050505050565b6060831561177f575081611641565b82511561178f5782518084602001fd5b8160405162461bcd60e51b81526004016104429190611950565b6000602082840312156117ba578081fd5b813561164181611b78565b6000602082840312156117d6578081fd5b815161164181611b78565b600080600080608085870312156117f6578283fd5b843561180181611b78565b9350602085013561181181611b78565b9250604085013561182181611b78565b9150606085013561183181611b78565b939692955090935050565b60006020828403121561184d578081fd5b81518015158114611641578182fd5b60006020828403121561186d578081fd5b5035919050565b600060208284031215611885578081fd5b5051919050565b6000806000606084860312156118a0578283fd5b505081359360208301359350604090920135919050565b600080600080600080600080610100898b0312156118d3578384fd5b505086516020880151604089015160608a015160808b015160a08c015160c08d015160e0909d0151959e949d50929b919a50985090965094509092509050565b600060208284031215611924578081fd5b815160ff81168114611641578182fd5b60008251611946818460208701611b36565b9190910192915050565b602081526000825180602084015261196f816040850160208701611b36565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156119cb576119cb611b62565b500190565b6000826119eb57634e487b7160e01b81526012600452602481fd5b500490565b600181815b80851115611a2b578160001904821115611a1157611a11611b62565b80851615611a1e57918102915b93841c93908002906119f5565b509250929050565b60006116418383600082611a4957506001611ad7565b81611a5657506000611ad7565b8160018114611a6c5760028114611a7657611a92565b6001915050611ad7565b60ff841115611a8757611a87611b62565b50506001821b611ad7565b5060208310610133831016604e8410600b8410161715611ab5575081810a611ad7565b611abf83836119f0565b8060001904821115611ad357611ad3611b62565b0290505b92915050565b6000816000190483118215151615611af757611af7611b62565b500290565b600082821015611b0e57611b0e611b62565b500390565b600060ff821660ff841680821015611b2d57611b2d611b62565b90039392505050565b60005b83811015611b51578181015183820152602001611b39565b838111156108805750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611b8d57600080fd5b5056fea2646970667358221220774c7143bac35a990bd282dff4c1e3284208458b345b7dc194b68d369ba50e7364736f6c63430008040033
Deployed ByteCode Sourcemap
36720:10086:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39299:1826;;;;;;:::i;:::-;;:::i;:::-;;43808:1227;;;:::i;37742:35::-;;;;;;;;;11223:25:1;;;11211:2;11196:18;37742:35:0;;;;;;;;38509:470;;;:::i;:::-;;;;11506:25:1;;;11562:2;11547:18;;11540:34;;;;11590:18;;;11583:34;;;;11660:14;11653:22;11648:2;11633:18;;11626:50;11720:14;11713:22;11707:3;11692:19;;11685:51;11493:3;11478:19;38509:470:0;11460:282:1;38987:124:0;;;:::i;:::-;;;-1:-1:-1;;;;;3627:32:1;;;3609:51;;3597:2;3582:18;38987:124:0;3564:102:1;36934:21:0;;;;;-1:-1:-1;;;;;36934:21:0;;;37072:56;;;;;;:::i;:::-;;;;;;;;;;;;;;36962:23;;;;;-1:-1:-1;;;;;36962:23:0;;;29856:148;;;:::i;46232:150::-;;;;;;:::i;:::-;;:::i;46032:89::-;;;:::i;36874:21::-;;;;;;;;-1:-1:-1;;;;;36874:21:0;;;37862:33;;;;;;;;;;;;;;;4495:14:1;;4488:22;4470:41;;4458:2;4443:18;37862:33:0;4425:92:1;29205:87:0;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;29205:87;;36992:20;;;;;-1:-1:-1;;;;;36992:20:0;;;41133:2667;;;;;;:::i;:::-;;:::i;37824:31::-;;;;;;;;;37261:35;;;;;;37135:61;;;;;;:::i;:::-;;;;;;;;;;;;;;36902:25;;;;;-1:-1:-1;;;;;36902:25:0;;;46129:95;;;:::i;37305:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;46527:202;;;;;;:::i;:::-;;:::i;46390:129::-;;;;;;:::i;:::-;;:::i;30159:244::-;;;;;;:::i;:::-;;:::i;39119:120::-;;;:::i;38103:357::-;;;;;;:::i;:::-;;:::i;37205:49::-;;;;;;39299:1826;39451:11;;;;:20;39443:50;;;;-1:-1:-1;;;39443:50:0;;10164:2:1;39443:50:0;;;10146:21:1;10203:2;10183:18;;;10176:30;-1:-1:-1;;;10222:18:1;;;10215:47;10279:18;;39443:50:0;;;;;;;;;39507:20;39531:12;39549:20;39598:8;;;;;;;;;-1:-1:-1;;;;;39598:8:0;-1:-1:-1;;;;;39588:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39504:110;;;;;;;;;;;39648:1;39633:12;:16;39625:48;;;;-1:-1:-1;;;39625:48:0;;9816:2:1;39625:48:0;;;9798:21:1;9855:2;9835:18;;;9828:30;-1:-1:-1;;;9874:18:1;;;9867:49;9933:18;;39625:48:0;9788:169:1;39625:48:0;39684:25;39712:20;:18;:20::i;:::-;39684:48;-1:-1:-1;39743:27:0;;39834:8;;39830:665;;39859:25;37446:3;39953:17;39932:16;;39928:2;:20;;;;:::i;:::-;39906:43;;:18;:43;:::i;:::-;39905:65;;;;:::i;:::-;39904:106;;;;:::i;:::-;39859:151;-1:-1:-1;40098:4:0;40048:46;37510:3;39859:151;40048:46;:::i;:::-;40047:55;;;;:::i;:::-;40025:77;;37568:3;40121:4;:27;40117:211;;;40300:12;37446:3;40217:39;40239:17;40217:19;:39;:::i;:::-;40216:59;;;;:::i;:::-;40215:97;;;;:::i;:::-;40169:143;;40117:211;39830:665;;;;37446:3;40383:28;40399:12;40383:13;:28;:::i;:::-;40382:48;;;;:::i;:::-;40360:70;;40470:13;40445:38;;39830:665;40505:29;37446:3;40574:34;40596:12;40574:19;:34;:::i;:::-;40573:54;;;;:::i;:::-;40550:78;;:19;:78;:::i;:::-;40505:123;;40666:21;40647:15;:40;;40639:61;;;;-1:-1:-1;;;40639:61:0;;5456:2:1;40639:61:0;;;5438:21:1;5495:1;5475:18;;;5468:29;-1:-1:-1;;;5513:18:1;;;5506:38;5561:18;;40639:61:0;5428:157:1;40639:61:0;40717:26;;40713:210;;40794:13;40768:22;:39;;40760:74;;;;-1:-1:-1;;;40760:74:0;;5792:2:1;40760:74:0;;;5774:21:1;5831:2;5811:18;;;5804:30;-1:-1:-1;;;5850:18:1;;;5843:52;5912:18;;40760:74:0;5764:172:1;40760:74:0;40856:5;;40849:62;;-1:-1:-1;;;40849:62:0;;40876:10;40849:62;;;4225:51:1;4292:18;;;4285:34;;;-1:-1:-1;;;;;40856:5:0;;;;40849:26;;4198:18:1;;40849:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40713:210;40937:22;;40933:115;;40976:60;41005:10;41017:18;40976:28;:60::i;:::-;41066:6;;;41058:59;;-1:-1:-1;;;41058:59:0;;41083:10;41058:59;;;4225:51:1;;;;4292:18;;;4285:34;;;-1:-1:-1;;;;;41066:6:0;;41058:24;;4198:18:1;;41058:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39299:1826;;;;;;;;;;:::o;43808:1227::-;43908:16;;43894:10;43880:25;;;;:13;:25;;;;;;43929:12;;43880:44;;;:::i;:::-;43879:62;;43857:129;;;;-1:-1:-1;;;43857:129:0;;9109:2:1;43857:129:0;;;9091:21:1;9148:2;9128:18;;;9121:30;-1:-1:-1;;;9167:18:1;;;9160:47;9224:18;;43857:129:0;9081:167:1;43857:129:0;44223:10;43999:16;44201:33;;;:21;:33;;;;;;43999:16;;;;;;44201:37;44197:278;;44293:10;44271:33;;;;:21;:33;;;;;;;44319:37;;;44394:20;;44271:33;;-1:-1:-1;44394:36:0;;44271:33;;44394:36;:::i;:::-;44371:20;:59;44459:4;;-1:-1:-1;44197:278:0;44518:10;44532:1;44491:38;;;:26;:38;;;;;;:42;44487:318;;-1:-1:-1;44598:10:0;44571:38;;;;:26;:38;;;;;;;44624:42;;;44709:25;;:46;;44571:38;;44709:46;:::i;:::-;44681:25;:74;44789:4;;-1:-1:-1;44487:318:0;44821:11;44817:92;;;44849:48;44871:10;44883:13;44849:21;:48::i;:::-;44925:16;44921:107;;;44958:58;44985:10;44997:18;44958:26;:58::i;:::-;43808:1227;;;;:::o;38509:470::-;38589:7;38611;38633;38655:4;38674;38728:25;;38802:20;;38866;:18;:20::i;:::-;38921:11;;38706:265;;;;-1:-1:-1;38706:265:0;-1:-1:-1;38921:11:0;;;;;-1:-1:-1;38921:11:0;38947:13;;;;;;;-1:-1:-1;38509:470:0;-1:-1:-1;38509:470:0:o;38987:124::-;39074:8;;39064:39;;;-1:-1:-1;;;39064:39:0;;;;39037:7;;-1:-1:-1;;;;;39074:8:0;;39064:37;;:39;;;;;;;;;;;;;;39074:8;39064:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39057:46;;38987:124;:::o;29856:148::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;29963:1:::1;29947:6:::0;;29926:40:::1;::::0;-1:-1:-1;;;;;29947:6:0;;::::1;::::0;29926:40:::1;::::0;29963:1;;29926:40:::1;29994:1;29977:19:::0;;-1:-1:-1;;;;;;29977:19:0::1;::::0;;29856:148::o;46232:150::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46306:21:0;::::1;46298:49;;;::::0;-1:-1:-1;;;46298:49:0;;5112:2:1;46298:49:0::1;::::0;::::1;5094:21:1::0;5151:2;5131:18;;;5124:30;-1:-1:-1;;;5170:18:1;;;5163:45;5225:18;;46298:49:0::1;5084:165:1::0;46298:49:0::1;46358:6;:16:::0;;-1:-1:-1;;;;;46358:16:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;46358:16:0;;::::1;::::0;;;::::1;::::0;;46232:150::o;46032:89::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;46102:11:::1;::::0;;-1:-1:-1;;46087:26:0;::::1;46102:11;::::0;;::::1;46101:12;46087:26;::::0;;46032:89::o;41133:2667::-;41288:13;;;;;;;:22;41280:54;;;;-1:-1:-1;;;41280:54:0;;7662:2:1;41280:54:0;;;7644:21:1;7701:2;7681:18;;;7674:30;-1:-1:-1;;;7720:18:1;;;7713:49;7779:18;;41280:54:0;7634:169:1;41280:54:0;41348:20;41374:12;41392:23;41442:8;;;;;;;;;-1:-1:-1;;;;;41442:8:0;-1:-1:-1;;;;;41432:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41345:113;;;;;;;;;;;41469:25;41497:20;:18;:20::i;:::-;41469:48;;41556:1;41536:17;:21;41528:58;;;;-1:-1:-1;;;41528:58:0;;6143:2:1;41528:58:0;;;6125:21:1;6182:2;6162:18;;;6155:30;6221:26;6201:18;;;6194:54;6265:18;;41528:58:0;6115:174:1;41528:58:0;41620:1;41605:12;:16;41597:48;;;;-1:-1:-1;;;41597:48:0;;9816:2:1;41597:48:0;;;9798:21:1;9855:2;9835:18;;;9828:30;-1:-1:-1;;;9874:18:1;;;9867:49;9933:18;;41597:48:0;9788:169:1;41597:48:0;41656:31;37446:3;41722:32;41739:15;41722:14;:32;:::i;:::-;41721:52;;;;:::i;:::-;41703:71;;:14;:71;:::i;:::-;41656:118;;41785:33;41833:28;37568:3;41882:4;:27;41878:277;;;41926:27;37446:3;42001:30;42027:4;42001:23;:30;:::i;:::-;42000:50;;;;:::i;:::-;41973:78;;:23;:78;:::i;:::-;41926:125;-1:-1:-1;42131:12:0;42090:37;37446:3;41926:125;42090:37;:::i;:::-;42089:54;;;;:::i;:::-;42066:77;;41878:277;;42171:8;;42167:311;;42196:32;42308:16;;42304:2;:20;;;;:::i;:::-;37446:3;42250:30;42276:4;42250:23;:30;:::i;:::-;42249:50;;;;:::i;:::-;42248:77;;;;:::i;:::-;42196:129;-1:-1:-1;42449:17:0;42386:42;37446:3;42196:129;42386:42;:::i;:::-;42385:81;;;;:::i;:::-;42340:126;;42167:311;;42608:8;;42598:45;;;-1:-1:-1;;;42598:45:0;;;;42564:31;;-1:-1:-1;;;;;42608:8:0;;42598:43;;:45;;;;;;;;;;;;;;42608:8;42598:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42564:79;;42691:23;42662:25;:52;;42654:83;;;;-1:-1:-1;;;42654:83:0;;8010:2:1;42654:83:0;;;7992:21:1;8049:2;8029:18;;;8022:30;-1:-1:-1;;;8068:18:1;;;8061:48;8126:18;;42654:83:0;7982:168:1;42654:83:0;42793:25;42770:19;:48;;:107;;;;;42857:20;42839:14;:38;;42770:107;42748:166;;;;-1:-1:-1;;;42748:166:0;;8357:2:1;42748:166:0;;;8339:21:1;8396:1;8376:18;;;8369:29;-1:-1:-1;;;8414:18:1;;;8407:39;8463:18;;42748:166:0;8329:158:1;42748:166:0;42931:29;;42927:299;;43062:10;43035:38;;;;:26;:38;;;;;;:83;;43093:25;;43035:83;:::i;:::-;43004:10;42977:38;;;;:26;:38;;;;;:141;43161:25;;:53;;43189:25;;43161:53;:::i;:::-;43133:25;:81;42927:299;43242:24;;43238:264;;43358:10;43336:33;;;;:21;:33;;;;;;:73;;43389:20;;43336:73;:::i;:::-;43305:10;43283:33;;;;:21;:33;;;;;:126;43447:20;;:43;;43470:20;;43447:43;:::i;:::-;43424:20;:66;43238:264;43528:10;43514:25;;;;:13;:25;;;;;;;43542:12;43514:40;;43626:6;;;43618:56;;-1:-1:-1;;;43618:56:0;;;;;4225:51:1;;;;4292:18;;;4285:34;;;-1:-1:-1;;;;;43626:6:0;;43618:28;;4198:18:1;;43618:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43712:1;43689:20;:24;43685:108;;;43730:51;43760:20;43730:29;:51::i;:::-;41133:2667;;;;;;;;;;;:::o;46129:95::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;46203:13:::1;::::0;;-1:-1:-1;;46186:30:0;::::1;46203:13;::::0;;;::::1;;;46202:14;46186:30:::0;;::::1;;::::0;;46129:95::o;46527:202::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46605:23:0;::::1;46597:51;;;::::0;-1:-1:-1;;;46597:51:0;;5112:2:1;46597:51:0::1;::::0;::::1;5094:21:1::0;5151:2;5131:18;;;5124:30;-1:-1:-1;;;5170:18:1;;;5163:45;5225:18;;46597:51:0::1;5084:165:1::0;46597:51:0::1;46659:8;:20:::0;;-1:-1:-1;;;;;;46659:20:0::1;-1:-1:-1::0;;;;;46659:20:0;::::1;::::0;;::::1;::::0;;;46695:26:::1;::::0;::::1;::::0;-1:-1:-1;;46695:26:0::1;46527:202:::0;:::o;46390:129::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;46475:16:::1;:36:::0;46390:129::o;30159:244::-;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23;29417:68;;;;-1:-1:-1;;;29417:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30248:22:0;::::1;30240:73;;;::::0;-1:-1:-1;;;30240:73:0;;6496:2:1;30240:73:0::1;::::0;::::1;6478:21:1::0;6535:2;6515:18;;;6508:30;6574:34;6554:18;;;6547:62;-1:-1:-1;;;6625:18:1;;;6618:36;6671:19;;30240:73:0::1;6468:228:1::0;30240:73:0::1;30350:6;::::0;;30329:38:::1;::::0;-1:-1:-1;;;;;30329:38:0;;::::1;::::0;30350:6;::::1;::::0;30329:38:::1;::::0;::::1;30378:6;:17:::0;;-1:-1:-1;;;;;;30378:17:0::1;-1:-1:-1::0;;;;;30378:17:0;;;::::1;::::0;;;::::1;::::0;;30159:244::o;39119:120::-;39179:7;39214:6;;;;;;;;-1:-1:-1;;;;;39214:6:0;-1:-1:-1;;;;;39206:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38103:357::-;34640:13;;;;;;;;:30;;-1:-1:-1;34658:12:0;;;;34657:13;34640:30;34632:89;;;;-1:-1:-1;;;34632:89:0;;8694:2:1;34632:89:0;;;8676:21:1;8733:2;8713:18;;;8706:30;8772:34;8752:18;;;8745:62;-1:-1:-1;;;8823:18:1;;;8816:44;8877:19;;34632:89:0;8666:236:1;34632:89:0;34757:13;;;;;;;34756:14;34781:101;;;;34816:13;:20;;-1:-1:-1;;34851:19:0;;;;;34781:101;29251:7;29278:6;-1:-1:-1;;;;;29278:6:0;4297:10;29425:23:::1;29417:68;;;;-1:-1:-1::0;;;29417:68:0::1;;;;;;;:::i;:::-;38281:6:::2;:16:::0;;-1:-1:-1;;;;;38281:16:0;;::::2;-1:-1:-1::0;;;;;;38281:16:0;;::::2;;::::0;;38308:5:::2;:14:::0;;;;::::2;::::0;;::::2;;::::0;;38333:10:::2;:24:::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;38368:8:::2;:20:::0;;;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;;;38423:29:::2;::::0;;-1:-1:-1;;;38423:29:0;;;;38333:24;;38423:27:::2;::::0;:29;;::::2;::::0;::::2;::::0;;;;;;;38333:24;38423:29;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38418:34;::::0;:2:::2;:34;:::i;:::-;38399:53;;:16;:53:::0;34908:68;;;;34943:13;:21;;-1:-1:-1;;34943:21:0;;;34908:68;38103:357;;;;;:::o;45097:280::-;45189:16;45208:19;:17;:19::i;:::-;45189:38;-1:-1:-1;;;;;;45246:22:0;;45238:58;;;;-1:-1:-1;;;45238:58:0;;6903:2:1;45238:58:0;;;6885:21:1;6942:2;6922:18;;;6915:30;-1:-1:-1;;;6961:18:1;;;6954:53;7024:18;;45238:58:0;6875:173:1;45238:58:0;45313:10;;45307:62;;-1:-1:-1;;;;;45313:10:0;45342:7;45351:8;45361:7;45307:34;:62::i;:::-;45097:280;;;:::o;45811:157::-;45908:8;;45934:5;;45898:62;;-1:-1:-1;;;45898:62:0;;-1:-1:-1;;;;;45934:5:0;;;45898:62;;;3911:34:1;3981:15;;;3961:18;;;3954:43;4013:18;;;4006:34;;;45908:8:0;;;45898:35;;3846:18:1;;45898:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45811:157;;:::o;45636:167::-;45738:8;;45764:10;;45728:67;;-1:-1:-1;;;45728:67:0;;-1:-1:-1;;;;;45764:10:0;;;45728:67;;;3911:34:1;3981:15;;;3961:18;;;3954:43;4013:18;;;4006:34;;;45738:8:0;;;45728:35;;3846:18:1;;45728:67:0;3828:218:1;45385:243:0;45461:16;45480:19;:17;:19::i;:::-;45461:38;-1:-1:-1;;;;;;45518:22:0;;45510:58;;;;-1:-1:-1;;;45510:58:0;;6903:2:1;45510:58:0;;;6885:21:1;6942:2;6922:18;;;6915:30;-1:-1:-1;;;6961:18:1;;;6954:53;7024:18;;45510:58:0;6875:173:1;45510:58:0;45586:5;;45579:41;;-1:-1:-1;;;45579:41:0;;-1:-1:-1;;;;;4243:32:1;;;45579:41:0;;;4225:51:1;4292:18;;;4285:34;;;45586:5:0;;;;45579:22;;4198:18:1;;45579:41:0;4180:145:1;24785:285:0;24983:68;;;-1:-1:-1;;;;;3929:15:1;;;24983:68:0;;;3911:34:1;3981:15;;;3961:18;;;3954:43;4013:18;;;;4006:34;;;24983:68:0;;;;;;;;;;3846:18:1;;;;24983:68:0;;;;;;;;-1:-1:-1;;;;;24983:68:0;-1:-1:-1;;;24983:68:0;;;27779:69;;;;;;;;;;;;;;;;24929:133;;24963:5;;24983:68;-1:-1:-1;;27779:69:0;;:27;;;24983:68;;27779:27;:69::i;:::-;27863:17;;27740:108;;-1:-1:-1;27863:21:0;27859:237;;28018:10;28007:30;;;;;;;;;;;;:::i;:::-;27999:85;;;;-1:-1:-1;;;27999:85:0;;10868:2:1;27999:85:0;;;10850:21:1;10907:2;10887:18;;;10880:30;10946:34;10926:18;;;10919:62;-1:-1:-1;;;10997:18:1;;;10990:40;11047:19;;27999:85:0;10840:232:1;19318:229:0;19455:12;19487:52;19509:6;19517:4;19523:1;19526:12;19487:21;:52::i;:::-;19480:59;;19318:229;;;;;;:::o;20451:571::-;20621:12;20679:5;20654:21;:30;;20646:81;;;;-1:-1:-1;;;20646:81:0;;7255:2:1;20646:81:0;;;7237:21:1;7294:2;7274:18;;;7267:30;7333:34;7313:18;;;7306:62;-1:-1:-1;;;7384:18:1;;;7377:36;7430:19;;20646:81:0;7227:228:1;20646:81:0;16758:20;;20738:60;;;;-1:-1:-1;;;20738:60:0;;10510:2:1;20738:60:0;;;10492:21:1;10549:2;10529:18;;;10522:30;10588:31;10568:18;;;10561:59;10637:18;;20738:60:0;10482:179:1;20738:60:0;20872:12;20886:23;20913:6;-1:-1:-1;;;;;20913:11:0;20932:5;20939:4;20913:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20871:73;;;;20962:52;20980:7;20989:10;21001:12;20962:17;:52::i;:::-;20955:59;20451:571;-1:-1:-1;;;;;;;20451:571:0:o;23155:777::-;23305:12;23334:7;23330:595;;;-1:-1:-1;23365:10:0;23358:17;;23330:595;23479:17;;:21;23475:439;;23742:10;23736:17;23803:15;23790:10;23786:2;23782:19;23775:44;23690:148;23885:12;23878:20;;-1:-1:-1;;;23878:20:0;;;;;;;;:::i;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:681::-;628:6;636;644;652;705:3;693:9;684:7;680:23;676:33;673:2;;;727:6;719;712:22;673:2;771:9;758:23;790:31;815:5;790:31;:::i;:::-;840:5;-1:-1:-1;897:2:1;882:18;;869:32;910:33;869:32;910:33;:::i;:::-;962:7;-1:-1:-1;1021:2:1;1006:18;;993:32;1034:33;993:32;1034:33;:::i;:::-;1086:7;-1:-1:-1;1145:2:1;1130:18;;1117:32;1158:33;1117:32;1158:33;:::i;:::-;663:560;;;;-1:-1:-1;663:560:1;;-1:-1:-1;;663:560:1:o;1228:297::-;1295:6;1348:2;1336:9;1327:7;1323:23;1319:32;1316:2;;;1369:6;1361;1354:22;1316:2;1406:9;1400:16;1459:5;1452:13;1445:21;1438:5;1435:32;1425:2;;1486:6;1478;1471:22;1530:190;1589:6;1642:2;1630:9;1621:7;1617:23;1613:32;1610:2;;;1663:6;1655;1648:22;1610:2;-1:-1:-1;1691:23:1;;1600:120;-1:-1:-1;1600:120:1:o;1725:194::-;1795:6;1848:2;1836:9;1827:7;1823:23;1819:32;1816:2;;;1869:6;1861;1854:22;1816:2;-1:-1:-1;1897:16:1;;1806:113;-1:-1:-1;1806:113:1:o;1924:326::-;2001:6;2009;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:2;;;2091:6;2083;2076:22;2038:2;-1:-1:-1;;2119:23:1;;;2189:2;2174:18;;2161:32;;-1:-1:-1;2240:2:1;2225:18;;;2212:32;;2028:222;-1:-1:-1;2028:222:1:o;2255:626::-;2388:6;2396;2404;2412;2420;2428;2436;2444;2497:3;2485:9;2476:7;2472:23;2468:33;2465:2;;;2519:6;2511;2504:22;2465:2;-1:-1:-1;;2547:16:1;;2603:2;2588:18;;2582:25;2647:2;2632:18;;2626:25;2691:2;2676:18;;2670:25;2735:3;2720:19;;2714:26;2780:3;2765:19;;2759:26;2825:3;2810:19;;2804:26;2870:3;2855:19;;;2849:26;2547:16;;2582:25;;-1:-1:-1;2626:25:1;;2670;;-1:-1:-1;2714:26:1;-1:-1:-1;2759:26:1;;-1:-1:-1;2804:26:1;-1:-1:-1;2849:26:1;;-1:-1:-1;2455:426:1;-1:-1:-1;2455:426:1:o;2886:293::-;2954:6;3007:2;2995:9;2986:7;2982:23;2978:32;2975:2;;;3028:6;3020;3013:22;2975:2;3065:9;3059:16;3115:4;3108:5;3104:16;3097:5;3094:27;3084:2;;3140:6;3132;3125:22;3184:274;3313:3;3351:6;3345:13;3367:53;3413:6;3408:3;3401:4;3393:6;3389:17;3367:53;:::i;:::-;3436:16;;;;;3321:137;-1:-1:-1;;3321:137:1:o;4522:383::-;4671:2;4660:9;4653:21;4634:4;4703:6;4697:13;4746:6;4741:2;4730:9;4726:18;4719:34;4762:66;4821:6;4816:2;4805:9;4801:18;4796:2;4788:6;4784:15;4762:66;:::i;:::-;4889:2;4868:15;-1:-1:-1;;4864:29:1;4849:45;;;;4896:2;4845:54;;4643:262;-1:-1:-1;;4643:262:1:o;9253:356::-;9455:2;9437:21;;;9474:18;;;9467:30;9533:34;9528:2;9513:18;;9506:62;9600:2;9585:18;;9427:182::o;11747:128::-;11787:3;11818:1;11814:6;11811:1;11808:13;11805:2;;;11824:18;;:::i;:::-;-1:-1:-1;11860:9:1;;11795:80::o;11880:217::-;11920:1;11946;11936:2;;-1:-1:-1;;;11971:31:1;;12025:4;12022:1;12015:15;12053:4;11978:1;12043:15;11936:2;-1:-1:-1;12082:9:1;;11926:171::o;12102:422::-;12191:1;12234:5;12191:1;12248:270;12269:7;12259:8;12256:21;12248:270;;;12328:4;12324:1;12320:6;12316:17;12310:4;12307:27;12304:2;;;12337:18;;:::i;:::-;12387:7;12377:8;12373:22;12370:2;;;12407:16;;;;12370:2;12486:22;;;;12446:15;;;;12248:270;;;12252:3;12166:358;;;;;:::o;12529:131::-;12589:5;12618:36;12645:8;12639:4;12714:5;12744:8;12734:2;;-1:-1:-1;12785:1:1;12799:5;;12734:2;12833:4;12823:2;;-1:-1:-1;12870:1:1;12884:5;;12823:2;12915:4;12933:1;12928:59;;;;13001:1;12996:130;;;;12908:218;;12928:59;12958:1;12949:10;;12972:5;;;12996:130;13033:3;13023:8;13020:17;13017:2;;;13040:18;;:::i;:::-;-1:-1:-1;;13096:1:1;13082:16;;13111:5;;12908:218;;13210:2;13200:8;13197:16;13191:3;13185:4;13182:13;13178:36;13172:2;13162:8;13159:16;13154:2;13148:4;13145:12;13141:35;13138:77;13135:2;;;-1:-1:-1;13247:19:1;;;13279:5;;13135:2;13326:34;13351:8;13345:4;13326:34;:::i;:::-;13396:6;13392:1;13388:6;13384:19;13375:7;13372:32;13369:2;;;13407:18;;:::i;:::-;13445:20;;-1:-1:-1;12724:747:1;;;;;:::o;13476:168::-;13516:7;13582:1;13578;13574:6;13570:14;13567:1;13564:21;13559:1;13552:9;13545:17;13541:45;13538:2;;;13589:18;;:::i;:::-;-1:-1:-1;13629:9:1;;13528:116::o;13649:125::-;13689:4;13717:1;13714;13711:8;13708:2;;;13722:18;;:::i;:::-;-1:-1:-1;13759:9:1;;13698:76::o;13779:195::-;13817:4;13854;13851:1;13847:12;13886:4;13883:1;13879:12;13911:3;13906;13903:12;13900:2;;;13918:18;;:::i;:::-;13955:13;;;13826:148;-1:-1:-1;;;13826:148:1:o;13979:258::-;14051:1;14061:113;14075:6;14072:1;14069:13;14061:113;;;14151:11;;;14145:18;14132:11;;;14125:39;14097:2;14090:10;14061:113;;;14192:6;14189:1;14186:13;14183:2;;;-1:-1:-1;;14227:1:1;14209:16;;14202:27;14032:205::o;14242:127::-;14303:10;14298:3;14294:20;14291:1;14284:31;14334:4;14331:1;14324:15;14358:4;14355:1;14348:15;14374:131;-1:-1:-1;;;;;14449:31:1;;14439:42;;14429:2;;14495:1;14492;14485:12;14429:2;14419:86;:::o
Swarm Source
ipfs://774c7143bac35a990bd282dff4c1e3284208458b345b7dc194b68d369ba50e73
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.