More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,929 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Override Border | 19193936 | 147 days ago | IN | 0 ETH | 0.00195006 | ||||
Override Border | 19036961 | 169 days ago | IN | 0 ETH | 0.00201132 | ||||
Leave War | 19031428 | 170 days ago | IN | 0 ETH | 0.00189575 | ||||
Override Border | 19029720 | 170 days ago | IN | 0 ETH | 0.0015995 | ||||
Override Border | 19029664 | 170 days ago | IN | 0 ETH | 0.00113953 | ||||
Leave War | 19024298 | 171 days ago | IN | 0 ETH | 0.00241962 | ||||
Leave War | 19024288 | 171 days ago | IN | 0 ETH | 0.00231553 | ||||
Leave War | 19020208 | 171 days ago | IN | 0 ETH | 0.00661664 | ||||
Leave War | 19016878 | 172 days ago | IN | 0 ETH | 0.00188018 | ||||
Leave War | 19016873 | 172 days ago | IN | 0 ETH | 0.00181896 | ||||
Leave War | 19016870 | 172 days ago | IN | 0 ETH | 0.00173955 | ||||
Leave War | 19016868 | 172 days ago | IN | 0 ETH | 0.00178952 | ||||
Leave War | 19016865 | 172 days ago | IN | 0 ETH | 0.00174274 | ||||
Leave War | 19016862 | 172 days ago | IN | 0 ETH | 0.00168711 | ||||
Override Border | 19007654 | 173 days ago | IN | 0 ETH | 0.0142453 | ||||
Override Border | 19007653 | 173 days ago | IN | 0 ETH | 0.00343979 | ||||
Override Border | 19007651 | 173 days ago | IN | 0 ETH | 0.01469735 | ||||
Override Border | 19007650 | 173 days ago | IN | 0 ETH | 0.00966717 | ||||
Override Border | 19007649 | 173 days ago | IN | 0 ETH | 0.00890574 | ||||
Leave War | 19003736 | 174 days ago | IN | 0 ETH | 0.00359713 | ||||
Leave War | 19003712 | 174 days ago | IN | 0 ETH | 0.00321926 | ||||
Leave War | 19003705 | 174 days ago | IN | 0 ETH | 0.00340435 | ||||
Leave War | 19003677 | 174 days ago | IN | 0 ETH | 0.00390774 | ||||
Leave War | 19003638 | 174 days ago | IN | 0 ETH | 0.0033787 | ||||
Leave War | 19003619 | 174 days ago | IN | 0 ETH | 0.00315219 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
WarStaking
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-13 */ // SPDX-License-Identifier: MIT // War by ATS. Written by NiftyLabs (https://niftylabs.dev/). //,,,,,,******,*************////*********,,,,*************//**///////((((((((((((((((((((((((((((((((# //***********,,,,,************///*************************//////((((((((((########################%#%# //,,,,,,,,,,,,,,,,,,,,,,**************************,******///((((((((((((((####((((###############%%%%% //,,,,,,,,,,,,,,,,,,,,,,,/*************,**********************//(((((((((((((((((((((############%%%%% //,,,,,,,,,,,,,,,,,,,,(##.#**************,,,,,,,,,,,*,,,*********/////((((((((((((((############%%%%%% //.,,,,,,,,,,,,,,,,,,,,,(#,#,#(/*********,,,,,#%%%%%%%%%(,,**********////(((((((((((################## //..,,,,,,,,,,,,,,,,,,,,, */,.####********,,/%#%%%%%%%%%%%***********///((//(((((((###############%%%% //.....,,,,,,,,,,,,,,,,,,,*/.#(*/#(##,******%%%%%%%%%%%%%%%%***/////(((/////////(((############%#%%%%% //........,,,,,,,,,,,,,,,,,,,,,#(##(###******%%%%%%%%%%%%%%#*******//////////////((((##########%%%%%%% //..........,,,,,,,,,,,,,,,,,,,,,,, ######*#%%%%%%%%%%%%%%%%%%%%/*****////////////((((##########%%%%% //............,,,,,,,,,,,,,,,,,,,,,,##########%%%%%%%%%%%%%%%%%%%%%%%(***/////(((((((((((##########%%% //.............,,,,,,,,,,,,,,,,,###############%%%%%%%%%%%%%%%%%%%%%%%&%////////((((((((((((((#####%%% //..............,,,,,,,,,,,,,,,,,,,*##########%#%%%%%%%%%%%%%%%%%%%%%%%&&*/////////////////((((####### //................,,,,,,,,,,,,,,,,,#############%##%%%%%%%%%%%%%%%%%%%%&&&#*////////(((((((((((((((### //.................,,,,,,,,,,,,,,,############%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&(//////////(((((/((((###(( //....................,,,,,,,,,,*#############%%%%%%%%%%%%#%%%%%%%%%%%&&&&&&&&*////////(((((((((#####( //.........................,,,,,(#############%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&*/////////((((((((((((( //........................,,,,,(((##############%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&%/(((((((((((#######((( //........................,,,,(((#######,*#######%%%%%%%%%%%%%%%%%%%**%&&&&&&&&&&///(((((((((((######( //..........................(((((#####(,,(#####%%%%%%%%%%%%%%%%%%%%%%***%&&&&&&&&&%///(((((((((((###(# //........................,((((((#####*,,,########%%%%%%%%%%%%%%%%%(%%%**%&&&&&&&&&#///(((((((((((#### //........................*(((((((###/,,,,,#####%%%#%%%%%%%%%%%%%%%%%%&&%/&&&&&&&&&&%//(((((((((((((## //........................((((((((##*,,,,,,,#######%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&///((((((((((#((( //.......................,/(((((((#,,,,,,,,,######%%%%%%%%%%%%%%%%%%#**(/**/&&&&&&&&&///((((//(((((((( //.......................///(((((*.,,,,,,,,,,####%%#%%%%%%%%%%%%%%%%%***/***/&&&&&&&&////((((((((((#(( //.......................///((((..,,,,,,,,,,*#####%%%%%%%%%%%%%%%%%&&**///////&&&&&&#//(((((((((((###( //.......................///((/..,,,,,,,,,,,#####%%%%%%%%%%%%%%%%%%%&%*///////&&&&&&%(((((((((((((#### //.......................///((.,,,,,,,,,,,,####%%%%%%%%%%%%%%%%%%%%%&&#//////&&&&&&&&((((((((((((##### //......................,///((.,,,,,,,,,,,#####%%%%%%%%%%%%%%%%%%%%&&&&/////&&/&&&&&&(((((((((((###### //......................////(*(/,,,,,,,,,/#####%%%%%%%%#***%%%%%%%%&&&&%///////&&&&&&((((((((######### //.......................////((,,,,,,,,,,#######%%%%%%*****%%%%%%&%%&&&%/////((&&&&&&&(((##(########## //.......................*,.,..,,,,,,,,,,######%%%%%%*******%%%%%%&&&&&///(((((&&&&&&%(############### //.. .................././.*../,,,,,,,,,,###%%%%%%%%*********%&&&&&&&&&//((((((%(&&&&(################ //....................*/*,,/(((((((#,,,,,/##%%%%%%%%******////&&&&&&&&&/((((((((&#&################### //....................,,,,,,,((((((#,,,,,*##%%%%%%%%%***//////%&&&&&&&&%(((((((######################% //...................../**/*((((((####*****%%%%%%%%%%(////////%&&&&&&&&#(((((####################%%%%% //..................,,,,,,,,,,,,,*#####*****%%%%%%%%%%////////&&&&&&&&&((((######################%%%%% //................,,,,,,,,,,,,,*************/%%%%%%%%&/////((((&&&&&&&&#(######################%%%%%%% //..........,.,,,,,,,,,,,,,******/*/**/*//**(#%%%%%&%&/%((((((#%&&&&&&&##%##(################%%%%%%%%% //*//*////,*/((/#,(/**/(#**(##(%#%%%%%%%%%%&%&&&&&&&&&&&&&&%&&&&&@&&@@@&@&&&&@&@&@&&@@&&&&&&%&%%%%&%&% //(##############%%%%%%%#%%%%%%%&%&&&&&&&&&&&&&&&&&@&&&@&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&@&&&@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //%%%%%%%%%%%&&%&&&&&&&&&&&&&&&&&&&&&&&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @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 { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. 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. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @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) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @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) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @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)); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: War.sol pragma solidity ^0.8.18; interface WarBonds { function burnForAddress(uint256 _id, address _address) external; } interface Rota { function ownerOf(uint256 tokenId) external view returns (address); function safeTransferFrom(address from, address to, uint256 tokenId) external payable; function transferFrom(address from, address to, uint256 tokenId) external payable; function burn(uint256[] memory tokenIds) external; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); } contract WarStaking is Ownable, IERC721Receiver, ReentrancyGuard { address public WARBONDS_CONTRACT = 0xcAcb0a5bb1f52F00a14bDA0dc85dE81392B2892B; address public ROTA_CONTRACT = 0xDfB29501b42f63A947Ddc5249F185D6BcBE6986f; uint256 public MAX_TYPE = 4; address public SIGNER = 0x2f2A13462f6d4aF64954ee84641D265932849b64; uint256 public warTime = 48 hours; uint256[] public burnRates = [15, 30, 45, 60, 60]; struct TokenData { uint40 time; uint40 border; uint8 battlesCompleted; address owner; } mapping(uint256 => TokenData) public tokenToData; event WarLost(uint256 tokenId, uint256 valueAtBurn); event WarWon(uint256 tokenId, uint256 newValue); function goToWar(uint256[] calldata tokenIds, uint256[] calldata warBondIds) external nonReentrant { require(tokenIds.length == warBondIds.length, "Arrays must be the same length"); for(uint256 i = 0; i < tokenIds.length; i++) _goToWar(tokenIds[i], warBondIds[i]); } function _goToWar(uint256 tokenId, uint256 warBondId) internal { TokenData storage data = tokenToData[tokenId]; require(data.border < MAX_TYPE, "Token is already maxed out"); Rota(ROTA_CONTRACT).safeTransferFrom(msg.sender, address(this), tokenId); WarBonds(WARBONDS_CONTRACT).burnForAddress(warBondId, msg.sender); data.time = uint40(block.timestamp); data.owner = msg.sender; } function leaveWar(uint256[] calldata tokenIds, uint256[] calldata randomNumbers, uint256[] calldata battleIndices, bytes calldata signature) external nonReentrant { require(tokenIds.length == randomNumbers.length, "Arrays must be the same length"); bytes32 hash = keccak256(abi.encodePacked(msg.sender, tokenIds, randomNumbers, battleIndices)); require(_verifySignature(SIGNER, hash, signature), "Invalid signature"); for(uint256 i = 0; i < tokenIds.length; i++) _leaveWar(tokenIds[i], randomNumbers[i], battleIndices[i]); } function _leaveWar(uint256 tokenId, uint256 randomNumber, uint256 battleIndex) internal { TokenData storage data = tokenToData[tokenId]; require(msg.sender == data.owner, "Not owner"); require(block.timestamp - data.time >= warTime, "Token can not leave war yet"); require(battleIndex == data.battlesCompleted, "Battle index does not match"); data.time = 0; data.battlesCompleted += 1; if(diedAtWar(tokenId, randomNumber, burnRates[data.border])) { uint256[] memory tokenIds = new uint256[](1); tokenIds[0] = tokenId; data.owner = address(0); Rota(ROTA_CONTRACT).burn(tokenIds); emit WarLost(tokenId, data.border); } else { Rota(ROTA_CONTRACT).transferFrom(address(this), msg.sender, tokenId); data.border = data.border + 1; emit WarWon(tokenId, data.border); } } function _verifySignature(address _signer, bytes32 _hash, bytes calldata _signature) internal pure returns (bool) { return _signer == ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature); } function diedAtWar(uint256 tokenId, uint256 random, uint256 burnRate) internal pure returns (bool) { uint256 randomNumber = uint256(keccak256(abi.encodePacked(tokenId, random))) % 100; return randomNumber < burnRate; } function getBorderNumber(uint256 tokenId) public view returns (uint256) { TokenData storage data = tokenToData[tokenId]; return data.border; } function getNumberOfBattles(uint256 tokenId) public view returns (uint256) { TokenData storage data = tokenToData[tokenId]; return data.battlesCompleted; } function getTokenDataFor(uint256[] calldata tokenIds) public view returns (uint40[] memory, uint40[] memory, uint8[] memory, address[] memory) { uint40[] memory times = new uint40[](tokenIds.length); uint40[] memory borders = new uint40[](tokenIds.length); uint8[] memory battlesCompleted = new uint8[](tokenIds.length); address[] memory owners = new address[](tokenIds.length); for(uint256 i = 0; i < tokenIds.length; i++) { TokenData memory data = tokenToData[tokenIds[i]]; times[i] = data.time; borders[i] = data.border; battlesCompleted[i] = data.battlesCompleted; owners[i] = data.owner; } return (times, borders, battlesCompleted, owners); } function changeWarTime(uint256 _time) public onlyOwner { warTime = _time; } function overrideBorder(uint256[] memory tokenId, uint40 _border) public onlyOwner { require(_border <= MAX_TYPE, "Border does not exist"); for(uint256 i = 0; i < tokenId.length; i++) tokenToData[tokenId[i]].border = _border; } function setBurnRates(uint256[] memory _rates) public onlyOwner { burnRates = _rates; } function setRotaContract(address _addr) public onlyOwner { ROTA_CONTRACT = _addr; } function setWarBondsContract(address _addr) public onlyOwner { WARBONDS_CONTRACT = _addr; } function setMaxWarType(uint256 _max) public onlyOwner { MAX_TYPE = _max; } function onERC721Received( address, address, uint256, bytes calldata ) external pure override returns (bytes4) { return IERC721Receiver.onERC721Received.selector; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"valueAtBurn","type":"uint256"}],"name":"WarLost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"WarWon","type":"event"},{"inputs":[],"name":"MAX_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROTA_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WARBONDS_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"changeWarTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBorderNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNumberOfBattles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getTokenDataFor","outputs":[{"internalType":"uint40[]","name":"","type":"uint40[]"},{"internalType":"uint40[]","name":"","type":"uint40[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"warBondIds","type":"uint256[]"}],"name":"goToWar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"randomNumbers","type":"uint256[]"},{"internalType":"uint256[]","name":"battleIndices","type":"uint256[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"leaveWar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"uint40","name":"_border","type":"uint40"}],"name":"overrideBorder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_rates","type":"uint256[]"}],"name":"setBurnRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxWarType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setRotaContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setWarBondsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToData","outputs":[{"internalType":"uint40","name":"time","type":"uint40"},{"internalType":"uint40","name":"border","type":"uint40"},{"internalType":"uint8","name":"battlesCompleted","type":"uint8"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"warTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
600280546001600160a01b031990811673cacb0a5bb1f52f00a14bda0dc85de81392b2892b1790915560038054821673dfb29501b42f63a947ddc5249f185d6bcbe6986f1790556004805560058054909116732f2a13462f6d4af64954ee84641d265932849b641781556202a300600655610120604052600f6080908152601e60a052602d60c052603c60e081905261010052620000a1916007919062000115565b50348015620000af57600080fd5b50620000bb33620000c5565b6001805562000181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000158579160200282015b8281111562000158578251829060ff1690559160200191906001019062000136565b50620001669291506200016a565b5090565b5b808211156200016657600081556001016200016b565b611b4680620001916000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806398764d83116100b8578063b8c1db401161007c578063b8c1db401461036b578063d9197c321461037e578063ef7df66b14610387578063f2bc9e051461039a578063f2fde38b146103ad578063f8939e0c146103c057600080fd5b806398764d8314610278578063a4d1776d1461029b578063a5e7f9ea146102a4578063a6a2ee02146102ce578063ae3d5414146102e157600080fd5b80633bb624c21161010a5780633bb624c2146101fb578063582abd121461020e578063715018a614610239578063788cb4d9146102415780637b58c4bd146102545780638da5cb5b1461026757600080fd5b80630e58f7c314610147578063150b7a02146101885780631ecaef43146101c057806329a86c52146101d55780632ce8939a146101e8575b600080fd5b6101756101553660046114a0565b600090815260086020526040902054600160281b900464ffffffffff1690565b6040519081526020015b60405180910390f35b6101a7610196366004611516565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161017f565b6101d36101ce366004611634565b6103d3565b005b6101d36101e336600461168f565b6104a5565b6101756101f63660046114a0565b6104cf565b6101d36102093660046114a0565b6104f0565b600554610221906001600160a01b031681565b6040516001600160a01b03909116815260200161017f565b6101d36104fd565b600254610221906001600160a01b031681565b6101d36102623660046116f5565b610511565b6000546001600160a01b0316610221565b61028b610286366004611760565b6105cf565b60405161017f94939291906117e3565b61017560065481565b6101756102b23660046114a0565b600090815260086020526040902054600160501b900460ff1690565b6101d36102dc366004611890565b61085d565b6103316102ef3660046114a0565b60086020526000908152604090205464ffffffffff80821691600160281b810490911690600160501b810460ff1690600160581b90046001600160a01b031684565b6040805164ffffffffff958616815294909316602085015260ff909116918301919091526001600160a01b0316606082015260800161017f565b600354610221906001600160a01b031681565b61017560045481565b6101d36103953660046114a0565b61087c565b6101d36103a836600461168f565b610889565b6101d36103bb36600461168f565b6108b3565b6101d36103ce3660046118cc565b61092c565b6103db610a9a565b6004548164ffffffffff1611156104315760405162461bcd60e51b8152602060048201526015602482015274109bdc99195c88191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064015b60405180910390fd5b60005b82518110156104a05781600860008584815181106104545761045461198f565b6020026020010151815260200190815260200160002060000160056101000a81548164ffffffffff021916908364ffffffffff1602179055508080610498906119bb565b915050610434565b505050565b6104ad610a9a565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600781815481106104df57600080fd5b600091825260209091200154905081565b6104f8610a9a565b600655565b610505610a9a565b61050f6000610af4565b565b610519610b44565b8281146105685760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610428565b60005b838110156105bf576105ad8585838181106105885761058861198f565b905060200201358484848181106105a1576105a161198f565b90506020020135610b9d565b806105b7816119bb565b91505061056b565b506105c960018055565b50505050565b60608080806000856001600160401b038111156105ee576105ee611584565b604051908082528060200260200182016040528015610617578160200160208202803683370190505b5090506000866001600160401b0381111561063457610634611584565b60405190808252806020026020018201604052801561065d578160200160208202803683370190505b5090506000876001600160401b0381111561067a5761067a611584565b6040519080825280602002602001820160405280156106a3578160200160208202803683370190505b5090506000886001600160401b038111156106c0576106c0611584565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b50905060005b8981101561084c576000600860008d8d8581811061070f5761070f61198f565b602090810292909201358352508181019290925260409081016000208151608081018352905464ffffffffff808216808452600160281b830490911694830194909452600160501b810460ff1692820192909252600160581b9091046001600160a01b0316606082015287519092508790849081106107905761079061198f565b602002602001019064ffffffffff16908164ffffffffff168152505080602001518583815181106107c3576107c361198f565b602002602001019064ffffffffff16908164ffffffffff168152505080604001518483815181106107f6576107f661198f565b602002602001019060ff16908160ff168152505080606001518383815181106108215761082161198f565b6001600160a01b03909216602092830291909101909101525080610844816119bb565b9150506106ef565b509299919850965090945092505050565b610865610a9a565b8051610878906007906020840190611440565b5050565b610884610a9a565b600455565b610891610a9a565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6108bb610a9a565b6001600160a01b0381166109205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610428565b61092981610af4565b50565b610934610b44565b8685146109835760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610428565b6000338989898989896040516020016109a297969594939291906119fd565b60408051601f1981840301815291905280516020909101206005549091506109d5906001600160a01b0316828585610d17565b610a155760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610428565b60005b88811015610a8557610a738a8a83818110610a3557610a3561198f565b90506020020135898984818110610a4e57610a4e61198f565b90506020020135888885818110610a6757610a6761198f565b90506020020135610dcd565b80610a7d816119bb565b915050610a18565b5050610a9060018055565b5050505050505050565b6000546001600160a01b0316331461050f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610428565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610b965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610428565b6002600155565b60008281526008602052604090206004548154600160281b900464ffffffffff1610610c0b5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e20697320616c7265616479206d61786564206f75740000000000006044820152606401610428565b600354604051632142170760e11b8152336004820152306024820152604481018590526001600160a01b03909116906342842e0e90606401600060405180830381600087803b158015610c5d57600080fd5b505af1158015610c71573d6000803e3d6000fd5b5050600254604051635209071360e01b8152600481018690523360248201526001600160a01b03909116925063520907139150604401600060405180830381600087803b158015610cc157600080fd5b505af1158015610cd5573d6000803e3d6000fd5b50508254600160581b33027fff0000000000000000000000000000000000000000ffffffffffff000000000090911664ffffffffff4216171790925550505050565b6000610daf610d73856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061117892505050565b6001600160a01b0316856001600160a01b0316149050949350505050565b60008381526008602052604090208054600160581b90046001600160a01b03163314610e275760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610428565b6006548154610e3d9064ffffffffff1642611a43565b1015610e8b5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e2063616e206e6f74206c65617665207761722079657400000000006044820152606401610428565b8054600160501b900460ff168214610ee55760405162461bcd60e51b815260206004820152601b60248201527f426174746c6520696e64657820646f6573206e6f74206d6174636800000000006044820152606401610428565b805464ffffffffff19168082556001908290600a90610f0f908490600160501b900460ff16611a56565b92506101000a81548160ff021916908360ff160217905550610f6b848460078460000160059054906101000a900464ffffffffff1664ffffffffff1681548110610f5b57610f5b61198f565b906000526020600020015461119e565b1561108857604080516001808252818301909252600091602080830190803683370190505090508481600081518110610fa657610fa661198f565b602090810291909101015281547fff0000000000000000000000000000000000000000ffffffffffffffffffffff16825560035460405163b80f55c960e01b81526001600160a01b039091169063b80f55c990611007908490600401611a6f565b600060405180830381600087803b15801561102157600080fd5b505af1158015611035573d6000803e3d6000fd5b5050835460408051898152600160281b90920464ffffffffff1660208301527f735b6ee0baa0e267b335b9cbe4a627617e13b2cd15bcf0382430f8c73f356a0e935001905060405180910390a1506105c9565b6003546040516323b872dd60e01b8152306004820152336024820152604481018690526001600160a01b03909116906323b872dd90606401600060405180830381600087803b1580156110da57600080fd5b505af11580156110ee573d6000803e3d6000fd5b5050825461110e9250600160281b900464ffffffffff1690506001611ab3565b815469ffffffffff00000000001916600160281b64ffffffffff928316810291909117808455604080518881529290910490921660208201527fc6e154d143a863e2cce9664b681e1abf3260e6350b653095c731bec6f16dccde910160405180910390a150505050565b600080600061118785856111ed565b9150915061119481611232565b5090505b92915050565b600080606485856040516020016111bf929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6111e29190611ad8565b909211949350505050565b60008082516041036112235760208301516040840151606085015160001a6112178782858561137c565b9450945050505061122b565b506000905060025b9250929050565b600081600481111561124657611246611afa565b0361124e5750565b600181600481111561126257611262611afa565b036112af5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610428565b60028160048111156112c3576112c3611afa565b036113105760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610428565b600381600481111561132457611324611afa565b036109295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610428565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113b35750600090506003611437565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611407573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661143057600060019250925050611437565b9150600090505b94509492505050565b82805482825590600052602060002090810192821561147b579160200282015b8281111561147b578251825591602001919060010190611460565b5061148792915061148b565b5090565b5b80821115611487576000815560010161148c565b6000602082840312156114b257600080fd5b5035919050565b80356001600160a01b03811681146114d057600080fd5b919050565b60008083601f8401126114e757600080fd5b5081356001600160401b038111156114fe57600080fd5b60208301915083602082850101111561122b57600080fd5b60008060008060006080868803121561152e57600080fd5b611537866114b9565b9450611545602087016114b9565b93506040860135925060608601356001600160401b0381111561156757600080fd5b611573888289016114d5565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126115ab57600080fd5b813560206001600160401b03808311156115c7576115c7611584565b8260051b604051601f19603f830116810181811084821117156115ec576115ec611584565b60405293845285810183019383810192508785111561160a57600080fd5b83870191505b8482101561162957813583529183019190830190611610565b979650505050505050565b6000806040838503121561164757600080fd5b82356001600160401b0381111561165d57600080fd5b6116698582860161159a565b925050602083013564ffffffffff8116811461168457600080fd5b809150509250929050565b6000602082840312156116a157600080fd5b6116aa826114b9565b9392505050565b60008083601f8401126116c357600080fd5b5081356001600160401b038111156116da57600080fd5b6020830191508360208260051b850101111561122b57600080fd5b6000806000806040858703121561170b57600080fd5b84356001600160401b038082111561172257600080fd5b61172e888389016116b1565b9096509450602087013591508082111561174757600080fd5b50611754878288016116b1565b95989497509550505050565b6000806020838503121561177357600080fd5b82356001600160401b0381111561178957600080fd5b611795858286016116b1565b90969095509350505050565b600081518084526020808501945080840160005b838110156117d857815164ffffffffff16875295820195908201906001016117b5565b509495945050505050565b6080815260006117f660808301876117a1565b60208382038185015261180982886117a1565b8481036040860152865180825282880193509082019060005b8181101561184157845160ff1683529383019391830191600101611822565b50508481036060860152855180825290820192508186019060005b818110156118815782516001600160a01b03168552938301939183019160010161185c565b50929998505050505050505050565b6000602082840312156118a257600080fd5b81356001600160401b038111156118b857600080fd5b6118c48482850161159a565b949350505050565b6000806000806000806000806080898b0312156118e857600080fd5b88356001600160401b03808211156118ff57600080fd5b61190b8c838d016116b1565b909a50985060208b013591508082111561192457600080fd5b6119308c838d016116b1565b909850965060408b013591508082111561194957600080fd5b6119558c838d016116b1565b909650945060608b013591508082111561196e57600080fd5b5061197b8b828c016114d5565b999c989b5096995094979396929594505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016119cd576119cd6119a5565b5060010190565b60006001600160fb1b038311156119ea57600080fd5b8260051b80838637939093019392505050565b6bffffffffffffffffffffffff198860601b1681526000611a36611a2f611a28601485018a8c6119d4565b87896119d4565b84866119d4565b9998505050505050505050565b81810381811115611198576111986119a5565b60ff8181168382160190811115611198576111986119a5565b6020808252825182820181905260009190848201906040850190845b81811015611aa757835183529284019291840191600101611a8b565b50909695505050505050565b64ffffffffff818116838216019080821115611ad157611ad16119a5565b5092915050565b600082611af557634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052602160045260246000fdfea264697066735822122098aae522cbae28e01038c27e9bd433dc46406e6e924aa60ef668dca3f2a2c14864736f6c63430008130033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c806398764d83116100b8578063b8c1db401161007c578063b8c1db401461036b578063d9197c321461037e578063ef7df66b14610387578063f2bc9e051461039a578063f2fde38b146103ad578063f8939e0c146103c057600080fd5b806398764d8314610278578063a4d1776d1461029b578063a5e7f9ea146102a4578063a6a2ee02146102ce578063ae3d5414146102e157600080fd5b80633bb624c21161010a5780633bb624c2146101fb578063582abd121461020e578063715018a614610239578063788cb4d9146102415780637b58c4bd146102545780638da5cb5b1461026757600080fd5b80630e58f7c314610147578063150b7a02146101885780631ecaef43146101c057806329a86c52146101d55780632ce8939a146101e8575b600080fd5b6101756101553660046114a0565b600090815260086020526040902054600160281b900464ffffffffff1690565b6040519081526020015b60405180910390f35b6101a7610196366004611516565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161017f565b6101d36101ce366004611634565b6103d3565b005b6101d36101e336600461168f565b6104a5565b6101756101f63660046114a0565b6104cf565b6101d36102093660046114a0565b6104f0565b600554610221906001600160a01b031681565b6040516001600160a01b03909116815260200161017f565b6101d36104fd565b600254610221906001600160a01b031681565b6101d36102623660046116f5565b610511565b6000546001600160a01b0316610221565b61028b610286366004611760565b6105cf565b60405161017f94939291906117e3565b61017560065481565b6101756102b23660046114a0565b600090815260086020526040902054600160501b900460ff1690565b6101d36102dc366004611890565b61085d565b6103316102ef3660046114a0565b60086020526000908152604090205464ffffffffff80821691600160281b810490911690600160501b810460ff1690600160581b90046001600160a01b031684565b6040805164ffffffffff958616815294909316602085015260ff909116918301919091526001600160a01b0316606082015260800161017f565b600354610221906001600160a01b031681565b61017560045481565b6101d36103953660046114a0565b61087c565b6101d36103a836600461168f565b610889565b6101d36103bb36600461168f565b6108b3565b6101d36103ce3660046118cc565b61092c565b6103db610a9a565b6004548164ffffffffff1611156104315760405162461bcd60e51b8152602060048201526015602482015274109bdc99195c88191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064015b60405180910390fd5b60005b82518110156104a05781600860008584815181106104545761045461198f565b6020026020010151815260200190815260200160002060000160056101000a81548164ffffffffff021916908364ffffffffff1602179055508080610498906119bb565b915050610434565b505050565b6104ad610a9a565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600781815481106104df57600080fd5b600091825260209091200154905081565b6104f8610a9a565b600655565b610505610a9a565b61050f6000610af4565b565b610519610b44565b8281146105685760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610428565b60005b838110156105bf576105ad8585838181106105885761058861198f565b905060200201358484848181106105a1576105a161198f565b90506020020135610b9d565b806105b7816119bb565b91505061056b565b506105c960018055565b50505050565b60608080806000856001600160401b038111156105ee576105ee611584565b604051908082528060200260200182016040528015610617578160200160208202803683370190505b5090506000866001600160401b0381111561063457610634611584565b60405190808252806020026020018201604052801561065d578160200160208202803683370190505b5090506000876001600160401b0381111561067a5761067a611584565b6040519080825280602002602001820160405280156106a3578160200160208202803683370190505b5090506000886001600160401b038111156106c0576106c0611584565b6040519080825280602002602001820160405280156106e9578160200160208202803683370190505b50905060005b8981101561084c576000600860008d8d8581811061070f5761070f61198f565b602090810292909201358352508181019290925260409081016000208151608081018352905464ffffffffff808216808452600160281b830490911694830194909452600160501b810460ff1692820192909252600160581b9091046001600160a01b0316606082015287519092508790849081106107905761079061198f565b602002602001019064ffffffffff16908164ffffffffff168152505080602001518583815181106107c3576107c361198f565b602002602001019064ffffffffff16908164ffffffffff168152505080604001518483815181106107f6576107f661198f565b602002602001019060ff16908160ff168152505080606001518383815181106108215761082161198f565b6001600160a01b03909216602092830291909101909101525080610844816119bb565b9150506106ef565b509299919850965090945092505050565b610865610a9a565b8051610878906007906020840190611440565b5050565b610884610a9a565b600455565b610891610a9a565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6108bb610a9a565b6001600160a01b0381166109205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610428565b61092981610af4565b50565b610934610b44565b8685146109835760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610428565b6000338989898989896040516020016109a297969594939291906119fd565b60408051601f1981840301815291905280516020909101206005549091506109d5906001600160a01b0316828585610d17565b610a155760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610428565b60005b88811015610a8557610a738a8a83818110610a3557610a3561198f565b90506020020135898984818110610a4e57610a4e61198f565b90506020020135888885818110610a6757610a6761198f565b90506020020135610dcd565b80610a7d816119bb565b915050610a18565b5050610a9060018055565b5050505050505050565b6000546001600160a01b0316331461050f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610428565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600260015403610b965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610428565b6002600155565b60008281526008602052604090206004548154600160281b900464ffffffffff1610610c0b5760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e20697320616c7265616479206d61786564206f75740000000000006044820152606401610428565b600354604051632142170760e11b8152336004820152306024820152604481018590526001600160a01b03909116906342842e0e90606401600060405180830381600087803b158015610c5d57600080fd5b505af1158015610c71573d6000803e3d6000fd5b5050600254604051635209071360e01b8152600481018690523360248201526001600160a01b03909116925063520907139150604401600060405180830381600087803b158015610cc157600080fd5b505af1158015610cd5573d6000803e3d6000fd5b50508254600160581b33027fff0000000000000000000000000000000000000000ffffffffffff000000000090911664ffffffffff4216171790925550505050565b6000610daf610d73856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061117892505050565b6001600160a01b0316856001600160a01b0316149050949350505050565b60008381526008602052604090208054600160581b90046001600160a01b03163314610e275760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606401610428565b6006548154610e3d9064ffffffffff1642611a43565b1015610e8b5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e2063616e206e6f74206c65617665207761722079657400000000006044820152606401610428565b8054600160501b900460ff168214610ee55760405162461bcd60e51b815260206004820152601b60248201527f426174746c6520696e64657820646f6573206e6f74206d6174636800000000006044820152606401610428565b805464ffffffffff19168082556001908290600a90610f0f908490600160501b900460ff16611a56565b92506101000a81548160ff021916908360ff160217905550610f6b848460078460000160059054906101000a900464ffffffffff1664ffffffffff1681548110610f5b57610f5b61198f565b906000526020600020015461119e565b1561108857604080516001808252818301909252600091602080830190803683370190505090508481600081518110610fa657610fa661198f565b602090810291909101015281547fff0000000000000000000000000000000000000000ffffffffffffffffffffff16825560035460405163b80f55c960e01b81526001600160a01b039091169063b80f55c990611007908490600401611a6f565b600060405180830381600087803b15801561102157600080fd5b505af1158015611035573d6000803e3d6000fd5b5050835460408051898152600160281b90920464ffffffffff1660208301527f735b6ee0baa0e267b335b9cbe4a627617e13b2cd15bcf0382430f8c73f356a0e935001905060405180910390a1506105c9565b6003546040516323b872dd60e01b8152306004820152336024820152604481018690526001600160a01b03909116906323b872dd90606401600060405180830381600087803b1580156110da57600080fd5b505af11580156110ee573d6000803e3d6000fd5b5050825461110e9250600160281b900464ffffffffff1690506001611ab3565b815469ffffffffff00000000001916600160281b64ffffffffff928316810291909117808455604080518881529290910490921660208201527fc6e154d143a863e2cce9664b681e1abf3260e6350b653095c731bec6f16dccde910160405180910390a150505050565b600080600061118785856111ed565b9150915061119481611232565b5090505b92915050565b600080606485856040516020016111bf929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c6111e29190611ad8565b909211949350505050565b60008082516041036112235760208301516040840151606085015160001a6112178782858561137c565b9450945050505061122b565b506000905060025b9250929050565b600081600481111561124657611246611afa565b0361124e5750565b600181600481111561126257611262611afa565b036112af5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610428565b60028160048111156112c3576112c3611afa565b036113105760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610428565b600381600481111561132457611324611afa565b036109295760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610428565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113b35750600090506003611437565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611407573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661143057600060019250925050611437565b9150600090505b94509492505050565b82805482825590600052602060002090810192821561147b579160200282015b8281111561147b578251825591602001919060010190611460565b5061148792915061148b565b5090565b5b80821115611487576000815560010161148c565b6000602082840312156114b257600080fd5b5035919050565b80356001600160a01b03811681146114d057600080fd5b919050565b60008083601f8401126114e757600080fd5b5081356001600160401b038111156114fe57600080fd5b60208301915083602082850101111561122b57600080fd5b60008060008060006080868803121561152e57600080fd5b611537866114b9565b9450611545602087016114b9565b93506040860135925060608601356001600160401b0381111561156757600080fd5b611573888289016114d5565b969995985093965092949392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126115ab57600080fd5b813560206001600160401b03808311156115c7576115c7611584565b8260051b604051601f19603f830116810181811084821117156115ec576115ec611584565b60405293845285810183019383810192508785111561160a57600080fd5b83870191505b8482101561162957813583529183019190830190611610565b979650505050505050565b6000806040838503121561164757600080fd5b82356001600160401b0381111561165d57600080fd5b6116698582860161159a565b925050602083013564ffffffffff8116811461168457600080fd5b809150509250929050565b6000602082840312156116a157600080fd5b6116aa826114b9565b9392505050565b60008083601f8401126116c357600080fd5b5081356001600160401b038111156116da57600080fd5b6020830191508360208260051b850101111561122b57600080fd5b6000806000806040858703121561170b57600080fd5b84356001600160401b038082111561172257600080fd5b61172e888389016116b1565b9096509450602087013591508082111561174757600080fd5b50611754878288016116b1565b95989497509550505050565b6000806020838503121561177357600080fd5b82356001600160401b0381111561178957600080fd5b611795858286016116b1565b90969095509350505050565b600081518084526020808501945080840160005b838110156117d857815164ffffffffff16875295820195908201906001016117b5565b509495945050505050565b6080815260006117f660808301876117a1565b60208382038185015261180982886117a1565b8481036040860152865180825282880193509082019060005b8181101561184157845160ff1683529383019391830191600101611822565b50508481036060860152855180825290820192508186019060005b818110156118815782516001600160a01b03168552938301939183019160010161185c565b50929998505050505050505050565b6000602082840312156118a257600080fd5b81356001600160401b038111156118b857600080fd5b6118c48482850161159a565b949350505050565b6000806000806000806000806080898b0312156118e857600080fd5b88356001600160401b03808211156118ff57600080fd5b61190b8c838d016116b1565b909a50985060208b013591508082111561192457600080fd5b6119308c838d016116b1565b909850965060408b013591508082111561194957600080fd5b6119558c838d016116b1565b909650945060608b013591508082111561196e57600080fd5b5061197b8b828c016114d5565b999c989b5096995094979396929594505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016119cd576119cd6119a5565b5060010190565b60006001600160fb1b038311156119ea57600080fd5b8260051b80838637939093019392505050565b6bffffffffffffffffffffffff198860601b1681526000611a36611a2f611a28601485018a8c6119d4565b87896119d4565b84866119d4565b9998505050505050505050565b81810381811115611198576111986119a5565b60ff8181168382160190811115611198576111986119a5565b6020808252825182820181905260009190848201906040850190845b81811015611aa757835183529284019291840191600101611a8b565b50909695505050505050565b64ffffffffff818116838216019080821115611ad157611ad16119a5565b5092915050565b600082611af557634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052602160045260246000fdfea264697066735822122098aae522cbae28e01038c27e9bd433dc46406e6e924aa60ef668dca3f2a2c14864736f6c63430008130033
Deployed Bytecode Sourcemap
36962:5758:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40540:165;;;;;;:::i;:::-;40603:7;40648:20;;;:11;:20;;;;;40686:11;-1:-1:-1;;;40686:11:0;;;;;40540:165;;;;345:25:1;;;333:2;318:18;40540:165:0;;;;;;;;42496:219;;;;;;:::i;:::-;-1:-1:-1;;;42496:219:0;;;;;;;;;;;-1:-1:-1;;;;;;1704:33:1;;;1686:52;;1674:2;1659:18;42496:219:0;1542:202:1;41788:277:0;;;;;;:::i;:::-;;:::i;:::-;;42182:97;;;;;;:::i;:::-;;:::i;37349:49::-;;;;;;:::i;:::-;;:::i;41691:89::-;;;;;;:::i;:::-;;:::i;37234:66::-;;;;;-1:-1:-1;;;;;37234:66:0;;;;;;-1:-1:-1;;;;;3662:32:1;;;3644:51;;3632:2;3617:18;37234:66:0;3498:203:1;35412:103:0;;;:::i;37036:77::-;;;;;-1:-1:-1;;;;;37036:77:0;;;37714:304;;;;;;:::i;:::-;;:::i;34764:87::-;34810:7;34837:6;-1:-1:-1;;;;;34837:6:0;34764:87;;40899:784;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;37309:33::-;;;;;;40713:178;;;;;;:::i;:::-;40779:7;40824:20;;;:11;:20;;;;;40862:21;-1:-1:-1;;;40862:21:0;;;;;40713:178;42073:101;;;;;;:::i;:::-;;:::i;37543:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;37543:48:0;;;;;;-1:-1:-1;;;37543:48:0;;;;;-1:-1:-1;;;37543:48:0;;-1:-1:-1;;;;;37543:48:0;;;;;;;7902:12:1;7941:15;;;7923:34;;7993:15;;;;7988:2;7973:18;;7966:43;8057:4;8045:17;;;8025:18;;;8018:45;;;;-1:-1:-1;;;;;8099:32:1;8094:2;8079:18;;8072:60;7879:3;7864:19;37543:48:0;7669:469:1;37120:73:0;;;;;-1:-1:-1;;;;;37120:73:0;;;37200:27;;;;;;42400:88;;;;;;:::i;:::-;;:::i;42287:105::-;;;;;;:::i;:::-;;:::i;35670:201::-;;;;;;:::i;:::-;;:::i;38480:586::-;;;;;;:::i;:::-;;:::i;41788:277::-;34650:13;:11;:13::i;:::-;41901:8:::1;;41890:7;:19;;;;41882:53;;;::::0;-1:-1:-1;;;41882:53:0;;9726:2:1;41882:53:0::1;::::0;::::1;9708:21:1::0;9765:2;9745:18;;;9738:30;-1:-1:-1;;;9784:18:1;;;9777:51;9845:18;;41882:53:0::1;;;;;;;;;41953:9;41949:97;41972:7;:14;41968:1;:18;41949:97;;;42039:7;42006:11;:23;42018:7;42026:1;42018:10;;;;;;;;:::i;:::-;;;;;;;42006:23;;;;;;;;;;;:30;;;:40;;;;;;;;;;;;;;;;;;41988:3;;;;;:::i;:::-;;;;41949:97;;;;41788:277:::0;;:::o;42182:97::-;34650:13;:11;:13::i;:::-;42250::::1;:21:::0;;-1:-1:-1;;;;;;42250:21:0::1;-1:-1:-1::0;;;;;42250:21:0;;;::::1;::::0;;;::::1;::::0;;42182:97::o;37349:49::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37349:49:0;:::o;41691:89::-;34650:13;:11;:13::i;:::-;41757:7:::1;:15:::0;41691:89::o;35412:103::-;34650:13;:11;:13::i;:::-;35477:30:::1;35504:1;35477:18;:30::i;:::-;35412:103::o:0;37714:304::-;32035:21;:19;:21::i;:::-;37832:36;;::::1;37824:79;;;::::0;-1:-1:-1;;;37824:79:0;;10480:2:1;37824:79:0::1;::::0;::::1;10462:21:1::0;10519:2;10499:18;;;10492:30;10558:32;10538:18;;;10531:60;10608:18;;37824:79:0::1;10278:354:1::0;37824:79:0::1;37920:9;37916:94;37935:19:::0;;::::1;37916:94;;;37974:36;37983:8;;37992:1;37983:11;;;;;;;:::i;:::-;;;;;;;37996:10;;38007:1;37996:13;;;;;;;:::i;:::-;;;;;;;37974:8;:36::i;:::-;37956:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37916:94;;;;32079:20:::0;31473:1;32599:22;;32416:213;32079:20;37714:304;;;;:::o;40899:784::-;40974:15;;;;41053:21;41090:8;-1:-1:-1;;;;;41077:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41077:29:0;-1:-1:-1;41053:53:0;-1:-1:-1;41117:23:0;41156:8;-1:-1:-1;;;;;41143:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41143:29:0;-1:-1:-1;41117:55:0;-1:-1:-1;41183:31:0;41229:8;-1:-1:-1;;;;;41217:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41217:28:0;-1:-1:-1;41183:62:0;-1:-1:-1;41256:23:0;41296:8;-1:-1:-1;;;;;41282:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41282:30:0;;41256:56;;41329:9;41325:289;41344:19;;;41325:289;;;41385:21;41409:11;:24;41421:8;;41430:1;41421:11;;;;;;;:::i;:::-;;;;;;;;;;41409:24;;-1:-1:-1;41409:24:0;;;;;;;;;;;-1:-1:-1;41409:24:0;41385:48;;;;;;;;;;;;;;;;-1:-1:-1;;;41385:48:0;;;;;;;;;;;;-1:-1:-1;;;41385:48:0;;;;;;;;;;;-1:-1:-1;;;41385:48:0;;;-1:-1:-1;;;;;41385:48:0;;;;;41448:8;;41385:48;;-1:-1:-1;41448:8:0;;41454:1;;41448:8;;;;;;:::i;:::-;;;;;;:20;;;;;;;;;;;41496:4;:11;;;41483:7;41491:1;41483:10;;;;;;;;:::i;:::-;;;;;;:24;;;;;;;;;;;41544:4;:21;;;41522:16;41539:1;41522:19;;;;;;;;:::i;:::-;;;;;;:43;;;;;;;;;;;41592:4;:10;;;41580:6;41587:1;41580:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41580:22:0;;;:9;;;;;;;;;;;:22;-1:-1:-1;41365:3:0;;;;:::i;:::-;;;;41325:289;;;-1:-1:-1;41634:5:0;;41641:7;;-1:-1:-1;41641:7:0;-1:-1:-1;41634:5:0;;-1:-1:-1;40899:784:0;-1:-1:-1;;;40899:784:0:o;42073:101::-;34650:13;:11;:13::i;:::-;42148:18;;::::1;::::0;:9:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42073:101:::0;:::o;42400:88::-;34650:13;:11;:13::i;:::-;42465:8:::1;:15:::0;42400:88::o;42287:105::-;34650:13;:11;:13::i;:::-;42359:17:::1;:25:::0;;-1:-1:-1;;;;;;42359:25:0::1;-1:-1:-1::0;;;;;42359:25:0;;;::::1;::::0;;;::::1;::::0;;42287:105::o;35670:201::-;34650:13;:11;:13::i;:::-;-1:-1:-1;;;;;35759:22:0;::::1;35751:73;;;::::0;-1:-1:-1;;;35751:73:0;;10839:2:1;35751:73:0::1;::::0;::::1;10821:21:1::0;10878:2;10858:18;;;10851:30;10917:34;10897:18;;;10890:62;-1:-1:-1;;;10968:18:1;;;10961:36;11014:19;;35751:73:0::1;10637:402:1::0;35751:73:0::1;35835:28;35854:8;35835:18;:28::i;:::-;35670:201:::0;:::o;38480:586::-;32035:21;:19;:21::i;:::-;38664:39;;::::1;38656:82;;;::::0;-1:-1:-1;;;38656:82:0;;10480:2:1;38656:82:0::1;::::0;::::1;10462:21:1::0;10519:2;10499:18;;;10492:30;10558:32;10538:18;;;10531:60;10608:18;;38656:82:0::1;10278:354:1::0;38656:82:0::1;38751:12;38793:10;38805:8;;38815:13;;38830;;38776:68;;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;38776:68:0;;::::1;::::0;;;;;;38766:79;;38776:68:::1;38766:79:::0;;::::1;::::0;38881:6:::1;::::0;38766:79;;-1:-1:-1;38864:41:0::1;::::0;-1:-1:-1;;;;;38881:6:0::1;38766:79:::0;38895:9;;38864:16:::1;:41::i;:::-;38856:71;;;::::0;-1:-1:-1;;;38856:71:0;;12175:2:1;38856:71:0::1;::::0;::::1;12157:21:1::0;12214:2;12194:18;;;12187:30;-1:-1:-1;;;12233:18:1;;;12226:47;12290:18;;38856:71:0::1;11973:341:1::0;38856:71:0::1;38944:9;38940:116;38959:19:::0;;::::1;38940:116;;;38998:58;39008:8;;39017:1;39008:11;;;;;;;:::i;:::-;;;;;;;39021:13;;39035:1;39021:16;;;;;;;:::i;:::-;;;;;;;39039:13;;39053:1;39039:16;;;;;;;:::i;:::-;;;;;;;38998:9;:58::i;:::-;38980:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38940:116;;;;38643:423;32079:20:::0;31473:1;32599:22;;32416:213;32079:20;38480:586;;;;;;;;:::o;34929:132::-;34810:7;34837:6;-1:-1:-1;;;;;34837:6:0;33395:10;34993:23;34985:68;;;;-1:-1:-1;;;34985:68:0;;12521:2:1;34985:68:0;;;12503:21:1;;;12540:18;;;12533:30;12599:34;12579:18;;;12572:62;12651:18;;34985:68:0;12319:356:1;36031:191:0;36105:16;36124:6;;-1:-1:-1;;;;;36141:17:0;;;-1:-1:-1;;;;;;36141:17:0;;;;;;36174:40;;36124:6;;;;;;;36174:40;;36105:16;36174:40;36094:128;36031:191;:::o;32115:293::-;31517:1;32249:7;;:19;32241:63;;;;-1:-1:-1;;;32241:63:0;;12882:2:1;32241:63:0;;;12864:21:1;12921:2;12901:18;;;12894:30;12960:33;12940:18;;;12933:61;13011:18;;32241:63:0;12680:355:1;32241:63:0;31517:1;32382:7;:18;32115:293::o;38026:446::-;38100:22;38125:20;;;:11;:20;;;;;38180:8;;38166:11;;-1:-1:-1;;;38166:11:0;;;;:22;38158:61;;;;-1:-1:-1;;;38158:61:0;;13242:2:1;38158:61:0;;;13224:21:1;13281:2;13261:18;;;13254:30;13320:28;13300:18;;;13293:56;13366:18;;38158:61:0;13040:350:1;38158:61:0;38237:13;;38232:72;;-1:-1:-1;;;38232:72:0;;38269:10;38232:72;;;13635:34:1;38289:4:0;13685:18:1;;;13678:43;13737:18;;;13730:34;;;-1:-1:-1;;;;;38237:13:0;;;;38232:36;;13570:18:1;;38232:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38326:17:0;;38317:65;;-1:-1:-1;;;38317:65:0;;;;;13949:25:1;;;38371:10:0;13990:18:1;;;13983:60;-1:-1:-1;;;;;38326:17:0;;;;-1:-1:-1;38317:42:0;;-1:-1:-1;13922:18:1;;38317:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38395:35:0;;-1:-1:-1;;;38454:10:0;38441:23;;;;;38395:35;38414:15;38395:35;38441:23;;;;;-1:-1:-1;;;;38026:446:0:o;40070:213::-;40178:4;40213:62;40227:35;40256:5;27523:58;;16718:66:1;27523:58:0;;;16706:79:1;16801:12;;;16794:28;;;27390:7:0;;16838:12:1;;27523:58:0;;;;;;;;;;;;27513:69;;;;;;27506:76;;27321:269;;;;40227:35;40264:10;;40213:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40213:13:0;;-1:-1:-1;;;40213:62:0:i;:::-;-1:-1:-1;;;;;40202:73:0;:7;-1:-1:-1;;;;;40202:73:0;;40195:80;;40070:213;;;;;;:::o;39074:988::-;39175:22;39200:20;;;:11;:20;;;;;39255:10;;-1:-1:-1;;;39255:10:0;;-1:-1:-1;;;;;39255:10:0;39241;:24;39233:46;;;;-1:-1:-1;;;39233:46:0;;14256:2:1;39233:46:0;;;14238:21:1;14295:1;14275:18;;;14268:29;-1:-1:-1;;;14313:18:1;;;14306:39;14362:18;;39233:46:0;14054:332:1;39233:46:0;39329:7;;39316:9;;39298:27;;39316:9;;39298:15;:27;:::i;:::-;:38;;39290:78;;;;-1:-1:-1;;;39290:78:0;;14726:2:1;39290:78:0;;;14708:21:1;14765:2;14745:18;;;14738:30;14804:29;14784:18;;;14777:57;14851:18;;39290:78:0;14524:351:1;39290:78:0;39402:21;;-1:-1:-1;;;39402:21:0;;;;39387:36;;39379:76;;;;-1:-1:-1;;;39379:76:0;;15082:2:1;39379:76:0;;;15064:21:1;15121:2;15101:18;;;15094:30;15160:29;15140:18;;;15133:57;15207:18;;39379:76:0;14880:351:1;39379:76:0;39468:13;;-1:-1:-1;;39468:13:0;;;;-1:-1:-1;;39468:13:0;;39494:21;;:26;;-1:-1:-1;;;;;39494:26:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39536:56;39546:7;39555:12;39569:9;39579:4;:11;;;;;;;;;;;;39569:22;;;;;;;;;;:::i;:::-;;;;;;;;;39536:9;:56::i;:::-;39533:522;;;39639:16;;;39653:1;39639:16;;;;;;;;;39611:25;;39639:16;;;;;;;;;;;-1:-1:-1;39639:16:0;39611:44;;39684:7;39670:8;39679:1;39670:11;;;;;;;;:::i;:::-;;;;;;;;;;:21;39708:23;;;;;;39753:13;;39748:34;;-1:-1:-1;;;39748:34:0;;-1:-1:-1;;;;;39753:13:0;;;;39748:24;;:34;;39773:8;;39748:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39821:11:0;;39804:29;;;16199:25:1;;;-1:-1:-1;;;39821:11:0;;;;;16255:2:1;16240:18;;16233:53;39804:29:0;;-1:-1:-1;16172:18:1;;-1:-1:-1;39804:29:0;;;;;;;39594:261;39533:522;;;39883:13;;39878:68;;-1:-1:-1;;;39878:68:0;;39919:4;39878:68;;;13635:34:1;39926:10:0;13685:18:1;;;13678:43;13737:18;;;13730:34;;;-1:-1:-1;;;;;39883:13:0;;;;39878:32;;13570:18:1;;39878:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39978:11:0;;:15;;-1:-1:-1;;;;39978:11:0;;;;;-1:-1:-1;39992:1:0;39978:15;:::i;:::-;39964:29;;-1:-1:-1;;39964:29:0;-1:-1:-1;;;39964:29:0;;;;;;;;;;;;;40015:28;;;16199:25:1;;;40031:11:0;;;;;;;16255:2:1;16240:18;;16233:53;40015:28:0;;16172:18:1;40015:28:0;;;;;;;39162:900;39074:988;;;:::o;23631:231::-;23709:7;23730:17;23749:18;23771:27;23782:4;23788:9;23771:10;:27::i;:::-;23729:69;;;;23809:18;23821:5;23809:11;:18::i;:::-;-1:-1:-1;23845:9:0;-1:-1:-1;23631:231:0;;;;;:::o;40291:241::-;40384:4;40401:20;40480:3;40459:7;40468:6;40442:33;;;;;;;;17018:19:1;;;17062:2;17053:12;;17046:28;17099:2;17090:12;;16861:247;40442:33:0;;;;;;;;;;;;;40432:44;;;;;;40424:53;;:59;;;;:::i;:::-;-1:-1:-1;;;;40291:241:0;-1:-1:-1;;;;40291:241:0:o;22082:747::-;22163:7;22172:12;22201:9;:16;22221:2;22201:22;22197:625;;22545:4;22530:20;;22524:27;22595:4;22580:20;;22574:27;22653:4;22638:20;;22632:27;22240:9;22624:36;22696:25;22707:4;22624:36;22524:27;22574;22696:10;:25::i;:::-;22689:32;;;;;;;;;22197:625;-1:-1:-1;22770:1:0;;-1:-1:-1;22774:35:0;22197:625;22082:747;;;;;:::o;20475:521::-;20553:20;20544:5;:29;;;;;;;;:::i;:::-;;20540:449;;20475:521;:::o;20540:449::-;20651:29;20642:5;:38;;;;;;;;:::i;:::-;;20638:351;;20697:34;;-1:-1:-1;;;20697:34:0;;17661:2:1;20697:34:0;;;17643:21:1;17700:2;17680:18;;;17673:30;17739:26;17719:18;;;17712:54;17783:18;;20697:34:0;17459:348:1;20638:351:0;20762:35;20753:5;:44;;;;;;;;:::i;:::-;;20749:240;;20814:41;;-1:-1:-1;;;20814:41:0;;18014:2:1;20814:41:0;;;17996:21:1;18053:2;18033:18;;;18026:30;18092:33;18072:18;;;18065:61;18143:18;;20814:41:0;17812:355:1;20749:240:0;20886:30;20877:5;:39;;;;;;;;:::i;:::-;;20873:116;;20933:44;;-1:-1:-1;;;20933:44:0;;18374:2:1;20933:44:0;;;18356:21:1;18413:2;18393:18;;;18386:30;18452:34;18432:18;;;18425:62;-1:-1:-1;;;18503:18:1;;;18496:32;18545:19;;20933:44:0;18172:398:1;25083:1520:0;25214:7;;26148:66;26135:79;;26131:163;;;-1:-1:-1;26247:1:0;;-1:-1:-1;26251:30:0;26231:51;;26131:163;26408:24;;;26391:14;26408:24;;;;;;;;;18802:25:1;;;18875:4;18863:17;;18843:18;;;18836:45;;;;18897:18;;;18890:34;;;18940:18;;;18933:34;;;26408:24:0;;18774:19:1;;26408:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26408:24:0;;-1:-1:-1;;26408:24:0;;;-1:-1:-1;;;;;;;26447:20:0;;26443:103;;26500:1;26504:29;26484:50;;;;;;;26443:103;26566:6;-1:-1:-1;26574:20:0;;-1:-1:-1;25083:1520:0;;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;381:173::-;449:20;;-1:-1:-1;;;;;498:31:1;;488:42;;478:70;;544:1;541;534:12;478:70;381:173;;;:::o;559:347::-;610:8;620:6;674:3;667:4;659:6;655:17;651:27;641:55;;692:1;689;682:12;641:55;-1:-1:-1;715:20:1;;-1:-1:-1;;;;;747:30:1;;744:50;;;790:1;787;780:12;744:50;827:4;819:6;815:17;803:29;;879:3;872:4;863:6;855;851:19;847:30;844:39;841:59;;;896:1;893;886:12;911:626;1008:6;1016;1024;1032;1040;1093:3;1081:9;1072:7;1068:23;1064:33;1061:53;;;1110:1;1107;1100:12;1061:53;1133:29;1152:9;1133:29;:::i;:::-;1123:39;;1181:38;1215:2;1204:9;1200:18;1181:38;:::i;:::-;1171:48;;1266:2;1255:9;1251:18;1238:32;1228:42;;1321:2;1310:9;1306:18;1293:32;-1:-1:-1;;;;;1340:6:1;1337:30;1334:50;;;1380:1;1377;1370:12;1334:50;1419:58;1469:7;1460:6;1449:9;1445:22;1419:58;:::i;:::-;911:626;;;;-1:-1:-1;911:626:1;;-1:-1:-1;1496:8:1;;1393:84;911:626;-1:-1:-1;;;911:626:1:o;1749:127::-;1810:10;1805:3;1801:20;1798:1;1791:31;1841:4;1838:1;1831:15;1865:4;1862:1;1855:15;1881:902;1935:5;1988:3;1981:4;1973:6;1969:17;1965:27;1955:55;;2006:1;2003;1996:12;1955:55;2042:6;2029:20;2068:4;-1:-1:-1;;;;;2128:2:1;2124;2121:10;2118:36;;;2134:18;;:::i;:::-;2180:2;2177:1;2173:10;2212:2;2206:9;2275:2;2271:7;2266:2;2262;2258:11;2254:25;2246:6;2242:38;2330:6;2318:10;2315:22;2310:2;2298:10;2295:18;2292:46;2289:72;;;2341:18;;:::i;:::-;2377:2;2370:22;2427:18;;;2503:15;;;2499:24;;;2461:15;;;;-1:-1:-1;2535:15:1;;;2532:35;;;2563:1;2560;2553:12;2532:35;2599:2;2591:6;2587:15;2576:26;;2611:142;2627:6;2622:3;2619:15;2611:142;;;2693:17;;2681:30;;2731:12;;;;2644;;;;2611:142;;;2771:6;1881:902;-1:-1:-1;;;;;;;1881:902:1:o;2788:514::-;2880:6;2888;2941:2;2929:9;2920:7;2916:23;2912:32;2909:52;;;2957:1;2954;2947:12;2909:52;2997:9;2984:23;-1:-1:-1;;;;;3022:6:1;3019:30;3016:50;;;3062:1;3059;3052:12;3016:50;3085:61;3138:7;3129:6;3118:9;3114:22;3085:61;:::i;:::-;3075:71;;;3196:2;3185:9;3181:18;3168:32;3240:12;3233:5;3229:24;3222:5;3219:35;3209:63;;3268:1;3265;3258:12;3209:63;3291:5;3281:15;;;2788:514;;;;;:::o;3307:186::-;3366:6;3419:2;3407:9;3398:7;3394:23;3390:32;3387:52;;;3435:1;3432;3425:12;3387:52;3458:29;3477:9;3458:29;:::i;:::-;3448:39;3307:186;-1:-1:-1;;;3307:186:1:o;3706:367::-;3769:8;3779:6;3833:3;3826:4;3818:6;3814:17;3810:27;3800:55;;3851:1;3848;3841:12;3800:55;-1:-1:-1;3874:20:1;;-1:-1:-1;;;;;3906:30:1;;3903:50;;;3949:1;3946;3939:12;3903:50;3986:4;3978:6;3974:17;3962:29;;4046:3;4039:4;4029:6;4026:1;4022:14;4014:6;4010:27;4006:38;4003:47;4000:67;;;4063:1;4060;4053:12;4078:773;4200:6;4208;4216;4224;4277:2;4265:9;4256:7;4252:23;4248:32;4245:52;;;4293:1;4290;4283:12;4245:52;4333:9;4320:23;-1:-1:-1;;;;;4403:2:1;4395:6;4392:14;4389:34;;;4419:1;4416;4409:12;4389:34;4458:70;4520:7;4511:6;4500:9;4496:22;4458:70;:::i;:::-;4547:8;;-1:-1:-1;4432:96:1;-1:-1:-1;4635:2:1;4620:18;;4607:32;;-1:-1:-1;4651:16:1;;;4648:36;;;4680:1;4677;4670:12;4648:36;;4719:72;4783:7;4772:8;4761:9;4757:24;4719:72;:::i;:::-;4078:773;;;;-1:-1:-1;4810:8:1;-1:-1:-1;;;;4078:773:1:o;4856:437::-;4942:6;4950;5003:2;4991:9;4982:7;4978:23;4974:32;4971:52;;;5019:1;5016;5009:12;4971:52;5059:9;5046:23;-1:-1:-1;;;;;5084:6:1;5081:30;5078:50;;;5124:1;5121;5114:12;5078:50;5163:70;5225:7;5216:6;5205:9;5201:22;5163:70;:::i;:::-;5252:8;;5137:96;;-1:-1:-1;4856:437:1;-1:-1:-1;;;;4856:437:1:o;5298:453::-;5350:3;5388:5;5382:12;5415:6;5410:3;5403:19;5441:4;5470:2;5465:3;5461:12;5454:19;;5507:2;5500:5;5496:14;5528:1;5538:188;5552:6;5549:1;5546:13;5538:188;;;5617:13;;5632:12;5613:32;5601:45;;5666:12;;;;5701:15;;;;5574:1;5567:9;5538:188;;;-1:-1:-1;5742:3:1;;5298:453;-1:-1:-1;;;;;5298:453:1:o;5756:1555::-;6161:3;6150:9;6143:22;6124:4;6188:56;6239:3;6228:9;6224:19;6216:6;6188:56;:::i;:::-;6263:2;6313:9;6305:6;6301:22;6296:2;6285:9;6281:18;6274:50;6347:43;6383:6;6375;6347:43;:::i;:::-;6426:22;;;6421:2;6406:18;;6399:50;6498:13;;6520:22;;;6596:15;;;;-1:-1:-1;6558:15:1;;;;6629:1;6639:180;6653:6;6650:1;6647:13;6639:180;;;6718:13;;6733:4;6714:24;6702:37;;6794:15;;;;6759:12;;;;6675:1;6668:9;6639:180;;;-1:-1:-1;;6855:19:1;;;6850:2;6835:18;;6828:47;6925:13;;6947:21;;;6986:12;;;;-1:-1:-1;7023:15:1;;;;7058:1;7068:215;7084:8;7079:3;7076:17;7068:215;;;7157:15;;-1:-1:-1;;;;;7153:41:1;7139:56;;7217:14;;;;7256:17;;;;7191:1;7103:11;7068:215;;;-1:-1:-1;7300:5:1;;5756:1555;-1:-1:-1;;;;;;;;;5756:1555:1:o;7316:348::-;7400:6;7453:2;7441:9;7432:7;7428:23;7424:32;7421:52;;;7469:1;7466;7459:12;7421:52;7509:9;7496:23;-1:-1:-1;;;;;7534:6:1;7531:30;7528:50;;;7574:1;7571;7564:12;7528:50;7597:61;7650:7;7641:6;7630:9;7626:22;7597:61;:::i;:::-;7587:71;7316:348;-1:-1:-1;;;;7316:348:1:o;8143:1376::-;8321:6;8329;8337;8345;8353;8361;8369;8377;8430:3;8418:9;8409:7;8405:23;8401:33;8398:53;;;8447:1;8444;8437:12;8398:53;8487:9;8474:23;-1:-1:-1;;;;;8557:2:1;8549:6;8546:14;8543:34;;;8573:1;8570;8563:12;8543:34;8612:70;8674:7;8665:6;8654:9;8650:22;8612:70;:::i;:::-;8701:8;;-1:-1:-1;8586:96:1;-1:-1:-1;8789:2:1;8774:18;;8761:32;;-1:-1:-1;8805:16:1;;;8802:36;;;8834:1;8831;8824:12;8802:36;8873:72;8937:7;8926:8;8915:9;8911:24;8873:72;:::i;:::-;8964:8;;-1:-1:-1;8847:98:1;-1:-1:-1;9052:2:1;9037:18;;9024:32;;-1:-1:-1;9068:16:1;;;9065:36;;;9097:1;9094;9087:12;9065:36;9136:72;9200:7;9189:8;9178:9;9174:24;9136:72;:::i;:::-;9227:8;;-1:-1:-1;9110:98:1;-1:-1:-1;9315:2:1;9300:18;;9287:32;;-1:-1:-1;9331:16:1;;;9328:36;;;9360:1;9357;9350:12;9328:36;;9399:60;9451:7;9440:8;9429:9;9425:24;9399:60;:::i;:::-;8143:1376;;;;-1:-1:-1;8143:1376:1;;-1:-1:-1;8143:1376:1;;;;;;9478:8;-1:-1:-1;;;8143:1376:1:o;9874:127::-;9935:10;9930:3;9926:20;9923:1;9916:31;9966:4;9963:1;9956:15;9990:4;9987:1;9980:15;10006:127;10067:10;10062:3;10058:20;10055:1;10048:31;10098:4;10095:1;10088:15;10122:4;10119:1;10112:15;10138:135;10177:3;10198:17;;;10195:43;;10218:18;;:::i;:::-;-1:-1:-1;10265:1:1;10254:13;;10138:135::o;11044:261::-;11114:3;-1:-1:-1;;;;;11135:31:1;;11132:51;;;11179:1;11176;11169:12;11132:51;11215:6;11212:1;11208:14;11256:8;11249:5;11244:3;11231:34;11281:18;;;;;11044:261;-1:-1:-1;;;11044:261:1:o;11310:658::-;11740:26;11736:31;11727:6;11723:2;11719:15;11715:53;11710:3;11703:66;11685:3;11785:177;11839:122;11893:67;11956:2;11951:3;11947:12;11939:6;11931;11893:67;:::i;:::-;11885:6;11877;11839:122;:::i;:::-;11831:6;11823;11785:177;:::i;:::-;11778:184;11310:658;-1:-1:-1;;;;;;;;;11310:658:1:o;14391:128::-;14458:9;;;14479:11;;;14476:37;;;14493:18;;:::i;15236:148::-;15324:4;15303:12;;;15317;;;15299:31;;15342:13;;15339:39;;;15358:18;;:::i;15389:632::-;15560:2;15612:21;;;15682:13;;15585:18;;;15704:22;;;15531:4;;15560:2;15783:15;;;;15757:2;15742:18;;;15531:4;15826:169;15840:6;15837:1;15834:13;15826:169;;;15901:13;;15889:26;;15970:15;;;;15935:12;;;;15862:1;15855:9;15826:169;;;-1:-1:-1;16012:3:1;;15389:632;-1:-1:-1;;;;;;15389:632:1:o;16297:174::-;16364:12;16396:10;;;16408;;;16392:27;;16431:11;;;16428:37;;;16445:18;;:::i;:::-;16428:37;16297:174;;;;:::o;17113:209::-;17145:1;17171;17161:132;;17215:10;17210:3;17206:20;17203:1;17196:31;17250:4;17247:1;17240:15;17278:4;17275:1;17268:15;17161:132;-1:-1:-1;17307:9:1;;17113:209::o;17327:127::-;17388:10;17383:3;17379:20;17376:1;17369:31;17419:4;17416:1;17409:15;17443:4;17440:1;17433:15
Swarm Source
ipfs://98aae522cbae28e01038c27e9bd433dc46406e6e924aa60ef668dca3f2a2c148
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.