Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
TokenDistributor
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at bobascan.com on 2022-07-30 */ // File: contracts/common/IERC20.sol // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.6.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/common/SafeMath.sol pragma solidity 0.6.12; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/common/Address.sol pragma solidity 0.6.12; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/common/SafeERC20.sol pragma solidity 0.6.12; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/mining/TokenDistributor.sol pragma solidity 0.6.12; // TokenDistributor allows anyone to distribute tokens according to governance defined allocations contract TokenDistributor { using SafeERC20 for IERC20; using SafeMath for uint; /* ========== STATE VARIABLES ========== */ address public governance; mapping(address => bool) public distributableTokens; address[] public recipients; uint256[] public percentages; /* ========== CONSTRUCTOR ========== */ constructor() public { governance = msg.sender; } /* ========== RESTRICTED FUNCTIONS ========== */ function setGovernance(address _governance) external onlyGov { governance = _governance; } function allowDistribution(address _token) external onlyGov { distributableTokens[_token] = true; } function disableDistribution(address _token) external onlyGov { distributableTokens[_token] = false; } // Must set recipient and percentages in single tx to avoid discrepency of length function setAllocations( address[] calldata _recipients, uint256[] calldata _percentages ) external onlyGov { require(_recipients.length == _percentages.length, "length does not match"); uint total = 0; for (uint i=0; i<_percentages.length; i++) { total = total + _percentages[i]; } require(total == 10000, "total percentage is not 10000"); recipients = _recipients; percentages = _percentages; } // Allow governance to rescue rewards function rescue(address _rewardToken) external onlyGov { uint _balance = IERC20(_rewardToken).balanceOf(address(this)); IERC20(_rewardToken).safeTransfer(governance, _balance); } /* ========== MUTATIVE FUNCTIONS ========== */ function distributeToken( IERC20 _token ) external { require(distributableTokens[address(_token)] == true, "Not allowed to distribute this token"); uint total = _token.balanceOf(address(this)); if (total == 0) { return; } for(uint i = 0; i < recipients.length; i++){ uint256 amount = total.mul(percentages[i]).div(10000); address recipient = recipients[i]; // Send the RewardToken to recipient _token.safeTransfer(recipient, amount); emit DistributedToken(recipient, address(_token), amount); } } /* ========== MODIFIERS ========== */ modifier onlyGov() { require(msg.sender == governance, "!governance"); _; } /* ========== EVENTS ========== */ event DistributedToken(address recipient, address rewardToken, uint256 amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DistributedToken","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"allowDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"disableDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"distributableTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"distributeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"percentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recipients","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_percentages","type":"uint256[]"}],"name":"setAllocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50600080546001600160a01b03191633179055610df5806100326000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063839006f211610066578063839006f21461021157806386d7403714610237578063ab033ea91461025d578063d1bc76a114610283578063f8858386146102a05761009e565b80630468c572146100a357806308da03c4146100cb5780631ff64acd14610105578063592fad19146101c75780635aa6e675146101ed575b600080fd5b6100c9600480360360208110156100b957600080fd5b50356001600160a01b03166102cf565b005b6100f1600480360360208110156100e157600080fd5b50356001600160a01b031661033d565b604080519115158252519081900360200190f35b6100c96004803603604081101561011b57600080fd5b81019060208101813564010000000081111561013657600080fd5b82018360208201111561014857600080fd5b8035906020019184602083028401116401000000008311171561016a57600080fd5b91939092909160208101903564010000000081111561018857600080fd5b82018360208201111561019a57600080fd5b803590602001918460208302840111640100000000831117156101bc57600080fd5b509092509050610352565b6100c9600480360360208110156101dd57600080fd5b50356001600160a01b0316610491565b6101f5610505565b604080516001600160a01b039092168252519081900360200190f35b6100c96004803603602081101561022757600080fd5b50356001600160a01b0316610514565b6100c96004803603602081101561024d57600080fd5b50356001600160a01b03166105fd565b6100c96004803603602081101561027357600080fd5b50356001600160a01b03166107b8565b6101f56004803603602081101561029957600080fd5b5035610827565b6102bd600480360360208110156102b657600080fd5b503561084e565b60408051918252519081900360200190f35b6000546001600160a01b0316331461031c576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152600160205260409020805460ff19169055565b60016020526000908152604090205460ff1681565b6000546001600160a01b0316331461039f576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b8281146103eb576040805162461bcd60e51b81526020600482015260156024820152740d8cadccee8d040c8decae640dcdee840dac2e8c6d605b1b604482015290519081900360640190fd5b6000805b828110156104195783838281811061040357fe5b60200291909101359290920191506001016103ef565b508061271014610470576040805162461bcd60e51b815260206004820152601d60248201527f746f74616c2070657263656e74616765206973206e6f74203130303030000000604482015290519081900360640190fd5b61047c60028686610c72565b5061048960038484610cd5565b505050505050565b6000546001600160a01b031633146104de576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6000546001600160a01b031681565b6000546001600160a01b03163314610561576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156105b057600080fd5b505afa1580156105c4573d6000803e3d6000fd5b505050506040513d60208110156105da57600080fd5b50516000549091506105f9906001600160a01b0384811691168361086c565b5050565b6001600160a01b03811660009081526001602081905260409091205460ff1615151461065a5760405162461bcd60e51b8152600401808060200182810382526024815260200180610d9c6024913960400191505060405180910390fd5b6000816001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156106a957600080fd5b505afa1580156106bd573d6000803e3d6000fd5b505050506040513d60208110156106d357600080fd5b50519050806106e257506107b5565b60005b6002548110156107b25760006107276127106107216003858154811061070757fe5b9060005260206000200154866108be90919063ffffffff16565b90610920565b905060006002838154811061073857fe5b6000918252602090912001546001600160a01b03908116915061075e908616828461086c565b604080516001600160a01b0380841682528716602082015280820184905290517fec8a926ea18363663a5a548a7025fce5cbebf4ed0f1ec215a0324f77094d52c59181900360600190a150506001016106e5565b50505b50565b6000546001600160a01b03163314610805576040805162461bcd60e51b815260206004820152600b60248201526a21676f7665726e616e636560a81b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6002818154811061083457fe5b6000918252602090912001546001600160a01b0316905081565b6003818154811061085b57fe5b600091825260209091200154905081565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107b2908490610962565b6000826108cd5750600061091a565b828202828482816108da57fe5b04146109175760405162461bcd60e51b8152600401808060200182810382526021815260200180610d516021913960400191505060405180910390fd5b90505b92915050565b600061091783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610a13565b60606109b7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610ab59092919063ffffffff16565b8051909150156107b2578080602001905160208110156109d657600080fd5b50516107b25760405162461bcd60e51b815260040180806020018281038252602a815260200180610d72602a913960400191505060405180910390fd5b60008183610a9f5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610a64578181015183820152602001610a4c565b50505050905090810190601f168015610a915780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581610aab57fe5b0495945050505050565b6060610ac48484600085610acc565b949350505050565b6060610ad785610c39565b610b28576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310610b675780518252601f199092019160209182019101610b48565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610bc9576040519150601f19603f3d011682016040523d82523d6000602084013e610bce565b606091505b50915091508115610be2579150610ac49050565b805115610bf25780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315610a64578181015183820152602001610a4c565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610ac4575050151592915050565b828054828255906000526020600020908101928215610cc5579160200282015b82811115610cc55781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190610c92565b50610cd1929150610d1c565b5090565b828054828255906000526020600020908101928215610d10579160200282015b82811115610d10578235825591602001919060010190610cf5565b50610cd1929150610d3b565b5b80821115610cd15780546001600160a01b0319168155600101610d1d565b5b80821115610cd15760008155600101610d3c56fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644e6f7420616c6c6f77656420746f2064697374726962757465207468697320746f6b656ea2646970667358221220f645d61d25714459f4b97e83d6f28f1c5d13072a465b404b0b281f8e8c3702bc64736f6c634300060c0033
Deployed ByteCode Sourcemap
18304:2756:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19037:116;;;;;;;;;;;;;;;;-1:-1:-1;19037:116:0;-1:-1:-1;;;;;19037:116:0;;:::i;:::-;;18487:51;;;;;;;;;;;;;;;;-1:-1:-1;18487:51:0;-1:-1:-1;;;;;18487:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;19248:525;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19248:525:0;;-1:-1:-1;19248:525:0;-1:-1:-1;19248:525:0;:::i;18916:113::-;;;;;;;;;;;;;;;;-1:-1:-1;18916:113:0;-1:-1:-1;;;;;18916:113:0;;:::i;18453:25::-;;;:::i;:::-;;;;-1:-1:-1;;;;;18453:25:0;;;;;;;;;;;;;;19824:224;;;;;;;;;;;;;;;;-1:-1:-1;19824:224:0;-1:-1:-1;;;;;19824:224:0;;:::i;20110:667::-;;;;;;;;;;;;;;;;-1:-1:-1;20110:667:0;-1:-1:-1;;;;;20110:667:0;;:::i;18804:104::-;;;;;;;;;;;;;;;;-1:-1:-1;18804:104:0;-1:-1:-1;;;;;18804:104:0;;:::i;18545:27::-;;;;;;;;;;;;;;;;-1:-1:-1;18545:27:0;;:::i;18579:28::-;;;;;;;;;;;;;;;;-1:-1:-1;18579:28:0;;:::i;:::-;;;;;;;;;;;;;;;;19037:116;20882:10;;-1:-1:-1;;;;;20882:10:0;20868;:24;20860:48;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19110:27:0::1;19140:5;19110:27:::0;;;:19:::1;:27;::::0;;;;:35;;-1:-1:-1;;19110:35:0::1;::::0;;19037:116::o;18487:51::-;;;;;;;;;;;;;;;:::o;19248:525::-;20882:10;;-1:-1:-1;;;;;20882:10:0;20868;:24;20860:48;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;;;;19421:41;;::::1;19413:75;;;::::0;;-1:-1:-1;;;19413:75:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19413:75:0;;;;;;;;;;;;;::::1;;19499:10;19529:6:::0;19524:101:::1;19539:21:::0;;::::1;19524:101;;;19598:12;;19611:1;19598:15;;;;;;;;;::::0;;;::::1;;19590:23:::0;;;::::1;::::0;-1:-1:-1;19562:3:0::1;;19524:101;;;;19643:5;19652;19643:14;19635:56;;;::::0;;-1:-1:-1;;;19635:56:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;19704:24;:10;19717:11:::0;;19704:24:::1;:::i;:::-;-1:-1:-1::0;19739:26:0::1;:11;19753:12:::0;;19739:26:::1;:::i;:::-;;20919:1;19248:525:::0;;;;:::o;18916:113::-;20882:10;;-1:-1:-1;;;;;20882:10:0;20868;:24;20860:48;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18987:27:0::1;;::::0;;;19017:4:::1;18987:27;::::0;;;;;;;:34;;-1:-1:-1;;18987:34:0::1;::::0;;::::1;::::0;;18916:113::o;18453:25::-;;;-1:-1:-1;;;;;18453:25:0;;:::o;19824:224::-;20882:10;;-1:-1:-1;;;;;20882:10:0;20868;:24;20860:48;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;;;;19913:13:::1;19936:12;-1:-1:-1::0;;;;;19929:30:0::1;;19968:4;19929:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;19929:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19929:45:0;20019:10:::1;::::0;19929:45;;-1:-1:-1;19985:55:0::1;::::0;-1:-1:-1;;;;;19985:33:0;;::::1;::::0;20019:10:::1;19929:45:::0;19985:33:::1;:55::i;:::-;20919:1;19824:224:::0;:::o;20110:667::-;-1:-1:-1;;;;;20208:36:0;;;;;;:19;:36;;;;;;;;;;;:44;;;20200:93;;;;-1:-1:-1;;;20200:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20306:10;20319:6;-1:-1:-1;;;;;20319:16:0;;20344:4;20319:31;;;;;;;;;;;;;-1:-1:-1;;;;;20319:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20319:31:0;;-1:-1:-1;20365:10:0;20361:49;;20392:7;;;20361:49;20426:6;20422:348;20442:10;:17;20438:21;;20422:348;;;20480:14;20497:36;20527:5;20497:25;20507:11;20519:1;20507:14;;;;;;;;;;;;;;;;20497:5;:9;;:25;;;;:::i;:::-;:29;;:36::i;:::-;20480:53;;20548:17;20568:10;20579:1;20568:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20568:13:0;;;;-1:-1:-1;20646:38:0;;:19;;20568:13;20677:6;20646:19;:38::i;:::-;20706:52;;;-1:-1:-1;;;;;20706:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20461:3:0;;20422:348;;;;20110:667;;;:::o;18804:104::-;20882:10;;-1:-1:-1;;;;;20882:10:0;20868;:24;20860:48;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;-1:-1:-1;;;20860:48:0;;;;;;;;;;;;;;;18876:10:::1;:24:::0;;-1:-1:-1;;;;;;18876:24:0::1;-1:-1:-1::0;;;;;18876:24:0;;;::::1;::::0;;;::::1;::::0;;18804:104::o;18545:27::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18545:27:0;;-1:-1:-1;18545:27:0;:::o;18579:28::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18579:28:0;:::o;15050:177::-;15160:58;;;-1:-1:-1;;;;;15160:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15160:58:0;-1:-1:-1;;;15160:58:0;;;15133:86;;15153:5;;15133:19;:86::i;5082:471::-;5140:7;5385:6;5381:47;;-1:-1:-1;5415:1:0;5408:8;;5381:47;5452:5;;;5456:1;5452;:5;:1;5476:5;;;;;:10;5468:56;;;;-1:-1:-1;;;5468:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:1;-1:-1:-1;5082:471:0;;;;;:::o;6029:132::-;6087:7;6114:39;6118:1;6121;6114:39;;;;;;;;;;;;;;;;;:3;:39::i;17355:761::-;17779:23;17805:69;17833:4;17805:69;;;;;;;;;;;;;;;;;17813:5;-1:-1:-1;;;;;17805:27:0;;;:69;;;;;:::i;:::-;17889:17;;17779:95;;-1:-1:-1;17889:21:0;17885:224;;18031:10;18020:30;;;;;;;;;;;;;;;-1:-1:-1;18020:30:0;18012:85;;;;-1:-1:-1;;;18012:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6657:278;6743:7;6778:12;6771:5;6763:28;;;;-1:-1:-1;;;6763:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6802:9;6818:1;6814;:5;;;;;;;6657:278;-1:-1:-1;;;;;6657:278:0:o;12052:196::-;12155:12;12187:53;12210:6;12218:4;12224:1;12227:12;12187:22;:53::i;:::-;12180:60;12052:196;-1:-1:-1;;;;12052:196:0:o;13429:979::-;13559:12;13592:18;13603:6;13592:10;:18::i;:::-;13584:60;;;;;-1:-1:-1;;;13584:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13718:12;13732:23;13759:6;-1:-1:-1;;;;;13759:11:0;13779:8;13790:4;13759:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13759:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13717:78;;;;13810:7;13806:595;;;13841:10;-1:-1:-1;13834:17:0;;-1:-1:-1;13834:17:0;13806:595;13955:17;;:21;13951:439;;14218:10;14212:17;14279:15;14266:10;14262:2;14258:19;14251:44;14166:148;14354:20;;-1:-1:-1;;;14354:20:0;;;;;;;;;;;;;;;;;14361:12;;14354:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8937:619;8997:4;9465:20;;9308:66;9505:23;;;;;;:42;;-1:-1:-1;;9532:15:0;;;9497:51;-1:-1:-1;;8937:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://f645d61d25714459f4b97e83d6f28f1c5d13072a465b404b0b281f8e8c3702bc
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.