Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,073 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Ether | 14360457 | 1041 days ago | IN | 0 ETH | 0.00161842 | ||||
Withdraw | 13547093 | 1168 days ago | IN | 0 ETH | 0.01357128 | ||||
Claim | 13502632 | 1175 days ago | IN | 0 ETH | 0.09310941 | ||||
Withdraw | 13265244 | 1212 days ago | IN | 0 ETH | 0.0032966 | ||||
Withdraw | 13036287 | 1247 days ago | IN | 0 ETH | 0.00300715 | ||||
Claim | 12762789 | 1290 days ago | IN | 0 ETH | 0.00042454 | ||||
Deposit | 12730114 | 1295 days ago | IN | 0 ETH | 0.00301059 | ||||
Claim | 12730108 | 1295 days ago | IN | 0 ETH | 0.01709185 | ||||
Withdraw | 12724014 | 1296 days ago | IN | 0 ETH | 0.00083083 | ||||
Withdraw | 12642723 | 1309 days ago | IN | 0 ETH | 0.00074378 | ||||
Claim | 12627677 | 1311 days ago | IN | 0 ETH | 0.00600256 | ||||
Withdraw | 12608348 | 1314 days ago | IN | 0 ETH | 0.00053419 | ||||
Deposit | 12595017 | 1316 days ago | IN | 0 ETH | 0.00428474 | ||||
Withdraw | 12594992 | 1316 days ago | IN | 0 ETH | 0.0032698 | ||||
Deposit | 12590044 | 1317 days ago | IN | 0 ETH | 0.00486116 | ||||
Withdraw | 12568353 | 1320 days ago | IN | 0 ETH | 0.00828995 | ||||
Claim | 12551975 | 1323 days ago | IN | 0 ETH | 0.01960049 | ||||
Claim | 12526643 | 1327 days ago | IN | 0 ETH | 0.01435821 | ||||
Withdraw | 12526229 | 1327 days ago | IN | 0 ETH | 0.00148675 | ||||
Withdraw | 12515175 | 1328 days ago | IN | 0 ETH | 0.00098633 | ||||
Withdraw | 12508685 | 1329 days ago | IN | 0 ETH | 0.00249493 | ||||
Withdraw | 12508457 | 1329 days ago | IN | 0 ETH | 0.00084553 | ||||
Withdraw | 12508440 | 1329 days ago | IN | 0 ETH | 0.0015309 | ||||
Withdraw | 12508227 | 1329 days ago | IN | 0 ETH | 0.00161838 | ||||
Claim | 12508220 | 1329 days ago | IN | 0 ETH | 0.01382972 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
14360457 | 1041 days ago | 4.99548837 ETH | ||||
13502632 | 1175 days ago | 0.33819274 ETH | ||||
13036287 | 1247 days ago | 0.00726284 ETH | ||||
12730108 | 1295 days ago | 0.25328344 ETH | ||||
12627677 | 1311 days ago | 0.05153169 ETH | ||||
12568353 | 1320 days ago | 0.13826535 ETH | ||||
12551975 | 1323 days ago | 2.71825392 ETH | ||||
12526643 | 1327 days ago | 0.53569811 ETH | ||||
12508220 | 1329 days ago | 0.16457388 ETH | ||||
12494240 | 1332 days ago | 0.00663004 ETH | ||||
12466946 | 1336 days ago | 0.3112026 ETH | ||||
12451041 | 1338 days ago | 0.2574004 ETH | ||||
12443672 | 1339 days ago | 0.06566649 ETH | ||||
12432738 | 1341 days ago | 0.25690007 ETH | ||||
12431175 | 1341 days ago | 0.27973475 ETH | ||||
12395171 | 1347 days ago | 0.08703917 ETH | ||||
12389765 | 1348 days ago | 0.28988083 ETH | ||||
12381748 | 1349 days ago | 0.00118623 ETH | ||||
12377520 | 1350 days ago | 0.10899997 ETH | ||||
12375539 | 1350 days ago | 0.29783821 ETH | ||||
12370225 | 1351 days ago | 0.03411883 ETH | ||||
12367281 | 1351 days ago | 0.48431064 ETH | ||||
12364105 | 1352 days ago | 0.40242521 ETH | ||||
12359433 | 1352 days ago | 0.13478932 ETH | ||||
12358057 | 1353 days ago | 0.09532503 ETH |
Loading...
Loading
Contract Name:
BlackFiskStaking
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-10 */ /** * * Market has owned you? * Now you will own the market * * Loading blackfisk.ai * * .ooooooooooooooooooooooooooo+ .ooooooooooooooooooooooooooo+ .ooooooooooooooooooooooooooo+ .ooooooooooooooooooooooooooo+ :+++++++++oooooooooooooooooooooooooooo+++++++++` /oooooooooooooooooooooooooooooooooooooooooooooo` /oooooooooooooooooooooooooooooooooooooooooooooo` /oooooooooooooooooooooooooooooooooooooooooooooo` /oooooooooooooooooooooooooooooooooooooooooooooo.```````` /oooooooooooooooooooooooooooooooooooooooooooooooooooooo- /oooooooooooooooooooooooooooooooooooooooooooooooooooooo- /oooooooooooooooooooooooooooooooooooooooooooooooooooooo- /oooooooooooooooooooooooooooooooooooooooooooooooooooooo- .--------/ooooooooooooooooooooooooooooooooooooooooooooo- .ooooooooooooooooooooooooo++++ooooooooo++++ooo- .oooooooooooooooooooooooo+---:oooooooo+:--:+oo- .oooooooooooooooooooooooo+----oooooooo+---:+oo- .oooooooooooooooooooooooo+----oooooooo+---:+oo- `````````````````/oooooo+::::oooooooo+:::/+oo- :ooooooooooooooooooooooooooo- :ooooooooooooooooooooooooooo- :ooooooooooooooooooooooooooo- ``````````````````````````/ooooooooooooooooooooooooooo:````````````````````````````` /oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo/ /oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo/ /oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo/ /oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo/ /ooooooooo+::::::::ooooooooooooooooooooooooooo:::::::::/ooooooooo::::::::+ooooooooo/ /ooooooooo/ +oooooooooooooooooooooooooo` -oooooooo+ /ooooooooo/ /ooooooooo/ +oooooooooooooooooooooooooo` -oooooooo+ /ooooooooo/ /ooooooooo/ +oooooooooooooooooooooooooo` -oooooooo+ /ooooooooo/ ......../ooooooooo+........ooooooooooooooooooooooooooo` -ooooooooo........+ooooooooo/........ ooooooooo-```````-ooooooooo.```````/oooooooooooooooooo` `````````.ooooooooo-```````-ooooooooo ooooooooo- .ooooooooo` :oooooooooooooooooo` `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :oooooooooooooooooo` `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :oooooooooooooooooo` `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :ooooooooo+.......+/////////- `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :ooooooooo+ +ooooooooo: `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :ooooooooo+ +ooooooooo: `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :ooooooooo+ +ooooooooo: `ooooooooo. -ooooooooo ooooooooo- .ooooooooo` :ooooooooo+ +ooooooooo: `ooooooooo. -ooooooooo */ pragma solidity ^0.6.0; 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); } 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; } } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly {codehash := extcodehash(account)} return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success,) = recipient.call{value : amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value : weiValue}(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library 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"); } } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) {// Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view 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 {_setupDecimals} is * called. * * 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 returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is 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 Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} } contract BlackFisk is ERC20("BlackFisk", "BLFI"), Ownable { uint256 public total = 140000; constructor () public { // mint tokens _mint(msg.sender, total.mul(10 ** 18)); } function burn(uint256 _amount) public { _burn(msg.sender, _amount); } } contract BlackFiskStaking is Ownable { /** * Libs for safeErc-20 and SafeMath */ using SafeMath for uint256; using SafeERC20 for IERC20; /** * Public constants helpers */ address public zeroAddress = address(0); /** Number of currentEpoch */ uint256 public currentEpoch = 0; /** Developer commission in case of using claim instead of user */ uint256 public devCommission = 0; /** * Public structs */ /** Struct User */ struct User { uint256 activeAmount; uint256 totalDeposited; uint256 lastEpoch; uint256 lastDeposit; uint256 lastDepositEpoch; } /** Struct for Pool */ struct Pool { uint256 totalSupplyLp; IERC20 lpToken; } /** Struct for Epoch */ struct Epoch { uint256 startTime; uint256 startBlock; uint256 endTime; uint256 endBlock; uint256 eth; uint256[] poolStatus; } /** List of supported lp pools for staking */ Pool[] public pools; /** HashMap of users that take part in staking */ mapping(uint256 => mapping(address => User)) public userInfo; /** HashMap of epoch starting from zero */ mapping(uint256 => Epoch) public Epochs; /** * All events that uses in public transactions */ event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event Claim(address indexed user, uint256 indexed pid, uint256 amount); event ClaimInsteadOfUser(address indexed caller, address indexed user, uint256 indexed pid, uint256 amount); /** Creates first epoch and init contract */ constructor() public { Epoch memory epoch = Epoch(now, block.number, 0, 0, 0, new uint256[](0)); Epochs[currentEpoch] = epoch; } /** * Main for using BlackFiskStaking for users */ /** Method that used by user to deposit tokens. * Check for reward if user deposited before than calculate and send them reward * than transfer lp-tokens to contract and start staking */ function deposit(uint pid, uint256 amount) public { require(amount > 0, "BlackFiskStaking : Deposit must be bigger than zero"); User storage user = userInfo[pid][msg.sender]; if (user.totalDeposited > 0) { claim(pid); // checking for rewards } else { user.lastEpoch = currentEpoch; } user.lastDeposit = user.lastDeposit.add(amount); user.lastDepositEpoch = currentEpoch.add(1); user.totalDeposited = user.totalDeposited.add(amount); pools[pid].totalSupplyLp = pools[pid].totalSupplyLp.add(amount); pools[pid].lpToken.safeTransferFrom(address(msg.sender), address(this), amount); emit Deposit(msg.sender, pid, amount); } /** Method that used by user to withdraw tokens. * Check for reward if user deposited before than calculate and send them reward * than transfer lp-tokens to user */ function withdraw(uint pid, uint256 amount) public { User storage user = userInfo[pid][msg.sender]; require(amount > 0, "BlackFiskStaking : Withdraw must be bigger than zero"); require(user.totalDeposited >= amount, "BlackFiskStaking: trying to withdraw more then are"); claim(pid); // checking for rewards if(amount > user.lastDeposit){ uint difference = amount.sub(user.lastDeposit); user.activeAmount = user.activeAmount.sub(difference); user.lastDeposit = 0; user.lastDepositEpoch = 0; } else { user.lastDeposit = user.lastDeposit.sub(amount); } user.totalDeposited = user.totalDeposited.sub(amount); pools[pid].totalSupplyLp = pools[pid].totalSupplyLp.sub(amount); pools[pid].lpToken.safeTransfer(address(msg.sender), amount); emit Withdraw(msg.sender, pid, amount); } /** Emergency withdraw use only in case of emergency. * Nullify all rewards and withdraw lp-tokens */ function emergencyWithdraw(uint pid) public { User storage user = userInfo[pid][msg.sender]; uint amount = user.totalDeposited; pools[pid].totalSupplyLp = pools[pid].totalSupplyLp.sub(amount); pools[pid].lpToken.safeTransfer(address(msg.sender), amount); user.totalDeposited = 0; user.activeAmount = 0; user.lastDeposit = 0; user.lastDepositEpoch = 0; user.lastEpoch = currentEpoch; emit EmergencyWithdraw(msg.sender, pid, amount); } /** Method that calculate user reward and withdraw it * Calculate reward by missed epochs and withdraw eth */ function claim(uint pid) public payable { User storage user = userInfo[pid][msg.sender]; uint amount = calcReward(pid, msg.sender); if(user.lastDepositEpoch <= currentEpoch){ user.activeAmount = user.activeAmount.add(user.lastDeposit); user.lastDepositEpoch = 0; user.lastDeposit = 0; } if (address(this).balance > amount) { msg.sender.transfer(amount); } else { msg.sender.transfer(address(this).balance); } user.lastEpoch = currentEpoch; emit Claim(msg.sender, pid, amount); } /** * All admin functions */ /** Waits for eth from deployer and call endEpoch*/ receive() external payable { endEpoch(msg.value); } /** Close current epoch and start new Epoch */ function endEpoch(uint256 amount) public payable onlyOwner { require(amount > 0, "BlackFiskStaking: reward must be bigger than zero"); Epoch storage previousEpoch = Epochs[currentEpoch]; previousEpoch.endBlock = block.number; previousEpoch.endTime = now; previousEpoch.eth = amount; // calculating all stakes for (uint i = 0; i < pools.length; i++) { previousEpoch.poolStatus.push(pools[i].totalSupplyLp); } currentEpoch = currentEpoch.add(1); Epochs[currentEpoch] = Epoch(now, block.number, 0, 0, 0, new uint256[](0)); } /** add new lp-pool to staking (can be called from deployer) */ function add(IERC20 _lpToken) public onlyOwner { pools.push(Pool({ lpToken : _lpToken, totalSupplyLp : 0 })); } /** Can claim eth instead of user. * This function will be used when person a lot of * epochs as a result his commission is to high. * This method send reward of user with but with minus commission that * deployers pays instead of him. * This method can helps to save a lot of eth. */ function claimInsteadOfUser(uint pid, address payable userAddress, uint commission, uint reward) public onlyOwner { User storage user = userInfo[pid][userAddress]; uint256 amount = reward.sub(commission); if (address(this).balance > amount) { userAddress.transfer(amount); } else { userAddress.transfer(address(this).balance); } devCommission = devCommission.add(commission); user.lastEpoch = currentEpoch; emit ClaimInsteadOfUser(msg.sender, userAddress, pid, amount); } /** Emergency only. Withdraw eth from contract when something went wrong or for migration to new contract*/ function withdrawEther(uint256 amount) public onlyOwner { msg.sender.transfer(amount); } /** Withdraw eth (devs commissions received in claimInsteadOfUser) */ function claimDevCommission() public onlyOwner { msg.sender.transfer(devCommission); devCommission = 0; } /** * View methods */ /** Return length of pools list */ function poolLength() external view returns (uint256) { return pools.length; } /** * Calculate profit of epochs starting from now */ function getBotProfit(uint amountOfEpochs) external view returns (uint256){ uint profit = 0; uint startEpochIndex = currentEpoch.sub(1); uint endEpochIndex = 0; if(amountOfEpochs <= startEpochIndex){ endEpochIndex = currentEpoch.sub(amountOfEpochs); } for (uint i = startEpochIndex; i > endEpochIndex; i--) { Epoch storage epoch = Epochs[i]; profit = profit.add(epoch.eth); } // to avoid overflow Epoch storage epoch = Epochs[0]; profit = profit.add(epoch.eth); return profit; } /** Calculate Possible Reward for all epochs. Used by app and users methods. */ function calcReward(uint pid, address user) public view returns (uint256){ User storage currentUser = userInfo[pid][user]; uint256 totalReward = 0; for (uint256 i = currentUser.lastEpoch; i < currentEpoch; i++) { uint amount = currentUser.activeAmount; if(currentUser.lastDepositEpoch <= i){ amount = amount.add(currentUser.lastDeposit); } Epoch storage epoch = Epochs[i]; uint256 rewardForPool = epoch.eth.div(epoch.poolStatus.length); uint reward = amount.mul(rewardForPool).div(epoch.poolStatus[pid]); totalReward = totalReward.add(reward); } return totalReward; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimInsteadOfUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Epochs","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"eth","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_lpToken","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"calcReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimDevCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"uint256","name":"commission","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"name":"claimInsteadOfUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"endEpoch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfEpochs","type":"uint256"}],"name":"getBotProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"totalSupplyLp","type":"uint256"},{"internalType":"contract IERC20","name":"lpToken","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"activeAmount","type":"uint256"},{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"lastEpoch","type":"uint256"},{"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"internalType":"uint256","name":"lastDepositEpoch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zeroAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060025560006003553480156200005d57600080fd5b506000620000706200020460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001186200020c565b6040518060c00160405280428152602001438152602001600081526020016000815260200160008152602001600067ffffffffffffffff811180156200015d57600080fd5b506040519080825280602002602001820160405280156200018d5781602001602082028036833780820191505090505b50815250905080600660006002548152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005019080519060200190620001f992919062000242565b5090505050620002b3565b600033905090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001606081525090565b82805482825590600052602060002090810192821562000281579160200282015b828111156200028057825182559160200191906001019062000263565b5b50905062000290919062000294565b5090565b5b80821115620002af57600081600090555060010162000295565b5090565b6128a080620002c36000396000f3fe60806040526004361061012e5760003560e01c8063715018a6116100ab5780638da5cb5b1161006f5780638da5cb5b146104e457806393f1a40b14610525578063ac4afa38146105b0578063e2bbb1581461061c578063f2fde38b14610661578063fe6214ad146106b25761013e565b8063715018a614610359578063766718081461037057806377a810c61461039b57806379a6dbf91461040657806385461f69146104755761013e565b80633bed33ce116100f25780633bed33ce14610259578063441a3e70146102945780635312ea8e146102d95780636164e45d1461031457806366d113b5146103425761013e565b8063081e3eda146101435780630930907b1461016e5780630a32e91e146101af5780630a3b0a4f146101da578063379607f51461022b5761013e565b3661013e5761013c34610701565b005b600080fd5b34801561014f57600080fd5b506101586109bb565b6040518082815260200191505060405180910390f35b34801561017a57600080fd5b506101836109c8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101bb57600080fd5b506101c46109ee565b6040518082815260200191505060405180910390f35b3480156101e657600080fd5b50610229600480360360208110156101fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109f4565b005b6102576004803603602081101561024157600080fd5b8101908080359060200190929190505050610b69565b005b34801561026557600080fd5b506102926004803603602081101561027c57600080fd5b8101908080359060200190929190505050610d0b565b005b3480156102a057600080fd5b506102d7600480360360408110156102b757600080fd5b810190808035906020019092919080359060200190929190505050610e1d565b005b3480156102e557600080fd5b50610312600480360360208110156102fc57600080fd5b81019080803590602001909291905050506110df565b005b6103406004803603602081101561032a57600080fd5b8101908080359060200190929190505050610701565b005b34801561034e57600080fd5b5061035761127f565b005b34801561036557600080fd5b5061036e61139a565b005b34801561037c57600080fd5b50610385611520565b6040518082815260200191505060405180910390f35b3480156103a757600080fd5b506103d4600480360360208110156103be57600080fd5b8101908080359060200190929190505050611526565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561041257600080fd5b506104736004803603608081101561042957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061155c565b005b34801561048157600080fd5b506104ce6004803603604081101561049857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117bf565b6040518082815260200191505060405180910390f35b3480156104f057600080fd5b506104f9611904565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053157600080fd5b5061057e6004803603604081101561054857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061192d565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156105bc57600080fd5b506105e9600480360360208110156105d357600080fd5b8101908080359060200190929190505050611970565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34801561062857600080fd5b5061065f6004803603604081101561063f57600080fd5b8101908080359060200190929190803590602001909291905050506119c1565b005b34801561066d57600080fd5b506106b06004803603602081101561068457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c03565b005b3480156106be57600080fd5b506106eb600480360360208110156106d557600080fd5b8101908080359060200190929190505050611e0e565b6040518082815260200191505060405180910390f35b610709611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008111610822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806127896031913960400191505060405180910390fd5b6000600660006002548152602001908152602001600020905043816003018190555042816002018190555081816004018190555060005b6004805490508110156108bc57816005016004828154811061087757fe5b90600052602060002090600202016000015490806001815401808255809150506001900390600052602060002001600090919091909150558080600101915050610859565b506108d36001600254611ee290919063ffffffff16565b6002819055506040518060c00160405280428152602001438152602001600081526020016000815260200160008152602001600067ffffffffffffffff8111801561091d57600080fd5b5060405190808252806020026020018201604052801561094c5781602001602082028036833780820191505090505b50815250600660006002548152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190805190602001906109b39291906126c5565b509050505050565b6000600480549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6109fc611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60046040518060400160405280600081526020018373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60006005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610bc983336117bf565b9050600254826004015411610c1057610bf382600301548360000154611ee290919063ffffffff16565b826000018190555060008260040181905550600082600301819055505b80471115610c64573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c5e573d6000803e3d6000fd5b50610cac565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610caa573d6000803e3d6000fd5b505b6002548260020181905550823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040518082815260200191505060405180910390a3505050565b610d13611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e19573d6000803e3d6000fd5b5050565b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008211610eca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806127ba6034913960400191505060405180910390fd5b8181600101541015610f27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128396032913960400191505060405180910390fd5b610f3083610b69565b8060030154821115610f90576000610f55826003015484611f6a90919063ffffffff16565b9050610f6e818360000154611f6a90919063ffffffff16565b8260000181905550600082600301819055506000826004018190555050610fb0565b610fa7828260030154611f6a90919063ffffffff16565b81600301819055505b610fc7828260010154611f6a90919063ffffffff16565b81600101819055506110008260048581548110610fe057fe5b906000526020600020906002020160000154611f6a90919063ffffffff16565b6004848154811061100d57fe5b90600052602060002090600202016000018190555061108b33836004868154811061103457fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb49092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568846040518082815260200191505060405180910390a3505050565b60006005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010154905061116d816004858154811061114d57fe5b906000526020600020906002020160000154611f6a90919063ffffffff16565b6004848154811061117a57fe5b9060005260206000209060020201600001819055506111f83382600486815481106111a157fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb49092919063ffffffff16565b600082600101819055506000826000018190555060008260030181905550600082600401819055506002548260020181905550823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a3505050565b611287611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc6003549081150290604051600060405180830381858888f1935050505015801561138f573d6000803e3d6000fd5b506000600381905550565b6113a2611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60025481565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b611564611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611624576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061168d8484611f6a90919063ffffffff16565b9050804711156116e3578473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116dd573d6000803e3d6000fd5b5061172b565b8473ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611729573d6000803e3d6000fd5b505b61174084600354611ee290919063ffffffff16565b6003819055506002548260020181905550858573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5b15d724d2e05f048a98ff73f7e6dc266a3bc849c9b156c756f431d5e2bace9846040518082815260200191505060405180910390a4505050505050565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080826002015490505b6002548110156118f8576000836000015490508184600401541161185757611854846003015482611ee290919063ffffffff16565b90505b6000600660008481526020019081526020016000209050600061188e8260050180549050836004015461205690919063ffffffff16565b905060006118d0836005018b815481106118a457fe5b90600052602060002001546118c284876120a090919063ffffffff16565b61205690919063ffffffff16565b90506118e58187611ee290919063ffffffff16565b955050505050808060010191505061181f565b50809250505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154905085565b6004818154811061197d57fe5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b60008111611a1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806127306033913960400191505060405180910390fd5b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600101541115611a8957611a8483610b69565b611a95565b60025481600201819055505b611aac828260030154611ee290919063ffffffff16565b8160030181905550611aca6001600254611ee290919063ffffffff16565b8160040181905550611ae9828260010154611ee290919063ffffffff16565b8160010181905550611b228260048581548110611b0257fe5b906000526020600020906002020160000154611ee290919063ffffffff16565b60048481548110611b2f57fe5b906000526020600020906002020160000181905550611baf33308460048781548110611b5757fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612126909392919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15846040518082815260200191505060405180910390a3505050565b611c0b611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127636026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090506000611e2d6001600254611f6a90919063ffffffff16565b90506000818511611e5057611e4d85600254611f6a90919063ffffffff16565b90505b60008290505b81811115611e9d576000600660008381526020019081526020016000209050611e8c816004015486611ee290919063ffffffff16565b945050808060019003915050611e56565b506000600660008081526020019081526020016000209050611ecc816004015485611ee290919063ffffffff16565b935083945050505050919050565b600033905090565b600080828401905083811015611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000611fac83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121e7565b905092915050565b6120518363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122a7565b505050565b600061209883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612396565b905092915050565b6000808314156120b35760009050612120565b60008284029050828482816120c457fe5b041461211b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127ee6021913960400191505060405180910390fd5b809150505b92915050565b6121e1846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122a7565b50505050565b6000838311158290612294576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561225957808201518184015260208101905061223e565b50505050905090810190601f1680156122865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060612309826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661245c9092919063ffffffff16565b90506000815111156123915780806020019051602081101561232a57600080fd5b8101908080519060200190929190505050612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061280f602a913960400191505060405180910390fd5b5b505050565b60008083118290612442576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124075780820151818401526020810190506123ec565b50505050905090810190601f1680156124345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161244e57fe5b049050809150509392505050565b606061246b8484600085612474565b90509392505050565b606061247f8561267a565b6124f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612541578051825260208201915060208101905060208303925061251e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146125a3576040519150601f19603f3d011682016040523d82523d6000602084013e6125a8565b606091505b509150915081156125bd578092505050612672565b6000815111156125d05780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561263757808201518184015260208101905061261c565b50505050905090810190601f1680156126645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156126bc57506000801b8214155b92505050919050565b828054828255906000526020600020908101928215612701579160200282015b828111156127005782518255916020019190600101906126e5565b5b50905061270e9190612712565b5090565b5b8082111561272b576000816000905550600101612713565b509056fe426c61636b4669736b5374616b696e67203a204465706f736974206d75737420626520626967676572207468616e207a65726f4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373426c61636b4669736b5374616b696e673a20726577617264206d75737420626520626967676572207468616e207a65726f426c61636b4669736b5374616b696e67203a205769746864726177206d75737420626520626967676572207468616e207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564426c61636b4669736b5374616b696e673a20747279696e6720746f207769746864726177206d6f7265207468656e20617265a26469706673582212203b3f3c392fbc3128b5cdfc83fd2345b13dae3f3ad5660a09c1c0e1ac160a161464736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061012e5760003560e01c8063715018a6116100ab5780638da5cb5b1161006f5780638da5cb5b146104e457806393f1a40b14610525578063ac4afa38146105b0578063e2bbb1581461061c578063f2fde38b14610661578063fe6214ad146106b25761013e565b8063715018a614610359578063766718081461037057806377a810c61461039b57806379a6dbf91461040657806385461f69146104755761013e565b80633bed33ce116100f25780633bed33ce14610259578063441a3e70146102945780635312ea8e146102d95780636164e45d1461031457806366d113b5146103425761013e565b8063081e3eda146101435780630930907b1461016e5780630a32e91e146101af5780630a3b0a4f146101da578063379607f51461022b5761013e565b3661013e5761013c34610701565b005b600080fd5b34801561014f57600080fd5b506101586109bb565b6040518082815260200191505060405180910390f35b34801561017a57600080fd5b506101836109c8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101bb57600080fd5b506101c46109ee565b6040518082815260200191505060405180910390f35b3480156101e657600080fd5b50610229600480360360208110156101fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109f4565b005b6102576004803603602081101561024157600080fd5b8101908080359060200190929190505050610b69565b005b34801561026557600080fd5b506102926004803603602081101561027c57600080fd5b8101908080359060200190929190505050610d0b565b005b3480156102a057600080fd5b506102d7600480360360408110156102b757600080fd5b810190808035906020019092919080359060200190929190505050610e1d565b005b3480156102e557600080fd5b50610312600480360360208110156102fc57600080fd5b81019080803590602001909291905050506110df565b005b6103406004803603602081101561032a57600080fd5b8101908080359060200190929190505050610701565b005b34801561034e57600080fd5b5061035761127f565b005b34801561036557600080fd5b5061036e61139a565b005b34801561037c57600080fd5b50610385611520565b6040518082815260200191505060405180910390f35b3480156103a757600080fd5b506103d4600480360360208110156103be57600080fd5b8101908080359060200190929190505050611526565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34801561041257600080fd5b506104736004803603608081101561042957600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061155c565b005b34801561048157600080fd5b506104ce6004803603604081101561049857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506117bf565b6040518082815260200191505060405180910390f35b3480156104f057600080fd5b506104f9611904565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053157600080fd5b5061057e6004803603604081101561054857600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061192d565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b3480156105bc57600080fd5b506105e9600480360360208110156105d357600080fd5b8101908080359060200190929190505050611970565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34801561062857600080fd5b5061065f6004803603604081101561063f57600080fd5b8101908080359060200190929190803590602001909291905050506119c1565b005b34801561066d57600080fd5b506106b06004803603602081101561068457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c03565b005b3480156106be57600080fd5b506106eb600480360360208110156106d557600080fd5b8101908080359060200190929190505050611e0e565b6040518082815260200191505060405180910390f35b610709611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146107c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008111610822576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806127896031913960400191505060405180910390fd5b6000600660006002548152602001908152602001600020905043816003018190555042816002018190555081816004018190555060005b6004805490508110156108bc57816005016004828154811061087757fe5b90600052602060002090600202016000015490806001815401808255809150506001900390600052602060002001600090919091909150558080600101915050610859565b506108d36001600254611ee290919063ffffffff16565b6002819055506040518060c00160405280428152602001438152602001600081526020016000815260200160008152602001600067ffffffffffffffff8111801561091d57600080fd5b5060405190808252806020026020018201604052801561094c5781602001602082028036833780820191505090505b50815250600660006002548152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050190805190602001906109b39291906126c5565b509050505050565b6000600480549050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b6109fc611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60046040518060400160405280600081526020018373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60006005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000610bc983336117bf565b9050600254826004015411610c1057610bf382600301548360000154611ee290919063ffffffff16565b826000018190555060008260040181905550600082600301819055505b80471115610c64573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610c5e573d6000803e3d6000fd5b50610cac565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610caa573d6000803e3d6000fd5b505b6002548260020181905550823373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040518082815260200191505060405180910390a3505050565b610d13611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e19573d6000803e3d6000fd5b5050565b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008211610eca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806127ba6034913960400191505060405180910390fd5b8181600101541015610f27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806128396032913960400191505060405180910390fd5b610f3083610b69565b8060030154821115610f90576000610f55826003015484611f6a90919063ffffffff16565b9050610f6e818360000154611f6a90919063ffffffff16565b8260000181905550600082600301819055506000826004018190555050610fb0565b610fa7828260030154611f6a90919063ffffffff16565b81600301819055505b610fc7828260010154611f6a90919063ffffffff16565b81600101819055506110008260048581548110610fe057fe5b906000526020600020906002020160000154611f6a90919063ffffffff16565b6004848154811061100d57fe5b90600052602060002090600202016000018190555061108b33836004868154811061103457fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb49092919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568846040518082815260200191505060405180910390a3505050565b60006005600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160010154905061116d816004858154811061114d57fe5b906000526020600020906002020160000154611f6a90919063ffffffff16565b6004848154811061117a57fe5b9060005260206000209060020201600001819055506111f83382600486815481106111a157fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fb49092919063ffffffff16565b600082600101819055506000826000018190555060008260030181905550600082600401819055506002548260020181905550823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae0595836040518082815260200191505060405180910390a3505050565b611287611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611347576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc6003549081150290604051600060405180830381858888f1935050505015801561138f573d6000803e3d6000fd5b506000600381905550565b6113a2611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611462576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60025481565b60066020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b611564611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611624576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006005600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600061168d8484611f6a90919063ffffffff16565b9050804711156116e3578473ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156116dd573d6000803e3d6000fd5b5061172b565b8473ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611729573d6000803e3d6000fd5b505b61174084600354611ee290919063ffffffff16565b6003819055506002548260020181905550858573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd5b15d724d2e05f048a98ff73f7e6dc266a3bc849c9b156c756f431d5e2bace9846040518082815260200191505060405180910390a4505050505050565b6000806005600085815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080826002015490505b6002548110156118f8576000836000015490508184600401541161185757611854846003015482611ee290919063ffffffff16565b90505b6000600660008481526020019081526020016000209050600061188e8260050180549050836004015461205690919063ffffffff16565b905060006118d0836005018b815481106118a457fe5b90600052602060002001546118c284876120a090919063ffffffff16565b61205690919063ffffffff16565b90506118e58187611ee290919063ffffffff16565b955050505050808060010191505061181f565b50809250505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6005602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154908060030154908060040154905085565b6004818154811061197d57fe5b90600052602060002090600202016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b60008111611a1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806127306033913960400191505060405180910390fd5b60006005600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600101541115611a8957611a8483610b69565b611a95565b60025481600201819055505b611aac828260030154611ee290919063ffffffff16565b8160030181905550611aca6001600254611ee290919063ffffffff16565b8160040181905550611ae9828260010154611ee290919063ffffffff16565b8160010181905550611b228260048581548110611b0257fe5b906000526020600020906002020160000154611ee290919063ffffffff16565b60048481548110611b2f57fe5b906000526020600020906002020160000181905550611baf33308460048781548110611b5757fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612126909392919063ffffffff16565b823373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15846040518082815260200191505060405180910390a3505050565b611c0b611eda565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d51576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127636026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600090506000611e2d6001600254611f6a90919063ffffffff16565b90506000818511611e5057611e4d85600254611f6a90919063ffffffff16565b90505b60008290505b81811115611e9d576000600660008381526020019081526020016000209050611e8c816004015486611ee290919063ffffffff16565b945050808060019003915050611e56565b506000600660008081526020019081526020016000209050611ecc816004015485611ee290919063ffffffff16565b935083945050505050919050565b600033905090565b600080828401905083811015611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000611fac83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121e7565b905092915050565b6120518363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122a7565b505050565b600061209883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612396565b905092915050565b6000808314156120b35760009050612120565b60008284029050828482816120c457fe5b041461211b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127ee6021913960400191505060405180910390fd5b809150505b92915050565b6121e1846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122a7565b50505050565b6000838311158290612294576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561225957808201518184015260208101905061223e565b50505050905090810190601f1680156122865780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6060612309826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661245c9092919063ffffffff16565b90506000815111156123915780806020019051602081101561232a57600080fd5b8101908080519060200190929190505050612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061280f602a913960400191505060405180910390fd5b5b505050565b60008083118290612442576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156124075780820151818401526020810190506123ec565b50505050905090810190601f1680156124345780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161244e57fe5b049050809150509392505050565b606061246b8484600085612474565b90509392505050565b606061247f8561267a565b6124f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310612541578051825260208201915060208101905060208303925061251e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146125a3576040519150601f19603f3d011682016040523d82523d6000602084013e6125a8565b606091505b509150915081156125bd578092505050612672565b6000815111156125d05780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561263757808201518184015260208101905061261c565b50505050905090810190601f1680156126645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156126bc57506000801b8214155b92505050919050565b828054828255906000526020600020908101928215612701579160200282015b828111156127005782518255916020019190600101906126e5565b5b50905061270e9190612712565b5090565b5b8082111561272b576000816000905550600101612713565b509056fe426c61636b4669736b5374616b696e67203a204465706f736974206d75737420626520626967676572207468616e207a65726f4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373426c61636b4669736b5374616b696e673a20726577617264206d75737420626520626967676572207468616e207a65726f426c61636b4669736b5374616b696e67203a205769746864726177206d75737420626520626967676572207468616e207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564426c61636b4669736b5374616b696e673a20747279696e6720746f207769746864726177206d6f7265207468656e20617265a26469706673582212203b3f3c392fbc3128b5cdfc83fd2345b13dae3f3ad5660a09c1c0e1ac160a161464736f6c634300060c0033
Deployed Bytecode Sourcemap
39389:9818:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45199:19;45208:9;45199:8;:19::i;:::-;39389:9818;;;;;47586:92;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39612:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39803:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45996:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44415:633;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47183:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42670:950;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43747:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45286:633;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47368:128;;;;;;;;;;;;;:::i;:::-;;28810:148;;;;;;;;;;;;;:::i;:::-;;39693:31;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40678:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46482:580;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48477:727;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28168:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40563:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40482:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;41723:753;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29113:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47757:627;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45286:633;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45373:1:::1;45364:6;:10;45356:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45439:27;45469:6;:20;45476:12;;45469:20;;;;;;;;;;;45439:50;;45525:12;45500:13;:22;;:37;;;;45572:3;45548:13;:21;;:27;;;;45606:6;45586:13;:17;;:26;;;;45665:6;45660:120;45681:5;:12;;;;45677:1;:16;45660:120;;;45715:13;:24;;45745:5;45751:1;45745:8;;;;;;;;;;;;;;;;;;:22;;;45715:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45695:3;;;;;;;45660:120;;;;45807:19;45824:1;45807:12;;:16;;:19;;;;:::i;:::-;45792:12;:34;;;;45860:51;;;;;;;;45866:3;45860:51;;;;45871:12;45860:51;;;;45885:1;45860:51;;;;45888:1;45860:51;;;;45891:1;45860:51;;;;45908:1;45894:16;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45860:51;;::::0;45837:6:::1;:20;45844:12;;45837:20;;;;;;;;;;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;28450:1;45286:633:::0;:::o;47586:92::-;47631:7;47658:5;:12;;;;47651:19;;47586:92;:::o;39612:39::-;;;;;;;;;;;;;:::o;39803:32::-;;;;:::o;45996:152::-;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46054:5:::1;46065:74;;;;;;;;46126:1;46065:74;;;;46091:8;46065:74;;;;::::0;46054:86:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45996:152:::0;:::o;44415:633::-;44466:17;44486:8;:13;44495:3;44486:13;;;;;;;;;;;:25;44500:10;44486:25;;;;;;;;;;;;;;;44466:45;;44522:11;44536:27;44547:3;44552:10;44536;:27::i;:::-;44522:41;;44604:12;;44579:4;:21;;;:37;44576:202;;44652:39;44674:4;:16;;;44652:4;:17;;;:21;;:39;;;;:::i;:::-;44632:4;:17;;:59;;;;44730:1;44706:4;:21;;:25;;;;44765:1;44746:4;:16;;:20;;;;44576:202;44818:6;44794:21;:30;44790:165;;;44841:10;:19;;:27;44861:6;44841:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44790:165;;;44901:10;:19;;:42;44921:21;44901:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44790:165;44982:12;;44965:4;:14;;:29;;;;45028:3;45016:10;45010:30;;;45033:6;45010:30;;;;;;;;;;;;;;;;;;44415:633;;;:::o;47183:102::-;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47250:10:::1;:19;;:27;47270:6;47250:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47183:102:::0;:::o;42670:950::-;42732:17;42752:8;:13;42761:3;42752:13;;;;;;;;;;;:25;42766:10;42752:25;;;;;;;;;;;;;;;42732:45;;42807:1;42798:6;:10;42790:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42907:6;42884:4;:19;;;:29;;42876:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42981:10;42987:3;42981:5;:10::i;:::-;43040:4;:16;;;43031:6;:25;43028:325;;;43072:15;43090:28;43101:4;:16;;;43090:6;:10;;:28;;;;:::i;:::-;43072:46;;43153:33;43175:10;43153:4;:17;;;:21;;:33;;;;:::i;:::-;43133:4;:17;;:53;;;;43220:1;43201:4;:16;;:20;;;;43260:1;43236:4;:21;;:25;;;;43028:325;;;;43313:28;43334:6;43313:4;:16;;;:20;;:28;;;;:::i;:::-;43294:4;:16;;:47;;;;43028:325;43387:31;43411:6;43387:4;:19;;;:23;;:31;;;;:::i;:::-;43365:4;:19;;:53;;;;43456:36;43485:6;43456:5;43462:3;43456:10;;;;;;;;;;;;;;;;;;:24;;;:28;;:36;;;;:::i;:::-;43429:5;43435:3;43429:10;;;;;;;;;;;;;;;;;;:24;;:63;;;;43503:60;43543:10;43556:6;43503:5;43509:3;43503:10;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;:31;;;;:60;;;;;:::i;:::-;43600:3;43588:10;43579:33;;;43605:6;43579:33;;;;;;;;;;;;;;;;;;42670:950;;;:::o;43747:534::-;43802:17;43822:8;:13;43831:3;43822:13;;;;;;;;;;;:25;43836:10;43822:25;;;;;;;;;;;;;;;43802:45;;43860:11;43874:4;:19;;;43860:33;;43931:36;43960:6;43931:5;43937:3;43931:10;;;;;;;;;;;;;;;;;;:24;;;:28;;:36;;;;:::i;:::-;43904:5;43910:3;43904:10;;;;;;;;;;;;;;;;;;:24;;:63;;;;43978:60;44018:10;44031:6;43978:5;43984:3;43978:10;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;:31;;;;:60;;;;;:::i;:::-;44073:1;44051:4;:19;;:23;;;;44105:1;44085:4;:17;;:21;;;;44136:1;44117:4;:16;;:20;;;;44172:1;44148:4;:21;;:25;;;;44203:12;;44186:4;:14;;:29;;;;44261:3;44249:10;44231:42;;;44266:6;44231:42;;;;;;;;;;;;;;;;;;43747:534;;;:::o;47368:128::-;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47426:10:::1;:19;;:34;47446:13;;47426:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47487:1;47471:13;:17;;;;47368:128::o:0;28810:148::-;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28917:1:::1;28880:40;;28901:6;::::0;::::1;;;;;;;;28880:40;;;;;;;;;;;;28948:1;28931:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;28810:148::o:0;39693:31::-;;;;:::o;40678:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46482:580::-;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46607:17:::1;46627:8;:13;46636:3;46627:13;;;;;;;;;;;:26;46641:11;46627:26;;;;;;;;;;;;;;;46607:46;;46666:14;46683:22;46694:10;46683:6;:10;;:22;;;;:::i;:::-;46666:39;;46746:6;46722:21;:30;46718:167;;;46769:11;:20;;:28;46790:6;46769:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46718:167;;;46830:11;:20;;:43;46851:21;46830:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;46718:167;46913:29;46931:10;46913:13;;:17;;:29;;;;:::i;:::-;46897:13;:45;;;;46970:12;;46953:4;:14;;:29;;;;47042:3;47029:11;46998:56;;47017:10;46998:56;;;47047:6;46998:56;;;;;;;;;;;;;;;;;;28450:1;;46482:580:::0;;;;:::o;48477:727::-;48542:7;48561:24;48588:8;:13;48597:3;48588:13;;;;;;;;;;;:19;48602:4;48588:19;;;;;;;;;;;;;;;48561:46;;48618:19;48657:9;48669:11;:21;;;48657:33;;48652:516;48696:12;;48692:1;:16;48652:516;;;48730:11;48744;:24;;;48730:38;;48818:1;48786:11;:28;;;:33;48783:116;;48848:35;48859:11;:23;;;48848:6;:10;;:35;;;;:::i;:::-;48839:44;;48783:116;48915:19;48937:6;:9;48944:1;48937:9;;;;;;;;;;;48915:31;;48961:21;48985:38;48999:5;:16;;:23;;;;48985:5;:9;;;:13;;:38;;;;:::i;:::-;48961:62;;49038:11;49052:52;49082:5;:16;;49099:3;49082:21;;;;;;;;;;;;;;;;49052:25;49063:13;49052:6;:10;;:25;;;;:::i;:::-;:29;;:52;;;;:::i;:::-;49038:66;;49133:23;49149:6;49133:11;:15;;:23;;;;:::i;:::-;49119:37;;48652:516;;;;48710:3;;;;;;;48652:516;;;;49185:11;49178:18;;;;48477:727;;;;:::o;28168:79::-;28206:7;28233:6;;;;;;;;;;;28226:13;;28168:79;:::o;40563:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40482:19::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41723:753::-;41801:1;41792:6;:10;41784:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41869:17;41889:8;:13;41898:3;41889:13;;;;;;;;;;;:25;41903:10;41889:25;;;;;;;;;;;;;;;41869:45;;41951:1;41929:4;:19;;;:23;41925:152;;;41969:10;41975:3;41969:5;:10::i;:::-;41925:152;;;42053:12;;42036:4;:14;;:29;;;;41925:152;42108:28;42129:6;42108:4;:16;;;:20;;:28;;;;:::i;:::-;42089:4;:16;;:47;;;;42171:19;42188:1;42171:12;;:16;;:19;;;;:::i;:::-;42147:4;:21;;:43;;;;42223:31;42247:6;42223:4;:19;;;:23;;:31;;;;:::i;:::-;42201:4;:19;;:53;;;;42292:36;42321:6;42292:5;42298:3;42292:10;;;;;;;;;;;;;;;;;;:24;;;:28;;:36;;;;:::i;:::-;42265:5;42271:3;42265:10;;;;;;;;;;;;;;;;;;:24;;:63;;;;42341:79;42385:10;42406:4;42413:6;42341:5;42347:3;42341:10;;;;;;;;;;;;;;;;;;:18;;;;;;;;;;;;:35;;;;:79;;;;;;:::i;:::-;42456:3;42444:10;42436:32;;;42461:6;42436:32;;;;;;;;;;;;;;;;;;41723:753;;;:::o;29113:244::-;28390:12;:10;:12::i;:::-;28380:22;;:6;;;;;;;;;;:22;;;28372:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29222:1:::1;29202:22;;:8;:22;;;;29194:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29312:8;29283:38;;29304:6;::::0;::::1;;;;;;;;29283:38;;;;;;;;;;;;29341:8;29332:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;29113:244:::0;:::o;47757:627::-;47823:7;47842:11;47856:1;47842:15;;47868:20;47892:19;47909:1;47892:12;;:16;;:19;;;;:::i;:::-;47868:43;;47922:18;47977:15;47959:14;:33;47956:112;;48024:32;48041:14;48024:12;;:16;;:32;;;;:::i;:::-;48008:48;;47956:112;48083:6;48092:15;48083:24;;48078:158;48113:13;48109:1;:17;48078:158;;;48148:19;48170:6;:9;48177:1;48170:9;;;;;;;;;;;48148:31;;48203:21;48214:5;:9;;;48203:6;:10;;:21;;;;:::i;:::-;48194:30;;48078:158;48128:3;;;;;;;;48078:158;;;;48278:19;48300:6;:9;48307:1;48300:9;;;;;;;;;;;48278:31;;48329:21;48340:5;:9;;;48329:6;:10;;:21;;;;:::i;:::-;48320:30;;48370:6;48363:13;;;;;;47757:627;;;:::o;27302:106::-;27355:15;27390:10;27383:17;;27302:106;:::o;6233:181::-;6291:7;6311:9;6327:1;6323;:5;6311:17;;6352:1;6347;:6;;6339:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6405:1;6398:8;;;6233:181;;;;:::o;6697:136::-;6755:7;6782:43;6786:1;6789;6782:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6775:50;;6697:136;;;;:::o;16872:177::-;16955:86;16975:5;17005:23;;;17030:2;17034:5;16982:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16955:19;:86::i;:::-;16872:177;;;:::o;8534:132::-;8592:7;8619:39;8623:1;8626;8619:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;8612:46;;8534:132;;;;:::o;7587:471::-;7645:7;7895:1;7890;:6;7886:47;;;7920:1;7913:8;;;;7886:47;7945:9;7961:1;7957;:5;7945:17;;7990:1;7985;7981;:5;;;;;;:10;7973:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8049:1;8042:8;;;7587:471;;;;;:::o;17057:205::-;17158:96;17178:5;17208:27;;;17237:4;17243:2;17247:5;17185:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17158:19;:96::i;:::-;17057:205;;;;:::o;7136:192::-;7222:7;7255:1;7250;:6;;7258:12;7242:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7282:9;7298:1;7294;:5;7282:17;;7319:1;7312:8;;;7136:192;;;;;:::o;19177:760::-;19601:23;19627:69;19655:4;19627:69;;;;;;;;;;;;;;;;;19635:5;19627:27;;;;:69;;;;;:::i;:::-;19601:95;;19731:1;19711:10;:17;:21;19707:223;;;19852:10;19841:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19833:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19707:223;19177:760;;;:::o;9162:278::-;9248:7;9280:1;9276;:5;9283:12;9268:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9307:9;9323:1;9319;:5;;;;;;9307:17;;9431:1;9424:8;;;9162:278;;;;;:::o;14418:196::-;14521:12;14553:53;14576:6;14584:4;14590:1;14593:12;14553:22;:53::i;:::-;14546:60;;14418:196;;;;;:::o;15795:978::-;15925:12;15958:18;15969:6;15958:10;:18::i;:::-;15950:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16084:12;16098:23;16125:6;:11;;16145:8;16155:4;16125:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16083:77;;;;16175:7;16171:595;;;16206:10;16199:17;;;;;;16171:595;16340:1;16320:10;:17;:21;16316:439;;;16583:10;16577:17;16644:15;16631:10;16627:2;16623:19;16616:44;16531:148;16726:12;16719:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15795:978;;;;;;;:::o;11305:617::-;11365:4;11627:16;11654:19;11676:66;11654:88;;;;11844:7;11832:20;11820:32;;11883:11;11871:8;:23;;:42;;;;;11910:3;11898:15;;:8;:15;;11871:42;11863:51;;;;11305:617;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://3b3f3c392fbc3128b5cdfc83fd2345b13dae3f3ad5660a09c1c0e1ac160a1614
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.