Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
HappyRedPacket
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-10 */ // Sources flattened with hardhat v2.5.0 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/[email protected] /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File @openzeppelin/contracts/utils/math/[email protected] // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/proxy/utils/[email protected] /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts/utils/cryptography/[email protected] /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } /** * @author Yisi Liu * @contact [email protected] * @author_time 04/20/2021 * @maintainer Hancheng Zhou, Yisi Liu * @maintain_time 05/21/2021 **/ pragma solidity >= 0.8.0; contract HappyRedPacket is Initializable { struct RedPacket { Packed packed; mapping(address => uint256) claimed_list; address public_key; address creator; } struct Packed { uint256 packed1; // 0 (128) total_tokens (96) expire_time(32) uint256 packed2; // 0 (64) token_addr (160) claimed_numbers(15) total_numbers(15) token_type(1) ifrandom(1) } event CreationSuccess( uint total, bytes32 id, string name, string message, address creator, uint creation_time, address token_address, uint number, bool ifrandom, uint duration ); event ClaimSuccess( bytes32 id, address claimer, uint claimed_value, address token_address ); event RefundSuccess( bytes32 id, address token_address, uint remaining_balance ); using SafeERC20 for IERC20; uint32 nonce; mapping(bytes32 => RedPacket) redpacket_by_id; bytes32 private seed; uint256 constant MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; function initialize() public initializer { seed = keccak256(abi.encodePacked("Former NBA Commissioner David St", block.timestamp, msg.sender)); } // Inits a red packet instance // _token_type: 0 - ETH 1 - ERC20 function create_red_packet (address _public_key, uint _number, bool _ifrandom, uint _duration, bytes32 _seed, string memory _message, string memory _name, uint _token_type, address _token_addr, uint _total_tokens) public payable { nonce ++; require(_total_tokens >= _number, "#tokens > #packets"); require(_number > 0, "At least 1 recipient"); require(_number < 256, "At most 255 recipients"); require(_token_type == 0 || _token_type == 1, "Unrecognizable token type"); if (_token_type == 0) require(msg.value >= _total_tokens, "No enough ETH"); else if (_token_type == 1) { require(IERC20(_token_addr).allowance(msg.sender, address(this)) >= _total_tokens, "No enough allowance"); IERC20(_token_addr).safeTransferFrom(msg.sender, address(this), _total_tokens); } bytes32 _id = keccak256(abi.encodePacked(msg.sender, block.timestamp, nonce, seed, _seed)); { uint _random_type = _ifrandom ? 1 : 0; RedPacket storage redp = redpacket_by_id[_id]; redp.packed.packed1 = wrap1(_total_tokens, _duration); redp.packed.packed2 = wrap2(_token_addr, _number, _token_type, _random_type); redp.public_key = _public_key; redp.creator = msg.sender; } { // as a workaround for "CompilerError: Stack too deep, try removing local variables" uint number = _number; bool ifrandom = _ifrandom; uint duration = _duration; emit CreationSuccess(_total_tokens, _id, _name, _message, msg.sender, block.timestamp, _token_addr, number, ifrandom, duration); } } // It takes the signed msg.sender message as verification passcode function claim(bytes32 id, bytes memory signedMsg, address payable recipient) public returns (uint claimed) { RedPacket storage rp = redpacket_by_id[id]; Packed memory packed = rp.packed; // Unsuccessful require (unbox(packed.packed1, 224, 32) > block.timestamp, "Expired"); uint total_number = unbox(packed.packed2, 239, 15); uint claimed_number = unbox(packed.packed2, 224, 15); require (claimed_number < total_number, "Out of stock"); address public_key = rp.public_key; require(_verify(signedMsg, public_key), "Verification failed"); uint256 claimed_tokens; uint256 token_type = unbox(packed.packed2, 254, 1); uint256 ifrandom = unbox(packed.packed2, 255, 1); uint256 remaining_tokens = unbox(packed.packed1, 128, 96); if (ifrandom == 1) { if (total_number - claimed_number == 1) claimed_tokens = remaining_tokens; else claimed_tokens = random(seed, nonce) % SafeMath.div(SafeMath.mul(remaining_tokens, 2), total_number - claimed_number); if (claimed_tokens == 0) claimed_tokens = 1; } else { if (total_number - claimed_number == 1) claimed_tokens = remaining_tokens; else claimed_tokens = SafeMath.div(remaining_tokens, (total_number - claimed_number)); } rp.packed.packed1 = rewriteBox(packed.packed1, 128, 96, remaining_tokens - claimed_tokens); // Penalize greedy attackers by placing duplication check at the very last require(rp.claimed_list[msg.sender] == 0, "Already claimed"); rp.claimed_list[msg.sender] = claimed_tokens; rp.packed.packed2 = rewriteBox(packed.packed2, 224, 15, claimed_number + 1); // Transfer the red packet after state changing if (token_type == 0) recipient.transfer(claimed_tokens); else if (token_type == 1) transfer_token(address(uint160(unbox(packed.packed2, 64, 160))), recipient, claimed_tokens); // Claim success event emit ClaimSuccess(id, recipient, claimed_tokens, address(uint160(unbox(packed.packed2, 64, 160)))); return claimed_tokens; } // as a workaround for "CompilerError: Stack too deep, try removing local variables" function _verify(bytes memory signedMsg, address public_key) private view returns (bool verified) { bytes memory prefix = "\x19Ethereum Signed Message:\n20"; bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, msg.sender)); address calculated_public_key = ECDSA.recover(prefixedHash, signedMsg); return (calculated_public_key == public_key); } // Returns 1. remaining value 2. total number of red packets 3. claimed number of red packets function check_availability(bytes32 id) external view returns ( address token_address, uint balance, uint total, uint claimed, bool expired, uint256 claimed_amount) { RedPacket storage rp = redpacket_by_id[id]; Packed memory packed = rp.packed; return ( address(uint160(unbox(packed.packed2, 64, 160))), unbox(packed.packed1, 128, 96), unbox(packed.packed2, 239, 15), unbox(packed.packed2, 224, 15), block.timestamp > unbox(packed.packed1, 224, 32), rp.claimed_list[msg.sender] ); } function refund(bytes32 id) public { RedPacket storage rp = redpacket_by_id[id]; Packed memory packed = rp.packed; address creator = rp.creator; require(creator == msg.sender, "Creator Only"); require(unbox(packed.packed1, 224, 32) <= block.timestamp, "Not expired yet"); uint256 remaining_tokens = unbox(packed.packed1, 128, 96); require(remaining_tokens != 0, "None left in the red packet"); uint256 token_type = unbox(packed.packed2, 254, 1); address token_address = address(uint160(unbox(packed.packed2, 64, 160))); rp.packed.packed1 = rewriteBox(packed.packed1, 128, 96, 0); if (token_type == 0) { payable(msg.sender).transfer(remaining_tokens); } else if (token_type == 1) { transfer_token(token_address, msg.sender, remaining_tokens); } emit RefundSuccess(id, token_address, remaining_tokens); } //------------------------------------------------------------------ /** * position position in a memory block * size data size * data data * box() inserts the data in a 256bit word with the given position and returns it * data is checked by validRange() to make sure it is not over size **/ function box (uint16 position, uint16 size, uint256 data) internal pure returns (uint256 boxed) { require(validRange(size, data), "Value out of range BOX"); assembly { // data << position boxed := shl(position, data) } } /** * position position in a memory block * size data size * base base data * unbox() extracts the data out of a 256bit word with the given position and returns it * base is checked by validRange() to make sure it is not over size **/ function unbox (uint256 base, uint16 position, uint16 size) internal pure returns (uint256 unboxed) { require(validRange(256, base), "Value out of range UNBOX"); assembly { // (((1 << size) - 1) & base >> position) unboxed := and(sub(shl(size, 1), 1), shr(position, base)) } } /** * size data size * data data * validRange() checks if the given data is over the specified data size **/ function validRange (uint16 size, uint256 data) internal pure returns(bool ifValid) { assembly { // 2^size > data or size ==256 ifValid := or(eq(size, 256), gt(shl(size, 1), data)) } } /** * _box 32byte data to be modified * position position in a memory block * size data size * data data to be inserted * rewriteBox() updates a 32byte word with a data at the given position with the specified size **/ function rewriteBox (uint256 _box, uint16 position, uint16 size, uint256 data) internal pure returns (uint256 boxed) { assembly { // mask = ~((1 << size - 1) << position) // _box = (mask & _box) | ()data << position) boxed := or( and(_box, not(shl(position, sub(shl(size, 1), 1)))), shl(position, data)) } } function transfer_token(address token_address, address recipient_address, uint amount) internal{ IERC20(token_address).safeTransfer(recipient_address, amount); } // A boring wrapper function random(bytes32 _seed, uint32 nonce_rand) internal view returns (uint rand) { return uint(keccak256(abi.encodePacked(nonce_rand, msg.sender, _seed, block.timestamp))) + 1 ; } function wrap1 (uint _total_tokens, uint _duration) internal view returns (uint256 packed1) { uint256 _packed1 = 0; _packed1 |= box(128, 96, _total_tokens); // total tokens = 80 bits = ~8 * 10^10 18 decimals _packed1 |= box(224, 32, (block.timestamp + _duration)); // expiration_time = 32 bits (until 2106) return _packed1; } function wrap2 (address _token_addr, uint _number, uint _token_type, uint _ifrandom) internal pure returns (uint256 packed2) { uint256 _packed2 = 0; _packed2 |= box(64, 160, uint160(_token_addr)); // token_address = 160 bits _packed2 |= box(224, 15, 0); // claimed_number = 14 bits 16384 _packed2 |= box(239, 15, _number); // total_number = 14 bits 16384 _packed2 |= box(254, 1, _token_type); // token_type = 1 bit 2 _packed2 |= box(255, 1, _ifrandom); // ifrandom = 1 bit 2 return _packed2; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"claimed_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"}],"name":"ClaimSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"creation_time","type":"uint256"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"number","type":"uint256"},{"indexed":false,"internalType":"bool","name":"ifrandom","type":"bool"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"CreationSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"remaining_balance","type":"uint256"}],"name":"RefundSuccess","type":"event"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"check_availability","outputs":[{"internalType":"address","name":"token_address","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"claimed","type":"uint256"},{"internalType":"bool","name":"expired","type":"bool"},{"internalType":"uint256","name":"claimed_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"bytes","name":"signedMsg","type":"bytes"},{"internalType":"address payable","name":"recipient","type":"address"}],"name":"claim","outputs":[{"internalType":"uint256","name":"claimed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_public_key","type":"address"},{"internalType":"uint256","name":"_number","type":"uint256"},{"internalType":"bool","name":"_ifrandom","type":"bool"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"bytes32","name":"_seed","type":"bytes32"},{"internalType":"string","name":"_message","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_token_type","type":"uint256"},{"internalType":"address","name":"_token_addr","type":"address"},{"internalType":"uint256","name":"_total_tokens","type":"uint256"}],"name":"create_red_packet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611a31806100206000396000f3fe60806040526004361061004a5760003560e01c80635db05aba1461004f5780636bfdaece146100645780637249fbb61461009f5780637394ad93146100bf5780638129fc1c146100ec575b600080fd5b61006261005d366004610ff7565b610101565b005b34801561007057600080fd5b5061008461007f3660046110d8565b6103cb565b604051610096969594939291906112fe565b60405180910390f35b3480156100ab57600080fd5b506100626100ba3660046110d8565b610479565b3480156100cb57600080fd5b506100df6100da3660046110f0565b610600565b6040516100969190611850565b3480156100f857600080fd5b506100626108f5565b6000805462010000900463ffffffff1690600261011d8361195e565b91906101000a81548163ffffffff021916908363ffffffff16021790555050888110156101655760405162461bcd60e51b815260040161015c906114e1565b60405180910390fd5b600089116101855760405162461bcd60e51b815260040161015c906114b3565b61010089106101a65760405162461bcd60e51b815260040161015c90611758565b8215806101b35750826001145b6101cf5760405162461bcd60e51b815260040161015c90611418565b826101f957803410156101f45760405162461bcd60e51b815260040161015c90611611565b6102b5565b82600114156102b557604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e9061023290339030906004016112a7565b60206040518083038186803b15801561024a57600080fd5b505afa15801561025e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610282919061115c565b10156102a05760405162461bcd60e51b815260040161015c90611486565b6102b56001600160a01b038316333084610998565b600080546002546040516102df92339242926201000090920463ffffffff16918c906020016111a0565b604051602081830303815290604052805190602001209050600089610305576000610308565b60015b600083815260016020526040902060ff919091169150610328848b6109f6565b8155610336858d8885610a25565b60018201556003810180546001600160a01b038f166001600160a01b03199182161790915560049091018054909116339081179091556040518c92508b918b917f86af556fd7cfab9462285ad44f2d5913527c539ff549f74731ca9997ca534018916103b391889188918d918f9142908e908c908c908c90611859565b60405180910390a15050505050505050505050505050565b6000818152600160208181526040808420815180830183528154815293810154928401839052849384938493849384939092909161040b919060a0610a81565b815161041a9060806060610a81565b61042b836020015160ef600f610a81565b61043c846020015160e0600f610a81565b845161044b9060e06020610a81565b3360009081526002909701602052604090962054939d929c50909a5098504293909311965094509092505050565b600081815260016020818152604092839020835180850190945280548452918201549083015260048101549091906001600160a01b03163381146104cf5760405162461bcd60e51b815260040161015c90611809565b426104e1836000015160e06020610a81565b11156104ff5760405162461bcd60e51b815260040161015c9061150d565b6000610512836000015160806060610a81565b9050806105315760405162461bcd60e51b815260040161015c906116f1565b6000610544846020015160fe6001610a81565b905060006105598560200151604060a0610a81565b905061056e8560000151608060606000610abc565b8655816105a857604051339084156108fc029085906000818181858888f193505050501580156105a2573d6000803e3d6000fd5b506105bc565b81600114156105bc576105bc813385610ad3565b7f66c304c539e0bc7c8070207c09b9f6a5a9591b434dfed1867cc57fde7fb600938782856040516105ef9392919061135a565b60405180910390a150505050505050565b600083815260016020818152604080842081518083019092528054808352938101548284015292909142916106379160e090610a81565b116106545760405162461bcd60e51b815260040161015c9061182f565b6000610667826020015160ef600f610a81565b9050600061067c836020015160e0600f610a81565b905081811061069d5760405162461bcd60e51b815260040161015c906115eb565b60038401546001600160a01b03166106b58882610aec565b6106d15760405162461bcd60e51b815260040161015c90611536565b6000806106e5866020015160fe6001610a81565b905060006106fa876020015160ff6001610a81565b9050600061070f886000015160806060610a81565b9050816001141561078957610724868861191b565b600114156107345780935061077a565b610751610742826002610b7a565b61074c888a61191b565b610b86565b60025460005461076d919062010000900463ffffffff16610b92565b6107779190611982565b93505b8361078457600193505b6107b4565b610793868861191b565b600114156107a3578093506107b4565b6107b18161074c888a61191b565b93505b87516107cd90608060606107c8888661191b565b610abc565b895533600090815260028a016020526040902054156107fe5760405162461bcd60e51b815260040161015c906116c8565b33600090815260028a016020908152604090912085905588015161082b9060e0600f6107c88a60016118d0565b60018a015582610871576040516001600160a01b038c169085156108fc029086906000818181858888f1935050505015801561086b573d6000803e3d6000fd5b50610895565b82600114156108955761089561088e8960200151604060a0610a81565b8c86610ad3565b7f358ddd686a5ca3ef6f8aee9b8d2dc3c642ecc278657c3802f8802b1a44c10e448d8c866108ca8c60200151604060a0610a81565b6040516108da9493929190611333565b60405180910390a150919750505050505050505b9392505050565b600054610100900460ff168061090e575060005460ff16155b61092a5760405162461bcd60e51b815260040161015c90611638565b600054610100900460ff16158015610955576000805460ff1961ff0019909116610100171660011790555b423360405160200161096892919061122d565b60408051601f1981840301815291905280516020909101206002558015610995576000805461ff00191690555b50565b6109f0846323b872dd60e01b8585856040516024016109b9939291906112c1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610bce565b50505050565b600080610a066080606086610c5d565b17610a1d60e06020610a1886426118d0565b610c5d565b179392505050565b600080610a3e604060a06001600160a01b038916610c5d565b17610a4d60e0600f6000610c5d565b17610a5b60ef600f87610c5d565b17610a6960fe600186610c5d565b17610a7760ff600185610c5d565b1795945050505050565b6000610a8f61010085610c8e565b610aab5760405162461bcd60e51b815260040161015c906113e1565b50600019600190911b0191901c1690565b821b600190911b6000190190911b19919091161790565b610ae76001600160a01b0384168383610c9d565b505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a323000000000815250905060008133604051602001610b3c9291906111fb565b6040516020818303038152906040528051906020012090506000610b608287610cbc565b6001600160a01b0390811690861614935050505092915050565b60006108ee82846118fc565b60006108ee82846118e8565b600081338442604051602001610bab9493929190611270565b60408051601f1981840301815291905280516020909101206108ee9060016118d0565b6000610c23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610d429092919063ffffffff16565b805190915015610ae75780806020019051810190610c4191906110bc565b610ae75760405162461bcd60e51b815260040161015c906117bf565b6000610c698383610c8e565b610c855760405162461bcd60e51b815260040161015c90611728565b5090911b919050565b6101008214600190921b111790565b610ae78363a9059cbb60e01b84846040516024016109b99291906112e5565b600080600080845160411415610ce65750505060208201516040830151606084015160001a610d2c565b845160401415610d145750505060408201516020830151906001600160ff1b0381169060ff1c601b01610d2c565b60405162461bcd60e51b815260040161015c9061144f565b610d3886828585610d59565b9695505050505050565b6060610d518484600085610e4f565b949350505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610d9b5760405162461bcd60e51b815260040161015c90611563565b8360ff16601b1480610db057508360ff16601c145b610dcc5760405162461bcd60e51b815260040161015c90611686565b600060018686868660405160008152602001604052604051610df19493929190611379565b6020604051602081039080840390855afa158015610e13573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e465760405162461bcd60e51b815260040161015c906113aa565b95945050505050565b606082471015610e715760405162461bcd60e51b815260040161015c906115a5565b610e7a85610f0f565b610e965760405162461bcd60e51b815260040161015c90611788565b600080866001600160a01b03168587604051610eb291906111df565b60006040518083038185875af1925050503d8060008114610eef576040519150601f19603f3d011682016040523d82523d6000602084013e610ef4565b606091505b5091509150610f04828286610f19565b979650505050505050565b803b15155b919050565b60608315610f285750816108ee565b825115610f385782518084602001fd5b8160405162461bcd60e51b815260040161015c9190611397565b600067ffffffffffffffff80841115610f6d57610f6d6119c2565b604051601f8501601f191681016020018281118282101715610f9157610f916119c2565b604052848152915081838501861015610fa957600080fd5b8484602083013760006020868301015250509392505050565b8035610f14816119d8565b8035610f14816119ed565b600082601f830112610fe8578081fd5b6108ee83833560208501610f52565b6000806000806000806000806000806101408b8d031215611016578586fd5b61101f8b610fc2565b995060208b0135985061103460408c01610fcd565b975060608b0135965060808b0135955060a08b013567ffffffffffffffff8082111561105e578687fd5b61106a8e838f01610fd8565b965060c08d013591508082111561107f578586fd5b5061108c8d828e01610fd8565b94505060e08b013592506110a36101008c01610fc2565b91506101208b013590509295989b9194979a5092959850565b6000602082840312156110cd578081fd5b81516108ee816119ed565b6000602082840312156110e9578081fd5b5035919050565b600080600060608486031215611104578283fd5b83359250602084013567ffffffffffffffff811115611121578283fd5b8401601f81018613611131578283fd5b61114086823560208401610f52565b9250506040840135611151816119d8565b809150509250925092565b60006020828403121561116d578081fd5b5051919050565b6000815180845261118c816020860160208601611932565b601f01601f19169290920160200192915050565b60609590951b6001600160601b0319168552601485019390935260e09190911b6001600160e01b03191660348401526038830152605882015260780190565b600082516111f1818460208701611932565b9190910192915050565b6000835161120d818460208801611932565b60609390931b6001600160601b0319169190920190815260140192915050565b7f466f726d6572204e424120436f6d6d697373696f6e65722044617669642053748152602081019290925260601b6001600160601b031916604082015260540190565b60e09490941b6001600160e01b031916845260609290921b6001600160601b03191660048401526018830152603882015260580190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039690961686526020860194909452604085019290925260608401521515608083015260a082015260c00190565b9384526001600160a01b039283166020850152604084019190915216606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108ee6020830184611174565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526018908201527f56616c7565206f7574206f662072616e676520554e424f580000000000000000604082015260600190565b60208082526019908201527f556e7265636f676e697a61626c6520746f6b656e207479706500000000000000604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601390820152724e6f20656e6f75676820616c6c6f77616e636560681b604082015260600190565b602080825260149082015273105d081b19585cdd080c481c9958da5c1a595b9d60621b604082015260600190565b60208082526012908201527123746f6b656e73203e20237061636b65747360701b604082015260600190565b6020808252600f908201526e139bdd08195e1c1a5c9959081e595d608a1b604082015260600190565b60208082526013908201527215995c9a599a58d85d1a5bdb8819985a5b1959606a1b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600c908201526b4f7574206f662073746f636b60a01b604082015260600190565b6020808252600d908201526c09cde40cadcdeeaced0408aa89609b1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252600f908201526e105b1c9958591e4818db185a5b5959608a1b604082015260600190565b6020808252601b908201527f4e6f6e65206c65667420696e2074686520726564207061636b65740000000000604082015260600190565b6020808252601690820152750acc2d8eaca40deeae840decc40e4c2dcceca40849eb60531b604082015260600190565b6020808252601690820152754174206d6f73742032353520726563697069656e747360501b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600c908201526b43726561746f72204f6e6c7960a01b604082015260600190565b602080825260079082015266115e1c1a5c995960ca1b604082015260600190565b90815260200190565b60006101408c83528b60208401528060408401526118798184018c611174565b9050828103606084015261188d818b611174565b6001600160a01b03998a16608085015260a084019890985250509390951660c084015260e083019190915215156101008201526101200191909152949350505050565b600082198211156118e3576118e3611996565b500190565b6000826118f7576118f76119ac565b500490565b600081600019048311821515161561191657611916611996565b500290565b60008282101561192d5761192d611996565b500390565b60005b8381101561194d578181015183820152602001611935565b838111156109f05750506000910152565b600063ffffffff8083168181141561197857611978611996565b6001019392505050565b600082611991576119916119ac565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461099557600080fd5b801515811461099557600080fdfea2646970667358221220e75561c3b119869ab629e4d940d87675589985de8c8cdd0a1068106797b730ac64736f6c63430008000033
Deployed Bytecode
0x60806040526004361061004a5760003560e01c80635db05aba1461004f5780636bfdaece146100645780637249fbb61461009f5780637394ad93146100bf5780638129fc1c146100ec575b600080fd5b61006261005d366004610ff7565b610101565b005b34801561007057600080fd5b5061008461007f3660046110d8565b6103cb565b604051610096969594939291906112fe565b60405180910390f35b3480156100ab57600080fd5b506100626100ba3660046110d8565b610479565b3480156100cb57600080fd5b506100df6100da3660046110f0565b610600565b6040516100969190611850565b3480156100f857600080fd5b506100626108f5565b6000805462010000900463ffffffff1690600261011d8361195e565b91906101000a81548163ffffffff021916908363ffffffff16021790555050888110156101655760405162461bcd60e51b815260040161015c906114e1565b60405180910390fd5b600089116101855760405162461bcd60e51b815260040161015c906114b3565b61010089106101a65760405162461bcd60e51b815260040161015c90611758565b8215806101b35750826001145b6101cf5760405162461bcd60e51b815260040161015c90611418565b826101f957803410156101f45760405162461bcd60e51b815260040161015c90611611565b6102b5565b82600114156102b557604051636eb1769f60e11b815281906001600160a01b0384169063dd62ed3e9061023290339030906004016112a7565b60206040518083038186803b15801561024a57600080fd5b505afa15801561025e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610282919061115c565b10156102a05760405162461bcd60e51b815260040161015c90611486565b6102b56001600160a01b038316333084610998565b600080546002546040516102df92339242926201000090920463ffffffff16918c906020016111a0565b604051602081830303815290604052805190602001209050600089610305576000610308565b60015b600083815260016020526040902060ff919091169150610328848b6109f6565b8155610336858d8885610a25565b60018201556003810180546001600160a01b038f166001600160a01b03199182161790915560049091018054909116339081179091556040518c92508b918b917f86af556fd7cfab9462285ad44f2d5913527c539ff549f74731ca9997ca534018916103b391889188918d918f9142908e908c908c908c90611859565b60405180910390a15050505050505050505050505050565b6000818152600160208181526040808420815180830183528154815293810154928401839052849384938493849384939092909161040b919060a0610a81565b815161041a9060806060610a81565b61042b836020015160ef600f610a81565b61043c846020015160e0600f610a81565b845161044b9060e06020610a81565b3360009081526002909701602052604090962054939d929c50909a5098504293909311965094509092505050565b600081815260016020818152604092839020835180850190945280548452918201549083015260048101549091906001600160a01b03163381146104cf5760405162461bcd60e51b815260040161015c90611809565b426104e1836000015160e06020610a81565b11156104ff5760405162461bcd60e51b815260040161015c9061150d565b6000610512836000015160806060610a81565b9050806105315760405162461bcd60e51b815260040161015c906116f1565b6000610544846020015160fe6001610a81565b905060006105598560200151604060a0610a81565b905061056e8560000151608060606000610abc565b8655816105a857604051339084156108fc029085906000818181858888f193505050501580156105a2573d6000803e3d6000fd5b506105bc565b81600114156105bc576105bc813385610ad3565b7f66c304c539e0bc7c8070207c09b9f6a5a9591b434dfed1867cc57fde7fb600938782856040516105ef9392919061135a565b60405180910390a150505050505050565b600083815260016020818152604080842081518083019092528054808352938101548284015292909142916106379160e090610a81565b116106545760405162461bcd60e51b815260040161015c9061182f565b6000610667826020015160ef600f610a81565b9050600061067c836020015160e0600f610a81565b905081811061069d5760405162461bcd60e51b815260040161015c906115eb565b60038401546001600160a01b03166106b58882610aec565b6106d15760405162461bcd60e51b815260040161015c90611536565b6000806106e5866020015160fe6001610a81565b905060006106fa876020015160ff6001610a81565b9050600061070f886000015160806060610a81565b9050816001141561078957610724868861191b565b600114156107345780935061077a565b610751610742826002610b7a565b61074c888a61191b565b610b86565b60025460005461076d919062010000900463ffffffff16610b92565b6107779190611982565b93505b8361078457600193505b6107b4565b610793868861191b565b600114156107a3578093506107b4565b6107b18161074c888a61191b565b93505b87516107cd90608060606107c8888661191b565b610abc565b895533600090815260028a016020526040902054156107fe5760405162461bcd60e51b815260040161015c906116c8565b33600090815260028a016020908152604090912085905588015161082b9060e0600f6107c88a60016118d0565b60018a015582610871576040516001600160a01b038c169085156108fc029086906000818181858888f1935050505015801561086b573d6000803e3d6000fd5b50610895565b82600114156108955761089561088e8960200151604060a0610a81565b8c86610ad3565b7f358ddd686a5ca3ef6f8aee9b8d2dc3c642ecc278657c3802f8802b1a44c10e448d8c866108ca8c60200151604060a0610a81565b6040516108da9493929190611333565b60405180910390a150919750505050505050505b9392505050565b600054610100900460ff168061090e575060005460ff16155b61092a5760405162461bcd60e51b815260040161015c90611638565b600054610100900460ff16158015610955576000805460ff1961ff0019909116610100171660011790555b423360405160200161096892919061122d565b60408051601f1981840301815291905280516020909101206002558015610995576000805461ff00191690555b50565b6109f0846323b872dd60e01b8585856040516024016109b9939291906112c1565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610bce565b50505050565b600080610a066080606086610c5d565b17610a1d60e06020610a1886426118d0565b610c5d565b179392505050565b600080610a3e604060a06001600160a01b038916610c5d565b17610a4d60e0600f6000610c5d565b17610a5b60ef600f87610c5d565b17610a6960fe600186610c5d565b17610a7760ff600185610c5d565b1795945050505050565b6000610a8f61010085610c8e565b610aab5760405162461bcd60e51b815260040161015c906113e1565b50600019600190911b0191901c1690565b821b600190911b6000190190911b19919091161790565b610ae76001600160a01b0384168383610c9d565b505050565b6000806040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a323000000000815250905060008133604051602001610b3c9291906111fb565b6040516020818303038152906040528051906020012090506000610b608287610cbc565b6001600160a01b0390811690861614935050505092915050565b60006108ee82846118fc565b60006108ee82846118e8565b600081338442604051602001610bab9493929190611270565b60408051601f1981840301815291905280516020909101206108ee9060016118d0565b6000610c23826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610d429092919063ffffffff16565b805190915015610ae75780806020019051810190610c4191906110bc565b610ae75760405162461bcd60e51b815260040161015c906117bf565b6000610c698383610c8e565b610c855760405162461bcd60e51b815260040161015c90611728565b5090911b919050565b6101008214600190921b111790565b610ae78363a9059cbb60e01b84846040516024016109b99291906112e5565b600080600080845160411415610ce65750505060208201516040830151606084015160001a610d2c565b845160401415610d145750505060408201516020830151906001600160ff1b0381169060ff1c601b01610d2c565b60405162461bcd60e51b815260040161015c9061144f565b610d3886828585610d59565b9695505050505050565b6060610d518484600085610e4f565b949350505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610d9b5760405162461bcd60e51b815260040161015c90611563565b8360ff16601b1480610db057508360ff16601c145b610dcc5760405162461bcd60e51b815260040161015c90611686565b600060018686868660405160008152602001604052604051610df19493929190611379565b6020604051602081039080840390855afa158015610e13573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610e465760405162461bcd60e51b815260040161015c906113aa565b95945050505050565b606082471015610e715760405162461bcd60e51b815260040161015c906115a5565b610e7a85610f0f565b610e965760405162461bcd60e51b815260040161015c90611788565b600080866001600160a01b03168587604051610eb291906111df565b60006040518083038185875af1925050503d8060008114610eef576040519150601f19603f3d011682016040523d82523d6000602084013e610ef4565b606091505b5091509150610f04828286610f19565b979650505050505050565b803b15155b919050565b60608315610f285750816108ee565b825115610f385782518084602001fd5b8160405162461bcd60e51b815260040161015c9190611397565b600067ffffffffffffffff80841115610f6d57610f6d6119c2565b604051601f8501601f191681016020018281118282101715610f9157610f916119c2565b604052848152915081838501861015610fa957600080fd5b8484602083013760006020868301015250509392505050565b8035610f14816119d8565b8035610f14816119ed565b600082601f830112610fe8578081fd5b6108ee83833560208501610f52565b6000806000806000806000806000806101408b8d031215611016578586fd5b61101f8b610fc2565b995060208b0135985061103460408c01610fcd565b975060608b0135965060808b0135955060a08b013567ffffffffffffffff8082111561105e578687fd5b61106a8e838f01610fd8565b965060c08d013591508082111561107f578586fd5b5061108c8d828e01610fd8565b94505060e08b013592506110a36101008c01610fc2565b91506101208b013590509295989b9194979a5092959850565b6000602082840312156110cd578081fd5b81516108ee816119ed565b6000602082840312156110e9578081fd5b5035919050565b600080600060608486031215611104578283fd5b83359250602084013567ffffffffffffffff811115611121578283fd5b8401601f81018613611131578283fd5b61114086823560208401610f52565b9250506040840135611151816119d8565b809150509250925092565b60006020828403121561116d578081fd5b5051919050565b6000815180845261118c816020860160208601611932565b601f01601f19169290920160200192915050565b60609590951b6001600160601b0319168552601485019390935260e09190911b6001600160e01b03191660348401526038830152605882015260780190565b600082516111f1818460208701611932565b9190910192915050565b6000835161120d818460208801611932565b60609390931b6001600160601b0319169190920190815260140192915050565b7f466f726d6572204e424120436f6d6d697373696f6e65722044617669642053748152602081019290925260601b6001600160601b031916604082015260540190565b60e09490941b6001600160e01b031916845260609290921b6001600160601b03191660048401526018830152603882015260580190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039690961686526020860194909452604085019290925260608401521515608083015260a082015260c00190565b9384526001600160a01b039283166020850152604084019190915216606082015260800190565b9283526001600160a01b03919091166020830152604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526108ee6020830184611174565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526018908201527f56616c7565206f7574206f662072616e676520554e424f580000000000000000604082015260600190565b60208082526019908201527f556e7265636f676e697a61626c6520746f6b656e207479706500000000000000604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252601390820152724e6f20656e6f75676820616c6c6f77616e636560681b604082015260600190565b602080825260149082015273105d081b19585cdd080c481c9958da5c1a595b9d60621b604082015260600190565b60208082526012908201527123746f6b656e73203e20237061636b65747360701b604082015260600190565b6020808252600f908201526e139bdd08195e1c1a5c9959081e595d608a1b604082015260600190565b60208082526013908201527215995c9a599a58d85d1a5bdb8819985a5b1959606a1b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600c908201526b4f7574206f662073746f636b60a01b604082015260600190565b6020808252600d908201526c09cde40cadcdeeaced0408aa89609b1b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b6020808252600f908201526e105b1c9958591e4818db185a5b5959608a1b604082015260600190565b6020808252601b908201527f4e6f6e65206c65667420696e2074686520726564207061636b65740000000000604082015260600190565b6020808252601690820152750acc2d8eaca40deeae840decc40e4c2dcceca40849eb60531b604082015260600190565b6020808252601690820152754174206d6f73742032353520726563697069656e747360501b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600c908201526b43726561746f72204f6e6c7960a01b604082015260600190565b602080825260079082015266115e1c1a5c995960ca1b604082015260600190565b90815260200190565b60006101408c83528b60208401528060408401526118798184018c611174565b9050828103606084015261188d818b611174565b6001600160a01b03998a16608085015260a084019890985250509390951660c084015260e083019190915215156101008201526101200191909152949350505050565b600082198211156118e3576118e3611996565b500190565b6000826118f7576118f76119ac565b500490565b600081600019048311821515161561191657611916611996565b500290565b60008282101561192d5761192d611996565b500390565b60005b8381101561194d578181015183820152602001611935565b838111156109f05750506000910152565b600063ffffffff8083168181141561197857611978611996565b6001019392505050565b600082611991576119916119ac565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461099557600080fd5b801515811461099557600080fdfea2646970667358221220e75561c3b119869ab629e4d940d87675589985de8c8cdd0a1068106797b730ac64736f6c63430008000033
Deployed Bytecode Sourcemap
29093:11783:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30565:1814;;;;;;:::i;:::-;;:::i;:::-;;35391:676;;;;;;;;;;-1:-1:-1;35391:676:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;36075:976;;;;;;;;;;-1:-1:-1;36075:976:0;;;;;:::i;:::-;;:::i;32459:2337::-;;;;;;;;;;-1:-1:-1;32459:2337:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30322:159::-;;;;;;;;;;;;;:::i;30565:1814::-;30878:5;:8;;;;;;;;:5;:8;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;30922:7;30905:13;:24;;30897:55;;;;-1:-1:-1;;;30897:55:0;;;;;;;:::i;:::-;;;;;;;;;30981:1;30971:7;:11;30963:44;;;;-1:-1:-1;;;30963:44:0;;;;;;;:::i;:::-;31036:3;31026:7;:13;31018:48;;;;-1:-1:-1;;;31018:48:0;;;;;;;:::i;:::-;31085:16;;;:36;;;31105:11;31120:1;31105:16;31085:36;31077:74;;;;-1:-1:-1;;;31077:74:0;;;;;;;:::i;:::-;31168:16;31164:350;;31220:13;31207:9;:26;;31199:52;;;;-1:-1:-1;;;31199:52:0;;;;;;;:::i;:::-;31164:350;;;31271:11;31286:1;31271:16;31267:247;;;31312:56;;-1:-1:-1;;;31312:56:0;;31372:13;;-1:-1:-1;;;;;31312:29:0;;;;;:56;;31342:10;;31362:4;;31312:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;31304:105;;;;-1:-1:-1;;;31304:105:0;;;;;;;:::i;:::-;31424:78;-1:-1:-1;;;;;31424:36:0;;31461:10;31481:4;31488:13;31424:36;:78::i;:::-;31526:11;31596:5;;;31603:4;31550:65;;;;31567:10;;31579:15;;31596:5;;;;;;;31609;;31550:65;;;:::i;:::-;;;;;;;;;;;;;31540:76;;;;;;31526:90;;31642:17;31662:9;:17;;31678:1;31662:17;;;31674:1;31662:17;31694:22;31719:20;;;:15;:20;;;;;31642:37;;;;;;-1:-1:-1;31776:31:0;31782:13;31797:9;31776:5;:31::i;:::-;31754:53;;31844:54;31850:11;31863:7;31872:11;31885:12;31844:5;:54::i;:::-;31822:19;;;:76;31913:15;;;:29;;-1:-1:-1;;;;;31913:29:0;;-1:-1:-1;;;;;;31913:29:0;;;;;;;31957:12;;;;:25;;;;;31972:10;31957:25;;;;;;32238:122;;32131:7;;-1:-1:-1;32169:9:0;;32209;;32238:122;;;;32254:13;;32269:3;;32274:5;;32281:8;;32303:15;;32320:11;;32131:7;;32169:9;;32209;;32238:122;:::i;:::-;;;;;;;;30565:1814;;;;;;;;;;;;;;:::o;35391:676::-;35455:21;35660:19;;;:15;:19;;;;;;;;35690:32;;;;;;;;;;;;;;;;;;;;;35455:21;;;;;;;;;;35660:19;;35690:32;;35771:30;;35690:32;35797:3;35771:5;:30::i;:::-;35825:14;;35819:30;;35841:3;35846:2;35819:5;:30::i;:::-;35865;35871:6;:14;;;35887:3;35892:2;35865:5;:30::i;:::-;35911;35917:6;:14;;;35933:3;35938:2;35911:5;:30::i;:::-;35981:14;;35975:30;;35997:3;36002:2;35975:5;:30::i;:::-;36037:10;36021:27;;;;:15;;;;:27;;;;;;;35733:326;;;;-1:-1:-1;35733:326:0;;-1:-1:-1;35733:326:0;-1:-1:-1;35957:15:0;:48;;;;;-1:-1:-1;36021:27:0;-1:-1:-1;35391:676:0;;-1:-1:-1;;;35391:676:0:o;36075:976::-;36121:20;36144:19;;;:15;:19;;;;;;;;;36174:32;;;;;;;;;;;;;;;;;;;;36235:10;;;;36144:19;;36174:32;-1:-1:-1;;;;;36235:10:0;36275;36264:21;;36256:46;;;;-1:-1:-1;;;36256:46:0;;;;;;;:::i;:::-;36355:15;36321:30;36327:6;:14;;;36343:3;36348:2;36321:5;:30::i;:::-;:49;;36313:77;;;;-1:-1:-1;;;36313:77:0;;;;;;;:::i;:::-;36401:24;36428:30;36434:6;:14;;;36450:3;36455:2;36428:5;:30::i;:::-;36401:57;-1:-1:-1;36477:21:0;36469:61;;;;-1:-1:-1;;;36469:61:0;;;;;;;:::i;:::-;36543:18;36564:29;36570:6;:14;;;36586:3;36591:1;36564:5;:29::i;:::-;36543:50;;36604:21;36644:30;36650:6;:14;;;36666:2;36670:3;36644:5;:30::i;:::-;36604:72;;36709:38;36720:6;:14;;;36736:3;36741:2;36745:1;36709:10;:38::i;:::-;36689:58;;36764:15;36760:216;;36796:46;;36804:10;;36796:46;;;;;36825:16;;36796:46;;;;36825:16;36804:10;36796:46;;;;;;;;;;;;;;;;;;;;;36760:216;;;36873:10;36887:1;36873:15;36869:107;;;36905:59;36920:13;36935:10;36947:16;36905:14;:59::i;:::-;36993:50;37007:2;37011:13;37026:16;36993:50;;;;;;;;:::i;:::-;;;;;;;;36075:976;;;;;;;:::o;32459:2337::-;32559:12;32609:19;;;:15;:19;;;;;;;;32639:32;;;;;;;;;;;;;;;;;;;;;32609:19;32639:32;;32749:15;;32716:30;;32738:3;;32716:5;:30::i;:::-;:48;32707:69;;;;-1:-1:-1;;;32707:69:0;;;;;;;:::i;:::-;32787:17;32807:30;32813:6;:14;;;32829:3;32834:2;32807:5;:30::i;:::-;32787:50;;32848:19;32870:30;32876:6;:14;;;32892:3;32897:2;32870:5;:30::i;:::-;32848:52;;32937:12;32920:14;:29;32911:55;;;;-1:-1:-1;;;32911:55:0;;;;;;;:::i;:::-;33008:13;;;;-1:-1:-1;;;;;33008:13:0;33040:30;33048:9;33008:13;33040:7;:30::i;:::-;33032:62;;;;-1:-1:-1;;;33032:62:0;;;;;;;:::i;:::-;33107:22;33140:18;33161:29;33167:6;:14;;;33183:3;33188:1;33161:5;:29::i;:::-;33140:50;;33201:16;33220:29;33226:6;:14;;;33242:3;33247:1;33220:5;:29::i;:::-;33201:48;;33260:24;33287:30;33293:6;:14;;;33309:3;33314:2;33287:5;:30::i;:::-;33260:57;;33332:8;33344:1;33332:13;33328:608;;;33366:29;33381:14;33366:12;:29;:::i;:::-;33399:1;33366:34;33362:245;;;33436:16;33419:33;;33362:245;;;33529:78;33542:33;33555:16;33573:1;33542:12;:33::i;:::-;33577:29;33592:14;33577:12;:29;:::i;:::-;33529:12;:78::i;:::-;33514:4;;33520:5;;33507:19;;33514:4;33520:5;;;;;33507:6;:19::i;:::-;:100;;;;:::i;:::-;33490:117;;33362:245;33626:19;33622:61;;33682:1;33665:18;;33622:61;33328:608;;;33720:29;33735:14;33720:12;:29;:::i;:::-;33753:1;33720:34;33716:208;;;33791:16;33774:33;;33716:208;;;33861:63;33874:16;33893:29;33908:14;33893:12;:29;:::i;33861:63::-;33844:80;;33716:208;33977:14;;33966:70;;33993:3;33998:2;34002:33;34021:14;34002:16;:33;:::i;:::-;33966:10;:70::i;:::-;33946:90;;34157:10;33946:9;34141:27;;;:15;;;:27;;;;;;:32;34133:60;;;;-1:-1:-1;;;34133:60:0;;;;;;;:::i;:::-;34222:10;34206:27;;;;:15;;;:27;;;;;;;;:44;;;34292:14;;;34281:55;;34308:3;34313:2;34317:18;:14;34334:1;34317:18;:::i;34281:55::-;34261:17;;;:75;34410:15;34406:209;;34440:34;;-1:-1:-1;;;;;34440:18:0;;;:34;;;;;34459:14;;34440:34;;;;34459:14;34440:18;:34;;;;;;;;;;;;;;;;;;;;;34406:209;;;34494:10;34508:1;34494:15;34490:125;;;34524:91;34555:30;34561:6;:14;;;34577:2;34581:3;34555:5;:30::i;:::-;34589:9;34600:14;34524;:91::i;:::-;34663:93;34676:2;34680:9;34691:14;34723:30;34729:6;:14;;;34745:2;34749:3;34723:5;:30::i;:::-;34663:93;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;34774:14:0;;-1:-1:-1;;;;;;;;32459:2337:0;;;;;;:::o;30322:159::-;23227:13;;;;;;;;:30;;-1:-1:-1;23245:12:0;;;;23244:13;23227:30;23219:89;;;;-1:-1:-1;;;23219:89:0;;;;;;;:::i;:::-;23321:19;23344:13;;;;;;23343:14;23368:101;;;;23403:13;:20;;-1:-1:-1;;;;23403:20:0;;;;;23438:19;23419:4;23438:19;;;23368:101;30444:15:::1;30461:10;30391:81;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;30391:81:0;;::::1;::::0;;;;;;30381:92;;30391:81:::1;30381:92:::0;;::::1;::::0;30374:4:::1;:99:::0;23495:68;;;;23546:5;23530:21;;-1:-1:-1;;23530:21:0;;;23495:68;30322:159;:::o;11695:205::-;11796:96;11816:5;11846:27;;;11875:4;11881:2;11885:5;11823:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11823:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11823:68:0;-1:-1:-1;;;;;;11823:68:0;;;;;;;;;;11796:19;:96::i;:::-;11695:205;;;;:::o;39865:376::-;39940:15;;40011:27;40015:3;40020:2;40024:13;40011:3;:27::i;:::-;39999:39;40119:43;40123:3;40128:2;40133:27;40151:9;40133:15;:27;:::i;:::-;40119:3;:43::i;:::-;40107:55;;39865:376;-1:-1:-1;;;39865:376:0:o;40249:624::-;40357:15;;40428:34;40432:2;40436:3;-1:-1:-1;;;;;40428:34:0;;:3;:34::i;:::-;40416:46;40516:15;40520:3;40525:2;40529:1;40516:3;:15::i;:::-;40504:27;40606:21;40610:3;40615:2;40619:7;40606:3;:21::i;:::-;40594:33;40696:24;40700:3;40705:1;40708:11;40696:3;:24::i;:::-;40684:36;40779:22;40783:3;40788:1;40791:9;40779:3;:22::i;:::-;40767:34;;40249:624;-1:-1:-1;;;;;40249:624:0:o;38005:336::-;38088:15;38124:21;38135:3;38140:4;38124:10;:21::i;:::-;38116:58;;;;-1:-1:-1;;;38116:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;38297:1:0;38283:12;;;38279:20;38301:19;;;38275:46;;38194:140::o;39042:395::-;39399:19;;39392:1;39378:12;;;-1:-1:-1;;39374:20:0;39360:35;;;39356:40;39346:51;;;;39342:77;;39205:225::o;39445:175::-;39551:61;-1:-1:-1;;;;;39551:34:0;;39586:17;39605:6;39551:34;:61::i;:::-;39445:175;;;:::o;34894:390::-;34977:13;35003:19;:56;;;;;;;;;;;;;;;;;;;35070:20;35120:6;35128:10;35103:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35093:47;;;;;;35070:70;;35151:29;35183:38;35197:12;35211:9;35183:13;:38::i;:::-;-1:-1:-1;;;;;35240:35:0;;;;;;;;-1:-1:-1;;;;34894:390:0;;;;:::o;18219:98::-;18277:7;18304:5;18308:1;18304;:5;:::i;18618:98::-;18676:7;18703:5;18707:1;18703;:5;:::i;39657:196::-;39730:9;39791:10;39803;39815:5;39822:15;39774:64;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;39774:64:0;;;;;;;;;39764:75;;39774:64;39764:75;;;;39759:85;;39843:1;39759:85;:::i;13944:761::-;14368:23;14394:69;14422:4;14394:69;;;;;;;;;;;;;;;;;14402:5;-1:-1:-1;;;;;14394:27:0;;;:69;;;;;:::i;:::-;14478:17;;14368:95;;-1:-1:-1;14478:21:0;14474:224;;14620:10;14609:30;;;;;;;;;;;;:::i;:::-;14601:85;;;;-1:-1:-1;;;14601:85:0;;;;;;;:::i;37418:278::-;37499:13;37533:22;37544:4;37550;37533:10;:22::i;:::-;37525:57;;;;-1:-1:-1;;;37525:57:0;;;;;;;:::i;:::-;-1:-1:-1;37659:19:0;;;;37602:87;-1:-1:-1;37602:87:0:o;38507:234::-;38694:3;38685:13;;38713:1;38703:12;;;38700:22;38682:41;;38612:122::o;11510:177::-;11593:86;11613:5;11643:23;;;11668:2;11672:5;11620:58;;;;;;;;;:::i;24677:1492::-;24755:7;24832:9;24852;24872:7;25092:9;:16;25112:2;25092:22;25088:1032;;;-1:-1:-1;;;25379:4:0;25364:20;;25358:27;25429:4;25414:20;;25408:27;25487:4;25472:20;;25466:27;25463:1;25458:36;25334:175;;;25530:9;:16;25550:2;25530:22;25526:594;;;-1:-1:-1;;;25822:4:0;25807:20;;25801:27;25872:4;25857:20;;25851:27;;-1:-1:-1;;;;;25901:75:0;;;26007:3;26003:12;26017:2;25999:21;25772:263;;;26067:41;;-1:-1:-1;;;26067:41:0;;;;;;;:::i;25526:594::-;26139:22;26147:4;26153:1;26156;26159;26139:7;:22::i;:::-;26132:29;24677:1492;-1:-1:-1;;;;;;24677:1492:0:o;6565:195::-;6668:12;6700:52;6722:6;6730:4;6736:1;6739:12;6700:21;:52::i;:::-;6693:59;6565:195;-1:-1:-1;;;;6565:195:0:o;26308:1432::-;26393:7;27318:66;27304:80;;;27296:127;;;;-1:-1:-1;;;27296:127:0;;;;;;;:::i;:::-;27442:1;:7;;27447:2;27442:7;:18;;;;27453:1;:7;;27458:2;27453:7;27442:18;27434:65;;;;-1:-1:-1;;;27434:65:0;;;;;;;:::i;:::-;27597:14;27614:24;27624:4;27630:1;27633;27636;27614:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27614:24:0;;-1:-1:-1;;27614:24:0;;;-1:-1:-1;;;;;;;27657:20:0;;27649:57;;;;-1:-1:-1;;;27649:57:0;;;;;;;:::i;:::-;27726:6;26308:1432;-1:-1:-1;;;;;26308:1432:0:o;7617:530::-;7744:12;7802:5;7777:21;:30;;7769:81;;;;-1:-1:-1;;;7769:81:0;;;;;;;:::i;:::-;7869:18;7880:6;7869:10;:18::i;:::-;7861:60;;;;-1:-1:-1;;;7861:60:0;;;;;;;:::i;:::-;7995:12;8009:23;8036:6;-1:-1:-1;;;;;8036:11:0;8056:5;8064:4;8036:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7994:75;;;;8087:52;8105:7;8114:10;8126:12;8087:17;:52::i;:::-;8080:59;7617:530;-1:-1:-1;;;;;;;7617:530:0:o;3647:422::-;4014:20;;4053:8;;3647:422;;;;:::o;10157:742::-;10272:12;10301:7;10297:595;;;-1:-1:-1;10332:10:0;10325:17;;10297:595;10446:17;;:21;10442:439;;10709:10;10703:17;10770:15;10757:10;10753:2;10749:19;10742:44;10657:148;10852:12;10845:20;;-1:-1:-1;;;10845:20:0;;;;;;;;:::i;14:607:1:-;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:138::-;696:20;;725:33;696:20;725:33;:::i;769:132::-;836:20;;865:30;836:20;865:30;:::i;906:233::-;;1004:3;997:4;989:6;985:17;981:27;971:2;;1026:5;1019;1012:20;971:2;1052:81;1129:3;1120:6;1107:20;1100:4;1092:6;1088:17;1052:81;:::i;1144:1146::-;;;;;;;;;;;1426:3;1414:9;1405:7;1401:23;1397:33;1394:2;;;1448:6;1440;1433:22;1394:2;1476:31;1497:9;1476:31;:::i;:::-;1466:41;;1554:2;1543:9;1539:18;1526:32;1516:42;;1577:37;1610:2;1599:9;1595:18;1577:37;:::i;:::-;1567:47;;1661:2;1650:9;1646:18;1633:32;1623:42;;1712:3;1701:9;1697:19;1684:33;1674:43;;1768:3;1757:9;1753:19;1740:33;1792:18;1833:2;1825:6;1822:14;1819:2;;;1854:6;1846;1839:22;1819:2;1882:52;1926:7;1917:6;1906:9;1902:22;1882:52;:::i;:::-;1872:62;;1987:3;1976:9;1972:19;1959:33;1943:49;;2017:2;2007:8;2004:16;2001:2;;;2038:6;2030;2023:22;2001:2;;2066:54;2112:7;2101:8;2090:9;2086:24;2066:54;:::i;:::-;2056:64;;;2167:3;2156:9;2152:19;2139:33;2129:43;;2191:41;2227:3;2216:9;2212:19;2191:41;:::i;:::-;2181:51;;2279:3;2268:9;2264:19;2251:33;2241:43;;1384:906;;;;;;;;;;;;;:::o;2295:257::-;;2415:2;2403:9;2394:7;2390:23;2386:32;2383:2;;;2436:6;2428;2421:22;2383:2;2473:9;2467:16;2492:30;2516:5;2492:30;:::i;2557:190::-;;2669:2;2657:9;2648:7;2644:23;2640:32;2637:2;;;2690:6;2682;2675:22;2637:2;-1:-1:-1;2718:23:1;;2627:120;-1:-1:-1;2627:120:1:o;2752:694::-;;;;2915:2;2903:9;2894:7;2890:23;2886:32;2883:2;;;2936:6;2928;2921:22;2883:2;2977:9;2964:23;2954:33;;3038:2;3027:9;3023:18;3010:32;3065:18;3057:6;3054:30;3051:2;;;3102:6;3094;3087:22;3051:2;3130:22;;3183:4;3175:13;;3171:27;-1:-1:-1;3161:2:1;;3217:6;3209;3202:22;3161:2;3245:75;3312:7;3307:2;3294:16;3289:2;3285;3281:11;3245:75;:::i;:::-;3235:85;;;3370:2;3359:9;3355:18;3342:32;3383:33;3410:5;3383:33;:::i;:::-;3435:5;3425:15;;;2873:573;;;;;:::o;3451:194::-;;3574:2;3562:9;3553:7;3549:23;3545:32;3542:2;;;3595:6;3587;3580:22;3542:2;-1:-1:-1;3623:16:1;;3532:113;-1:-1:-1;3532:113:1:o;3650:260::-;;3732:5;3726:12;3759:6;3754:3;3747:19;3775:63;3831:6;3824:4;3819:3;3815:14;3808:4;3801:5;3797:16;3775:63;:::i;:::-;3892:2;3871:15;-1:-1:-1;;3867:29:1;3858:39;;;;3899:4;3854:50;;3702:208;-1:-1:-1;;3702:208:1:o;3915:525::-;4174:2;4170:15;;;;-1:-1:-1;;;;;;4166:53:1;4154:66;;4245:2;4236:12;;4229:28;;;;4313:3;4291:16;;;;-1:-1:-1;;;;;;4287:43:1;4282:2;4273:12;;4266:65;4356:2;4347:12;;4340:28;4393:2;4384:12;;4377:28;4430:3;4421:13;;4144:296::o;4445:274::-;;4612:6;4606:13;4628:53;4674:6;4669:3;4662:4;4654:6;4650:17;4628:53;:::i;:::-;4697:16;;;;;4582:137;-1:-1:-1;;4582:137:1:o;4724:415::-;;4919:6;4913:13;4935:53;4981:6;4976:3;4969:4;4961:6;4957:17;4935:53;:::i;:::-;5057:2;5053:15;;;;-1:-1:-1;;;;;;5049:53:1;5010:16;;;;5035:68;;;5130:2;5119:14;;4889:250;-1:-1:-1;;4889:250:1:o;5144:460::-;5414:34;5402:47;;5474:2;5465:12;;5458:28;;;;5524:2;5520:15;-1:-1:-1;;;;;;5516:53:1;5511:2;5502:12;;5495:75;5595:2;5586:12;;5392:212::o;5609:458::-;5858:3;5836:16;;;;-1:-1:-1;;;;;;5832:43:1;5820:56;;5913:2;5909:15;;;;-1:-1:-1;;;;;;5905:53:1;5901:1;5892:11;;5885:74;5984:2;5975:12;;5968:28;6021:2;6012:12;;6005:28;6058:2;6049:12;;5810:257::o;6072:304::-;-1:-1:-1;;;;;6302:15:1;;;6284:34;;6354:15;;6349:2;6334:18;;6327:43;6234:2;6219:18;;6201:175::o;6381:375::-;-1:-1:-1;;;;;6639:15:1;;;6621:34;;6691:15;;;;6686:2;6671:18;;6664:43;6738:2;6723:18;;6716:34;;;;6571:2;6556:18;;6538:218::o;6761:274::-;-1:-1:-1;;;;;6953:32:1;;;;6935:51;;7017:2;7002:18;;6995:34;6923:2;6908:18;;6890:145::o;7040:571::-;-1:-1:-1;;;;;7339:32:1;;;;7321:51;;7403:2;7388:18;;7381:34;;;;7446:2;7431:18;;7424:34;;;;7489:2;7474:18;;7467:34;7545:14;7538:22;7532:3;7517:19;;7510:51;7359:3;7577:19;;7570:35;7308:3;7293:19;;7275:336::o;7616:455::-;7855:25;;;-1:-1:-1;;;;;7954:15:1;;;7949:2;7934:18;;7927:43;8001:2;7986:18;;7979:34;;;;8049:15;8044:2;8029:18;;8022:43;7842:3;7827:19;;7809:262::o;8076:345::-;8278:25;;;-1:-1:-1;;;;;8339:32:1;;;;8334:2;8319:18;;8312:60;8403:2;8388:18;;8381:34;8266:2;8251:18;;8233:188::o;8426:398::-;8653:25;;;8726:4;8714:17;;;;8709:2;8694:18;;8687:45;8763:2;8748:18;;8741:34;8806:2;8791:18;;8784:34;8640:3;8625:19;;8607:217::o;8829:222::-;;8978:2;8967:9;8960:21;8998:47;9041:2;9030:9;9026:18;9018:6;8998:47;:::i;9056:348::-;9258:2;9240:21;;;9297:2;9277:18;;;9270:30;9336:26;9331:2;9316:18;;9309:54;9395:2;9380:18;;9230:174::o;9409:348::-;9611:2;9593:21;;;9650:2;9630:18;;;9623:30;9689:26;9684:2;9669:18;;9662:54;9748:2;9733:18;;9583:174::o;9762:349::-;9964:2;9946:21;;;10003:2;9983:18;;;9976:30;10042:27;10037:2;10022:18;;10015:55;10102:2;10087:18;;9936:175::o;10116:355::-;10318:2;10300:21;;;10357:2;10337:18;;;10330:30;10396:33;10391:2;10376:18;;10369:61;10462:2;10447:18;;10290:181::o;10476:343::-;10678:2;10660:21;;;10717:2;10697:18;;;10690:30;-1:-1:-1;;;10751:2:1;10736:18;;10729:49;10810:2;10795:18;;10650:169::o;10824:344::-;11026:2;11008:21;;;11065:2;11045:18;;;11038:30;-1:-1:-1;;;11099:2:1;11084:18;;11077:50;11159:2;11144:18;;10998:170::o;11173:342::-;11375:2;11357:21;;;11414:2;11394:18;;;11387:30;-1:-1:-1;;;11448:2:1;11433:18;;11426:48;11506:2;11491:18;;11347:168::o;11520:339::-;11722:2;11704:21;;;11761:2;11741:18;;;11734:30;-1:-1:-1;;;11795:2:1;11780:18;;11773:45;11850:2;11835:18;;11694:165::o;11864:343::-;12066:2;12048:21;;;12105:2;12085:18;;;12078:30;-1:-1:-1;;;12139:2:1;12124:18;;12117:49;12198:2;12183:18;;12038:169::o;12212:398::-;12414:2;12396:21;;;12453:2;12433:18;;;12426:30;12492:34;12487:2;12472:18;;12465:62;-1:-1:-1;;;12558:2:1;12543:18;;12536:32;12600:3;12585:19;;12386:224::o;12615:402::-;12817:2;12799:21;;;12856:2;12836:18;;;12829:30;12895:34;12890:2;12875:18;;12868:62;-1:-1:-1;;;12961:2:1;12946:18;;12939:36;13007:3;12992:19;;12789:228::o;13022:336::-;13224:2;13206:21;;;13263:2;13243:18;;;13236:30;-1:-1:-1;;;13297:2:1;13282:18;;13275:42;13349:2;13334:18;;13196:162::o;13363:337::-;13565:2;13547:21;;;13604:2;13584:18;;;13577:30;-1:-1:-1;;;13638:2:1;13623:18;;13616:43;13691:2;13676:18;;13537:163::o;13705:410::-;13907:2;13889:21;;;13946:2;13926:18;;;13919:30;13985:34;13980:2;13965:18;;13958:62;-1:-1:-1;;;14051:2:1;14036:18;;14029:44;14105:3;14090:19;;13879:236::o;14120:398::-;14322:2;14304:21;;;14361:2;14341:18;;;14334:30;14400:34;14395:2;14380:18;;14373:62;-1:-1:-1;;;14466:2:1;14451:18;;14444:32;14508:3;14493:19;;14294:224::o;14523:339::-;14725:2;14707:21;;;14764:2;14744:18;;;14737:30;-1:-1:-1;;;14798:2:1;14783:18;;14776:45;14853:2;14838:18;;14697:165::o;14867:351::-;15069:2;15051:21;;;15108:2;15088:18;;;15081:30;15147:29;15142:2;15127:18;;15120:57;15209:2;15194:18;;15041:177::o;15223:346::-;15425:2;15407:21;;;15464:2;15444:18;;;15437:30;-1:-1:-1;;;15498:2:1;15483:18;;15476:52;15560:2;15545:18;;15397:172::o;15574:346::-;15776:2;15758:21;;;15815:2;15795:18;;;15788:30;-1:-1:-1;;;15849:2:1;15834:18;;15827:52;15911:2;15896:18;;15748:172::o;15925:353::-;16127:2;16109:21;;;16166:2;16146:18;;;16139:30;16205:31;16200:2;16185:18;;16178:59;16269:2;16254:18;;16099:179::o;16283:406::-;16485:2;16467:21;;;16524:2;16504:18;;;16497:30;16563:34;16558:2;16543:18;;16536:62;-1:-1:-1;;;16629:2:1;16614:18;;16607:40;16679:3;16664:19;;16457:232::o;16694:336::-;16896:2;16878:21;;;16935:2;16915:18;;;16908:30;-1:-1:-1;;;16969:2:1;16954:18;;16947:42;17021:2;17006:18;;16868:162::o;17035:330::-;17237:2;17219:21;;;17276:1;17256:18;;;17249:29;-1:-1:-1;;;17309:2:1;17294:18;;17287:37;17356:2;17341:18;;17209:156::o;17370:177::-;17516:25;;;17504:2;17489:18;;17471:76::o;17552:1049::-;;17959:3;17989:6;17978:9;17971:25;18032:6;18027:2;18016:9;18012:18;18005:34;18075:2;18070;18059:9;18055:18;18048:30;18101:47;18144:2;18133:9;18129:18;18121:6;18101:47;:::i;:::-;18087:61;;18196:9;18188:6;18184:22;18179:2;18168:9;18164:18;18157:50;18224:35;18252:6;18244;18224:35;:::i;:::-;-1:-1:-1;;;;;18334:15:1;;;18328:3;18313:19;;18306:44;18286:3;18366:19;;18359:35;;;;-1:-1:-1;;18431:15:1;;;;18425:3;18410:19;;18403:44;18478:3;18463:19;;18456:35;;;;18535:14;18528:22;18522:3;18507:19;;18500:51;18582:3;18567:19;18560:35;;;;18216:43;17939:662;-1:-1:-1;;;;17939:662:1:o;18606:128::-;;18677:1;18673:6;18670:1;18667:13;18664:2;;;18683:18;;:::i;:::-;-1:-1:-1;18719:9:1;;18654:80::o;18739:120::-;;18805:1;18795:2;;18810:18;;:::i;:::-;-1:-1:-1;18844:9:1;;18785:74::o;18864:168::-;;18970:1;18966;18962:6;18958:14;18955:1;18952:21;18947:1;18940:9;18933:17;18929:45;18926:2;;;18977:18;;:::i;:::-;-1:-1:-1;19017:9:1;;18916:116::o;19037:125::-;;19105:1;19102;19099:8;19096:2;;;19110:18;;:::i;:::-;-1:-1:-1;19147:9:1;;19086:76::o;19167:258::-;19239:1;19249:113;19263:6;19260:1;19257:13;19249:113;;;19339:11;;;19333:18;19320:11;;;19313:39;19285:2;19278:10;19249:113;;;19380:6;19377:1;19374:13;19371:2;;;-1:-1:-1;;19415:1:1;19397:16;;19390:27;19220:205::o;19430:201::-;;19496:10;19541:2;19534:5;19530:14;19568:2;19559:7;19556:15;19553:2;;;19574:18;;:::i;:::-;19623:1;19610:15;;19476:155;-1:-1:-1;;;19476:155:1:o;19636:112::-;;19694:1;19684:2;;19699:18;;:::i;:::-;-1:-1:-1;19733:9:1;;19674:74::o;19753:127::-;19814:10;19809:3;19805:20;19802:1;19795:31;19845:4;19842:1;19835:15;19869:4;19866:1;19859:15;19885:127;19946:10;19941:3;19937:20;19934:1;19927:31;19977:4;19974:1;19967:15;20001:4;19998:1;19991:15;20017:127;20078:10;20073:3;20069:20;20066:1;20059:31;20109:4;20106:1;20099:15;20133:4;20130:1;20123:15;20149:133;-1:-1:-1;;;;;20226:31:1;;20216:42;;20206:2;;20272:1;20269;20262:12;20287:120;20375:5;20368:13;20361:21;20354:5;20351:32;20341:2;;20397:1;20394;20387:12
Swarm Source
ipfs://e75561c3b119869ab629e4d940d87675589985de8c8cdd0a1068106797b730ac
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.