More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,052 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Collect Funds | 21269215 | 83 days ago | IN | 0 ETH | 0.00060154 | ||||
Collect Funds | 21247677 | 86 days ago | IN | 0 ETH | 0.00088899 | ||||
Collect Funds | 21238769 | 87 days ago | IN | 0 ETH | 0.00138216 | ||||
Collect Funds | 21237978 | 87 days ago | IN | 0 ETH | 0.00177464 | ||||
Collect Funds | 21237974 | 87 days ago | IN | 0 ETH | 0.00170052 | ||||
Collect Funds | 21237968 | 87 days ago | IN | 0 ETH | 0.00167914 | ||||
Collect Funds | 21237599 | 87 days ago | IN | 0 ETH | 0.00132553 | ||||
Collect Funds | 21236340 | 87 days ago | IN | 0 ETH | 0.00343667 | ||||
Collect Funds | 21229262 | 88 days ago | IN | 0 ETH | 0.00147501 | ||||
Collect Funds | 21221411 | 89 days ago | IN | 0 ETH | 0.00111882 | ||||
Collect Funds | 21207701 | 91 days ago | IN | 0 ETH | 0.00071537 | ||||
Collect Funds | 21207695 | 91 days ago | IN | 0 ETH | 0.00082667 | ||||
Collect Funds | 21203013 | 92 days ago | IN | 0 ETH | 0.00086671 | ||||
Collect Funds | 21198610 | 93 days ago | IN | 0 ETH | 0.00118917 | ||||
Collect Funds | 21194825 | 93 days ago | IN | 0 ETH | 0.00178067 | ||||
Collect Funds | 21194395 | 93 days ago | IN | 0 ETH | 0.002448 | ||||
Collect Funds | 21176055 | 96 days ago | IN | 0 ETH | 0.00234195 | ||||
Collect Funds | 21164605 | 97 days ago | IN | 0 ETH | 0.00142294 | ||||
Collect Funds | 21159659 | 98 days ago | IN | 0 ETH | 0.00245618 | ||||
Collect Funds | 21156400 | 98 days ago | IN | 0 ETH | 0.00122127 | ||||
Collect Funds | 21155951 | 99 days ago | IN | 0 ETH | 0.00091441 | ||||
Collect Funds | 21155829 | 99 days ago | IN | 0 ETH | 0.00119209 | ||||
Collect Funds | 21154521 | 99 days ago | IN | 0 ETH | 0.00049321 | ||||
Collect Funds | 21137951 | 101 days ago | IN | 0 ETH | 0.0018251 | ||||
Collect Funds | 21129463 | 102 days ago | IN | 0 ETH | 0.00222349 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MBLKVesting
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-24 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: interfaces/IMBLK.sol pragma solidity ^0.8.9; interface IMBLK is IERC20{ event Mint(address indexed to, uint256 value); event Burn(address indexed owner, uint256 value); function mint(address account_, uint256 amount_) external; function burn(uint256 amount_) external; } // File: @openzeppelin/[email protected]/utils/math/SignedMathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMathUpgradeable { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/MathUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { 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) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.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 `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMathUpgradeable.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.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); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/cryptography/ECDSAUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.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 ECDSAUpgradeable { 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 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @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", StringsUpgradeable.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 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/[email protected]/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/[email protected]/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @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 proxied contracts do not make use of 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. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * 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. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File: @openzeppelin/[email protected]/security/ReentrancyGuardUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal onlyInitializing { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal onlyInitializing { _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; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/[email protected]/utils/ContextUpgradeable.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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/[email protected]/security/PausableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/[email protected]/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.9.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: accessControl/AccessProtectedUpgradable.sol pragma solidity ^0.8.9; abstract contract AccessProtectedUpgradable is OwnableUpgradeable { mapping(address => bool) private _admins; // user address => admin? mapping event AdminAccessSet(address _admin, bool _enabled); /** * @notice Set Admin Access * @param admin - Address of Minter * @param enabled - Enable/Disable Admin Access */ function setAdmin(address admin, bool enabled) external onlyOwner { _admins[admin] = enabled; emit AdminAccessSet(admin, enabled); } /** * @notice Check Admin Access * * @param admin - Address of Admin * @return whether minter has access */ function isAdmin(address admin) public view returns (bool) { return _admins[admin]; } /** * Throws if called by any account other than the Admin. */ modifier onlyAdmin() { require(_admins[_msgSender()] || _msgSender() == owner(), 'Caller does not have Admin Access'); _; } } // File: deposit/MBLKVesting.sol pragma solidity ^0.8.20; contract MBLKVesting is OwnableUpgradeable,PausableUpgradeable,ReentrancyGuardUpgradeable,AccessProtectedUpgradable { IMBLK public MBLK; mapping(address => bool) private authorizedSigners; mapping(uint256 => bool) public orders; bool private initialized; using ECDSAUpgradeable for bytes32; event DepositedFunds(address sender,uint256 amount_, uint256 order_); event CollectedFunds(address sender,uint256 amount_, uint256 order_); function init(address mblkAddress_) external initializer { require(!initialized); MBLK = IMBLK(mblkAddress_); __Ownable_init(); __Pausable_init(); initialized = true; } function updateSignerStatus(address signer, bool status) external onlyOwner { authorizedSigners[signer] = status; } function isSigner(address signer) external view returns (bool) { return authorizedSigners[signer]; } function DepositFunds(bytes memory signature_,uint256 amount_,uint256 order_) external whenNotPaused nonReentrant { require(amount_ > 0, "Amount must be greater than zero"); bytes32 msgHash = keccak256(abi.encodePacked(msg.sender,amount_,order_)); bytes32 prefixedHash = msgHash.toEthSignedMessageHash(); address msgSigner = recover(prefixedHash, signature_); require(authorizedSigners[msgSigner], "Invalid Signer"); require(orders[order_] == false, "Record already exists"); orders[order_] = true; MBLK.transferFrom(msg.sender,address(this),amount_); emit DepositedFunds(msg.sender,amount_,order_); } function CollectFunds(bytes memory signature_,uint256 amount_,uint256 order_) external whenNotPaused nonReentrant { require(amount_ > 0, "Amount must be greater than zero"); // Signature order must be different from deposit bytes32 msgHash = keccak256(abi.encodePacked(amount_,msg.sender,order_)); bytes32 prefixedHash = msgHash.toEthSignedMessageHash(); address msgSigner = recover(prefixedHash, signature_); require(authorizedSigners[msgSigner], "Invalid Signer"); require(orders[order_] == false, "Record already exists"); orders[order_] = true; MBLK.transfer(msg.sender, amount_); emit CollectedFunds(msg.sender,amount_,order_); } function AdminTransfer(address to, uint256 amount_) external onlyAdmin { MBLK.transfer(to, amount_); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function recover(bytes32 hash, bytes memory signature_) private pure returns(address) { return hash.recover(signature_); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_admin","type":"address"},{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"AdminAccessSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"order_","type":"uint256"}],"name":"CollectedFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"order_","type":"uint256"}],"name":"DepositedFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"AdminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature_","type":"bytes"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"order_","type":"uint256"}],"name":"CollectFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature_","type":"bytes"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"order_","type":"uint256"}],"name":"DepositFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MBLK","outputs":[{"internalType":"contract IMBLK","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mblkAddress_","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateSignerStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506112578061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c80637df73e2711610093578063a85c38ef11610063578063a85c38ef14610213578063deebecb714610235578063f28c555b14610248578063f2fde38b1461025b575f80fd5b80637df73e27146101a85780638456cb59146101d35780638da5cb5b146101db5780639d0841c414610200575f80fd5b80633f4ba83a116100ce5780633f4ba83a1461017a5780634b0bddd2146101825780635c975abb14610195578063715018a6146101a0575f80fd5b806319ab453c146100ff57806320f5fbb71461011457806324d7806c146101275780632a45d03214610167575b5f80fd5b61011261010d36600461103c565b61026e565b005b610112610122366004611062565b6103bf565b61015261013536600461103c565b6001600160a01b03165f90815260c9602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6101126101753660046110ab565b6103f1565b610112610671565b610112610190366004611062565b610683565b60655460ff16610152565b6101126106e6565b6101526101b636600461103c565b6001600160a01b03165f90815260cb602052604090205460ff1690565b6101126106f7565b6033546001600160a01b03165b6040516001600160a01b03909116815260200161015e565b61011261020e366004611168565b610707565b610152610221366004611190565b60cc6020525f908152604090205460ff1681565b60ca546101e8906001600160a01b031681565b6101126102563660046110ab565b6107f8565b61011261026936600461103c565b610a4d565b5f54610100900460ff161580801561028c57505f54600160ff909116105b806102a55750303b1580156102a557505f5460ff166001145b61030d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561032e575f805461ff0019166101001790555b60cd5460ff161561033d575f80fd5b60ca80546001600160a01b0319166001600160a01b038416179055610360610ac6565b610368610af4565b60cd805460ff1916600117905580156103bb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b5050565b6103c7610b22565b6001600160a01b03919091165f90815260cb60205260409020805460ff1916911515919091179055565b6103f9610b7c565b610401610bc2565b5f82116104505760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610304565b6040516bffffffffffffffffffffffff193360601b16602082015260348101839052605481018290525f906074016040516020818303038152906040528051906020012090505f6104cd827f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b90505f6104da8287610c1b565b6001600160a01b0381165f90815260cb602052604090205490915060ff166105355760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610304565b5f84815260cc602052604090205460ff161561058b5760405162461bcd60e51b81526020600482015260156024820152745265636f726420616c72656164792065786973747360581b6044820152606401610304565b5f84815260cc602052604090819020805460ff1916600117905560ca5490516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156105f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061061c91906111a7565b5060408051338152602081018790529081018590527f9624cc4c1fccbc2cf6d61d0f98e2db70f376ad4079ae0b3e2ef2cd31b162eba5906060015b60405180910390a150505061066c6001609755565b505050565b610679610b22565b610681610c2d565b565b61068b610b22565b6001600160a01b0382165f81815260c96020908152604091829020805460ff19168515159081179091558251938452908301527fe529461c8529abc0e0fe7c5ee361f74fe22e0b7574df1fc0b7558a282091fb7891016103b2565b6106ee610b22565b6106815f610c7f565b6106ff610b22565b610681610cd0565b335f90815260c9602052604090205460ff168061072e57506033546001600160a01b031633145b6107845760405162461bcd60e51b815260206004820152602160248201527f43616c6c657220646f6573206e6f7420686176652041646d696e2041636365736044820152607360f81b6064820152608401610304565b60ca5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af11580156107d4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066c91906111a7565b610800610b7c565b610808610bc2565b5f82116108575760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610304565b6040805160208082018590526bffffffffffffffffffffffff193360601b1682840152605480830185905283518084039091018152607490920190925280519101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120906108d28287610c1b565b6001600160a01b0381165f90815260cb602052604090205490915060ff1661092d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610304565b5f84815260cc602052604090205460ff16156109835760405162461bcd60e51b81526020600482015260156024820152745265636f726420616c72656164792065786973747360581b6044820152606401610304565b5f84815260cc602052604090819020805460ff1916600117905560ca54905163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb906044016020604051808303815f875af11580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e91906111a7565b5060408051338152602081018790529081018590527ffa4f5733a37ff6d0a5dcb54f3400d47b58f3ef13b153b4c744b7079a79fbc5a390606001610657565b610a55610b22565b6001600160a01b038116610aba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610304565b610ac381610c7f565b50565b5f54610100900460ff16610aec5760405162461bcd60e51b8152600401610304906111c2565b610681610d0d565b5f54610100900460ff16610b1a5760405162461bcd60e51b8152600401610304906111c2565b610681610d3c565b6033546001600160a01b031633146106815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b60655460ff16156106815760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610304565b600260975403610c145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610304565b6002609755565b5f610c268383610d6e565b9392505050565b610c35610d90565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610cd8610b7c565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c623390565b5f54610100900460ff16610d335760405162461bcd60e51b8152600401610304906111c2565b61068133610c7f565b5f54610100900460ff16610d625760405162461bcd60e51b8152600401610304906111c2565b6065805460ff19169055565b5f805f610d7b8585610dd9565b91509150610d8881610e1b565b509392505050565b60655460ff166106815760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610304565b5f808251604103610e0d576020830151604084015160608501515f1a610e0187828585610f64565b94509450505050610e14565b505f905060025b9250929050565b5f816004811115610e2e57610e2e61120d565b03610e365750565b6001816004811115610e4a57610e4a61120d565b03610e975760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610304565b6002816004811115610eab57610eab61120d565b03610ef85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610304565b6003816004811115610f0c57610f0c61120d565b03610ac35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610304565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610f9957505f90506003611018565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610fea573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611012575f60019250925050611018565b91505f90505b94509492505050565b80356001600160a01b0381168114611037575f80fd5b919050565b5f6020828403121561104c575f80fd5b610c2682611021565b8015158114610ac3575f80fd5b5f8060408385031215611073575f80fd5b61107c83611021565b9150602083013561108c81611055565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156110bd575f80fd5b833567ffffffffffffffff808211156110d4575f80fd5b818601915086601f8301126110e7575f80fd5b8135818111156110f9576110f9611097565b604051601f8201601f19908116603f0116810190838211818310171561112157611121611097565b81604052828152896020848701011115611139575f80fd5b826020860160208301375f60208483010152809750505050505060208401359150604084013590509250925092565b5f8060408385031215611179575f80fd5b61118283611021565b946020939093013593505050565b5f602082840312156111a0575f80fd5b5035919050565b5f602082840312156111b7575f80fd5b8151610c2681611055565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220c0d2a0c6321f56c897de131eff436148000f15f5c21dd101a2023eb8f64b58a264736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100fb575f3560e01c80637df73e2711610093578063a85c38ef11610063578063a85c38ef14610213578063deebecb714610235578063f28c555b14610248578063f2fde38b1461025b575f80fd5b80637df73e27146101a85780638456cb59146101d35780638da5cb5b146101db5780639d0841c414610200575f80fd5b80633f4ba83a116100ce5780633f4ba83a1461017a5780634b0bddd2146101825780635c975abb14610195578063715018a6146101a0575f80fd5b806319ab453c146100ff57806320f5fbb71461011457806324d7806c146101275780632a45d03214610167575b5f80fd5b61011261010d36600461103c565b61026e565b005b610112610122366004611062565b6103bf565b61015261013536600461103c565b6001600160a01b03165f90815260c9602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6101126101753660046110ab565b6103f1565b610112610671565b610112610190366004611062565b610683565b60655460ff16610152565b6101126106e6565b6101526101b636600461103c565b6001600160a01b03165f90815260cb602052604090205460ff1690565b6101126106f7565b6033546001600160a01b03165b6040516001600160a01b03909116815260200161015e565b61011261020e366004611168565b610707565b610152610221366004611190565b60cc6020525f908152604090205460ff1681565b60ca546101e8906001600160a01b031681565b6101126102563660046110ab565b6107f8565b61011261026936600461103c565b610a4d565b5f54610100900460ff161580801561028c57505f54600160ff909116105b806102a55750303b1580156102a557505f5460ff166001145b61030d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff19166001179055801561032e575f805461ff0019166101001790555b60cd5460ff161561033d575f80fd5b60ca80546001600160a01b0319166001600160a01b038416179055610360610ac6565b610368610af4565b60cd805460ff1916600117905580156103bb575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b5050565b6103c7610b22565b6001600160a01b03919091165f90815260cb60205260409020805460ff1916911515919091179055565b6103f9610b7c565b610401610bc2565b5f82116104505760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610304565b6040516bffffffffffffffffffffffff193360601b16602082015260348101839052605481018290525f906074016040516020818303038152906040528051906020012090505f6104cd827f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b90505f6104da8287610c1b565b6001600160a01b0381165f90815260cb602052604090205490915060ff166105355760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610304565b5f84815260cc602052604090205460ff161561058b5760405162461bcd60e51b81526020600482015260156024820152745265636f726420616c72656164792065786973747360581b6044820152606401610304565b5f84815260cc602052604090819020805460ff1916600117905560ca5490516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b03909116906323b872dd906064016020604051808303815f875af11580156105f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061061c91906111a7565b5060408051338152602081018790529081018590527f9624cc4c1fccbc2cf6d61d0f98e2db70f376ad4079ae0b3e2ef2cd31b162eba5906060015b60405180910390a150505061066c6001609755565b505050565b610679610b22565b610681610c2d565b565b61068b610b22565b6001600160a01b0382165f81815260c96020908152604091829020805460ff19168515159081179091558251938452908301527fe529461c8529abc0e0fe7c5ee361f74fe22e0b7574df1fc0b7558a282091fb7891016103b2565b6106ee610b22565b6106815f610c7f565b6106ff610b22565b610681610cd0565b335f90815260c9602052604090205460ff168061072e57506033546001600160a01b031633145b6107845760405162461bcd60e51b815260206004820152602160248201527f43616c6c657220646f6573206e6f7420686176652041646d696e2041636365736044820152607360f81b6064820152608401610304565b60ca5460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303815f875af11580156107d4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066c91906111a7565b610800610b7c565b610808610bc2565b5f82116108575760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610304565b6040805160208082018590526bffffffffffffffffffffffff193360601b1682840152605480830185905283518084039091018152607490920190925280519101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c829052603c8120906108d28287610c1b565b6001600160a01b0381165f90815260cb602052604090205490915060ff1661092d5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21029b4b3b732b960911b6044820152606401610304565b5f84815260cc602052604090205460ff16156109835760405162461bcd60e51b81526020600482015260156024820152745265636f726420616c72656164792065786973747360581b6044820152606401610304565b5f84815260cc602052604090819020805460ff1916600117905560ca54905163a9059cbb60e01b8152336004820152602481018790526001600160a01b039091169063a9059cbb906044016020604051808303815f875af11580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e91906111a7565b5060408051338152602081018790529081018590527ffa4f5733a37ff6d0a5dcb54f3400d47b58f3ef13b153b4c744b7079a79fbc5a390606001610657565b610a55610b22565b6001600160a01b038116610aba5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610304565b610ac381610c7f565b50565b5f54610100900460ff16610aec5760405162461bcd60e51b8152600401610304906111c2565b610681610d0d565b5f54610100900460ff16610b1a5760405162461bcd60e51b8152600401610304906111c2565b610681610d3c565b6033546001600160a01b031633146106815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610304565b60655460ff16156106815760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610304565b600260975403610c145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610304565b6002609755565b5f610c268383610d6e565b9392505050565b610c35610d90565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b610cd8610b7c565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c623390565b5f54610100900460ff16610d335760405162461bcd60e51b8152600401610304906111c2565b61068133610c7f565b5f54610100900460ff16610d625760405162461bcd60e51b8152600401610304906111c2565b6065805460ff19169055565b5f805f610d7b8585610dd9565b91509150610d8881610e1b565b509392505050565b60655460ff166106815760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610304565b5f808251604103610e0d576020830151604084015160608501515f1a610e0187828585610f64565b94509450505050610e14565b505f905060025b9250929050565b5f816004811115610e2e57610e2e61120d565b03610e365750565b6001816004811115610e4a57610e4a61120d565b03610e975760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610304565b6002816004811115610eab57610eab61120d565b03610ef85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610304565b6003816004811115610f0c57610f0c61120d565b03610ac35760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610304565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610f9957505f90506003611018565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610fea573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116611012575f60019250925050611018565b91505f90505b94509492505050565b80356001600160a01b0381168114611037575f80fd5b919050565b5f6020828403121561104c575f80fd5b610c2682611021565b8015158114610ac3575f80fd5b5f8060408385031215611073575f80fd5b61107c83611021565b9150602083013561108c81611055565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156110bd575f80fd5b833567ffffffffffffffff808211156110d4575f80fd5b818601915086601f8301126110e7575f80fd5b8135818111156110f9576110f9611097565b604051601f8201601f19908116603f0116810190838211818310171561112157611121611097565b81604052828152896020848701011115611139575f80fd5b826020860160208301375f60208483010152809750505050505060208401359150604084013590509250925092565b5f8060408385031215611179575f80fd5b61118283611021565b946020939093013593505050565b5f602082840312156111a0575f80fd5b5035919050565b5f602082840312156111b7575f80fd5b8151610c2681611055565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b5f52602160045260245ffdfea2646970667358221220c0d2a0c6321f56c897de131eff436148000f15f5c21dd101a2023eb8f64b58a264736f6c63430008140033
Deployed Bytecode Sourcemap
59325:2888:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59821:229;;;;;;:::i;:::-;;:::i;:::-;;60058:130;;;;;;:::i;:::-;;:::i;58907:99::-;;;;;;:::i;:::-;-1:-1:-1;;;;;58984:14:0;58960:4;58984:14;;;:7;:14;;;;;;;;;58907:99;;;;991:14:1;;984:22;966:41;;954:2;939:18;58907:99:0;;;;;;;;60321:703;;;;;;:::i;:::-;;:::i;61999:67::-;;;:::i;58601:155::-;;;;;;:::i;:::-;;:::i;53663:86::-;53734:7;;;;53663:86;;57038:103;;;:::i;60196:114::-;;;;;;:::i;:::-;-1:-1:-1;;;;;60277:25:0;60253:4;60277:25;;;:17;:25;;;;;;;;;60196:114;61928:63;;;:::i;56397:87::-;56470:6;;-1:-1:-1;;;;;56470:6:0;56397:87;;;-1:-1:-1;;;;;2386:32:1;;;2368:51;;2356:2;2341:18;56397:87:0;2222:203:1;61799:121:0;;;;;;:::i;:::-;;:::i;59544:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;59455:17;;;;;-1:-1:-1;;;;;59455:17:0;;;61032:759;;;;;;:::i;:::-;;:::i;57296:201::-;;;;;;:::i;:::-;;:::i;59821:229::-;43158:19;43181:13;;;;;;43180:14;;43228:34;;;;-1:-1:-1;43246:12:0;;43261:1;43246:12;;;;:16;43228:34;43227:108;;;-1:-1:-1;43307:4:0;31926:19;:23;;;43268:66;;-1:-1:-1;43317:12:0;;;;;:17;43268:66;43205:204;;;;-1:-1:-1;;;43205:204:0;;3297:2:1;43205:204:0;;;3279:21:1;3336:2;3316:18;;;3309:30;3375:34;3355:18;;;3348:62;-1:-1:-1;;;3426:18:1;;;3419:44;3480:19;;43205:204:0;;;;;;;;;43420:12;:16;;-1:-1:-1;;43420:16:0;43435:1;43420:16;;;43447:67;;;;43482:13;:20;;-1:-1:-1;;43482:20:0;;;;;43447:67;59903:11:::1;::::0;::::1;;59902:12;59894:21;;;::::0;::::1;;59926:4;:26:::0;;-1:-1:-1;;;;;;59926:26:0::1;-1:-1:-1::0;;;;;59926:26:0;::::1;;::::0;;59966:16:::1;:14;:16::i;:::-;59993:17;:15;:17::i;:::-;60023:11;:18:::0;;-1:-1:-1;;60023:18:0::1;60037:4;60023:18;::::0;;43536:102;;;;43587:5;43571:21;;-1:-1:-1;;43571:21:0;;;43612:14;;-1:-1:-1;3662:36:1;;43612:14:0;;3650:2:1;3635:18;43612:14:0;;;;;;;;43536:102;43147:498;59821:229;:::o;60058:130::-;56283:13;:11;:13::i;:::-;-1:-1:-1;;;;;60145:25:0;;;::::1;;::::0;;;:17:::1;:25;::::0;;;;:34;;-1:-1:-1;;60145:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;60058:130::o;60321:703::-;53268:19;:17;:19::i;:::-;49183:21:::1;:19;:21::i;:::-;60472:1:::2;60462:7;:11;60454:56;;;::::0;-1:-1:-1;;;60454:56:0;;3911:2:1;60454:56:0::2;::::0;::::2;3893:21:1::0;;;3930:18;;;3923:30;3989:34;3969:18;;;3962:62;4041:18;;60454:56:0::2;3709:356:1::0;60454:56:0::2;60551:43;::::0;-1:-1:-1;;60568:10:0::2;4275:2:1::0;4271:15;4267:53;60551:43:0::2;::::0;::::2;4255:66:1::0;4337:12;;;4330:28;;;4374:12;;;4367:28;;;60523:15:0::2;::::0;4411:12:1;;60551:43:0::2;;;;;;;;;;;;60541:54;;;;;;60523:72;;60608:20;60631:32;:7;28316:34:::0;28111:15;28303:48;;;28372:4;28365:18;;;;28424:4;28408:21;;;28042:405;60631:32:::2;60608:55;;60674:17;60694:33;60702:12;60716:10;60694:7;:33::i;:::-;-1:-1:-1::0;;;;;60746:28:0;::::2;;::::0;;;:17:::2;:28;::::0;;;;;60674:53;;-1:-1:-1;60746:28:0::2;;60738:55;;;::::0;-1:-1:-1;;;60738:55:0;;4636:2:1;60738:55:0::2;::::0;::::2;4618:21:1::0;4675:2;4655:18;;;4648:30;-1:-1:-1;;;4694:18:1;;;4687:44;4748:18;;60738:55:0::2;4434:338:1::0;60738:55:0::2;60812:14;::::0;;;:6:::2;:14;::::0;;;;;::::2;;:23;60804:57;;;::::0;-1:-1:-1;;;60804:57:0;;4979:2:1;60804:57:0::2;::::0;::::2;4961:21:1::0;5018:2;4998:18;;;4991:30;-1:-1:-1;;;5037:18:1;;;5030:51;5098:18;;60804:57:0::2;4777:345:1::0;60804:57:0::2;60872:14;::::0;;;:6:::2;:14;::::0;;;;;;:21;;-1:-1:-1;;60872:21:0::2;60889:4;60872:21;::::0;;60906:4:::2;::::0;:51;;-1:-1:-1;;;60906:51:0;;60924:10:::2;60906:51;::::0;::::2;5367:34:1::0;60943:4:0::2;5417:18:1::0;;;5410:43;5469:18;;;5462:34;;;-1:-1:-1;;;;;60906:4:0;;::::2;::::0;:17:::2;::::0;5302:18:1;;60906:51:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;60975:41:0::2;::::0;;60990:10:::2;5959:51:1::0;;6041:2;6026:18;;6019:34;;;6069:18;;;6062:34;;;60975:41:0::2;::::0;5947:2:1;5932:18;60975:41:0::2;;;;;;;;60440:584;;;49227:20:::1;48444:1:::0;49747:7;:22;49564:213;49227:20:::1;60321:703:::0;;;:::o;61999:67::-;56283:13;:11;:13::i;:::-;62048:10:::1;:8;:10::i;:::-;61999:67::o:0;58601:155::-;56283:13;:11;:13::i;:::-;-1:-1:-1;;;;;58678:14:0;::::1;;::::0;;;:7:::1;:14;::::0;;;;;;;;:24;;-1:-1:-1;;58678:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;58718:30;;6275:51:1;;;6342:18;;;6335:50;58718:30:0::1;::::0;6248:18:1;58718:30:0::1;6107:284:1::0;57038:103:0;56283:13;:11;:13::i;:::-;57103:30:::1;57130:1;57103:18;:30::i;61928:63::-:0;56283:13;:11;:13::i;:::-;61975:8:::1;:6;:8::i;61799:121::-:0;51336:10;59134:21;;;;:7;:21;;;;;;;;;:48;;-1:-1:-1;56470:6:0;;-1:-1:-1;;;;;56470:6:0;51336:10;59159:23;59134:48;59126:94;;;;-1:-1:-1;;;59126:94:0;;6598:2:1;59126:94:0;;;6580:21:1;6637:2;6617:18;;;6610:30;6676:34;6656:18;;;6649:62;-1:-1:-1;;;6727:18:1;;;6720:31;6768:19;;59126:94:0;6396:397:1;59126:94:0;61886:4:::1;::::0;:26:::1;::::0;-1:-1:-1;;;61886:26:0;;-1:-1:-1;;;;;6990:32:1;;;61886:26:0::1;::::0;::::1;6972:51:1::0;7039:18;;;7032:34;;;61886:4:0;;::::1;::::0;:13:::1;::::0;6945:18:1;;61886:26:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;61032:759::-:0;53268:19;:17;:19::i;:::-;49183:21:::1;:19;:21::i;:::-;61183:1:::2;61173:7;:11;61165:56;;;::::0;-1:-1:-1;;;61165:56:0;;3911:2:1;61165:56:0::2;::::0;::::2;3893:21:1::0;;;3930:18;;;3923:30;3989:34;3969:18;;;3962:62;4041:18;;61165:56:0::2;3709:356:1::0;61165:56:0::2;61319:43;::::0;;::::2;::::0;;::::2;7262:19:1::0;;;-1:-1:-1;;61344:10:0::2;7319:2:1::0;7315:15;7311:53;7297:12;;;7290:75;7381:12;;;;7374:28;;;61319:43:0;;;;;;;;;;7418:12:1;;;;61319:43:0;;;61309:54;;;::::2;::::0;28316:34;-1:-1:-1;28303:48:0;;;28372:4;28365:18;;;28424:4;28408:21;;;61462:33:::2;28408:21:::0;61484:10;61462:7:::2;:33::i;:::-;-1:-1:-1::0;;;;;61514:28:0;::::2;;::::0;;;:17:::2;:28;::::0;;;;;61442:53;;-1:-1:-1;61514:28:0::2;;61506:55;;;::::0;-1:-1:-1;;;61506:55:0;;4636:2:1;61506:55:0::2;::::0;::::2;4618:21:1::0;4675:2;4655:18;;;4648:30;-1:-1:-1;;;4694:18:1;;;4687:44;4748:18;;61506:55:0::2;4434:338:1::0;61506:55:0::2;61580:14;::::0;;;:6:::2;:14;::::0;;;;;::::2;;:23;61572:57;;;::::0;-1:-1:-1;;;61572:57:0;;4979:2:1;61572:57:0::2;::::0;::::2;4961:21:1::0;5018:2;4998:18;;;4991:30;-1:-1:-1;;;5037:18:1;;;5030:51;5098:18;;61572:57:0::2;4777:345:1::0;61572:57:0::2;61640:14;::::0;;;:6:::2;:14;::::0;;;;;;:21;;-1:-1:-1;;61640:21:0::2;61657:4;61640:21;::::0;;61682:4:::2;::::0;:34;;-1:-1:-1;;;61682:34:0;;61696:10:::2;61682:34;::::0;::::2;6972:51:1::0;7039:18;;;7032:34;;;-1:-1:-1;;;;;61682:4:0;;::::2;::::0;:13:::2;::::0;6945:18:1;;61682:34:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;61742:41:0::2;::::0;;61757:10:::2;5959:51:1::0;;6041:2;6026:18;;6019:34;;;6069:18;;;6062:34;;;61742:41:0::2;::::0;5947:2:1;5932:18;61742:41:0::2;5757:345:1::0;57296:201:0;56283:13;:11;:13::i;:::-;-1:-1:-1;;;;;57385:22:0;::::1;57377:73;;;::::0;-1:-1:-1;;;57377:73:0;;7643:2:1;57377:73:0::1;::::0;::::1;7625:21:1::0;7682:2;7662:18;;;7655:30;7721:34;7701:18;;;7694:62;-1:-1:-1;;;7772:18:1;;;7765:36;7818:19;;57377:73:0::1;7441:402:1::0;57377:73:0::1;57461:28;57480:8;57461:18;:28::i;:::-;57296:201:::0;:::o;55940:97::-;45301:13;;;;;;;45293:69;;;;-1:-1:-1;;;45293:69:0;;;;;;;:::i;:::-;56003:26:::1;:24;:26::i;52833:99::-:0;45301:13;;;;;;;45293:69;;;;-1:-1:-1;;;45293:69:0;;;;;;;:::i;:::-;52897:27:::1;:25;:27::i;56562:132::-:0;56470:6;;-1:-1:-1;;;;;56470:6:0;51336:10;56626:23;56618:68;;;;-1:-1:-1;;;56618:68:0;;8462:2:1;56618:68:0;;;8444:21:1;;;8481:18;;;8474:30;8540:34;8520:18;;;8513:62;8592:18;;56618:68:0;8260:356:1;53822:108:0;53734:7;;;;53892:9;53884:38;;;;-1:-1:-1;;;53884:38:0;;8823:2:1;53884:38:0;;;8805:21:1;8862:2;8842:18;;;8835:30;-1:-1:-1;;;8881:18:1;;;8874:46;8937:18;;53884:38:0;8621:340:1;49263:293:0;48488:1;49397:7;;:19;49389:63;;;;-1:-1:-1;;;49389:63:0;;9168:2:1;49389:63:0;;;9150:21:1;9207:2;9187:18;;;9180:30;9246:33;9226:18;;;9219:61;9297:18;;49389:63:0;8966:355:1;49389:63:0;48488:1;49530:7;:18;49263:293::o;62074:136::-;62151:7;62178:24;:4;62191:10;62178:12;:24::i;:::-;62171:31;62074:136;-1:-1:-1;;;62074:136:0:o;54518:120::-;53527:16;:14;:16::i;:::-;54577:7:::1;:15:::0;;-1:-1:-1;;54577:15:0::1;::::0;;54608:22:::1;51336:10:::0;54617:12:::1;54608:22;::::0;-1:-1:-1;;;;;2386:32:1;;;2368:51;;2356:2;2341:18;54608:22:0::1;;;;;;;54518:120::o:0;57657:191::-;57750:6;;;-1:-1:-1;;;;;57767:17:0;;;-1:-1:-1;;;;;;57767:17:0;;;;;;;57800:40;;57750:6;;;57767:17;57750:6;;57800:40;;57731:16;;57800:40;57720:128;57657:191;:::o;54259:118::-;53268:19;:17;:19::i;:::-;54319:7:::1;:14:::0;;-1:-1:-1;;54319:14:0::1;54329:4;54319:14;::::0;;54349:20:::1;54356:12;51336:10:::0;;51256:98;56045:113;45301:13;;;;;;;45293:69;;;;-1:-1:-1;;;45293:69:0;;;;;;;:::i;:::-;56118:32:::1;51336:10:::0;56118:18:::1;:32::i;52940:97::-:0;45301:13;;;;;;;45293:69;;;;-1:-1:-1;;;45293:69:0;;;;;;;:::i;:::-;53014:7:::1;:15:::0;;-1:-1:-1;;53014:15:0::1;::::0;;52940:97::o;24506:231::-;24584:7;24605:17;24624:18;24646:27;24657:4;24663:9;24646:10;:27::i;:::-;24604:69;;;;24684:18;24696:5;24684:11;:18::i;:::-;-1:-1:-1;24720:9:0;24506:231;-1:-1:-1;;;24506:231:0:o;54007:108::-;53734:7;;;;54066:41;;;;-1:-1:-1;;;54066:41:0;;9528:2:1;54066:41:0;;;9510:21:1;9567:2;9547:18;;;9540:30;-1:-1:-1;;;9586:18:1;;;9579:50;9646:18;;54066:41:0;9326:344:1;22957:747:0;23038:7;23047:12;23076:9;:16;23096:2;23076:22;23072:625;;23420:4;23405:20;;23399:27;23470:4;23455:20;;23449:27;23528:4;23513:20;;23507:27;23115:9;23499:36;23571:25;23582:4;23499:36;23399:27;23449;23571:10;:25::i;:::-;23564:32;;;;;;;;;23072:625;-1:-1:-1;23645:1:0;;-1:-1:-1;23649:35:0;23072:625;22957:747;;;;;:::o;21350:521::-;21428:20;21419:5;:29;;;;;;;;:::i;:::-;;21415:449;;21350:521;:::o;21415:449::-;21526:29;21517:5;:38;;;;;;;;:::i;:::-;;21513:351;;21572:34;;-1:-1:-1;;;21572:34:0;;10009:2:1;21572:34:0;;;9991:21:1;10048:2;10028:18;;;10021:30;10087:26;10067:18;;;10060:54;10131:18;;21572:34:0;9807:348:1;21513:351:0;21637:35;21628:5;:44;;;;;;;;:::i;:::-;;21624:240;;21689:41;;-1:-1:-1;;;21689:41:0;;10362:2:1;21689:41:0;;;10344:21:1;10401:2;10381:18;;;10374:30;10440:33;10420:18;;;10413:61;10491:18;;21689:41:0;10160:355:1;21624:240:0;21761:30;21752:5;:39;;;;;;;;:::i;:::-;;21748:116;;21808:44;;-1:-1:-1;;;21808:44:0;;10722:2:1;21808:44:0;;;10704:21:1;10761:2;10741:18;;;10734:30;10800:34;10780:18;;;10773:62;-1:-1:-1;;;10851:18:1;;;10844:32;10893:19;;21808:44:0;10520:398:1;25890:1477:0;25978:7;;26912:66;26899:79;;26895:163;;;-1:-1:-1;27011:1:0;;-1:-1:-1;27015:30:0;26995:51;;26895:163;27172:24;;;27155:14;27172:24;;;;;;;;;11150:25:1;;;11223:4;11211:17;;11191:18;;;11184:45;;;;11245:18;;;11238:34;;;11288:18;;;11281:34;;;27172:24:0;;11122:19:1;;27172:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27172:24:0;;-1:-1:-1;;27172:24:0;;;-1:-1:-1;;;;;;;27211:20:0;;27207:103;;27264:1;27268:29;27248:50;;;;;;;27207:103;27330:6;-1:-1:-1;27338:20:0;;-1:-1:-1;25890:1477:0;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:118::-;469:5;462:13;455:21;448:5;445:32;435:60;;491:1;488;481:12;506:315;571:6;579;632:2;620:9;611:7;607:23;603:32;600:52;;;648:1;645;638:12;600:52;671:29;690:9;671:29;:::i;:::-;661:39;;750:2;739:9;735:18;722:32;763:28;785:5;763:28;:::i;:::-;810:5;800:15;;;506:315;;;;;:::o;1018:127::-;1079:10;1074:3;1070:20;1067:1;1060:31;1110:4;1107:1;1100:15;1134:4;1131:1;1124:15;1150:1067;1236:6;1244;1252;1305:2;1293:9;1284:7;1280:23;1276:32;1273:52;;;1321:1;1318;1311:12;1273:52;1361:9;1348:23;1390:18;1431:2;1423:6;1420:14;1417:34;;;1447:1;1444;1437:12;1417:34;1485:6;1474:9;1470:22;1460:32;;1530:7;1523:4;1519:2;1515:13;1511:27;1501:55;;1552:1;1549;1542:12;1501:55;1588:2;1575:16;1610:2;1606;1603:10;1600:36;;;1616:18;;:::i;:::-;1691:2;1685:9;1659:2;1745:13;;-1:-1:-1;;1741:22:1;;;1765:2;1737:31;1733:40;1721:53;;;1789:18;;;1809:22;;;1786:46;1783:72;;;1835:18;;:::i;:::-;1875:10;1871:2;1864:22;1910:2;1902:6;1895:18;1952:7;1945:4;1940:2;1936;1932:11;1928:22;1925:35;1922:55;;;1973:1;1970;1963:12;1922:55;2033:2;2026:4;2022:2;2018:13;2011:4;2003:6;1999:17;1986:50;2080:1;2073:4;2068:2;2060:6;2056:15;2052:26;2045:37;2101:6;2091:16;;;;;;;2154:4;2143:9;2139:20;2126:34;2116:44;;2207:2;2196:9;2192:18;2179:32;2169:42;;1150:1067;;;;;:::o;2430:254::-;2498:6;2506;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;2598:29;2617:9;2598:29;:::i;:::-;2588:39;2674:2;2659:18;;;;2646:32;;-1:-1:-1;;;2430:254:1:o;2689:180::-;2748:6;2801:2;2789:9;2780:7;2776:23;2772:32;2769:52;;;2817:1;2814;2807:12;2769:52;-1:-1:-1;2840:23:1;;2689:180;-1:-1:-1;2689:180:1:o;5507:245::-;5574:6;5627:2;5615:9;5606:7;5602:23;5598:32;5595:52;;;5643:1;5640;5633:12;5595:52;5675:9;5669:16;5694:28;5716:5;5694:28;:::i;7848:407::-;8050:2;8032:21;;;8089:2;8069:18;;;8062:30;8128:34;8123:2;8108:18;;8101:62;-1:-1:-1;;;8194:2:1;8179:18;;8172:41;8245:3;8230:19;;7848:407::o;9675:127::-;9736:10;9731:3;9727:20;9724:1;9717:31;9767:4;9764:1;9757:15;9791:4;9788:1;9781:15
Swarm Source
ipfs://c0d2a0c6321f56c897de131eff436148000f15f5c21dd101a2023eb8f64b58a2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.001074 | 1,156,450.7159 | $1,241.87 |
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.