Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x093c408fc3914c7d0bb4da8862c80004dac1625841c8ae06b5a5f15d91a35fe1 | Toggle Network | 38886366 | 194 days 59 mins ago | 0xf9da3664a0bf616987feed8919623fd4fdeb9e9f | IN | 0x43cce583aa7261d22d4ae32c9e9ff8e7ca100347 | 0 ETH | 0.00002401 | |
0xaafe39c476db733b3127d4fc2d074496cafbde6c35f83f1b368f19ed91b6990d | Address Settings | 38886135 | 194 days 1 hr ago | 0xf9da3664a0bf616987feed8919623fd4fdeb9e9f | IN | 0x43cce583aa7261d22d4ae32c9e9ff8e7ca100347 | 0 ETH | 0.0000507 | |
0xa735b6e102258a7541b0a24a31c3a364dae1a79261aad1e9481dc9237ec4603f | 0x60806040 | 38885766 | 194 days 1 hr ago | 0xf9da3664a0bf616987feed8919623fd4fdeb9e9f | IN | Create: NDCA_V2in | 0 ETH | 0.00124078 |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
NDCA_V2in
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2022-11-17 */ /* ...... ............ ............:.... .................:..... ......................:..... ........ .................::..... ......... .....................::..... ........ .........................:::..... ........ ........ ...:..........:::..... ......... ........ ...::.........::::..... ........ ........ .... ...::..........:::..... ........ ........ ........ ...:::.........::::..... ........ ........ ... .... ...:::........:::::.... ........ ....... .... ..... ...::::........::::.... ....... ....... ... ..:... ...:::::......:::-:... ....... ...... ... ..::.. ...::::......:::-:... ....... ..... ... ..::. ..::-:......::--.... ....... ...... ... ..::. ...:::.......:-::... ....... ...... .. .::......::::.......:-:.... ........ ...... ... .::......:::.......::-:.... ...:..... ....... ... ..::......:-:.......:-::.... ...:.........:... .... .::......::::.......:-:.... ...:.........::.. ..:.. .::......:-::......:--:.... ...::.........:... ..:.. ..::......:-:.......:-::.... ...::.........:... ..::. .:::.....::::.......:-:.... ....:.........::.. ..::.. ..::......:-::......::-:.... ....:.........::... ...::::::......:-::......:--:.... ....::........::.......:--:.....::-:.......:-::... ...::........:::... ..:......:-::......::-:.... ...:::.......:::... ...:-::......:--:.... ...:::........:::... ...::-::......:-::.... ....:::.......::::...::-::......::-:.... ....:::.......::-::::-::......:--:.... ...:::.......::-:--::......:--:.... ....:::......::-::......::-::... ....:::...............:--::... ....:-:.............:--:.... ....:-::.........::--:.... ....:--::.....:::-::... ...::-:::::::--::... ...::--::::--::... ....:--:---:... ...::--::... ....:..... .... +%# -%# %%%%%# *%%%#= *%* +%+ +%%= -%# %%+... +%#.-%%. *%%- +%+ +%%# -%# %%= +%# :%%: *%%# +%+ +%#%=-%# %%*-- +%# :%%: *%#%-+%+ +%++%+%# %%### +%# :%%: *%=*#+%+ +%+.%%%# %%= +%# :%%: *%=:%%%+ +%+ +%%# %%= +%# :%%: *%= *%%+ +%+ #%# %%*=== -%%=+%# *%= .%%+ -+= -++ ++++++ -+**+. ++- =+= */ // File: tools/interfaces/IProtocol_in.sol //SPDX-License-Identifier: MIT pragma solidity 0.8.16; interface INDCA_V2in { /* STRUCT*/ struct dashboardStruct{ bool dcaActive; uint256 pairId; uint256 srcTokenAmount; uint256 tau; uint256 nextDcaTime; uint256 lastDcaTimeOk; uint256 destTokenEarned; uint256 exeRequired;//0 = Unlimited uint256 exeCompleted; uint averageBuyPrice; uint code; uint userError; bool allowanceOK; bool balanceOK; } /* WRITE METHODS*/ function toggleRouter() external;//restricted to Proxy function createDCA(uint256 _pairId, address _userAddress, uint256 _srcTokenAmount, uint256 _tau, uint256 _exeRequired, bool _exeNow) external;//restricted to Proxy function closeDCA(uint256 _pairId, address _userAddress) external;//restricted to Proxy function DCAExecute(uint256 _dcaId) external;//restricted to Proxy function DCAResult(uint256 _dcaId, uint256 _destTokenAmount, uint _code, uint _unitaryPrice) external;//restricted to Proxy /* VIEW METHODS*/ function numberDCAs() external view returns(uint256 actives, uint256 totals);//restricted to Proxy function neonStatus() external view returns(bool netActive, bool routerBusy);//restricted to Proxy function DCAChecks(uint256 _dcaId) external view returns(bool execute, bool allowanceOK, bool balanceOK);//restricted to Proxy function DCAInfo(uint256 _dcaId) external view returns( address srcToken, uint256 srcDecimals, address destToken, uint256 destDecimals, address reciever, uint256 typeAMM, uint256 srcTokenAmount );//restricted to Proxy function getDetails(uint256 _pairId, address _userAddress) external view returns(dashboardStruct memory);//restricted to Proxy } interface INHistorian_V2in { /* STRUCT*/ struct detailStruct{ uint256 pairId; uint256 closedDcaTime; uint256 destTokenEarned; uint reason; // (0 = Completed, 1 = User Close DCA, 2 = Insufficient User Approval or Balance) } /* WRITE METHODS*/ function store(address _userAddress, detailStruct calldata _struct) external;//restricted to NDCA function deleteStore(address _userAddress, uint256 _storeId) external;//restricted to NDCA & Proxy /* VIEW METHODS*/ function getHistoryDataBatch(address _userAddress) external view returns(detailStruct[] memory);//restricted to Proxy function getHistoryData(address _userAddress, uint256 _storeId) external view returns(uint256 closedDcaTime, uint256 destTokenEarned, uint reason, bool stored);//restricted to Proxy } interface INPairPool_V2in { /* VIEW METHODS*/ function numberListedPairs() external view returns(uint256); function pairListed(uint256 _id) external view returns(address srcToken, uint256 srcDecimals, address destToken, uint256 destDecimals, uint typeAMM); } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) 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) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) 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' 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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) 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/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) 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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(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"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: NDCA-V2in.sol pragma solidity 0.8.16; contract NDCA_V2in is Ownable { using SafeERC20 for ERC20; using SafeMath for uint256; struct dcaStruct{ address userAddress; uint256 pairId; uint256 srcAmount; uint256 tau; uint256 nextDcaTime; uint256 lastDcaTimeOk; uint256 destTokenEarned; uint256 exeRequired;//0 = Unlimited uint256 exeCompleted; uint userError; uint averageBuyPrice;//USD (precision 6 dec) uint code; bool fundsTransfer; } struct dashboardStruct{ bool dcaActive; uint256 pairId; uint256 srcTokenAmount; uint256 tau; uint256 nextDcaTime; uint256 lastDcaTimeOk; uint256 destTokenEarned; uint256 exeRequired;//0 = Unlimited uint256 exeCompleted; uint averageBuyPrice; uint code; uint userError; bool allowanceOK; bool balanceOK; } mapping (uint256 => dcaStruct) private NDCAs; mapping (bytes32 => uint256) private positionDCAs; uint256 private activeDCAs; uint256 private totalDCAs; address private NRouter; address private NPairPool; address private NHistorian; address private NProxy; uint256 private minTauLimit; //days uint256 private maxTauLimit; //days uint256 private minSrcAmount; uint256 private maxActiveDCA; uint256 constant private defaultApproval = 150000000000000000000; uint256 constant private TAU_MULT = 86400; bool private networkEnable; bool private busyRouter; //Events event DCASwap(uint256 _pairId, address _userAddress, uint256 _destAmount, uint _status, uint256 _timestamp); event GetFunds(uint256 _pairId, address _userAddress, uint256 _srcAmount, uint256 _timestamp); event Refund(uint256 _pairId, address _userAddress, uint256 _srcAmount, uint256 _timestamp); event CreatedDCA(uint256 _pairId, address _userAddress, uint256 _srcAmount, uint256 _tau, uint256 _nExecution, uint256 _timestamp); event ClosedDCA(uint256 _pairId, address _userAddress, uint256 _timestamp); event CompletedDCA(uint256 _pairId, address _userAddress, uint256 _timestamp); /** * @dev Throws if called by any account other than the proxy. */ modifier onlyProxy() { require(msg.sender == NProxy, "NEON: Only Proxy is allowed"); _; } /* * Constructor * () will be defined the unit of measure * @param _minSrcAmount (ether) minimum amount of token to be invested (without decimals) * @param _minTauLimit (day) minimum time to be setted to excute the DCA * @param _maxTauLimit (day) minimum time to be setted to excute the DCA * @param _maxActiveDCA (n) maximum number of active users into the DCA */ constructor(uint256 _minSrcAmount, uint256 _minTauLimit, uint256 _maxTauLimit, uint256 _maxActiveDCA){ minSrcAmount = _minSrcAmount; minTauLimit = _minTauLimit; maxTauLimit = _maxTauLimit; maxActiveDCA = _maxActiveDCA; } /* WRITE METHODS*/ /* * @dev Toggle Network Status * @req All component has been defined */ function toggleNetwork() external onlyOwner { require(NRouter != address(0), "NEON: Router not defined"); require(NPairPool != address(0), "NEON: PairPool not defined"); require(NHistorian != address(0), "NEON: Hystorian not defined"); require(NProxy != address(0), "NEON: Proxy not defined"); networkEnable = !networkEnable; } /* * @dev Addresses Settings * () will be defined the unit of measure * @param _NRouter parameter to be modified, if 0 will be ignored * @param _NPairPool parameter to be modified, if 0 will be ignored * @param _NHistorian parameter to be modified, if 0 will be ignored * @param _NProxy parameter to be modified, if 0 will be ignored */ function addressSettings(address _NRouter, address _NPairPool, address _NHistorian, address _NProxy) external onlyOwner { NRouter = _NRouter != address(0) ? _NRouter : NRouter; NPairPool = _NPairPool != address(0) ? _NPairPool : NPairPool; NHistorian = _NHistorian != address(0) ? _NHistorian : NHistorian; NProxy = _NProxy != address(0) ? _NProxy : NProxy; } /* * @dev Frequency Range * () will be defined the unit of measure * @param _min parameter to be modified, if 0 will be ignored * @param _max parameter to be modified, if 0 will be ignored */ function setTauLimit(uint256 _min, uint256 _max) external onlyOwner { minTauLimit = _min != 0 ? _min : minTauLimit; maxTauLimit = _max != 0 ? _max : minTauLimit; } /* * @dev Define max active DCAs * () will be defined the unit of measure * @param _value (n) amount */ function setMaxActiveDCA(uint256 _value) external onlyOwner { maxActiveDCA = _value; } /* * @proxy Toggle Router Status [Router] * () will be defined the unit of measure */ function toggleRouter() external onlyProxy { busyRouter = !busyRouter; } /* * @proxy Create DCA * !User must approve amount to this SC in order to create it! * () will be defined the unit of measure * @param _pairId pair where will create a DCA * @param _userAddress address that create the DCA * @param _srcTokenAmount (wei) amount to be sell every tau with all decimals * @param _tau execution frequency * @param _exeRequired number of execution required (0 = unlimited) * @param _exeNow if true the first execution will be at first router scan (in the day) */ function createDCA(uint256 _pairId, address _userAddress, uint256 _srcTokenAmount, uint256 _tau, uint256 _exeRequired, bool _exeNow) onlyProxy external { require(networkEnable, "NEON: Network disabled"); require(!busyRouter, "NEON: Router busy try later"); require(activeDCAs <= maxActiveDCA, "NEON: Limit active DCAs reached"); require(_pairId > 0, "NEON: Pair id must be > 0"); require(_tau >= minTauLimit && _tau <= maxTauLimit, "NEON: Tau out of limits"); bytes32 uniqueId = _getId(_pairId, _userAddress); require(NDCAs[positionDCAs[uniqueId]].userAddress == address(0), "NEON: Already created DCA with this pair"); dcaStruct storage dca = positionDCAs[uniqueId] == 0 ? NDCAs[totalDCAs + 1] : NDCAs[positionDCAs[uniqueId]]; (address srcToken, uint256 srcDecimals, , , ) = INPairPool_V2in(NPairPool).pairListed(_pairId); require(srcToken != address(0), "NEON: Blacklisted pair, can't create DCA"); require(_srcTokenAmount >= (minSrcAmount * 10 ** srcDecimals), "NEON: Amount requested too low"); require(ERC20(srcToken).balanceOf(_userAddress) >= _srcTokenAmount, "NEON: Insufficient balance"); require(ERC20(srcToken).allowance(_userAddress, address(this)) >= (defaultApproval * 10 ** srcDecimals),"NEON: Insufficient approved token"); dca.fundsTransfer = false; dca.code = 0; dca.averageBuyPrice = 0; dca.userError = 0; dca.exeCompleted = 0; dca.exeRequired = _exeRequired; dca.destTokenEarned = 0; dca.lastDcaTimeOk = 0; dca.nextDcaTime = _exeNow == true ? block.timestamp : block.timestamp.add(_tau.mul(TAU_MULT)); dca.tau = _tau; dca.srcAmount = _srcTokenAmount; dca.pairId = _pairId; dca.userAddress = _userAddress; if(positionDCAs[uniqueId] == 0){ positionDCAs[uniqueId] = totalDCAs + 1; totalDCAs += 1; } activeDCAs += 1; emit CreatedDCA(_pairId, _userAddress, _srcTokenAmount, _tau, _exeRequired, block.timestamp); } /* * @proxy Close DCA * () will be defined the unit of measure * @param _pairId pair where DCA will be closed * @param _userAddress owner of the DCA */ function closeDCA(uint256 _pairId, address _userAddress) external onlyProxy { require(!busyRouter, "NEON: Router busy try later"); _closeDCA(_pairId, 1, _userAddress); emit ClosedDCA(_pairId, _userAddress, block.timestamp); } /* * @proxy DCA-in Execute (pre-execution) [Router] * () will be defined the unit of measure * @param _dcaId id to execute the DCA * @return bool (true = fund transfered, false = not) */ function DCAExecute(uint256 _dcaId) external onlyProxy { require(networkEnable, "NEON: Network disabled"); dcaStruct storage dca = NDCAs[_dcaId]; require(dca.userAddress != address(0), "NEON: DCA not active"); (address srcToken, , , , ) = INPairPool_V2in(NPairPool).pairListed(dca.pairId); require(srcToken != address(0), "NEON: Blacklisted pair, can't be executed"); require(block.timestamp >= dca.nextDcaTime, "NEON: Execution not required yet"); if(!(dca.fundsTransfer) && ERC20(srcToken).balanceOf(dca.userAddress) >= dca.srcAmount && ERC20(srcToken).allowance(dca.userAddress, address(this)) >= dca.srcAmount){ dca.fundsTransfer = true; ERC20(srcToken).safeTransferFrom(dca.userAddress, NRouter, dca.srcAmount); emit GetFunds(dca.pairId, dca.userAddress, dca.srcAmount, block.timestamp); } } /* * @proxy DCA-in Result (post-execution) * () will be defined the unit of measure * @param _dcaId id to log result * @param _destTokenAmount amount user has recieved * @param _code DCA result code * @param _unitaryPrice unit purchase * @return bool state of execution */ function DCAResult(uint256 _dcaId, uint256 _destTokenAmount, uint _code, uint _unitaryPrice) external onlyProxy{ require(networkEnable, "NEON: Network disabled"); dcaStruct storage dca = NDCAs[_dcaId]; require(dca.userAddress != address(0), "NEON: DCA not active"); (address srcToken, , , , ) = INPairPool_V2in(NPairPool).pairListed(dca.pairId); require(srcToken != address(0), "NEON: Blacklisted pair, can't be executed"); require(block.timestamp >= dca.nextDcaTime, "NEON: Execution not required yet"); dca.nextDcaTime = dca.nextDcaTime.add(dca.tau.mul(TAU_MULT)); dca.code = _code; dca.userError = _code == 400 || _code == 401 ? dca.userError + 1 : 0; if(_code == 200){ dca.fundsTransfer = false; dca.lastDcaTimeOk = block.timestamp; dca.destTokenEarned = dca.destTokenEarned.add(_destTokenAmount); dca.exeCompleted += 1; dca.averageBuyPrice = dca.averageBuyPrice == 0 ? _unitaryPrice : dca.averageBuyPrice.add(_unitaryPrice).div(2); //Automatic Complete DCA if((dca.exeCompleted >= dca.exeRequired) && (dca.exeRequired > 0)){ _closeDCA(dca.pairId, 0, dca.userAddress); emit CompletedDCA(dca.pairId, dca.userAddress, block.timestamp); } }else{ if(dca.fundsTransfer){//Refund dca.fundsTransfer = false; ERC20(srcToken).safeTransferFrom(NRouter, dca.userAddress, dca.srcAmount); emit Refund(dca.pairId, dca.userAddress, dca.srcAmount, block.timestamp); } if(dca.userError >= 3){//Automatic Close DCA _closeDCA(dca.pairId, 2, dca.userAddress); emit ClosedDCA(dca.pairId, dca.userAddress, block.timestamp); } } emit DCASwap(dca.pairId, dca.userAddress, _destTokenAmount, _code, block.timestamp); } /* INTERNAL METHODS*/ /* * @internal Store Data * () will be defined the unit of measure * @param _userData data to be stored * @param _reason (0 = Completed, 1 = User Close DCA, 2 = Insufficient User Approval or Balance) * @param _userAddress address that will be associated to the store */ function _storeData(dcaStruct memory _userData, uint _reason, address _userAddress) internal returns(bool){ INHistorian_V2in.detailStruct memory data; data.pairId = _userData.pairId; data.closedDcaTime = _userData.lastDcaTimeOk; data.destTokenEarned = _userData.destTokenEarned; data.reason = _reason; INHistorian_V2in(NHistorian).store(_userAddress, data); return true; } /* * @internal close DCA * () will be defined the unit of measure * @param _pairId pair where DCA will be closed * @param _reason (0 = Completed, 1 = User Close DCA, 2 = Insufficient User Approval or Balance) * @param _userAddress address that create the DCA */ function _closeDCA(uint256 _pairId, uint reason, address _userAddress) internal { require(_pairId > 0, "NEON: Pair id must be > 0"); bytes32 uniqueId = _getId(_pairId, _userAddress); require(NDCAs[positionDCAs[uniqueId]].userAddress != address(0), "NEON: DCA Already closed"); dcaStruct storage dca = NDCAs[positionDCAs[uniqueId]]; _storeData(dca, reason, _userAddress); dca.userAddress = address(0); activeDCAs -= 1; } /* * @internal Calculate Fee * () will be defined the unit of measure * @param _srcTokenAmount amount * @param _srcDecimals number of decimals */ function _calcFee(uint256 _srcTokenAmount, uint256 _srcDecimals) internal pure returns(uint256 feePercent){ if(_srcTokenAmount <= (500*10**_srcDecimals)){ feePercent = 100;//100 --> 1.00% } else if(_srcTokenAmount > (500*10**_srcDecimals) && _srcTokenAmount <= (2500*10**_srcDecimals)){ feePercent = 85;//85 --> 0.85% } else if(_srcTokenAmount > (2500*10**_srcDecimals) && _srcTokenAmount <= (10000*10**_srcDecimals)){ feePercent = 72;//72 --> 0.72% } else if(_srcTokenAmount > (10000*10**_srcDecimals) && _srcTokenAmount <= (50000*10**_srcDecimals)){ feePercent = 60;//60 --> 0.60% } else if(_srcTokenAmount > (50000*10**_srcDecimals)){ feePercent = 50;//50 --> 0.50% } } /* * @internal Generate Unique ID * () will be defined the unit of measure * @param _userAddress address that create the DCA * @param _pairId pair where will create a DCA */ function _getId(uint256 _pairId, address _userAddress) private pure returns (bytes32){ return keccak256(abi.encodePacked(_pairId, _userAddress)); } /* VIEW METHODS*/ /* * @proxy Neon DCAs numbers * () will be defined the unit of measure * @return actives total Active DCAs * @return totals total DCAs Created */ function numberDCAs() external onlyProxy view returns(uint256 actives, uint256 totals) { actives = activeDCAs; totals = totalDCAs; } /* * @proxy Network Status * () will be defined the unit of measure * @return netActive true if network active * @return routerBusy true if router busy */ function neonStatus() external view onlyProxy returns(bool netActive, bool routerBusy) { netActive = networkEnable; routerBusy = busyRouter; } /* * @proxy Pre-Check for DCA execution [Router] * () will be defined the unit of measure * @param _dcaId DCA id & DCA active * @return execute true when need to be execute * @return allowanceOK true when allowance OK * @return balanceOK true when balance OK */ function DCAChecks(uint256 _dcaId) external view onlyProxy returns(bool execute, bool allowanceOK, bool balanceOK) { dcaStruct storage dca = NDCAs[_dcaId]; if(block.timestamp >= dca.nextDcaTime && dca.userAddress != address(0)){//return if exe required & DCA active (address srcToken, , , , ) = INPairPool_V2in(NPairPool).pairListed(dca.pairId); execute = true; allowanceOK = ERC20(srcToken).allowance(dca.userAddress, address(this)) >= dca.srcAmount; balanceOK = ERC20(srcToken).balanceOf(dca.userAddress) >= dca.srcAmount; } } /* * @proxy Info to execute DCA [Router] * () will be defined the unit of measure * @param _dcaId DCA id * @return srcToken address of the token * @return srcDecimals number of decimals * @return destToken address of the token * @return destDecimals number of decimals * @return reciever address user for DCA * @return typeAMM AMM that will execute the swap * @return srcTokenAmount amount to be swapped */ function DCAInfo(uint256 _dcaId) external view onlyProxy returns( address srcToken, uint256 srcDecimals, address destToken, uint256 destDecimals, address reciever, uint256 typeAMM, uint256 srcTokenAmount ) { dcaStruct storage dca = NDCAs[_dcaId]; (srcToken, srcDecimals, destToken, destDecimals, typeAMM) = INPairPool_V2in(NPairPool).pairListed(dca.pairId); reciever = dca.userAddress; uint256 feePercent = _calcFee(dca.srcAmount, srcDecimals); uint256 feeAmount = dca.srcAmount.div(10000).mul(feePercent);//2 decimals srcTokenAmount = dca.srcAmount.sub(feeAmount); } /* * @proxy Details info for the user * () will be defined the unit of measure * @param _pairId pair where needed information * @param _userAddress address owner of those information * @return dashboardStruct data structure of user info displayed in the Dapp */ function getDetails(uint256 _pairId, address _userAddress) external view onlyProxy returns(dashboardStruct memory){ bytes32 uniqueId = _getId(_pairId, _userAddress); dcaStruct storage dca = NDCAs[positionDCAs[uniqueId]]; dashboardStruct memory data; if(dca.userAddress != address(0)){ data.dcaActive = true; data.pairId = _pairId; data.srcTokenAmount = dca.srcAmount; data.tau = dca.tau; data.nextDcaTime = dca.nextDcaTime; data.lastDcaTimeOk = dca.lastDcaTimeOk; data.destTokenEarned = dca.destTokenEarned; data.exeRequired = dca.exeRequired; data.exeCompleted = dca.exeCompleted; data.averageBuyPrice = dca.averageBuyPrice; data.code = dca.code; data.userError = dca.userError; (address srcToken, , , , ) = INPairPool_V2in(NPairPool).pairListed(_pairId); data.allowanceOK = ERC20(srcToken).allowance(_userAddress, address(this)) >= dca.srcAmount; data.balanceOK = ERC20(srcToken).balanceOf(_userAddress) >= dca.srcAmount; } return data; } }
[{"inputs":[{"internalType":"uint256","name":"_minSrcAmount","type":"uint256"},{"internalType":"uint256","name":"_minTauLimit","type":"uint256"},{"internalType":"uint256","name":"_maxTauLimit","type":"uint256"},{"internalType":"uint256","name":"_maxActiveDCA","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pairId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"ClosedDCA","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pairId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"CompletedDCA","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pairId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tau","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_nExecution","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"CreatedDCA","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pairId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_destAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_status","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"DCASwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pairId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"GetFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pairId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_srcAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Refund","type":"event"},{"inputs":[{"internalType":"uint256","name":"_dcaId","type":"uint256"}],"name":"DCAChecks","outputs":[{"internalType":"bool","name":"execute","type":"bool"},{"internalType":"bool","name":"allowanceOK","type":"bool"},{"internalType":"bool","name":"balanceOK","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dcaId","type":"uint256"}],"name":"DCAExecute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dcaId","type":"uint256"}],"name":"DCAInfo","outputs":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint256","name":"srcDecimals","type":"uint256"},{"internalType":"address","name":"destToken","type":"address"},{"internalType":"uint256","name":"destDecimals","type":"uint256"},{"internalType":"address","name":"reciever","type":"address"},{"internalType":"uint256","name":"typeAMM","type":"uint256"},{"internalType":"uint256","name":"srcTokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dcaId","type":"uint256"},{"internalType":"uint256","name":"_destTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_code","type":"uint256"},{"internalType":"uint256","name":"_unitaryPrice","type":"uint256"}],"name":"DCAResult","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_NRouter","type":"address"},{"internalType":"address","name":"_NPairPool","type":"address"},{"internalType":"address","name":"_NHistorian","type":"address"},{"internalType":"address","name":"_NProxy","type":"address"}],"name":"addressSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairId","type":"uint256"},{"internalType":"address","name":"_userAddress","type":"address"}],"name":"closeDCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairId","type":"uint256"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_srcTokenAmount","type":"uint256"},{"internalType":"uint256","name":"_tau","type":"uint256"},{"internalType":"uint256","name":"_exeRequired","type":"uint256"},{"internalType":"bool","name":"_exeNow","type":"bool"}],"name":"createDCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairId","type":"uint256"},{"internalType":"address","name":"_userAddress","type":"address"}],"name":"getDetails","outputs":[{"components":[{"internalType":"bool","name":"dcaActive","type":"bool"},{"internalType":"uint256","name":"pairId","type":"uint256"},{"internalType":"uint256","name":"srcTokenAmount","type":"uint256"},{"internalType":"uint256","name":"tau","type":"uint256"},{"internalType":"uint256","name":"nextDcaTime","type":"uint256"},{"internalType":"uint256","name":"lastDcaTimeOk","type":"uint256"},{"internalType":"uint256","name":"destTokenEarned","type":"uint256"},{"internalType":"uint256","name":"exeRequired","type":"uint256"},{"internalType":"uint256","name":"exeCompleted","type":"uint256"},{"internalType":"uint256","name":"averageBuyPrice","type":"uint256"},{"internalType":"uint256","name":"code","type":"uint256"},{"internalType":"uint256","name":"userError","type":"uint256"},{"internalType":"bool","name":"allowanceOK","type":"bool"},{"internalType":"bool","name":"balanceOK","type":"bool"}],"internalType":"struct NDCA_V2in.dashboardStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"neonStatus","outputs":[{"internalType":"bool","name":"netActive","type":"bool"},{"internalType":"bool","name":"routerBusy","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberDCAs","outputs":[{"internalType":"uint256","name":"actives","type":"uint256"},{"internalType":"uint256","name":"totals","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxActiveDCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_min","type":"uint256"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setTauLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200396c3803806200396c8339810160408190526200003491620000a7565b6200003f3362000057565b600b93909355600991909155600a55600c55620000de565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060008060808587031215620000be57600080fd5b505082516020840151604085015160609095015191969095509092509050565b61387e80620000ee6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c8063848e33e9116100b2578063c656e78e11610081578063e837523911610066578063e8375239146102b3578063ecf10a47146102d2578063f2fde38b146102e557600080fd5b8063c656e78e1461028d578063e37cadfa146102a057600080fd5b8063848e33e91461022a5780638da5cb5b146102325780639115abf41461025a578063b9c3a5681461027a57600080fd5b8063595137bd116100ee578063595137bd14610191578063684e1c5d146101fc578063715018a61461020f578063738be1141461021757600080fd5b806309e82c1a1461012057806318e8a5011461014257806338b4ee781461014c5780634be3a4201461017e575b600080fd5b6101286102f8565b604080519283526020830191909152015b60405180910390f35b61014a61038f565b005b61015f61015a3660046132e8565b61044a565b6040805193151584529115156020840152151590820152606001610139565b61014a61018c366004613331565b610702565b6101a461019f3660046132e8565b611094565b6040805173ffffffffffffffffffffffffffffffffffffffff98891681526020810197909752948716948601949094526060850192909252909316608083015260a082019290925260c081019190915260e001610139565b61014a61020a3660046132e8565b611252565b61014a6117a2565b61014a61022536600461338f565b6117b6565b61014a6117ed565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61026d6102683660046133b1565b611a23565b60405161013991906133e1565b61014a6102883660046133b1565b611e2f565b61014a61029b366004613489565b611f86565b61014a6102ae3660046132e8565b612149565b6102bb612156565b604080519215158352901515602083015201610139565b61014a6102e03660046134e5565b6121f1565b61014a6102f3366004613517565b61289e565b600854600090819073ffffffffffffffffffffffffffffffffffffffff163314610383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f776564000000000060448201526064015b60405180910390fd5b50506003546004549091565b60085473ffffffffffffffffffffffffffffffffffffffff163314610410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b6008546000908190819073ffffffffffffffffffffffffffffffffffffffff1633146104d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b60008481526001602052604090206004810154421080159061050a5750805473ffffffffffffffffffffffffffffffffffffffff1615155b156106fa5760065460018201546040517fc3683038000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff169063c36830389060240160a060405180830381865afa158015610585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a99190613534565b50505050600283015483546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201523060248201526001985092935090919083169063dd62ed3e90604401602060405180830381865afa158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190613588565b600284015484546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529390921015965091908316906370a0823190602401602060405180830381865afa1580156106d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f49190613588565b10159250505b509193909250565b60085473ffffffffffffffffffffffffffffffffffffffff163314610783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b600d5460ff166107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e454f4e3a204e6574776f726b2064697361626c656400000000000000000000604482015260640161037a565b600d54610100900460ff1615610861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a20526f75746572206275737920747279206c617465720000000000604482015260640161037a565b600c5460035411156108cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4e454f4e3a204c696d6974206163746976652044434173207265616368656400604482015260640161037a565b60008611610939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e454f4e3a2050616972206964206d757374206265203e203000000000000000604482015260640161037a565b600954831015801561094d5750600a548311155b6109b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e454f4e3a20546175206f7574206f66206c696d697473000000000000000000604482015260640161037a565b60006109bf8787612955565b6000818152600260209081526040808320548352600190915290205490915073ffffffffffffffffffffffffffffffffffffffff1615610a81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4e454f4e3a20416c72656164792063726561746564204443412077697468207460448201527f6869732070616972000000000000000000000000000000000000000000000000606482015260840161037a565b60008181526002602052604081205415610ab557600082815260026020908152604080832054835260019091529020610ad7565b600160006004546001610ac891906135d0565b81526020019081526020016000205b6006546040517fc3683038000000000000000000000000000000000000000000000000000000008152600481018b9052919250600091829173ffffffffffffffffffffffffffffffffffffffff169063c36830389060240160a060405180830381865afa158015610b4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b709190613534565b509294509092505073ffffffffffffffffffffffffffffffffffffffff83169050610c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4e454f4e3a20426c61636b6c697374656420706169722c2063616e277420637260448201527f6561746520444341000000000000000000000000000000000000000000000000606482015260840161037a565b610c2881600a613703565b600b54610c35919061370f565b881015610c9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e454f4e3a20416d6f756e742072657175657374656420746f6f206c6f770000604482015260640161037a565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528991908416906370a0823190602401602060405180830381865afa158015610d0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d319190613588565b1015610d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e454f4e3a20496e73756666696369656e742062616c616e6365000000000000604482015260640161037a565b610da481600a613703565b610db790680821ab0d441498000061370f565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015230602483015284169063dd62ed3e90604401602060405180830381865afa158015610e29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4d9190613588565b1015610edb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4e454f4e3a20496e73756666696369656e7420617070726f76656420746f6b6560448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015260840161037a565b600c830180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556000600b8401819055600a8401819055600984018190556008840181905560078401879055600684018190556005840155841515600114610f5c57610f57610f5088620151806129b6565b42906129c9565b610f5e565b425b6004840155600383018790556002808401899055600184018b905583547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b1617845560008581526020919091526040812054900361100657600454610fdb9060016135d0565b60008581526002602052604081209190915560048054600192906110009084906135d0565b90915550505b60016003600082825461101991906135d0565b9091555050604080518b815273ffffffffffffffffffffffffffffffffffffffff8b16602082015290810189905260608101889052608081018790524260a08201527f640a569fc7c6a42fcdafc73e763424f0c4f1372389be351750186057c703a5679060c00160405180910390a150505050505050505050565b60085460009081908190819081908190819073ffffffffffffffffffffffffffffffffffffffff163314611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b6000888152600160208190526040918290206006549181015492517fc368303800000000000000000000000000000000000000000000000000000000815260048101939093529173ffffffffffffffffffffffffffffffffffffffff9091169063c36830389060240160a060405180830381865afa1580156111aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190613534565b85546002870154959d50939b50919950975073ffffffffffffffffffffffffffffffffffffffff9091169550935060009061120990896129d5565b905060006112308261122a6127108660020154612afb90919063ffffffff16565b906129b6565b60028401549091506112429082612b07565b9350505050919395979092949650565b60085473ffffffffffffffffffffffffffffffffffffffff1633146112d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b600d5460ff1661133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e454f4e3a204e6574776f726b2064697361626c656400000000000000000000604482015260640161037a565b6000818152600160205260409020805473ffffffffffffffffffffffffffffffffffffffff166113cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e454f4e3a20444341206e6f7420616374697665000000000000000000000000604482015260640161037a565b60065460018201546040517fc3683038000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff169063c36830389060240160a060405180830381865afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190613534565b509293505073ffffffffffffffffffffffffffffffffffffffff831691506115119050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e454f4e3a20426c61636b6c697374656420706169722c2063616e277420626560448201527f2065786563757465640000000000000000000000000000000000000000000000606482015260840161037a565b816004015442101561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4e454f4e3a20457865637574696f6e206e6f7420726571756972656420796574604482015260640161037a565b600c82015460ff1615801561162a5750600282015482546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152908316906370a0823190602401602060405180830381865afa158015611603573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116279190613588565b10155b80156116d25750600282015482546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201523060248201529083169063dd62ed3e90604401602060405180830381865afa1580156116ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cf9190613588565b10155b1561179d57600c820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055815460055460028401546117379273ffffffffffffffffffffffffffffffffffffffff8581169391811692911690612b13565b6001820154825460028401546040805193845273ffffffffffffffffffffffffffffffffffffffff909216602084015282820152426060830152517f5aa05e02bd0b0fce762a0a0bcd3a075c30b279aa06f3ca05162cb300b32470a39181900360800190a15b505050565b6117aa612bae565b6117b46000612c2f565b565b6117be612bae565b816000036117ce576009546117d0565b815b60095560008190036117e4576009546117e6565b805b600a555050565b6117f5612bae565b60055473ffffffffffffffffffffffffffffffffffffffff16611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e454f4e3a20526f75746572206e6f7420646566696e65640000000000000000604482015260640161037a565b60065473ffffffffffffffffffffffffffffffffffffffff166118f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e454f4e3a2050616972506f6f6c206e6f7420646566696e6564000000000000604482015260640161037a565b60075473ffffffffffffffffffffffffffffffffffffffff16611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a20487973746f7269616e206e6f7420646566696e65640000000000604482015260640161037a565b60085473ffffffffffffffffffffffffffffffffffffffff166119f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e454f4e3a2050726f7879206e6f7420646566696e6564000000000000000000604482015260640161037a565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b611a9b604051806101c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b60085473ffffffffffffffffffffffffffffffffffffffff163314611b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b6000611b288484612955565b60008181526002602090815260408083205483526001825280832081516101c081018352848152928301849052908201839052606082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a082019290925291925090815473ffffffffffffffffffffffffffffffffffffffff1615611e245760018152602081018690526002820154604080830191909152600383015460608301526004808401546080840152600584015460a084015260068085015460c0850152600785015460e08501526008850154610100850152600a850154610120850152600b85015461014085015260098501546101608501525491517fc368303800000000000000000000000000000000000000000000000000000000815290810188905260009173ffffffffffffffffffffffffffffffffffffffff169063c36830389060240160a060405180830381865afa158015611cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd99190613534565b50505060028501546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a8116600483015230602483015293945090928416915063dd62ed3e90604401602060405180830381865afa158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190613588565b101561018083015260028301546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528316906370a0823190602401602060405180830381865afa158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a9190613588565b10156101a0830152505b925050505b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b600d54610100900460ff1615611f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a20526f75746572206275737920747279206c617465720000000000604482015260640161037a565b611f2e82600183612ca4565b6040805183815273ffffffffffffffffffffffffffffffffffffffff83166020820152428183015290517fa3e0b62309548ecc7ddae6c016ee832ba4720e3b62374029c99bed63088bd9689181900360600190a15050565b611f8e612bae565b73ffffffffffffffffffffffffffffffffffffffff8416611fc75760055473ffffffffffffffffffffffffffffffffffffffff16611fc9565b835b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055831661202e5760065473ffffffffffffffffffffffffffffffffffffffff16612030565b825b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905582166120955760075473ffffffffffffffffffffffffffffffffffffffff16612097565b815b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905581166120fc5760085473ffffffffffffffffffffffffffffffffffffffff166120fe565b805b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550505050565b612151612bae565b600c55565b600854600090819073ffffffffffffffffffffffffffffffffffffffff1633146121dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b5050600d5460ff808216926101009092041690565b60085473ffffffffffffffffffffffffffffffffffffffff163314612272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e454f4e3a204f6e6c792050726f787920697320616c6c6f7765640000000000604482015260640161037a565b600d5460ff166122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4e454f4e3a204e6574776f726b2064697361626c656400000000000000000000604482015260640161037a565b6000848152600160205260409020805473ffffffffffffffffffffffffffffffffffffffff1661236a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e454f4e3a20444341206e6f7420616374697665000000000000000000000000604482015260640161037a565b60065460018201546040517fc3683038000000000000000000000000000000000000000000000000000000008152600481019190915260009173ffffffffffffffffffffffffffffffffffffffff169063c36830389060240160a060405180830381865afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124049190613534565b509293505073ffffffffffffffffffffffffffffffffffffffff831691506124b09050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e454f4e3a20426c61636b6c697374656420706169722c2063616e277420626560448201527f2065786563757465640000000000000000000000000000000000000000000000606482015260840161037a565b816004015442101561251e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4e454f4e3a20457865637574696f6e206e6f7420726571756972656420796574604482015260640161037a565b600382015461253f9061253490620151806129b6565b6004840154906129c9565b6004830155600b820184905561019084148061255c575083610191145b612567576000612577565b60098201546125779060016135d0565b600983015560c88490036126ca57600c820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905542600583015560068201546125c490866129c9565b826006018190555060018260080160008282546125e191906135d0565b9091555050600a8201541561261757612612600261260c8585600a01546129c990919063ffffffff16565b90612afb565b612619565b825b600a830155600782015460088301541080159061263a575060008260070154115b156126c55760018201548254612669919060009073ffffffffffffffffffffffffffffffffffffffff16612ca4565b600182015482546040805192835273ffffffffffffffffffffffffffffffffffffffff90911660208301524282820152517f9fa5557e1e8eb488169d0eada6ac944692f511feb0b259bff4c828ca3447d9859181900360600190a15b61282c565b600c82015460ff161561279a57600c820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600554825460028401546127349273ffffffffffffffffffffffffffffffffffffffff8581169391811692911690612b13565b6001820154825460028401546040805193845273ffffffffffffffffffffffffffffffffffffffff909216602084015282820152426060830152517faba4210cad11f1112f31ba136a61cdc0f6ab4c2b478da8c93eec1d9769e97a899181900360800190a15b600382600901541061282c57600182015482546127d0919060029073ffffffffffffffffffffffffffffffffffffffff16612ca4565b600182015482546040805192835273ffffffffffffffffffffffffffffffffffffffff90911660208301524282820152517fa3e0b62309548ecc7ddae6c016ee832ba4720e3b62374029c99bed63088bd9689181900360600190a15b600182015482546040805192835273ffffffffffffffffffffffffffffffffffffffff90911660208301528101869052606081018590524260808201527f8dbc9a24460afd167489a0df547abf8af44620a81d3e1084ee53417c9461d4429060a00160405180910390a1505050505050565b6128a6612bae565b73ffffffffffffffffffffffffffffffffffffffff8116612949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161037a565b61295281612c2f565b50565b6000828260405160200161299892919091825260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602082015260340190565b60405160208183030381529060405280519060200120905092915050565b60006129c2828461370f565b9392505050565b60006129c282846135d0565b60006129e282600a613703565b6129ee906101f461370f565b83116129fc57506064611e29565b612a0782600a613703565b612a13906101f461370f565b83118015612a375750612a2782600a613703565b612a33906109c461370f565b8311155b15612a4457506055611e29565b612a4f82600a613703565b612a5b906109c461370f565b83118015612a7f5750612a6f82600a613703565b612a7b9061271061370f565b8311155b15612a8c57506048611e29565b612a9782600a613703565b612aa39061271061370f565b83118015612ac75750612ab782600a613703565b612ac39061c35061370f565b8311155b15612ad45750603c611e29565b612adf82600a613703565b612aeb9061c35061370f565b831115611e295750603292915050565b60006129c2828461374c565b60006129c28284613787565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612ba8908590612ece565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161037a565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008311612d0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4e454f4e3a2050616972206964206d757374206265203e203000000000000000604482015260640161037a565b6000612d1a8483612955565b6000818152600260209081526040808320548352600190915290205490915073ffffffffffffffffffffffffffffffffffffffff16612db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4e454f4e3a2044434120416c726561647920636c6f7365640000000000000000604482015260640161037a565b600081815260026020818152604080842054845260018083529381902081516101a081018352815473ffffffffffffffffffffffffffffffffffffffff168152948101549285019290925291810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e083015260088101546101008301526009810154610120830152600a810154610140830152600b810154610160830152600c81015460ff16151561018083015290612e85908585612fda565b5080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556003805460019190600090612ec2908490613787565b90915550505050505050565b6000612f30826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130d99092919063ffffffff16565b80519091501561179d5780806020019051810190612f4e919061379a565b61179d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161037a565b60006130076040518060800160405280600081526020016000815260200160008152602001600081525090565b602085810151825260a086015190820190815260c086015160408084019182526060840187815260075491517f8a8119f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff88811660048301528651602483015294516044820152925160648401525160848301529190911690638a8119f69060a401600060405180830381600087803b1580156130b657600080fd5b505af11580156130ca573d6000803e3d6000fd5b50600198975050505050505050565b60606130e884846000856130f0565b949350505050565b606082471015613182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161037a565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131ab91906137db565b60006040518083038185875af1925050503d80600081146131e8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ed565b606091505b50915091506131fe87838387613209565b979650505050505050565b6060831561329f5782516000036132985773ffffffffffffffffffffffffffffffffffffffff85163b613298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161037a565b50816130e8565b6130e883838151156132b45781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037a91906137f7565b6000602082840312156132fa57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461295257600080fd5b801515811461295257600080fd5b60008060008060008060c0878903121561334a57600080fd5b86359550602087013561335c81613301565b945060408701359350606087013592506080870135915060a087013561338181613323565b809150509295509295509295565b600080604083850312156133a257600080fd5b50508035926020909101359150565b600080604083850312156133c457600080fd5b8235915060208301356133d681613301565b809150509250929050565b8151151581526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e0830152610100808401518184015250610120808401518184015250610140808401518184015250610160808401518184015250610180808401516134768285018215159052565b50506101a0928301511515919092015290565b6000806000806080858703121561349f57600080fd5b84356134aa81613301565b935060208501356134ba81613301565b925060408501356134ca81613301565b915060608501356134da81613301565b939692955090935050565b600080600080608085870312156134fb57600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561352957600080fd5b81356129c281613301565b600080600080600060a0868803121561354c57600080fd5b855161355781613301565b60208701516040880151919650945061356f81613301565b6060870151608090970151959894975095949392505050565b60006020828403121561359a57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115611e2957611e296135a1565b600181815b8085111561363c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613622576136226135a1565b8085161561362f57918102915b93841c93908002906135e8565b509250929050565b60008261365357506001611e29565b8161366057506000611e29565b816001811461367657600281146136805761369c565b6001915050611e29565b60ff841115613691576136916135a1565b50506001821b611e29565b5060208310610133831016604e8410600b84101617156136bf575081810a611e29565b6136c983836135e3565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156136fb576136fb6135a1565b029392505050565b60006129c28383613644565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613747576137476135a1565b500290565b600082613782577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b81810381811115611e2957611e296135a1565b6000602082840312156137ac57600080fd5b81516129c281613323565b60005b838110156137d25781810151838201526020016137ba565b50506000910152565b600082516137ed8184602087016137b7565b9190910192915050565b60208152600082518060208401526138168160408501602087016137b7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea264697066735822122072686495eaa13c16f1fb74060e61c85967b163023e69adb6bf061cefaca1e11164736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000002710
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _minSrcAmount (uint256): 250
Arg [1] : _minTauLimit (uint256): 1
Arg [2] : _maxTauLimit (uint256): 30
Arg [3] : _maxActiveDCA (uint256): 10000
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000fa
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Deployed ByteCode Sourcemap
52165:19109:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67168:155;;;:::i;:::-;;;;188:25:1;;;244:2;229:18;;222:34;;;;161:18;67168:155:0;;;;;;;;57340:86;;;:::i;:::-;;67987:612;;;;;;:::i;:::-;;:::i;:::-;;;;757:14:1;;750:22;732:41;;816:14;;809:22;804:2;789:18;;782:50;875:14;868:22;848:18;;;841:50;720:2;705:18;67987:612:0;548:349:1;57978:2129:0;;;;;;:::i;:::-;;:::i;69072:699::-;;;;;;:::i;:::-;;:::i;:::-;;;;2171:42:1;2240:15;;;2222:34;;2287:2;2272:18;;2265:34;;;;2335:15;;;2315:18;;;2308:43;;;;2382:2;2367:18;;2360:34;;;;2431:15;;;2425:3;2410:19;;2403:44;2478:3;2463:19;;2456:35;;;;2522:3;2507:19;;2500:35;;;;2148:3;2133:19;69072:699:0;1846:695:1;60778:912:0;;;;;;:::i;:::-;;:::i;29831:103::-;;;:::i;56805:186::-;;;;;;:::i;:::-;;:::i;55417:377::-;;;:::i;29183:87::-;29229:7;29256:6;29183:87;;29256:6;;;;2945:74:1;;2933:2;2918:18;29183:87:0;2799:226:1;70074:1196:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60296:258::-;;;;;;:::i;:::-;;:::i;56177:400::-;;;;;;:::i;:::-;;:::i;57126:100::-;;;;;;:::i;:::-;;:::i;67514:165::-;;;:::i;:::-;;;;5527:14:1;;5520:22;5502:41;;5586:14;;5579:22;5574:2;5559:18;;5552:50;5475:18;67514:165:0;5340:268:1;62014:1993:0;;;;;;:::i;:::-;;:::i;30089:201::-;;;;;;:::i;:::-;;:::i;67168:155::-;54564:6;;67222:15;;;;54564:6;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;;;;;;;;;-1:-1:-1;;67276:10:0::1;::::0;67306:9:::1;::::0;67276:10;;67168:155::o;57340:86::-;54564:6;;;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;57408:10:::1;::::0;;57394:24;;::::1;57408:10;::::0;;;::::1;;;57407:11;57394:24:::0;;::::1;;::::0;;57340:86::o;67987:612::-;54564:6;;68054:12;;;;;;54564:6;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;68113:21:::1;68137:13:::0;;;:5:::1;:13;::::0;;;;68183:15:::1;::::0;::::1;::::0;68164::::1;:34;::::0;::::1;::::0;:67:::1;;-1:-1:-1::0;68202:15:0;;:29:::1;:15;:29:::0;::::1;68164:67;68161:431;;;68329:9;::::0;;68351:10;::::1;::::0;68313:49:::1;::::0;;;;::::1;::::0;::::1;6757:25:1::0;;;;68285:16:0::1;::::0;68329:9:::1;;::::0;68313:37:::1;::::0;6730:18:1;;68313:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;68481:13:0::1;::::0;::::1;::::0;68446:15;;68420:57:::1;::::0;;;;:25:::1;68446:15:::0;;::::1;68420:57;::::0;::::1;7603:34:1::0;68471:4:0::1;7653:18:1::0;;;7646:43;68387:4:0::1;::::0;-1:-1:-1;68284:78:0;;-1:-1:-1;68481:13:0;;68420:25;;::::1;::::0;::::1;::::0;7515:18:1;;68420:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68567:13;::::0;::::1;::::0;68547:15;;68521:42:::1;::::0;;;;:25:::1;68547:15:::0;;::::1;68521:42;::::0;::::1;2945:74:1::0;68420::0;;;::::1;;::::0;-1:-1:-1;68567:13:0;68521:25;;::::1;::::0;::::1;::::0;2918:18:1;;68521:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;68509:71;;68232:360;68161:431;68102:497;67987:612:::0;;;;;:::o;57978:2129::-;54564:6;;;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;58149:13:::1;::::0;::::1;;58141:48;;;::::0;::::1;::::0;;8091:2:1;58141:48:0::1;::::0;::::1;8073:21:1::0;8130:2;8110:18;;;8103:30;8169:24;8149:18;;;8142:52;8211:18;;58141:48:0::1;7889:346:1::0;58141:48:0::1;58209:10;::::0;::::1;::::0;::::1;;;58208:11;58200:51;;;::::0;::::1;::::0;;8442:2:1;58200:51:0::1;::::0;::::1;8424:21:1::0;8481:2;8461:18;;;8454:30;8520:29;8500:18;;;8493:57;8567:18;;58200:51:0::1;8240:351:1::0;58200:51:0::1;58284:12;;58270:10;;:26;;58262:70;;;::::0;::::1;::::0;;8798:2:1;58262:70:0::1;::::0;::::1;8780:21:1::0;8837:2;8817:18;;;8810:30;8876:33;8856:18;;;8849:61;8927:18;;58262:70:0::1;8596:355:1::0;58262:70:0::1;58361:1;58351:7;:11;58343:49;;;::::0;::::1;::::0;;9158:2:1;58343:49:0::1;::::0;::::1;9140:21:1::0;9197:2;9177:18;;;9170:30;9236:27;9216:18;;;9209:55;9281:18;;58343:49:0::1;8956:349:1::0;58343:49:0::1;58419:11;;58411:4;:19;;:42;;;;;58442:11;;58434:4;:19;;58411:42;58403:78;;;::::0;::::1;::::0;;9512:2:1;58403:78:0::1;::::0;::::1;9494:21:1::0;9551:2;9531:18;;;9524:30;9590:25;9570:18;;;9563:53;9633:18;;58403:78:0::1;9310:347:1::0;58403:78:0::1;58492:16;58511:29;58518:7;58527:12;58511:6;:29::i;:::-;58612:1;58565:22:::0;;;:12:::1;:22;::::0;;;;;;;;58559:29;;:5:::1;:29:::0;;;;;:41;58492:48;;-1:-1:-1;58559:55:0::1;:41;:55:::0;58551:108:::1;;;::::0;::::1;::::0;;9864:2:1;58551:108:0::1;::::0;::::1;9846:21:1::0;9903:2;9883:18;;;9876:30;9942:34;9922:18;;;9915:62;10013:10;9993:18;;;9986:38;10041:19;;58551:108:0::1;9662:404:1::0;58551:108:0::1;58670:21;58694:22:::0;;;:12:::1;:22;::::0;;;;;:27;:82:::1;;58747:29;58753:22:::0;;;:12:::1;:22;::::0;;;;;;;;58747:29;;:5:::1;:29:::0;;;;;58694:82:::1;;;58724:5;:20;58730:9;;58742:1;58730:13;;;;:::i;:::-;58724:20;;;;;;;;;;;58694:82;58851:9;::::0;58835:46:::1;::::0;;;;::::1;::::0;::::1;6757:25:1::0;;;58670:106:0;;-1:-1:-1;58788:16:0::1;::::0;;;58851:9:::1;;::::0;58835:37:::1;::::0;6730:18:1;;58835:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;58787:94:0;;-1:-1:-1;58787:94:0;;-1:-1:-1;;58900:22:0::1;::::0;::::1;::::0;-1:-1:-1;58892:75:0::1;;;::::0;::::1;::::0;;10592:2:1;58892:75:0::1;::::0;::::1;10574:21:1::0;10631:2;10611:18;;;10604:30;10670:34;10650:18;;;10643:62;10741:10;10721:18;;;10714:38;10769:19;;58892:75:0::1;10390:404:1::0;58892:75:0::1;59021:17;59027:11:::0;59021:2:::1;:17;:::i;:::-;59006:12;;:32;;;;:::i;:::-;58986:15;:53;;58978:96;;;::::0;::::1;::::0;;12728:2:1;58978:96:0::1;::::0;::::1;12710:21:1::0;12767:2;12747:18;;;12740:30;12806:32;12786:18;;;12779:60;12856:18;;58978:96:0::1;12526:354:1::0;58978:96:0::1;59093:39;::::0;;;;:25:::1;2963:55:1::0;;;59093:39:0::1;::::0;::::1;2945:74:1::0;59136:15:0;;59093:25;;::::1;::::0;::::1;::::0;2918:18:1;;59093:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;59085:97;;;::::0;::::1;::::0;;13087:2:1;59085:97:0::1;::::0;::::1;13069:21:1::0;13126:2;13106:18;;;13099:30;13165:28;13145:18;;;13138:56;13211:18;;59085:97:0::1;12885:350:1::0;59085:97:0::1;59278:17;59284:11:::0;59278:2:::1;:17;:::i;:::-;59260:35;::::0;53648:21:::1;59260:35;:::i;:::-;59201:54;::::0;;;;:25:::1;7621:15:1::0;;;59201:54:0::1;::::0;::::1;7603:34:1::0;59249:4:0::1;7653:18:1::0;;;7646:43;59201:25:0;::::1;::::0;::::1;::::0;7515:18:1;;59201:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:95;;59193:140;;;::::0;::::1;::::0;;13442:2:1;59193:140:0::1;::::0;::::1;13424:21:1::0;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;13591:3;13571:18;;;13564:31;13612:19;;59193:140:0::1;13240:397:1::0;59193:140:0::1;59344:17;::::0;::::1;:25:::0;;;::::1;::::0;;59364:5:::1;59380:8;::::0;::::1;:12:::0;;;59403:19:::1;::::0;::::1;:23:::0;;;59437:13:::1;::::0;::::1;:17:::0;;;59465:16:::1;::::0;::::1;:20:::0;;;59496:15:::1;::::0;::::1;:30:::0;;;59537:19:::1;::::0;::::1;:23:::0;;;-1:-1:-1;59571:17:0;::::1;:21:::0;59621:15;::::1;;59344:25:::0;59621:15:::1;:75;;59657:39;59677:18;:4:::0;53712:5:::1;59677:8;:18::i;:::-;59657:15;::::0;:19:::1;:39::i;:::-;59621:75;;;59639:15;59621:75;59603:15;::::0;::::1;:93:::0;59707:7:::1;::::0;::::1;:14:::0;;;59732:13:::1;::::0;;::::1;:31:::0;;;-1:-1:-1;59774:10:0;::::1;:20:::0;;;59805:30;;;::::1;;::::0;::::1;;::::0;;-1:-1:-1;59849:22:0;;;::::1;::::0;;;;;;;;:27;;59846:125:::1;;59917:9;::::0;:13:::1;::::0;59929:1:::1;59917:13;:::i;:::-;59892:22;::::0;;;:12:::1;:22;::::0;;;;:38;;;;59945:9:::1;:14:::0;;59958:1:::1;::::0;59892:22;59945:14:::1;::::0;59958:1;;59945:14:::1;:::i;:::-;::::0;;;-1:-1:-1;;59846:125:0::1;59995:1;59981:10;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60012:87:0::1;::::0;;13929:25:1;;;14002:42;13990:55;;13985:2;13970:18;;13963:83;14062:18;;;14055:34;;;14120:2;14105:18;;14098:34;;;14163:3;14148:19;;14141:35;;;60083:15:0::1;14207:3:1::0;14192:19;;14185:35;60012:87:0::1;::::0;13916:3:1;13901:19;60012:87:0::1;;;;;;;58130:1977;;;;57978:2129:::0;;;;;;:::o;69072:699::-;54564:6;;69147:16;;;;;;;;;;;;;;54564:6;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;69362:21:::1;69386:13:::0;;;:5:::1;:13;::::0;;;;;;;;69486:9:::1;::::0;69508:10;;::::1;::::0;69470:49;;;;;::::1;::::0;::::1;6757:25:1::0;;;;69386:13:0;69486:9:::1;::::0;;::::1;::::0;69470:37:::1;::::0;6730:18:1;;69470:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69541:15:::0;;69597:13:::1;::::0;::::1;::::0;69410:109;;-1:-1:-1;69410:109:0;;-1:-1:-1;69410:109:0;;-1:-1:-1;69410:109:0;-1:-1:-1;69541:15:0::1;::::0;;::::1;::::0;-1:-1:-1;69410:109:0;-1:-1:-1;69541:15:0::1;::::0;69588:36:::1;::::0;69410:109;69588:8:::1;:36::i;:::-;69567:57;;69635:17;69655:40;69684:10;69655:24;69673:5;69655:3;:13;;;:17;;:24;;;;:::i;:::-;:28:::0;::::1;:40::i;:::-;69735:13;::::0;::::1;::::0;69635:60;;-1:-1:-1;69735:28:0::1;::::0;69635:60;69735:17:::1;:28::i;:::-;69718:45;;69351:420;;;69072:699:::0;;;;;;;;;:::o;60778:912::-;54564:6;;;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;60852:13:::1;::::0;::::1;;60844:48;;;::::0;::::1;::::0;;8091:2:1;60844:48:0::1;::::0;::::1;8073:21:1::0;8130:2;8110:18;;;8103:30;8169:24;8149:18;;;8142:52;8211:18;;60844:48:0::1;7889:346:1::0;60844:48:0::1;60903:21;60927:13:::0;;;:5:::1;:13;::::0;;;;60959:15;;:29:::1;:15;60951:62;;;::::0;::::1;::::0;;14433:2:1;60951:62:0::1;::::0;::::1;14415:21:1::0;14472:2;14452:18;;;14445:30;14511:22;14491:18;;;14484:50;14551:18;;60951:62:0::1;14231:344:1::0;60951:62:0::1;61069:9;::::0;;61091:10;::::1;::::0;61053:49:::1;::::0;;;;::::1;::::0;::::1;6757:25:1::0;;;;61025:16:0::1;::::0;61069:9:::1;;::::0;61053:37:::1;::::0;6730:18:1;;61053:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;61024:78:0;;-1:-1:-1;;61121:22:0::1;::::0;::::1;::::0;-1:-1:-1;61113:76:0::1;::::0;-1:-1:-1;61113:76:0::1;;::::0;::::1;::::0;;14782:2:1;61113:76:0::1;::::0;::::1;14764:21:1::0;14821:2;14801:18;;;14794:30;14860:34;14840:18;;;14833:62;14931:11;14911:18;;;14904:39;14960:19;;61113:76:0::1;14580:405:1::0;61113:76:0::1;61227:3;:15;;;61208;:34;;61200:79;;;::::0;::::1;::::0;;15192:2:1;61200:79:0::1;::::0;::::1;15174:21:1::0;;;15211:18;;;15204:30;15270:34;15250:18;;;15243:62;15322:18;;61200:79:0::1;14990:356:1::0;61200:79:0::1;61295:17;::::0;::::1;::::0;::::1;;61293:20;:83:::0;::::1;;;-1:-1:-1::0;61363:13:0::1;::::0;::::1;::::0;61343:15;;61317:42:::1;::::0;;;;:25:::1;61343:15:::0;;::::1;61317:42;::::0;::::1;2945:74:1::0;61317:25:0;;::::1;::::0;::::1;::::0;2918:18:1;;61317:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;61293:83;:161;;;;-1:-1:-1::0;61441:13:0::1;::::0;::::1;::::0;61406:15;;61380:57:::1;::::0;;;;:25:::1;61406:15:::0;;::::1;61380:57;::::0;::::1;7603:34:1::0;61431:4:0::1;7653:18:1::0;;;7646:43;61380:25:0;;::::1;::::0;::::1;::::0;7515:18:1;;61380:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;61293:161;61290:393;;;61470:17;::::0;::::1;:24:::0;;;::::1;61490:4;61470:24;::::0;;61542:15;;61559:7:::1;::::0;61568:13:::1;::::0;::::1;::::0;61509:73:::1;::::0;61542:15:::1;61509:32:::0;;::::1;::::0;61542:15;;::::1;::::0;61559:7;::::1;::::0;61509:32:::1;:73::i;:::-;61611:10;::::0;::::1;::::0;61623:15;;61640:13:::1;::::0;::::1;::::0;61602:69:::1;::::0;;15582:25:1;;;61623:15:0::1;::::0;;::::1;15638:2:1::0;15623:18;;15616:83;15715:18;;;15708:34;61655:15:0::1;15773:2:1::0;15758:18;;15751:34;61602:69:0;::::1;::::0;;;;15569:3:1;61602:69:0;;::::1;61290:393;60833:857;;60778:912:::0;:::o;29831:103::-;29069:13;:11;:13::i;:::-;29896:30:::1;29923:1;29896:18;:30::i;:::-;29831:103::o:0;56805:186::-;29069:13;:11;:13::i;:::-;56898:4:::1;56906:1;56898:9:::0;:30:::1;;56917:11;;56898:30;;;56910:4;56898:30;56884:11;:44:::0;56961:1:::1;56953:9:::0;;;:30:::1;;56972:11;;56953:30;;;56965:4;56953:30;56939:11;:44:::0;-1:-1:-1;;56805:186:0:o;55417:377::-;29069:13;:11;:13::i;:::-;55480:7:::1;::::0;:21:::1;:7;55472:58;;;::::0;::::1;::::0;;15998:2:1;55472:58:0::1;::::0;::::1;15980:21:1::0;16037:2;16017:18;;;16010:30;16076:26;16056:18;;;16049:54;16120:18;;55472:58:0::1;15796:348:1::0;55472:58:0::1;55549:9;::::0;:23:::1;:9;55541:62;;;::::0;::::1;::::0;;16351:2:1;55541:62:0::1;::::0;::::1;16333:21:1::0;16390:2;16370:18;;;16363:30;16429:28;16409:18;;;16402:56;16475:18;;55541:62:0::1;16149:350:1::0;55541:62:0::1;55622:10;::::0;:24:::1;:10;55614:64;;;::::0;::::1;::::0;;16706:2:1;55614:64:0::1;::::0;::::1;16688:21:1::0;16745:2;16725:18;;;16718:30;16784:29;16764:18;;;16757:57;16831:18;;55614:64:0::1;16504:351:1::0;55614:64:0::1;55697:6;::::0;:20:::1;:6;55689:56;;;::::0;::::1;::::0;;17062:2:1;55689:56:0::1;::::0;::::1;17044:21:1::0;17101:2;17081:18;;;17074:30;17140:25;17120:18;;;17113:53;17183:18;;55689:56:0::1;16860:347:1::0;55689:56:0::1;55773:13;::::0;;55756:30;;::::1;55773:13;::::0;;::::1;55772:14;55756:30;::::0;;55417:377::o;70074:1196::-;70165:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:22:0;54564:6;;;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;70199:16:::1;70218:29;70225:7;70234:12;70218:6;:29::i;:::-;70258:21;70288:22:::0;;;:12:::1;:22;::::0;;;;;;;;70282:29;;:5:::1;:29:::0;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70199:48:0;;-1:-1:-1;70282:29:0;70363:15;;:29:::1;:15;:29:::0;70360:881:::1;;70425:4;70408:21:::0;;70444:11:::1;::::0;::::1;:21:::0;;;70502:13:::1;::::0;::::1;::::0;70480:19:::1;::::0;;::::1;:35:::0;;;;70541:7:::1;::::0;::::1;::::0;70530:8:::1;::::0;::::1;:18:::0;70582:15:::1;::::0;;::::1;::::0;70563:16:::1;::::0;::::1;:34:::0;70633:17:::1;::::0;::::1;::::0;70612:18:::1;::::0;::::1;:38:::0;70688:19:::1;::::0;;::::1;::::0;70665:20:::1;::::0;::::1;:42:::0;70741:15:::1;::::0;::::1;::::0;70722:16:::1;::::0;::::1;:34:::0;70791:16:::1;::::0;::::1;::::0;70771:17:::1;::::0;::::1;:36:::0;70845:19:::1;::::0;::::1;::::0;70822:20:::1;::::0;::::1;:42:::0;70891:8:::1;::::0;::::1;::::0;70879:9:::1;::::0;::::1;:20:::0;70931:13:::1;::::0;::::1;::::0;70914:14:::1;::::0;::::1;:30:::0;71006:9;70990:46;;;;;;;::::1;6757:25:1::0;;;-1:-1:-1;;71006:9:0::1;;::::0;70990:37:::1;::::0;6730:18:1;;70990:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;71128:13:0::1;::::0;::::1;::::0;71070:54:::1;::::0;;;;:25:::1;7621:15:1::0;;;71070:54:0::1;::::0;::::1;7603:34:1::0;71118:4:0::1;7653:18:1::0;;;7646:43;70961:75:0;;-1:-1:-1;71128:13:0;;71070:25;::::1;::::0;-1:-1:-1;71070:25:0::1;::::0;7515:18:1;;71070:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;71051:16;::::0;::::1;:90:::0;71216:13:::1;::::0;::::1;::::0;71173:39:::1;::::0;;;;:25:::1;2963:55:1::0;;;71173:39:0::1;::::0;::::1;2945:74:1::0;71173:25:0;::::1;::::0;::::1;::::0;2918:18:1;;71173:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;71156:14;::::0;::::1;:73:::0;-1:-1:-1;70360:881:0::1;71258:4:::0;-1:-1:-1;;;54613:1:0::1;70074:1196:::0;;;;:::o;60296:258::-;54564:6;;;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;60392:10:::1;::::0;::::1;::::0;::::1;;;60391:11;60383:51;;;::::0;::::1;::::0;;8442:2:1;60383:51:0::1;::::0;::::1;8424:21:1::0;8481:2;8461:18;;;8454:30;8520:29;8500:18;;;8493:57;8567:18;;60383:51:0::1;8240:351:1::0;60383:51:0::1;60445:36;60455:7;60464:1;60468:12;60445:9;:36::i;:::-;60497:49;::::0;;17414:25:1;;;17487:42;17475:55;;17470:2;17455:18;;17448:83;60530:15:0::1;17547:18:1::0;;;17540:34;60497:49:0;;::::1;::::0;;;;17402:2:1;60497:49:0;;::::1;60296:258:::0;;:::o;56177:400::-;29069:13;:11;:13::i;:::-;56318:22:::1;::::0;::::1;:43;;56354:7;::::0;::::1;;56318:43;;;56343:8;56318:43;56308:7;:53:::0;;;::::1;;::::0;;::::1;;::::0;;56384:24;::::1;:49;;56424:9;::::0;::::1;;56384:49;;;56411:10;56384:49;56372:9;:61:::0;;;::::1;;::::0;;::::1;;::::0;;56457:25;::::1;:52;;56499:10;::::0;::::1;;56457:52;;;56485:11;56457:52;56444:10;:65:::0;;;::::1;;::::0;;::::1;;::::0;;56529:21;::::1;:40;;56563:6;::::0;::::1;;56529:40;;;56553:7;56529:40;56520:6;:49:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;56177:400:0:o;57126:100::-;29069:13;:11;:13::i;:::-;57197:12:::1;:21:::0;57126:100::o;67514:165::-;54564:6;;67568:14;;;;54564:6;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;-1:-1:-1;;67624:13:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;67661:10:::0;;::::1;;::::0;67514:165::o;62014:1993::-;54564:6;;;;54550:10;:20;54542:60;;;;;;;6457:2:1;54542:60:0;;;6439:21:1;6496:2;6476:18;;;6469:30;6535:29;6515:18;;;6508:57;6582:18;;54542:60:0;6255:351:1;54542:60:0;62144:13:::1;::::0;::::1;;62136:48;;;::::0;::::1;::::0;;8091:2:1;62136:48:0::1;::::0;::::1;8073:21:1::0;8130:2;8110:18;;;8103:30;8169:24;8149:18;;;8142:52;8211:18;;62136:48:0::1;7889:346:1::0;62136:48:0::1;62195:21;62219:13:::0;;;:5:::1;:13;::::0;;;;62251:15;;:29:::1;:15;62243:62;;;::::0;::::1;::::0;;14433:2:1;62243:62:0::1;::::0;::::1;14415:21:1::0;14472:2;14452:18;;;14445:30;14511:22;14491:18;;;14484:50;14551:18;;62243:62:0::1;14231:344:1::0;62243:62:0::1;62361:9;::::0;;62383:10;::::1;::::0;62345:49:::1;::::0;;;;::::1;::::0;::::1;6757:25:1::0;;;;62317:16:0::1;::::0;62361:9:::1;;::::0;62345:37:::1;::::0;6730:18:1;;62345:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62316:78:0;;-1:-1:-1;;62413:22:0::1;::::0;::::1;::::0;-1:-1:-1;62405:76:0::1;::::0;-1:-1:-1;62405:76:0::1;;::::0;::::1;::::0;;14782:2:1;62405:76:0::1;::::0;::::1;14764:21:1::0;14821:2;14801:18;;;14794:30;14860:34;14840:18;;;14833:62;14931:11;14911:18;;;14904:39;14960:19;;62405:76:0::1;14580:405:1::0;62405:76:0::1;62519:3;:15;;;62500;:34;;62492:79;;;::::0;::::1;::::0;;15192:2:1;62492:79:0::1;::::0;::::1;15174:21:1::0;;;15211:18;;;15204:30;15270:34;15250:18;;;15243:62;15322:18;;62492:79:0::1;14990:356:1::0;62492:79:0::1;62620:7;::::0;::::1;::::0;62600:42:::1;::::0;62620:21:::1;::::0;53712:5:::1;62620:11;:21::i;:::-;62600:15;::::0;::::1;::::0;;:19:::1;:42::i;:::-;62582:15;::::0;::::1;:60:::0;62653:8:::1;::::0;::::1;:16:::0;;;62705:3:::1;62696:12:::0;::::1;::::0;:28:::1;;;62712:5;62721:3;62712:12;62696:28;:52;;62747:1;62696:52;;;62727:13;::::0;::::1;::::0;:17:::1;::::0;62743:1:::1;62727:17;:::i;:::-;62680:13;::::0;::::1;:68:::0;62771:3:::1;62762:12:::0;;;62759:1147:::1;;62790:17;::::0;::::1;:25:::0;;;::::1;::::0;;62850:15:::1;62830:17;::::0;::::1;:35:::0;62902:19:::1;::::0;::::1;::::0;:41:::1;::::0;62926:16;62902:23:::1;:41::i;:::-;62880:3;:19;;:63;;;;62978:1;62958:3;:16;;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;63016:19:0::1;::::0;::::1;::::0;:24;:88:::1;;63059:45;63102:1;63059:38;63083:13;63059:3;:19;;;:23;;:38;;;;:::i;:::-;:42:::0;::::1;:45::i;:::-;63016:88;;;63043:13;63016:88;62994:19;::::0;::::1;:110:::0;63181:15:::1;::::0;::::1;::::0;63161:16:::1;::::0;::::1;::::0;:35:::1;::::0;::::1;::::0;63160:62:::1;;;63220:1;63202:3;:15;;;:19;63160:62;63157:224;;;63252:10;::::0;::::1;::::0;63267:15;;63242:41:::1;::::0;63252:10;63264:1:::1;::::0;63267:15:::1;;63242:9;:41::i;:::-;63320:10;::::0;::::1;::::0;63332:15;;63307:58:::1;::::0;;17414:25:1;;;63332:15:0::1;::::0;;::::1;17470:2:1::0;17455:18;;17448:83;63349:15:0::1;17547:18:1::0;;;17540:34;63307:58:0;::::1;::::0;;;;17402:2:1;63307:58:0;;::::1;63157:224;62759:1147;;;63414:17;::::0;::::1;::::0;::::1;;63411:272;;;63459:17;::::0;::::1;:25:::0;;;::::1;::::0;;63536:7:::1;::::0;63545:15;;63562:13:::1;::::0;::::1;::::0;63503:73:::1;::::0;63536:7:::1;63503:32:::0;;::::1;::::0;63536:7;;::::1;::::0;63545:15;::::1;::::0;63503:32:::1;:73::i;:::-;63607:10;::::0;::::1;::::0;63619:15;;63636:13:::1;::::0;::::1;::::0;63600:67:::1;::::0;;15582:25:1;;;63619:15:0::1;::::0;;::::1;15638:2:1::0;15623:18;;15616:83;15715:18;;;15708:34;63651:15:0::1;15773:2:1::0;15758:18;;15751:34;63600:67:0;::::1;::::0;;;;15569:3:1;63600:67:0;;::::1;63411:272;63717:1;63700:3;:13;;;:18;63697:198;;63769:10;::::0;::::1;::::0;63784:15;;63759:41:::1;::::0;63769:10;63781:1:::1;::::0;63784:15:::1;;63759:9;:41::i;:::-;63834:10;::::0;::::1;::::0;63846:15;;63824:55:::1;::::0;;17414:25:1;;;63846:15:0::1;::::0;;::::1;17470:2:1::0;17455:18;;17448:83;63863:15:0::1;17547:18:1::0;;;17540:34;63824:55:0;::::1;::::0;;;;17402:2:1;63824:55:0;;::::1;63697:198;63929:10;::::0;::::1;::::0;63941:15;;63921:78:::1;::::0;;17844:25:1;;;63941:15:0::1;::::0;;::::1;17900:2:1::0;17885:18;;17878:83;17977:18;;17970:34;;;18035:2;18020:18;;18013:34;;;63983:15:0::1;18078:3:1::0;18063:19;;18056:35;63921:78:0::1;::::0;17831:3:1;17816:19;63921:78:0::1;;;;;;;62125:1882;;62014:1993:::0;;;;:::o;30089:201::-;29069:13;:11;:13::i;:::-;30178:22:::1;::::0;::::1;30170:73;;;::::0;::::1;::::0;;18304:2:1;30170:73:0::1;::::0;::::1;18286:21:1::0;18343:2;18323:18;;;18316:30;18382:34;18362:18;;;18355:62;18453:8;18433:18;;;18426:36;18479:19;;30170:73:0::1;18102:402:1::0;30170:73:0::1;30254:28;30273:8;30254:18;:28::i;:::-;30089:201:::0;:::o;66802:161::-;66879:7;66932;66941:12;66915:39;;;;;;;;18666:19:1;;;18723:2;18719:15;18736:66;18715:88;18710:2;18701:12;;18694:110;18829:2;18820:12;;18509:329;66915:39:0;;;;;;;;;;;;;66905:50;;;;;;66898:57;;66802:161;;;;:::o;11835:98::-;11893:7;11920:5;11924:1;11920;:5;:::i;:::-;11913:12;11835:98;-1:-1:-1;;;11835:98:0:o;11097:::-;11155:7;11182:5;11186:1;11182;:5;:::i;65757:832::-;65844:18;65901:16;65905:12;65901:2;:16;:::i;:::-;65897:20;;:3;:20;:::i;:::-;65877:15;:41;65874:708;;-1:-1:-1;65947:3:0;65874:708;;;66018:16;66022:12;66018:2;:16;:::i;:::-;66014:20;;:3;:20;:::i;:::-;65995:15;:40;:86;;;;-1:-1:-1;66064:16:0;66068:12;66064:2;:16;:::i;:::-;66059:21;;:4;:21;:::i;:::-;66039:15;:42;;65995:86;65992:590;;;-1:-1:-1;66110:2:0;65992:590;;;66180:16;66184:12;66180:2;:16;:::i;:::-;66175:21;;:4;:21;:::i;:::-;66156:15;:41;:88;;;;-1:-1:-1;66227:16:0;66231:12;66227:2;:16;:::i;:::-;66221:22;;:5;:22;:::i;:::-;66201:15;:43;;66156:88;66153:429;;;-1:-1:-1;66273:2:0;66153:429;;;66344:16;66348:12;66344:2;:16;:::i;:::-;66338:22;;:5;:22;:::i;:::-;66319:15;:42;:89;;;;-1:-1:-1;66391:16:0;66395:12;66391:2;:16;:::i;:::-;66385:22;;:5;:22;:::i;:::-;66365:15;:43;;66319:89;66316:266;;;-1:-1:-1;66437:2:0;66316:266;;;66508:16;66512:12;66508:2;:16;:::i;:::-;66502:22;;:5;:22;:::i;:::-;66483:15;:42;66480:102;;;-1:-1:-1;66554:2:0;65757:832;;;;:::o;12234:98::-;12292:7;12319:5;12323:1;12319;:5;:::i;11478:98::-;11536:7;11563:5;11567:1;11563;:5;:::i;34460:248::-;34631:68;;;19467:42:1;19536:15;;;34631:68:0;;;19518:34:1;19588:15;;19568:18;;;19561:43;19620:18;;;;19613:34;;;34631:68:0;;;;;;;;;;19430:18:1;;;;34631:68:0;;;;;;;;;;34654:27;34631:68;;;34604:96;;34624:5;;34604:19;:96::i;:::-;34460:248;;;;:::o;29348:132::-;29229:7;29256:6;29412:23;29256:6;27814:10;29412:23;29404:68;;;;;;;19860:2:1;29404:68:0;;;19842:21:1;;;19879:18;;;19872:30;19938:34;19918:18;;;19911:62;19990:18;;29404:68:0;19658:356:1;30450:191:0;30524:16;30543:6;;;30560:17;;;;;;;;;;30593:40;;30543:6;;;;;;;30593:40;;30524:16;30593:40;30513:128;30450:191;:::o;65088:487::-;65197:1;65187:7;:11;65179:49;;;;;;;9158:2:1;65179:49:0;;;9140:21:1;9197:2;9177:18;;;9170:30;9236:27;9216:18;;;9209:55;9281:18;;65179:49:0;8956:349:1;65179:49:0;65239:16;65258:29;65265:7;65274:12;65258:6;:29::i;:::-;65359:1;65312:22;;;:12;:22;;;;;;;;;65306:29;;:5;:29;;;;;:41;65239:48;;-1:-1:-1;65306:55:0;:41;65298:92;;;;;;;20221:2:1;65298:92:0;;;20203:21:1;20260:2;20240:18;;;20233:30;20299:26;20279:18;;;20272:54;20343:18;;65298:92:0;20019:348:1;65298:92:0;65401:21;65431:22;;;:12;:22;;;;;;;;;65425:29;;:5;:29;;;;;;;65465:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65425:29;65465:37;;65481:6;65489:12;65465:10;:37::i;:::-;-1:-1:-1;65513:28:0;;;;;;65552:10;:15;;65513:28;;65552:10;65539:1;;65552:15;;65513:28;;65552:15;:::i;:::-;;;;-1:-1:-1;;;;;;;65088:487:0:o;37308:716::-;37732:23;37758:69;37786:4;37758:69;;;;;;;;;;;;;;;;;37766:5;37758:27;;;;:69;;;;;:::i;:::-;37842:17;;37732:95;;-1:-1:-1;37842:21:0;37838:179;;37939:10;37928:30;;;;;;;;;;;;:::i;:::-;37920:85;;;;;;;20824:2:1;37920:85:0;;;20806:21:1;20863:2;20843:18;;;20836:30;20902:34;20882:18;;;20875:62;20973:12;20953:18;;;20946:40;21003:19;;37920:85:0;20622:406:1;64345:440:0;64446:4;64462:41;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64462:41:0;64528:16;;;;;64514:30;;64576:23;;;;64555:18;;;:44;;;64633:25;;;;64610:20;;;;:48;;;64669:11;;;:21;;;64718:10;;64701:54;;;;;64718:10;21284:55:1;;;64701:54:0;;;21266:74:1;21376:13;;21356:18;;;21349:41;21426:22;;21406:18;;;21399:50;21485:22;;21465:18;;;21458:50;21545:22;21524:19;;;21517:51;64718:10:0;;;;;64701:34;;21238:19:1;;64701:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64773:4:0;;64345:440;-1:-1:-1;;;;;;;;64345:440:0:o;19252:229::-;19389:12;19421:52;19443:6;19451:4;19457:1;19460:12;19421:21;:52::i;:::-;19414:59;19252:229;-1:-1:-1;;;;19252:229:0:o;20372:455::-;20542:12;20600:5;20575:21;:30;;20567:81;;;;;;;21781:2:1;20567:81:0;;;21763:21:1;21820:2;21800:18;;;21793:30;21859:34;21839:18;;;21832:62;21930:8;21910:18;;;21903:36;21956:19;;20567:81:0;21579:402:1;20567:81:0;20660:12;20674:23;20701:6;:11;;20720:5;20727:4;20701:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20659:73;;;;20750:69;20777:6;20785:7;20794:10;20806:12;20750:26;:69::i;:::-;20743:76;20372:455;-1:-1:-1;;;;;;;20372:455:0:o;22945:644::-;23130:12;23159:7;23155:427;;;23187:10;:17;23208:1;23187:22;23183:290;;16790:19;;;;23397:60;;;;;;;22735:2:1;23397:60:0;;;22717:21:1;22774:2;22754:18;;;22747:30;22813:31;22793:18;;;22786:59;22862:18;;23397:60:0;22533:353:1;23397:60:0;-1:-1:-1;23494:10:0;23487:17;;23155:427;23537:33;23545:10;23557:12;24292:17;;:21;24288:388;;24524:10;24518:17;24581:15;24568:10;24564:2;24560:19;24553:44;24288:388;24651:12;24644:20;;;;;;;;;;;:::i;267:180:1:-;326:6;379:2;367:9;358:7;354:23;350:32;347:52;;;395:1;392;385:12;347:52;-1:-1:-1;418:23:1;;267:180;-1:-1:-1;267:180:1:o;902:154::-;988:42;981:5;977:54;970:5;967:65;957:93;;1046:1;1043;1036:12;1061:118;1147:5;1140:13;1133:21;1126:5;1123:32;1113:60;;1169:1;1166;1159:12;1184:657;1285:6;1293;1301;1309;1317;1325;1378:3;1366:9;1357:7;1353:23;1349:33;1346:53;;;1395:1;1392;1385:12;1346:53;1431:9;1418:23;1408:33;;1491:2;1480:9;1476:18;1463:32;1504:31;1529:5;1504:31;:::i;:::-;1554:5;-1:-1:-1;1606:2:1;1591:18;;1578:32;;-1:-1:-1;1657:2:1;1642:18;;1629:32;;-1:-1:-1;1708:3:1;1693:19;;1680:33;;-1:-1:-1;1765:3:1;1750:19;;1737:33;1779:30;1737:33;1779:30;:::i;:::-;1828:7;1818:17;;;1184:657;;;;;;;;:::o;2546:248::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;-1:-1:-1;;2714:23:1;;;2784:2;2769:18;;;2756:32;;-1:-1:-1;2546:248:1:o;3030:315::-;3098:6;3106;3159:2;3147:9;3138:7;3134:23;3130:32;3127:52;;;3175:1;3172;3165:12;3127:52;3211:9;3198:23;3188:33;;3271:2;3260:9;3256:18;3243:32;3284:31;3309:5;3284:31;:::i;:::-;3334:5;3324:15;;;3030:315;;;;;:::o;3350:1309::-;3579:13;;522;515:21;503:34;;3550:3;3535:19;;3660:4;3652:6;3648:17;3642:24;3635:4;3624:9;3620:20;3613:54;3723:4;3715:6;3711:17;3705:24;3698:4;3687:9;3683:20;3676:54;3786:4;3778:6;3774:17;3768:24;3761:4;3750:9;3746:20;3739:54;3849:4;3841:6;3837:17;3831:24;3824:4;3813:9;3809:20;3802:54;3912:4;3904:6;3900:17;3894:24;3887:4;3876:9;3872:20;3865:54;3975:4;3967:6;3963:17;3957:24;3950:4;3939:9;3935:20;3928:54;4038:4;4030:6;4026:17;4020:24;4013:4;4002:9;3998:20;3991:54;4064:6;4124:2;4116:6;4112:15;4106:22;4101:2;4090:9;4086:18;4079:50;;4148:6;4208:2;4200:6;4196:15;4190:22;4185:2;4174:9;4170:18;4163:50;;4232:6;4292:2;4284:6;4280:15;4274:22;4269:2;4258:9;4254:18;4247:50;;4316:6;4376:2;4368:6;4364:15;4358:22;4353:2;4342:9;4338:18;4331:50;;4400:6;4453:2;4445:6;4441:15;4435:22;4466:49;4511:2;4500:9;4496:18;4482:12;522:13;515:21;503:34;;452:91;4466:49;-1:-1:-1;;4534:6:1;4577:15;;;4571:22;522:13;515:21;4634:18;;;;503:34;3350:1309;:::o;4664:671::-;4750:6;4758;4766;4774;4827:3;4815:9;4806:7;4802:23;4798:33;4795:53;;;4844:1;4841;4834:12;4795:53;4883:9;4870:23;4902:31;4927:5;4902:31;:::i;:::-;4952:5;-1:-1:-1;5009:2:1;4994:18;;4981:32;5022:33;4981:32;5022:33;:::i;:::-;5074:7;-1:-1:-1;5133:2:1;5118:18;;5105:32;5146:33;5105:32;5146:33;:::i;:::-;5198:7;-1:-1:-1;5257:2:1;5242:18;;5229:32;5270:33;5229:32;5270:33;:::i;:::-;4664:671;;;;-1:-1:-1;4664:671:1;;-1:-1:-1;;4664:671:1:o;5613:385::-;5699:6;5707;5715;5723;5776:3;5764:9;5755:7;5751:23;5747:33;5744:53;;;5793:1;5790;5783:12;5744:53;-1:-1:-1;;5816:23:1;;;5886:2;5871:18;;5858:32;;-1:-1:-1;5937:2:1;5922:18;;5909:32;;5988:2;5973:18;5960:32;;-1:-1:-1;5613:385:1;-1:-1:-1;5613:385:1:o;6003:247::-;6062:6;6115:2;6103:9;6094:7;6090:23;6086:32;6083:52;;;6131:1;6128;6121:12;6083:52;6170:9;6157:23;6189:31;6214:5;6189:31;:::i;6793:570::-;6899:6;6907;6915;6923;6931;6984:3;6972:9;6963:7;6959:23;6955:33;6952:53;;;7001:1;6998;6991:12;6952:53;7033:9;7027:16;7052:31;7077:5;7052:31;:::i;:::-;7147:2;7132:18;;7126:25;7196:2;7181:18;;7175:25;7102:5;;-1:-1:-1;7126:25:1;-1:-1:-1;7209:33:1;7175:25;7209:33;:::i;:::-;7308:2;7293:18;;7287:25;7352:3;7337:19;;;7331:26;6793:570;;;;-1:-1:-1;7261:7:1;7287:25;7331:26;6793:570;-1:-1:-1;;;6793:570:1:o;7700:184::-;7770:6;7823:2;7811:9;7802:7;7798:23;7794:32;7791:52;;;7839:1;7836;7829:12;7791:52;-1:-1:-1;7862:16:1;;7700:184;-1:-1:-1;7700:184:1:o;10071:::-;10123:77;10120:1;10113:88;10220:4;10217:1;10210:15;10244:4;10241:1;10234:15;10260:125;10325:9;;;10346:10;;;10343:36;;;10359:18;;:::i;10799:482::-;10888:1;10931:5;10888:1;10945:330;10966:7;10956:8;10953:21;10945:330;;;11085:4;11017:66;11013:77;11007:4;11004:87;11001:113;;;11094:18;;:::i;:::-;11144:7;11134:8;11130:22;11127:55;;;11164:16;;;;11127:55;11243:22;;;;11203:15;;;;10945:330;;;10949:3;10799:482;;;;;:::o;11286:866::-;11335:5;11365:8;11355:80;;-1:-1:-1;11406:1:1;11420:5;;11355:80;11454:4;11444:76;;-1:-1:-1;11491:1:1;11505:5;;11444:76;11536:4;11554:1;11549:59;;;;11622:1;11617:130;;;;11529:218;;11549:59;11579:1;11570:10;;11593:5;;;11617:130;11654:3;11644:8;11641:17;11638:43;;;11661:18;;:::i;:::-;-1:-1:-1;;11717:1:1;11703:16;;11732:5;;11529:218;;11831:2;11821:8;11818:16;11812:3;11806:4;11803:13;11799:36;11793:2;11783:8;11780:16;11775:2;11769:4;11766:12;11762:35;11759:77;11756:159;;;-1:-1:-1;11868:19:1;;;11900:5;;11756:159;11947:34;11972:8;11966:4;11947:34;:::i;:::-;12077:6;12009:66;12005:79;11996:7;11993:92;11990:118;;;12088:18;;:::i;:::-;12126:20;;11286:866;-1:-1:-1;;;11286:866:1:o;12157:131::-;12217:5;12246:36;12273:8;12267:4;12246:36;:::i;12293:228::-;12333:7;12459:1;12391:66;12387:74;12384:1;12381:81;12376:1;12369:9;12362:17;12358:105;12355:131;;;12466:18;;:::i;:::-;-1:-1:-1;12506:9:1;;12293:228::o;18843:274::-;18883:1;18909;18899:189;;18944:77;18941:1;18934:88;19045:4;19042:1;19035:15;19073:4;19070:1;19063:15;18899:189;-1:-1:-1;19102:9:1;;18843:274::o;19122:128::-;19189:9;;;19210:11;;;19207:37;;;19224:18;;:::i;20372:245::-;20439:6;20492:2;20480:9;20471:7;20467:23;20463:32;20460:52;;;20508:1;20505;20498:12;20460:52;20540:9;20534:16;20559:28;20581:5;20559:28;:::i;21986:250::-;22071:1;22081:113;22095:6;22092:1;22089:13;22081:113;;;22171:11;;;22165:18;22152:11;;;22145:39;22117:2;22110:10;22081:113;;;-1:-1:-1;;22228:1:1;22210:16;;22203:27;21986:250::o;22241:287::-;22370:3;22408:6;22402:13;22424:66;22483:6;22478:3;22471:4;22463:6;22459:17;22424:66;:::i;:::-;22506:16;;;;;22241:287;-1:-1:-1;;22241:287:1:o;22891:455::-;23040:2;23029:9;23022:21;23003:4;23072:6;23066:13;23115:6;23110:2;23099:9;23095:18;23088:34;23131:79;23203:6;23198:2;23187:9;23183:18;23178:2;23170:6;23166:15;23131:79;:::i;:::-;23262:2;23250:15;23267:66;23246:88;23231:104;;;;23337:2;23227:113;;22891:455;-1:-1:-1;;22891:455:1:o
Metadata Hash
72686495eaa13c16f1fb74060e61c85967b163023e69adb6bf061cefaca1e111
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.