Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 657,474 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Check In | 6253588 | 556 days ago | IN | 0 ETH | 0.00000006 | ||||
| Pause | 6207529 | 557 days ago | IN | 0 ETH | 0.00000005 | ||||
| Check In | 4634530 | 594 days ago | IN | 0 ETH | 0.00000065 | ||||
| Check In | 4634525 | 594 days ago | IN | 0 ETH | 0.00000065 | ||||
| Check In | 4634520 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634514 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634508 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634502 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634499 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634493 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634488 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634484 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634474 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634470 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634465 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634460 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634456 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634452 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634446 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634441 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634435 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634430 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634427 | 594 days ago | IN | 0 ETH | 0.00000064 | ||||
| Check In | 4634422 | 594 days ago | IN | 0 ETH | 0.00000065 | ||||
| Check In | 4634417 | 594 days ago | IN | 0 ETH | 0.00000064 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 4634530 | 594 days ago | 0 ETH | |||||
| 4634525 | 594 days ago | 0 ETH | |||||
| 4634520 | 594 days ago | 0 ETH | |||||
| 4634514 | 594 days ago | 0 ETH | |||||
| 4634508 | 594 days ago | 0 ETH | |||||
| 4634502 | 594 days ago | 0 ETH | |||||
| 4634499 | 594 days ago | 0 ETH | |||||
| 4634493 | 594 days ago | 0 ETH | |||||
| 4634488 | 594 days ago | 0 ETH | |||||
| 4634484 | 594 days ago | 0 ETH | |||||
| 4634474 | 594 days ago | 0 ETH | |||||
| 4634470 | 594 days ago | 0 ETH | |||||
| 4634465 | 594 days ago | 0 ETH | |||||
| 4634460 | 594 days ago | 0 ETH | |||||
| 4634456 | 594 days ago | 0 ETH | |||||
| 4634452 | 594 days ago | 0 ETH | |||||
| 4634446 | 594 days ago | 0 ETH | |||||
| 4634441 | 594 days ago | 0 ETH | |||||
| 4634435 | 594 days ago | 0 ETH | |||||
| 4634430 | 594 days ago | 0 ETH | |||||
| 4634427 | 594 days ago | 0 ETH | |||||
| 4634422 | 594 days ago | 0 ETH | |||||
| 4634417 | 594 days ago | 0 ETH | |||||
| 4634413 | 594 days ago | 0 ETH | |||||
| 4634408 | 594 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-03-19
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @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 {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_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);
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol)
/**
* @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 Pausable is Context {
bool private _paused;
/**
* @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);
/**
* @dev The operation failed because the contract is paused.
*/
error EnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/
error ExpectedPause();
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_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 {
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @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());
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol)
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Muldiv operation overflow.
*/
error MathOverflowedMulDiv();
enum Rounding {
Floor, // Toward negative infinity
Ceil, // Toward positive infinity
Trunc, // Toward zero
Expand // Away from zero
}
/**
* @dev Returns the addition of two unsigned integers, with an success flag (no overflow).
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an success flag (no overflow).
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an success flag (no overflow).
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a success flag (no division by zero).
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a success flag (no division by zero).
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @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 towards infinity instead
* of rounding towards zero.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
if (b == 0) {
// Guarantee the same behavior as in a regular Solidity division.
return a / b;
}
// The following calculation ensures accurate ceiling division without overflow.
// Since a is non-zero, (a - 1) / b will not overflow.
// The largest possible result occurs when (a - 1) / b is type(uint256).max,
// but the largest value we can obtain is type(uint256).max - 1, which happens
// when a = type(uint256).max and b = 1.
unchecked {
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 = x * y; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
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.
if (denominator <= prod1) {
revert MathOverflowedMulDiv();
}
///////////////////////////////////////////////
// 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.
uint256 twos = denominator & (0 - denominator);
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 (unsignedRoundsUp(rounding) && 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
* towards zero.
*
* 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256 of a positive value rounded towards zero.
* 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
}
}
/**
* @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
*/
function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
return uint8(rounding) % 2 == 1;
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @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);
}
}
}
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant HEX_DIGITS = "0123456789abcdef";
uint8 private constant ADDRESS_LENGTH = 20;
/**
* @dev The `value` string doesn't fit in the specified `length`.
*/
error StringsInsufficientHexLength(uint256 value, uint256 length);
/**
* @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), HEX_DIGITS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toStringSigned(int256 value) internal pure returns (string memory) {
return string.concat(value < 0 ? "-" : "", toString(SignedMath.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, 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) {
uint256 localValue = value;
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] = HEX_DIGITS[localValue & 0xf];
localValue >>= 4;
}
if (localValue != 0) {
revert StringsInsufficientHexLength(value, length);
}
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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
}
}
/**
* @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.
*
* The library provides methods for generating a hash of a message that conforms to the
* https://eips.ethereum.org/EIPS/eip-191[ERC-191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]
* specifications.
*/
library MessageHashUtils {
/**
* @dev Returns the keccak256 digest of an ERC-191 signed data with version
* `0x45` (`personal_sign` messages).
*
* The digest is calculated by prefixing a bytes32 `messageHash` with
* `"\x19Ethereum Signed Message:\n32"` and hashing the result. It corresponds with the
* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
*
* NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with
* keccak256, although any bytes32 value can be safely used because the final digest will
* be re-hashed.
*
* See {ECDSA-recover}.
*/
function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
}
}
/**
* @dev Returns the keccak256 digest of an ERC-191 signed data with version
* `0x45` (`personal_sign` messages).
*
* The digest is calculated by prefixing an arbitrary `message` with
* `"\x19Ethereum Signed Message:\n" + len(message)` and hashing the result. It corresponds with the
* hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.
*
* See {ECDSA-recover}.
*/
function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {
return
keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message));
}
/**
* @dev Returns the keccak256 digest of an ERC-191 signed data with version
* `0x00` (data with intended validator).
*
* The digest is calculated by prefixing an arbitrary `data` with `"\x19\x00"` and the intended
* `validator` address. Then hashing the result.
*
* See {ECDSA-recover}.
*/
function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(hex"19_00", validator, data));
}
/**
* @dev Returns the keccak256 digest of an EIP-712 typed data (ERC-191 version `0x01`).
*
* The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with
* `\x19\x01` and hashing the result. It corresponds to the hash signed by the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.
*
* See {ECDSA-recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(ptr, hex"19_01")
mstore(add(ptr, 0x02), domainSeparator)
mstore(add(ptr, 0x22), structHash)
digest := keccak256(ptr, 0x42)
}
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ShortStrings.sol)
// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.
/**
* @dev Library for reading and writing primitive types to specific storage slots.
*
* Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
* This library helps with reading and writing to such slots without the need for inline assembly.
*
* The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
*
* Example usage to set ERC-1967 implementation slot:
* ```solidity
* contract ERC1967 {
* bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
*
* function _getImplementation() internal view returns (address) {
* return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
* }
*
* function _setImplementation(address newImplementation) internal {
* require(newImplementation.code.length > 0);
* StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
* }
* }
* ```
*/
library StorageSlot {
struct AddressSlot {
address value;
}
struct BooleanSlot {
bool value;
}
struct Bytes32Slot {
bytes32 value;
}
struct Uint256Slot {
uint256 value;
}
struct StringSlot {
string value;
}
struct BytesSlot {
bytes value;
}
/**
* @dev Returns an `AddressSlot` with member `value` located at `slot`.
*/
function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BooleanSlot` with member `value` located at `slot`.
*/
function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
*/
function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `Uint256Slot` with member `value` located at `slot`.
*/
function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` with member `value` located at `slot`.
*/
function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `StringSlot` representation of the string storage pointer `store`.
*/
function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
/**
* @dev Returns an `BytesSlot` with member `value` located at `slot`.
*/
function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := slot
}
}
/**
* @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
*/
function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
/// @solidity memory-safe-assembly
assembly {
r.slot := store.slot
}
}
}
// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
// | length | 0x BB |
type ShortString is bytes32;
/**
* @dev This library provides functions to convert short memory strings
* into a `ShortString` type that can be used as an immutable variable.
*
* Strings of arbitrary length can be optimized using this library if
* they are short enough (up to 31 bytes) by packing them with their
* length (1 byte) in a single EVM word (32 bytes). Additionally, a
* fallback mechanism can be used for every other case.
*
* Usage example:
*
* ```solidity
* contract Named {
* using ShortStrings for *;
*
* ShortString private immutable _name;
* string private _nameFallback;
*
* constructor(string memory contractName) {
* _name = contractName.toShortStringWithFallback(_nameFallback);
* }
*
* function name() external view returns (string memory) {
* return _name.toStringWithFallback(_nameFallback);
* }
* }
* ```
*/
library ShortStrings {
// Used as an identifier for strings longer than 31 bytes.
bytes32 private constant FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;
error StringTooLong(string str);
error InvalidShortString();
/**
* @dev Encode a string of at most 31 chars into a `ShortString`.
*
* This will trigger a `StringTooLong` error is the input string is too long.
*/
function toShortString(string memory str) internal pure returns (ShortString) {
bytes memory bstr = bytes(str);
if (bstr.length > 31) {
revert StringTooLong(str);
}
return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));
}
/**
* @dev Decode a `ShortString` back to a "normal" string.
*/
function toString(ShortString sstr) internal pure returns (string memory) {
uint256 len = byteLength(sstr);
// using `new string(len)` would work locally but is not memory safe.
string memory str = new string(32);
/// @solidity memory-safe-assembly
assembly {
mstore(str, len)
mstore(add(str, 0x20), sstr)
}
return str;
}
/**
* @dev Return the length of a `ShortString`.
*/
function byteLength(ShortString sstr) internal pure returns (uint256) {
uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;
if (result > 31) {
revert InvalidShortString();
}
return result;
}
/**
* @dev Encode a string into a `ShortString`, or write it to storage if it is too long.
*/
function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {
if (bytes(value).length < 32) {
return toShortString(value);
} else {
StorageSlot.getStringSlot(store).value = value;
return ShortString.wrap(FALLBACK_SENTINEL);
}
}
/**
* @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.
*/
function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {
if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
return toString(value);
} else {
return store;
}
}
/**
* @dev Return the length of a string that was encoded to `ShortString` or written to storage using
* {setWithFallback}.
*
* WARNING: This will return the "byte length" of the string. This may not reflect the actual length in terms of
* actual characters as the UTF-8 encoding of a single character can span over multiple bytes.
*/
function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {
if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
return byteLength(value);
} else {
return bytes(store).length;
}
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)
interface IERC5267 {
/**
* @dev MAY be emitted to signal that the domain could have changed.
*/
event EIP712DomainChanged();
/**
* @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
* signature.
*/
function eip712Domain()
external
view
returns (
bytes1 fields,
string memory name,
string memory version,
uint256 chainId,
address verifyingContract,
bytes32 salt,
uint256[] memory extensions
);
}
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP-712] is a standard for hashing and signing of typed structured data.
*
* The encoding scheme specified in the EIP requires a domain separator and a hash of the typed structured data, whose
* encoding is very generic and therefore its implementation in Solidity is not feasible, thus this contract
* does not implement the encoding itself. Protocols need to implement the type-specific encoding they need in order to
* produce the hash of their typed data using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP-712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain
* separator of the implementation contract. This will cause the {_domainSeparatorV4} function to always rebuild the
* separator from the immutable values, which is cheaper than accessing a cached version in cold storage.
*
* @custom:oz-upgrades-unsafe-allow state-variable-immutable
*/
abstract contract EIP712 is IERC5267 {
using ShortStrings for *;
bytes32 private constant TYPE_HASH =
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
// invalidate the cached domain separator if the chain id changes.
bytes32 private immutable _cachedDomainSeparator;
uint256 private immutable _cachedChainId;
address private immutable _cachedThis;
bytes32 private immutable _hashedName;
bytes32 private immutable _hashedVersion;
ShortString private immutable _name;
ShortString private immutable _version;
string private _nameFallback;
string private _versionFallback;
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP-712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
constructor(string memory name, string memory version) {
_name = name.toShortStringWithFallback(_nameFallback);
_version = version.toShortStringWithFallback(_versionFallback);
_hashedName = keccak256(bytes(name));
_hashedVersion = keccak256(bytes(version));
_cachedChainId = block.chainid;
_cachedDomainSeparator = _buildDomainSeparator();
_cachedThis = address(this);
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
if (address(this) == _cachedThis && block.chainid == _cachedChainId) {
return _cachedDomainSeparator;
} else {
return _buildDomainSeparator();
}
}
function _buildDomainSeparator() private view returns (bytes32) {
return keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
}
/**
* @dev See {IERC-5267}.
*/
function eip712Domain()
public
view
virtual
returns (
bytes1 fields,
string memory name,
string memory version,
uint256 chainId,
address verifyingContract,
bytes32 salt,
uint256[] memory extensions
)
{
return (
hex"0f", // 01111
_EIP712Name(),
_EIP712Version(),
block.chainid,
address(this),
bytes32(0),
new uint256[](0)
);
}
/**
* @dev The name parameter for the EIP712 domain.
*
* NOTE: By default this function reads _name which is an immutable value.
* It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
*/
// solhint-disable-next-line func-name-mixedcase
function _EIP712Name() internal view returns (string memory) {
return _name.toStringWithFallback(_nameFallback);
}
/**
* @dev The version parameter for the EIP712 domain.
*
* NOTE: By default this function reads _version which is an immutable value.
* It only reads from storage if necessary (in case the value is too large to fit in a ShortString).
*/
// solhint-disable-next-line func-name-mixedcase
function _EIP712Version() internal view returns (string memory) {
return _version.toStringWithFallback(_versionFallback);
}
}
// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)
/**
* @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
}
/**
* @dev The signature derives the `address(0)`.
*/
error ECDSAInvalidSignature();
/**
* @dev The signature has an invalid length.
*/
error ECDSAInvalidSignatureLength(uint256 length);
/**
* @dev The signature has an S value that is in the upper half order.
*/
error ECDSAInvalidSignatureS(bytes32 s);
/**
* @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
* return address(0) without also returning an error description. Errors are documented using an enum (error type)
* and a bytes32 providing additional information about the error.
*
* If no error is returned, then the address can be used for verification purposes.
*
* The `ecrecover` EVM precompile 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 {MessageHashUtils-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]
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
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, bytes32(signature.length));
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM precompile 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 {MessageHashUtils-toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
_throwError(error, errorArg);
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[ERC-2098 short signatures]
*/
function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
unchecked {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
// We do not check for an overflow here since the shift operation results in 0 or 1.
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.
*/
function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
(address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError, bytes32) {
// 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, s);
}
// 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, bytes32(0));
}
return (signer, RecoverError.NoError, bytes32(0));
}
/**
* @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, bytes32 errorArg) = tryRecover(hash, v, r, s);
_throwError(error, errorArg);
return recovered;
}
/**
* @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
*/
function _throwError(RecoverError error, bytes32 errorArg) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert ECDSAInvalidSignature();
} else if (error == RecoverError.InvalidSignatureLength) {
revert ECDSAInvalidSignatureLength(uint256(errorArg));
} else if (error == RecoverError.InvalidSignatureS) {
revert ECDSAInvalidSignatureS(errorArg);
}
}
}
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IBlast {
// configure
function configureContract(
address contractAddress,
YieldMode _yield,
GasMode gasMode,
address governor
) external;
function configure(YieldMode _yield, GasMode gasMode, address governor) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;
// claim yield
function claimYield(
address contractAddress,
address recipientOfYield,
uint256 amount
) external returns (uint256);
function claimAllYield(
address contractAddress,
address recipientOfYield
) external returns (uint256);
// claim gas
function claimAllGas(
address contractAddress,
address recipientOfGas
) external returns (uint256);
function claimGasAtMinClaimRate(
address contractAddress,
address recipientOfGas,
uint256 minClaimRateBips
) external returns (uint256);
function claimMaxGas(
address contractAddress,
address recipientOfGas
) external returns (uint256);
function claimGas(
address contractAddress,
address recipientOfGas,
uint256 gasToClaim,
uint256 gasSecondsToConsume
) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(
address contractAddress
)
external
view
returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}
contract BlastGovernor {
IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002);
constructor(address governor) {
BLAST.configureClaimableGas();
BLAST.configureGovernor(governor);
}
}
interface IBlastPoints {
function configurePointsOperator(address operator) external;
function configurePointsOperatorOnBehalf(address contractAddress, address operator) external;
}
contract BlastPointsOperator {
constructor(address blastPointsRegistry_, address pointsOperator_) {
IBlastPoints(blastPointsRegistry_).configurePointsOperator(pointsOperator_);
}
}
contract BACCheckIn is
Ownable,
Pausable,
EIP712("BACCheckIn", "1"),
BlastGovernor,
BlastPointsOperator
{
error SignatureExpired();
error SignatureAlreadyUsed();
error SignatureInvalid();
event ApprovalSignerUpdated(address signer);
event UserCheckIn(address user, uint256 date);
address public approvalSigner;
mapping(address => mapping(uint256 => bool)) public userCheckInEntries;
bytes32 internal constant _CHECK_IN_TYPE_HASH =
keccak256("CheckIn(uint256 deadline,uint256 date,address user)");
constructor(
address owner_,
address blastPointsRegistry_,
address pointsOperator_
)
Ownable(owner_)
BlastGovernor(owner_)
BlastPointsOperator(blastPointsRegistry_, pointsOperator_)
{}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function setApprovalSigner(address signer) external onlyOwner {
approvalSigner = signer;
emit ApprovalSignerUpdated(signer);
}
function checkIn(
uint256 deadline,
uint256 date,
bytes calldata signature
) external whenNotPaused {
if (deadline < block.timestamp) {
revert SignatureExpired();
}
if (userCheckInEntries[_msgSender()][date]) {
revert SignatureAlreadyUsed();
}
bytes32 digest = _hashTypedDataV4(
keccak256(abi.encode(_CHECK_IN_TYPE_HASH, deadline, date, _msgSender()))
);
if (ECDSA.recover(digest, signature) != approvalSigner) {
revert SignatureInvalid();
}
userCheckInEntries[_msgSender()][date] = true;
emit UserCheckIn(_msgSender(), date);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"blastPointsRegistry_","type":"address"},{"internalType":"address","name":"pointsOperator_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"SignatureAlreadyUsed","type":"error"},{"inputs":[],"name":"SignatureExpired","type":"error"},{"inputs":[],"name":"SignatureInvalid","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"signer","type":"address"}],"name":"ApprovalSignerUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"EIP712DomainChanged","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"}],"name":"UserCheckIn","type":"event"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"approvalSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"date","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"checkIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"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":"signer","type":"address"}],"name":"setApprovalSigner","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":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userCheckInEntries","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101606040523480156200001257600080fd5b5060405162001341380380620013418339810160408190526200003591620003a8565b8181846040518060400160405280600a8152602001692120a1a1b432b1b5a4b760b11b815250604051806040016040528060018152602001603160f81b8152508760006001600160a01b0316816001600160a01b031603620000b257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000bd81620002bf565b506000805460ff60a01b19169055620000d88260016200030f565b61012052620000e98160026200030f565b61014052815160208084019190912060e052815190820120610100524660a0526200017760e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60805250503060c05260408051634e606c4760e01b8152905173430000000000000000000000000000000000000291634e606c4791600480830192600092919082900301818387803b158015620001cd57600080fd5b505af1158015620001e2573d6000803e3d6000fd5b5050604051631d70c8d360e31b81526001600160a01b0384166004820152734300000000000000000000000000000000000002925063eb8646989150602401600060405180830381600087803b1580156200023c57600080fd5b505af115801562000251573d6000803e3d6000fd5b50506040516336b91f2b60e01b81526001600160a01b038581166004830152861693506336b91f2b92506024019050600060405180830381600087803b1580156200029b57600080fd5b505af1158015620002b0573d6000803e3d6000fd5b505050505050505050620005d8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020835110156200032f57620003278362000348565b905062000342565b816200033c848262000497565b5060ff90505b92915050565b600080829050601f8151111562000376578260405163305a27a960e01b8152600401620000a9919062000563565b80516200038382620005b3565b179392505050565b80516001600160a01b0381168114620003a357600080fd5b919050565b600080600060608486031215620003be57600080fd5b620003c9846200038b565b9250620003d9602085016200038b565b9150620003e9604085016200038b565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200041d57607f821691505b6020821081036200043e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200049257600081815260208120601f850160051c810160208610156200046d5750805b601f850160051c820191505b818110156200048e5782815560010162000479565b5050505b505050565b81516001600160401b03811115620004b357620004b3620003f2565b620004cb81620004c4845462000408565b8462000444565b602080601f831160018114620005035760008415620004ea5750858301515b600019600386901b1c1916600185901b1785556200048e565b600085815260208120601f198616915b82811015620005345788860151825594840194600190910190840162000513565b5085821015620005535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620005925785810183015185820160400152820162000574565b506000604082860101526040601f19601f8301168501019250505092915050565b805160208083015191908110156200043e5760001960209190910360031b1b16919050565b60805160a05160c05160e051610100516101205161014051610d0e6200063360003960006105d6015260006105a4015260006108330152600061080b0152600061076601526000610790015260006107ba0152610d0e6000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806384b0196e1161007157806384b0196e1461014f5780638da5cb5b1461016a57806397d757761461017b578063bd919f7914610189578063f2fde38b1461019c578063fd649abf146101af57600080fd5b806318b1b60e146100b95780633f4ba83a146100e95780635c975abb146100f3578063715018a61461011157806372b3524a146101195780638456cb5914610147575b600080fd5b6003546100cc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100f16101c2565b005b600054600160a01b900460ff165b60405190151581526020016100e0565b6100f16101d4565b610101610127366004610ae0565b600460209081526000928352604080842090915290825290205460ff1681565b6100f16101e6565b6101576101f6565b6040516100e09796959493929190610b50565b6000546001600160a01b03166100cc565b6100cc6002604360981b0181565b6100f1610197366004610be6565b61023c565b6100f16101aa366004610be6565b610298565b6100f16101bd366004610c08565b6102db565b6101ca610488565b6101d26104b5565b565b6101dc610488565b6101d2600061050a565b6101ee610488565b6101d261055a565b60006060806000806000606061020a61059d565b6102126105cf565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b610244610488565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f431b93b531274b387b5c0098b65bf18c7d246ab17ece9980ce77547a73880eb29060200160405180910390a150565b6102a0610488565b6001600160a01b0381166102cf57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6102d88161050a565b50565b6102e36105fc565b4284101561030457604051630819bdcd60e01b815260040160405180910390fd5b33600090815260046020908152604080832086845290915290205460ff16156103405760405163900bb2c960e01b815260040160405180910390fd5b60006103ac7fc309c41ea8a84def19a2204e71142745169ca8aba85020064e97546bfe306c5f86863360408051602081019590955284019290925260608301526001600160a01b0316608082015260a00160405160208183030381529060405280519060200120610627565b600354604080516020601f87018190048102820181019092528581529293506001600160a01b03909116916103fe91849190879087908190840183828082843760009201919091525061065a92505050565b6001600160a01b031614610425576040516337e8456b60e01b815260040160405180910390fd5b336000818152600460209081526040808320888452825291829020805460ff191660011790558151928352820186905280517f38db2f2a03df12a6a6200f096a82e3db967c8b3df377a877847c29e89bbd1dd99281900390910190a15050505050565b6000546001600160a01b031633146101d25760405163118cdaa760e01b81523360048201526024016102c6565b6104bd610684565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105626105fc565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586104ed3390565b60606105ca7f000000000000000000000000000000000000000000000000000000000000000060016106ae565b905090565b60606105ca7f000000000000000000000000000000000000000000000000000000000000000060026106ae565b600054600160a01b900460ff16156101d25760405163d93c066560e01b815260040160405180910390fd5b6000610654610634610759565b8360405161190160f01b8152600281019290925260228201526042902090565b92915050565b60008060008061066a8686610884565b92509250925061067a82826108d1565b5090949350505050565b600054600160a01b900460ff166101d257604051638dfc202b60e01b815260040160405180910390fd5b606060ff83146106c8576106c18361098e565b9050610654565b8180546106d490610c88565b80601f016020809104026020016040519081016040528092919081815260200182805461070090610c88565b801561074d5780601f106107225761010080835404028352916020019161074d565b820191906000526020600020905b81548152906001019060200180831161073057829003601f168201915b50505050509050610654565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156107b257507f000000000000000000000000000000000000000000000000000000000000000046145b156107dc57507f000000000000000000000000000000000000000000000000000000000000000090565b6105ca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b600080600083516041036108be5760208401516040850151606086015160001a6108b0888285856109cd565b9550955095505050506108ca565b50508151600091506002905b9250925092565b60008260038111156108e5576108e5610cc2565b036108ee575050565b600182600381111561090257610902610cc2565b036109205760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561093457610934610cc2565b036109555760405163fce698f760e01b8152600481018290526024016102c6565b600382600381111561096957610969610cc2565b0361098a576040516335e2f38360e21b8152600481018290526024016102c6565b5050565b6060600061099b83610a9c565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a085750600091506003905082610a92565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a5c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610a8857506000925060019150829050610a92565b9250600091508190505b9450945094915050565b600060ff8216601f81111561065457604051632cd44ac360e21b815260040160405180910390fd5b80356001600160a01b0381168114610adb57600080fd5b919050565b60008060408385031215610af357600080fd5b610afc83610ac4565b946020939093013593505050565b6000815180845260005b81811015610b3057602081850181015186830182015201610b14565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e081840152610b7060e084018a610b0a565b8381036040850152610b82818a610b0a565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015610bd457835183529284019291840191600101610bb8565b50909c9b505050505050505050505050565b600060208284031215610bf857600080fd5b610c0182610ac4565b9392505050565b60008060008060608587031215610c1e57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115610c4457600080fd5b818701915087601f830112610c5857600080fd5b813581811115610c6757600080fd5b886020828501011115610c7957600080fd5b95989497505060200194505050565b600181811c90821680610c9c57607f821691505b602082108103610cbc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220d1e48fdb5ed6b923970bc96eeccb0b7455b7959adfa9a24a2a5b6fb40372e09f64736f6c63430008140033000000000000000000000000bba2213a0c06ed2f0e266572dac5a4bc5fb277c00000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd8000000000000000000000000008a505b86fcd7f58c0e8f654f93ffba297ed09abd
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c806384b0196e1161007157806384b0196e1461014f5780638da5cb5b1461016a57806397d757761461017b578063bd919f7914610189578063f2fde38b1461019c578063fd649abf146101af57600080fd5b806318b1b60e146100b95780633f4ba83a146100e95780635c975abb146100f3578063715018a61461011157806372b3524a146101195780638456cb5914610147575b600080fd5b6003546100cc906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6100f16101c2565b005b600054600160a01b900460ff165b60405190151581526020016100e0565b6100f16101d4565b610101610127366004610ae0565b600460209081526000928352604080842090915290825290205460ff1681565b6100f16101e6565b6101576101f6565b6040516100e09796959493929190610b50565b6000546001600160a01b03166100cc565b6100cc6002604360981b0181565b6100f1610197366004610be6565b61023c565b6100f16101aa366004610be6565b610298565b6100f16101bd366004610c08565b6102db565b6101ca610488565b6101d26104b5565b565b6101dc610488565b6101d2600061050a565b6101ee610488565b6101d261055a565b60006060806000806000606061020a61059d565b6102126105cf565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b610244610488565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f431b93b531274b387b5c0098b65bf18c7d246ab17ece9980ce77547a73880eb29060200160405180910390a150565b6102a0610488565b6001600160a01b0381166102cf57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6102d88161050a565b50565b6102e36105fc565b4284101561030457604051630819bdcd60e01b815260040160405180910390fd5b33600090815260046020908152604080832086845290915290205460ff16156103405760405163900bb2c960e01b815260040160405180910390fd5b60006103ac7fc309c41ea8a84def19a2204e71142745169ca8aba85020064e97546bfe306c5f86863360408051602081019590955284019290925260608301526001600160a01b0316608082015260a00160405160208183030381529060405280519060200120610627565b600354604080516020601f87018190048102820181019092528581529293506001600160a01b03909116916103fe91849190879087908190840183828082843760009201919091525061065a92505050565b6001600160a01b031614610425576040516337e8456b60e01b815260040160405180910390fd5b336000818152600460209081526040808320888452825291829020805460ff191660011790558151928352820186905280517f38db2f2a03df12a6a6200f096a82e3db967c8b3df377a877847c29e89bbd1dd99281900390910190a15050505050565b6000546001600160a01b031633146101d25760405163118cdaa760e01b81523360048201526024016102c6565b6104bd610684565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105626105fc565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586104ed3390565b60606105ca7f424143436865636b496e0000000000000000000000000000000000000000000a60016106ae565b905090565b60606105ca7f310000000000000000000000000000000000000000000000000000000000000160026106ae565b600054600160a01b900460ff16156101d25760405163d93c066560e01b815260040160405180910390fd5b6000610654610634610759565b8360405161190160f01b8152600281019290925260228201526042902090565b92915050565b60008060008061066a8686610884565b92509250925061067a82826108d1565b5090949350505050565b600054600160a01b900460ff166101d257604051638dfc202b60e01b815260040160405180910390fd5b606060ff83146106c8576106c18361098e565b9050610654565b8180546106d490610c88565b80601f016020809104026020016040519081016040528092919081815260200182805461070090610c88565b801561074d5780601f106107225761010080835404028352916020019161074d565b820191906000526020600020905b81548152906001019060200180831161073057829003601f168201915b50505050509050610654565b6000306001600160a01b037f000000000000000000000000e475af1e690b37b0d1f3c60ff44cd2fe8a2588ae161480156107b257507f0000000000000000000000000000000000000000000000000000000000013e3146145b156107dc57507f0f2b3d2c1bed359b630f8786a262568f189d3b0acecc71e5144857a9ab57a3de90565b6105ca604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f9deaf3a8cf426d9cc26dba37313e01cb892db81a3bf48b98f47569bd79222b20918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b600080600083516041036108be5760208401516040850151606086015160001a6108b0888285856109cd565b9550955095505050506108ca565b50508151600091506002905b9250925092565b60008260038111156108e5576108e5610cc2565b036108ee575050565b600182600381111561090257610902610cc2565b036109205760405163f645eedf60e01b815260040160405180910390fd5b600282600381111561093457610934610cc2565b036109555760405163fce698f760e01b8152600481018290526024016102c6565b600382600381111561096957610969610cc2565b0361098a576040516335e2f38360e21b8152600481018290526024016102c6565b5050565b6060600061099b83610a9c565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610a085750600091506003905082610a92565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610a5c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610a8857506000925060019150829050610a92565b9250600091508190505b9450945094915050565b600060ff8216601f81111561065457604051632cd44ac360e21b815260040160405180910390fd5b80356001600160a01b0381168114610adb57600080fd5b919050565b60008060408385031215610af357600080fd5b610afc83610ac4565b946020939093013593505050565b6000815180845260005b81811015610b3057602081850181015186830182015201610b14565b506000602082860101526020601f19601f83011685010191505092915050565b60ff60f81b881681526000602060e081840152610b7060e084018a610b0a565b8381036040850152610b82818a610b0a565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015610bd457835183529284019291840191600101610bb8565b50909c9b505050505050505050505050565b600060208284031215610bf857600080fd5b610c0182610ac4565b9392505050565b60008060008060608587031215610c1e57600080fd5b8435935060208501359250604085013567ffffffffffffffff80821115610c4457600080fd5b818701915087601f830112610c5857600080fd5b813581811115610c6757600080fd5b886020828501011115610c7957600080fd5b95989497505060200194505050565b600181811c90821680610c9c57607f821691505b602082108103610cbc57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220d1e48fdb5ed6b923970bc96eeccb0b7455b7959adfa9a24a2a5b6fb40372e09f64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bba2213a0c06ed2f0e266572dac5a4bc5fb277c00000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd8000000000000000000000000008a505b86fcd7f58c0e8f654f93ffba297ed09abd
-----Decoded View---------------
Arg [0] : owner_ (address): 0xBba2213a0C06eD2F0e266572DAc5a4bC5fB277C0
Arg [1] : blastPointsRegistry_ (address): 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800
Arg [2] : pointsOperator_ (address): 0x8a505b86FcD7f58c0E8F654F93FfBa297Ed09abD
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bba2213a0c06ed2f0e266572dac5a4bc5fb277c0
Arg [1] : 0000000000000000000000002536fe9ab3f511540f2f9e2ec2a805005c3dd800
Arg [2] : 0000000000000000000000008a505b86fcd7f58c0e8f654f93ffba297ed09abd
Deployed Bytecode Sourcemap
57597:1860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57937:29;;;;;-1:-1:-1;;;;;57937:29:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;57937:29:0;;;;;;;;58511:67;;;:::i;:::-;;5899:86;5946:4;5970:7;-1:-1:-1;;;5970:7:0;;;;5899:86;;;387:14:1;;380:22;362:41;;350:2;335:18;5899:86:0;222:187:1;3250:103:0;;;:::i;57975:70::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;58440:63;;;:::i;44968:580::-;;;:::i;:::-;;;;;;;;;;;;;:::i;2575:87::-;2621:7;2648:6;-1:-1:-1;;;;;2648:6:0;2575:87;;56976:81;;-1:-1:-1;;;;;56976:81:0;;58586:149;;;;;;:::i;:::-;;:::i;3508:220::-;;;;;;:::i;:::-;;:::i;58743:711::-;;;;;;:::i;:::-;;:::i;58511:67::-;2461:13;:11;:13::i;:::-;58560:10:::1;:8;:10::i;:::-;58511:67::o:0;3250:103::-;2461:13;:11;:13::i;:::-;3315:30:::1;3342:1;3315:18;:30::i;58440:63::-:0;2461:13;:11;:13::i;:::-;58487:8:::1;:6;:8::i;44968:580::-:0;45071:13;45099:18;45132:21;45168:15;45198:25;45238:12;45265:27;45373:13;:11;:13::i;:::-;45401:16;:14;:16::i;:::-;45513;;;45496:1;45513:16;;;;;;;;;-1:-1:-1;;;45320:220:0;;;-1:-1:-1;45320:220:0;;-1:-1:-1;45432:13:0;;-1:-1:-1;45468:4:0;;-1:-1:-1;45496:1:0;-1:-1:-1;45513:16:0;-1:-1:-1;45320:220:0;-1:-1:-1;44968:580:0:o;58586:149::-;2461:13;:11;:13::i;:::-;58659:14:::1;:23:::0;;-1:-1:-1;;;;;;58659:23:0::1;-1:-1:-1::0;;;;;58659:23:0;::::1;::::0;;::::1;::::0;;;58698:29:::1;::::0;160:51:1;;;58698:29:0::1;::::0;148:2:1;133:18;58698:29:0::1;;;;;;;58586:149:::0;:::o;3508:220::-;2461:13;:11;:13::i;:::-;-1:-1:-1;;;;;3593:22:0;::::1;3589:93;;3639:31;::::0;-1:-1:-1;;;3639:31:0;;3667:1:::1;3639:31;::::0;::::1;160:51:1::0;133:18;;3639:31:0::1;;;;;;;;3589:93;3692:28;3711:8;3692:18;:28::i;:::-;3508:220:::0;:::o;58743:711::-;5504:19;:17;:19::i;:::-;58901:15:::1;58890:8;:26;58886:84;;;58940:18;;-1:-1:-1::0;;;58940:18:0::1;;;;;;;;;;;58886:84;823:10:::0;58984:32:::1;::::0;;;:18:::1;:32;::::0;;;;;;;:38;;;;;;;;;::::1;;58980:100;;;59046:22;;-1:-1:-1::0;;;59046:22:0::1;;;;;;;;;;;58980:100;59092:14;59109:114;58111:64;59182:8:::0;59192:4;823:10;59150:61:::1;::::0;;::::1;::::0;::::1;4052:25:1::0;;;;4093:18;;4086:34;;;;4136:18;;;4129:34;-1:-1:-1;;;;;4199:32:1;4179:18;;;4172:60;4024:19;;59150:61:0::1;;;;;;;;;;;;59140:72;;;;;;59109:16;:114::i;:::-;59274:14;::::0;59238:32:::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;59092:131;;-1:-1:-1;;;;;;59274:14:0;;::::1;::::0;59238:32:::1;::::0;59092:131;;59238:32;59260:9;;;;;;59238:32;::::1;59260:9:::0;;;;59238:32;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;59238:13:0::1;::::0;-1:-1:-1;;;59238:32:0:i:1;:::-;-1:-1:-1::0;;;;;59238:50:0::1;;59234:108;;59312:18;;-1:-1:-1::0;;;59312:18:0::1;;;;;;;;;;;59234:108;823:10:::0;59354:32:::1;::::0;;;:18:::1;:32;::::0;;;;;;;:38;;;;;;;;;:45;;-1:-1:-1;;59354:45:0::1;59395:4;59354:45;::::0;;59415:31;;4417:51:1;;;4484:18;;4477:34;;;59415:31:0;;::::1;::::0;;;;;;;;::::1;58875:579;58743:711:::0;;;;:::o;2740:166::-;2621:7;2648:6;-1:-1:-1;;;;;2648:6:0;823:10;2800:23;2796:103;;2847:40;;-1:-1:-1;;;2847:40:0;;823:10;2847:40;;;160:51:1;133:18;;2847:40:0;14:203:1;6800:120:0;5763:16;:14;:16::i;:::-;6869:5:::1;6859:15:::0;;-1:-1:-1;;;;6859:15:0::1;::::0;;6890:22:::1;823:10:::0;6899:12:::1;6890:22;::::0;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;6890:22:0::1;;;;;;;6800:120::o:0;3888:191::-;3962:16;3981:6;;-1:-1:-1;;;;;3998:17:0;;;-1:-1:-1;;;;;;3998:17:0;;;;;;4031:40;;3981:6;;;;;;;4031:40;;3962:16;4031:40;3951:128;3888:191;:::o;6541:118::-;5504:19;:17;:19::i;:::-;6601:7:::1;:14:::0;;-1:-1:-1;;;;6601:14:0::1;-1:-1:-1::0;;;6601:14:0::1;::::0;;6631:20:::1;6638:12;823:10:::0;;743:98;45877:128;45923:13;45956:41;:5;45983:13;45956:26;:41::i;:::-;45949:48;;45877:128;:::o;46340:137::-;46389:13;46422:47;:8;46452:16;46422:29;:47::i;6058:132::-;5946:4;5970:7;-1:-1:-1;;;5970:7:0;;;;6120:63;;;6156:15;;-1:-1:-1;;;6156:15:0;;;;;;;;;;;44734:178;44811:7;44838:66;44871:20;:18;:20::i;:::-;44893:10;30785:4;30779:11;-1:-1:-1;;;30804:23:0;;30857:4;30848:14;;30841:39;;;;30910:4;30901:14;;30894:34;30967:4;30952:20;;;30580:410;44838:66;44831:73;44734:178;-1:-1:-1;;44734:178:0:o;50213:259::-;50291:7;50312:17;50331:18;50351:16;50371:27;50382:4;50388:9;50371:10;:27::i;:::-;50311:87;;;;;;50409:28;50421:5;50428:8;50409:11;:28::i;:::-;-1:-1:-1;50455:9:0;;50213:259;-1:-1:-1;;;;50213:259:0:o;6267:130::-;5946:4;5970:7;-1:-1:-1;;;5970:7:0;;;;6326:64;;6363:15;;-1:-1:-1;;;6363:15:0;;;;;;;;;;;38379:273;38473:13;36325:66;38503:46;;38499:146;;38573:15;38582:5;38573:8;:15::i;:::-;38566:22;;;;38499:146;38628:5;38621:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43635:268;43688:7;43720:4;-1:-1:-1;;;;;43729:11:0;43712:28;;:63;;;;;43761:14;43744:13;:31;43712:63;43708:188;;;-1:-1:-1;43799:22:0;;43635:268::o;43708:188::-;43861:23;44003:80;;;41827:95;44003:80;;;5662:25:1;44025:11:0;5703:18:1;;;5696:34;;;;44038:14:0;5746:18:1;;;5739:34;44054:13:0;5789:18:1;;;5782:34;44077:4:0;5832:19:1;;;5825:61;43966:7:0;;5634:19:1;;44003:80:0;;;;;;;;;;;;43993:91;;;;;;43986:98;;43911:181;;48607:783;48688:7;48697:12;48711:7;48735:9;:16;48755:2;48735:22;48731:652;;49079:4;49064:20;;49058:27;49129:4;49114:20;;49108:27;49187:4;49172:20;;49166:27;48774:9;49158:36;49230:25;49241:4;49158:36;49058:27;49108;49230:10;:25::i;:::-;49223:32;;;;;;;;;;;48731:652;-1:-1:-1;;49353:16:0;;49304:1;;-1:-1:-1;49308:35:0;;48731:652;48607:783;;;;;:::o;53781:542::-;53877:20;53868:5;:29;;;;;;;;:::i;:::-;;53864:452;;53781:542;;:::o;53864:452::-;53975:29;53966:5;:38;;;;;;;;:::i;:::-;;53962:354;;54028:23;;-1:-1:-1;;;54028:23:0;;;;;;;;;;;53962:354;54082:35;54073:5;:44;;;;;;;;:::i;:::-;;54069:247;;54141:46;;-1:-1:-1;;;54141:46:0;;;;;5185:25:1;;;5158:18;;54141:46:0;5039:177:1;54069:247:0;54218:30;54209:5;:39;;;;;;;;:::i;:::-;;54205:111;;54272:32;;-1:-1:-1;;;54272:32:0;;;;;5185:25:1;;;5158:18;;54272:32:0;5039:177:1;54205:111:0;53781:542;;:::o;37034:415::-;37093:13;37119:11;37133:16;37144:4;37133:10;:16::i;:::-;37259:14;;;37270:2;37259:14;;;;;;;;;37119:30;;-1:-1:-1;37239:17:0;;37259:14;;;;;;;;;-1:-1:-1;;;37352:16:0;;;-1:-1:-1;37398:4:0;37389:14;;37382:28;;;;-1:-1:-1;37352:16:0;37034:415::o;51684:1556::-;51815:7;;;52758:66;52745:79;;52741:166;;;-1:-1:-1;52857:1:0;;-1:-1:-1;52861:30:0;;-1:-1:-1;52893:1:0;52841:54;;52741:166;53021:24;;;53004:14;53021:24;;;;;;;;;6124:25:1;;;6197:4;6185:17;;6165:18;;;6158:45;;;;6219:18;;;6212:34;;;6262:18;;;6255:34;;;53021:24:0;;6096:19:1;;53021:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53021:24:0;;-1:-1:-1;;53021:24:0;;;-1:-1:-1;;;;;;;53060:20:0;;53056:115;;-1:-1:-1;53113:1:0;;-1:-1:-1;53117:29:0;;-1:-1:-1;53113:1:0;;-1:-1:-1;53097:62:0;;53056:115;53191:6;-1:-1:-1;53199:20:0;;-1:-1:-1;53199:20:0;;-1:-1:-1;51684:1556:0;;;;;;;;;:::o;37526:251::-;37587:7;37660:4;37624:40;;37688:2;37679:11;;37675:71;;;37714:20;;-1:-1:-1;;;37714:20:0;;;;;;;;;;;414:173:1;482:20;;-1:-1:-1;;;;;531:31:1;;521:42;;511:70;;577:1;574;567:12;511:70;414:173;;;:::o;592:254::-;660:6;668;721:2;709:9;700:7;696:23;692:32;689:52;;;737:1;734;727:12;689:52;760:29;779:9;760:29;:::i;:::-;750:39;836:2;821:18;;;;808:32;;-1:-1:-1;;;592:254:1:o;851:423::-;893:3;931:5;925:12;958:6;953:3;946:19;983:1;993:162;1007:6;1004:1;1001:13;993:162;;;1069:4;1125:13;;;1121:22;;1115:29;1097:11;;;1093:20;;1086:59;1022:12;993:162;;;997:3;1200:1;1193:4;1184:6;1179:3;1175:16;1171:27;1164:38;1263:4;1256:2;1252:7;1247:2;1239:6;1235:15;1231:29;1226:3;1222:39;1218:50;1211:57;;;851:423;;;;:::o;1279:1259::-;1685:3;1680;1676:13;1668:6;1664:26;1653:9;1646:45;1627:4;1710:2;1748:3;1743:2;1732:9;1728:18;1721:31;1775:46;1816:3;1805:9;1801:19;1793:6;1775:46;:::i;:::-;1869:9;1861:6;1857:22;1852:2;1841:9;1837:18;1830:50;1903:33;1929:6;1921;1903:33;:::i;:::-;1967:2;1952:18;;1945:34;;;-1:-1:-1;;;;;2016:32:1;;2010:3;1995:19;;1988:61;2036:3;2065:19;;2058:35;;;2130:22;;;2124:3;2109:19;;2102:51;2202:13;;2224:22;;;2300:15;;;;-1:-1:-1;2262:15:1;;;;-1:-1:-1;2343:169:1;2357:6;2354:1;2351:13;2343:169;;;2418:13;;2406:26;;2487:15;;;;2452:12;;;;2379:1;2372:9;2343:169;;;-1:-1:-1;2529:3:1;;1279:1259;-1:-1:-1;;;;;;;;;;;;1279:1259:1:o;2766:186::-;2825:6;2878:2;2866:9;2857:7;2853:23;2849:32;2846:52;;;2894:1;2891;2884:12;2846:52;2917:29;2936:9;2917:29;:::i;:::-;2907:39;2766:186;-1:-1:-1;;;2766:186:1:o;2957:727::-;3045:6;3053;3061;3069;3122:2;3110:9;3101:7;3097:23;3093:32;3090:52;;;3138:1;3135;3128:12;3090:52;3174:9;3161:23;3151:33;;3231:2;3220:9;3216:18;3203:32;3193:42;;3286:2;3275:9;3271:18;3258:32;3309:18;3350:2;3342:6;3339:14;3336:34;;;3366:1;3363;3356:12;3336:34;3404:6;3393:9;3389:22;3379:32;;3449:7;3442:4;3438:2;3434:13;3430:27;3420:55;;3471:1;3468;3461:12;3420:55;3511:2;3498:16;3537:2;3529:6;3526:14;3523:34;;;3553:1;3550;3543:12;3523:34;3598:7;3593:2;3584:6;3580:2;3576:15;3572:24;3569:37;3566:57;;;3619:1;3616;3609:12;3566:57;2957:727;;;;-1:-1:-1;;3650:2:1;3642:11;;-1:-1:-1;;;2957:727:1:o;4522:380::-;4601:1;4597:12;;;;4644;;;4665:61;;4719:4;4711:6;4707:17;4697:27;;4665:61;4772:2;4764:6;4761:14;4741:18;4738:38;4735:161;;4818:10;4813:3;4809:20;4806:1;4799:31;4853:4;4850:1;4843:15;4881:4;4878:1;4871:15;4735:161;;4522:380;;;:::o;4907:127::-;4968:10;4963:3;4959:20;4956:1;4949:31;4999:4;4996:1;4989:15;5023:4;5020:1;5013:15
Swarm Source
ipfs://d1e48fdb5ed6b923970bc96eeccb0b7455b7959adfa9a24a2a5b6fb40372e09f
Net Worth in USD
Net Worth in ETH
Token Allocations
Multichain Portfolio | 35 Chains
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.