ERC-20
Source Code
Overview
Max Total Supply
999,999,999.999992955069101283 BLEP
Holders
569,701
Market
Price
$0.00 @ 0.000000 ETH
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
BeliefToken
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
/*
X: https://x.com/lennoxxcartel/status/1867444580930785598
Created at https://beliefs.social
*/
/*
X: https://x.com/icedmarsh/status/1867429808814403992
Created at https://beliefs.social
*/
/*
X: https://x.com/mattrenggana/status/1867418481614106640
Created at https://beliefs.social
*/
/*
X: https://x.com/fgggg123456/status/1867389473589448948
Created at https://beliefs.social
*/
/*
X: https://x.com/rallyyyyyyz/status/1867378090433032253
Created at https://beliefs.social
*/
/*
X: https://x.com/0xMahla/status/1867368801118863760
Created at https://beliefs.social
*/
/*
X: https://x.com/SolarisAI_fun/status/1867366932015616114
Created at https://beliefs.social
*/
/*
X: https://x.com/god/status/1867366202794029113
Created at https://beliefs.social
*/
pragma solidity ^0.8.25;
import {ERC20} from "solady/src/tokens/ERC20.sol";
import {MerkleProofLib} from "solady/src/utils/MerkleProofLib.sol";
import {Token} from "./libraries/Token.sol";
interface ProtocolModerators {
function isAirdropController(address) external view returns (bool);
function isClaimableRewardsController(address) external view returns (bool);
function isTokenExists(address token) external view returns (bool);
}
/// @title BeliefToken
/// @dev Owner of this token is the protocol itself.
/// It is used as vault for tokens for airdrops and rewards (if creator has enabled them).
contract BeliefToken is ERC20 {
uint256 public constant MAX_SUPPLY = 1_000_000_000 * 1e18;
string private _name;
string private _symbol;
address public immutable creator;
address public immutable protocol;
error BeliefToken_Unauthorized();
error BeliefToken_AirdropNotEligible();
error BeliefToken_MaxSupplyOverflow();
error BeliefToken_AlreadyClaimed();
error BeliefToken_AirdropWaveNotEnabled();
event BeliefToken_ClaimReward(address indexed recipient, uint256 amount);
event BeliefToken_EnableAirdropWave(string waveId, bytes32 merkleRoot);
event BeliefToken_ClaimAirdropWave(string waveId, uint256 amount, bytes32[] merkleProof);
mapping(string waveId => mapping(address holder => bool claimed)) public claimedAirdropWaveStatusOf;
mapping(string waveId => Token.AirdropWave) public airdropWaves;
mapping(string userId => bool claimed) public claimedRewardStatusOf;
bytes32 public rewardsMerkleRoot;
constructor(
string memory name_,
string memory symbol_,
address creator_,
address protocol_,
Token.AirdropWave[] memory airdropWaves_,
bytes32 rewardsMerkleRoot_,
uint256 amountToDistributeClaimableRewards
) {
_name = name_;
// Ensure that the token is created by the protocol
if (!ProtocolModerators(protocol_).isTokenExists(address(this))) {
revert BeliefToken_Unauthorized();
}
protocol = protocol_;
_symbol = symbol_;
creator = creator_;
{
uint256 amountToDistributeAirdropToken;
for (uint256 i = 0; i < airdropWaves_.length; i++) {
airdropWaves[airdropWaves_[i].id] = airdropWaves_[i];
amountToDistributeAirdropToken += airdropWaves_[i].amount;
}
rewardsMerkleRoot = rewardsMerkleRoot_;
// mint most of the tokens to the protocol for trading and liquidity
_mint(protocol_, MAX_SUPPLY - amountToDistributeAirdropToken - amountToDistributeClaimableRewards);
// mint for airdrop and rewards to the token itself
_mint(address(this), amountToDistributeClaimableRewards + amountToDistributeAirdropToken);
}
}
function name() public view override returns (string memory) {
return _name;
}
function symbol() public view override returns (string memory) {
return _symbol;
}
function burn(uint256 amount) external {
_burn(msg.sender, amount);
}
function claimReward(address recipient, uint256 amount) external {
if (!ProtocolModerators(protocol).isClaimableRewardsController(msg.sender)) {
revert BeliefToken_Unauthorized();
}
_transfer(address(this), recipient, amount);
emit BeliefToken_ClaimReward(recipient, amount);
}
function enableAirdropWave(string memory waveId, bytes32 merkleRoot) external {
if (!ProtocolModerators(protocol).isAirdropController(msg.sender)) {
revert BeliefToken_Unauthorized();
}
airdropWaves[waveId].merkleRoot = merkleRoot;
emit BeliefToken_EnableAirdropWave(waveId, merkleRoot);
}
function claimAirdropWave(string memory waveId, uint256 amount, bytes32[] calldata merkleProof) external {
if (claimedAirdropWaveStatusOf[waveId][msg.sender]) {
revert BeliefToken_AlreadyClaimed();
}
if (airdropWaves[waveId].merkleRoot == bytes32(0)) {
revert BeliefToken_AirdropWaveNotEnabled();
}
claimedAirdropWaveStatusOf[waveId][msg.sender] = true;
if (
!MerkleProofLib.verifyCalldata(
merkleProof, airdropWaves[waveId].merkleRoot, keccak256(abi.encodePacked(msg.sender, amount))
)
) revert BeliefToken_AirdropNotEligible();
_transfer(address(this), msg.sender, amount);
emit BeliefToken_ClaimAirdropWave(waveId, amount, merkleProof);
}
function _beforeTokenTransfer(address from, address to, uint256) internal override {
address _protocol = protocol;
// automatically approve if the recipient is the protocol
if (to == _protocol && allowance(from, _protocol) == 0) {
_approve(from, _protocol, type(uint256).max);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Simple ERC20 + EIP-2612 implementation.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)
///
/// @dev Note:
/// - The ERC20 standard allows minting and transferring to and from the zero address,
/// minting and transferring zero tokens, as well as self-approvals.
/// For performance, this implementation WILL NOT revert for such actions.
/// Please add any checks with overrides if desired.
/// - The `permit` function uses the ecrecover precompile (0x1).
///
/// If you are overriding:
/// - NEVER violate the ERC20 invariant:
/// the total sum of all balances must be equal to `totalSupply()`.
/// - Check that the overridden function is actually used in the function you want to
/// change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC20 {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CUSTOM ERRORS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The total supply has overflowed.
error TotalSupplyOverflow();
/// @dev The allowance has overflowed.
error AllowanceOverflow();
/// @dev The allowance has underflowed.
error AllowanceUnderflow();
/// @dev Insufficient balance.
error InsufficientBalance();
/// @dev Insufficient allowance.
error InsufficientAllowance();
/// @dev The permit is invalid.
error InvalidPermit();
/// @dev The permit has expired.
error PermitExpired();
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EVENTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Emitted when `amount` tokens is transferred from `from` to `to`.
event Transfer(address indexed from, address indexed to, uint256 amount);
/// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.
event Approval(address indexed owner, address indexed spender, uint256 amount);
/// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
uint256 private constant _TRANSFER_EVENT_SIGNATURE =
0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;
/// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
uint256 private constant _APPROVAL_EVENT_SIGNATURE =
0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* STORAGE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev The storage slot for the total supply.
uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;
/// @dev The balance slot of `owner` is given by:
/// ```
/// mstore(0x0c, _BALANCE_SLOT_SEED)
/// mstore(0x00, owner)
/// let balanceSlot := keccak256(0x0c, 0x20)
/// ```
uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;
/// @dev The allowance slot of (`owner`, `spender`) is given by:
/// ```
/// mstore(0x20, spender)
/// mstore(0x0c, _ALLOWANCE_SLOT_SEED)
/// mstore(0x00, owner)
/// let allowanceSlot := keccak256(0x0c, 0x34)
/// ```
uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;
/// @dev The nonce slot of `owner` is given by:
/// ```
/// mstore(0x0c, _NONCES_SLOT_SEED)
/// mstore(0x00, owner)
/// let nonceSlot := keccak256(0x0c, 0x20)
/// ```
uint256 private constant _NONCES_SLOT_SEED = 0x38377508;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* CONSTANTS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`.
uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901;
/// @dev `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`.
bytes32 private constant _DOMAIN_TYPEHASH =
0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;
/// @dev `keccak256("1")`.
bytes32 private constant _VERSION_HASH =
0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;
/// @dev `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`.
bytes32 private constant _PERMIT_TYPEHASH =
0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC20 METADATA */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the name of the token.
function name() public view virtual returns (string memory);
/// @dev Returns the symbol of the token.
function symbol() public view virtual returns (string memory);
/// @dev Returns the decimals places of the token.
function decimals() public view virtual returns (uint8) {
return 18;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* ERC20 */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns the amount of tokens in existence.
function totalSupply() public view virtual returns (uint256 result) {
/// @solidity memory-safe-assembly
assembly {
result := sload(_TOTAL_SUPPLY_SLOT)
}
}
/// @dev Returns the amount of tokens owned by `owner`.
function balanceOf(address owner) public view virtual returns (uint256 result) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x0c, _BALANCE_SLOT_SEED)
mstore(0x00, owner)
result := sload(keccak256(0x0c, 0x20))
}
}
/// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.
function allowance(address owner, address spender)
public
view
virtual
returns (uint256 result)
{
/// @solidity memory-safe-assembly
assembly {
mstore(0x20, spender)
mstore(0x0c, _ALLOWANCE_SLOT_SEED)
mstore(0x00, owner)
result := sload(keccak256(0x0c, 0x34))
}
}
/// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
///
/// Emits a {Approval} event.
function approve(address spender, uint256 amount) public virtual returns (bool) {
/// @solidity memory-safe-assembly
assembly {
// Compute the allowance slot and store the amount.
mstore(0x20, spender)
mstore(0x0c, _ALLOWANCE_SLOT_SEED)
mstore(0x00, caller())
sstore(keccak256(0x0c, 0x34), amount)
// Emit the {Approval} event.
mstore(0x00, amount)
log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
}
return true;
}
/// @dev Transfer `amount` tokens from the caller to `to`.
///
/// Requirements:
/// - `from` must at least have `amount`.
///
/// Emits a {Transfer} event.
function transfer(address to, uint256 amount) public virtual returns (bool) {
_beforeTokenTransfer(msg.sender, to, amount);
/// @solidity memory-safe-assembly
assembly {
// Compute the balance slot and load its value.
mstore(0x0c, _BALANCE_SLOT_SEED)
mstore(0x00, caller())
let fromBalanceSlot := keccak256(0x0c, 0x20)
let fromBalance := sload(fromBalanceSlot)
// Revert if insufficient balance.
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
// Subtract and store the updated balance.
sstore(fromBalanceSlot, sub(fromBalance, amount))
// Compute the balance slot of `to`.
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x20)
// Add and store the updated balance of `to`.
// Will not overflow because the sum of all user balances
// cannot exceed the maximum uint256 value.
sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
// Emit the {Transfer} event.
mstore(0x20, amount)
log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))
}
_afterTokenTransfer(msg.sender, to, amount);
return true;
}
/// @dev Transfers `amount` tokens from `from` to `to`.
///
/// Note: Does not update the allowance if it is the maximum uint256 value.
///
/// Requirements:
/// - `from` must at least have `amount`.
/// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.
///
/// Emits a {Transfer} event.
function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
_beforeTokenTransfer(from, to, amount);
/// @solidity memory-safe-assembly
assembly {
let from_ := shl(96, from)
// Compute the allowance slot and load its value.
mstore(0x20, caller())
mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))
let allowanceSlot := keccak256(0x0c, 0x34)
let allowance_ := sload(allowanceSlot)
// If the allowance is not the maximum uint256 value.
if add(allowance_, 1) {
// Revert if the amount to be transferred exceeds the allowance.
if gt(amount, allowance_) {
mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
revert(0x1c, 0x04)
}
// Subtract and store the updated allowance.
sstore(allowanceSlot, sub(allowance_, amount))
}
// Compute the balance slot and load its value.
mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
let fromBalanceSlot := keccak256(0x0c, 0x20)
let fromBalance := sload(fromBalanceSlot)
// Revert if insufficient balance.
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
// Subtract and store the updated balance.
sstore(fromBalanceSlot, sub(fromBalance, amount))
// Compute the balance slot of `to`.
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x20)
// Add and store the updated balance of `to`.
// Will not overflow because the sum of all user balances
// cannot exceed the maximum uint256 value.
sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
// Emit the {Transfer} event.
mstore(0x20, amount)
log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
}
_afterTokenTransfer(from, to, amount);
return true;
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EIP-2612 */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev For more performance, override to return the constant value
/// of `keccak256(bytes(name()))` if `name()` will never change.
function _constantNameHash() internal view virtual returns (bytes32 result) {}
/// @dev Returns the current nonce for `owner`.
/// This value is used to compute the signature for EIP-2612 permit.
function nonces(address owner) public view virtual returns (uint256 result) {
/// @solidity memory-safe-assembly
assembly {
// Compute the nonce slot and load its value.
mstore(0x0c, _NONCES_SLOT_SEED)
mstore(0x00, owner)
result := sload(keccak256(0x0c, 0x20))
}
}
/// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`,
/// authorized by a signed approval by `owner`.
///
/// Emits a {Approval} event.
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
bytes32 nameHash = _constantNameHash();
// We simply calculate it on-the-fly to allow for cases where the `name` may change.
if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
/// @solidity memory-safe-assembly
assembly {
// Revert if the block timestamp is greater than `deadline`.
if gt(timestamp(), deadline) {
mstore(0x00, 0x1a15a3cc) // `PermitExpired()`.
revert(0x1c, 0x04)
}
let m := mload(0x40) // Grab the free memory pointer.
// Clean the upper 96 bits.
owner := shr(96, shl(96, owner))
spender := shr(96, shl(96, spender))
// Compute the nonce slot and load its value.
mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX)
mstore(0x00, owner)
let nonceSlot := keccak256(0x0c, 0x20)
let nonceValue := sload(nonceSlot)
// Prepare the domain separator.
mstore(m, _DOMAIN_TYPEHASH)
mstore(add(m, 0x20), nameHash)
mstore(add(m, 0x40), _VERSION_HASH)
mstore(add(m, 0x60), chainid())
mstore(add(m, 0x80), address())
mstore(0x2e, keccak256(m, 0xa0))
// Prepare the struct hash.
mstore(m, _PERMIT_TYPEHASH)
mstore(add(m, 0x20), owner)
mstore(add(m, 0x40), spender)
mstore(add(m, 0x60), value)
mstore(add(m, 0x80), nonceValue)
mstore(add(m, 0xa0), deadline)
mstore(0x4e, keccak256(m, 0xc0))
// Prepare the ecrecover calldata.
mstore(0x00, keccak256(0x2c, 0x42))
mstore(0x20, and(0xff, v))
mstore(0x40, r)
mstore(0x60, s)
let t := staticcall(gas(), 1, 0, 0x80, 0x20, 0x20)
// If the ecrecover fails, the returndatasize will be 0x00,
// `owner` will be checked if it equals the hash at 0x00,
// which evaluates to false (i.e. 0), and we will revert.
// If the ecrecover succeeds, the returndatasize will be 0x20,
// `owner` will be compared against the returned address at 0x20.
if iszero(eq(mload(returndatasize()), owner)) {
mstore(0x00, 0xddafbaef) // `InvalidPermit()`.
revert(0x1c, 0x04)
}
// Increment and store the updated nonce.
sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds.
// Compute the allowance slot and store the value.
// The `owner` is already at slot 0x20.
mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender))
sstore(keccak256(0x2c, 0x34), value)
// Emit the {Approval} event.
log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender)
mstore(0x40, m) // Restore the free memory pointer.
mstore(0x60, 0) // Restore the zero pointer.
}
}
/// @dev Returns the EIP-712 domain separator for the EIP-2612 permit.
function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) {
bytes32 nameHash = _constantNameHash();
// We simply calculate it on-the-fly to allow for cases where the `name` may change.
if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
/// @solidity memory-safe-assembly
assembly {
let m := mload(0x40) // Grab the free memory pointer.
mstore(m, _DOMAIN_TYPEHASH)
mstore(add(m, 0x20), nameHash)
mstore(add(m, 0x40), _VERSION_HASH)
mstore(add(m, 0x60), chainid())
mstore(add(m, 0x80), address())
result := keccak256(m, 0xa0)
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL MINT FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Mints `amount` tokens to `to`, increasing the total supply.
///
/// Emits a {Transfer} event.
function _mint(address to, uint256 amount) internal virtual {
_beforeTokenTransfer(address(0), to, amount);
/// @solidity memory-safe-assembly
assembly {
let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)
let totalSupplyAfter := add(totalSupplyBefore, amount)
// Revert if the total supply overflows.
if lt(totalSupplyAfter, totalSupplyBefore) {
mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.
revert(0x1c, 0x04)
}
// Store the updated total supply.
sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)
// Compute the balance slot and load its value.
mstore(0x0c, _BALANCE_SLOT_SEED)
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x20)
// Add and store the updated balance.
sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
// Emit the {Transfer} event.
mstore(0x20, amount)
log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))
}
_afterTokenTransfer(address(0), to, amount);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL BURN FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Burns `amount` tokens from `from`, reducing the total supply.
///
/// Emits a {Transfer} event.
function _burn(address from, uint256 amount) internal virtual {
_beforeTokenTransfer(from, address(0), amount);
/// @solidity memory-safe-assembly
assembly {
// Compute the balance slot and load its value.
mstore(0x0c, _BALANCE_SLOT_SEED)
mstore(0x00, from)
let fromBalanceSlot := keccak256(0x0c, 0x20)
let fromBalance := sload(fromBalanceSlot)
// Revert if insufficient balance.
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
// Subtract and store the updated balance.
sstore(fromBalanceSlot, sub(fromBalance, amount))
// Subtract and store the updated total supply.
sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount))
// Emit the {Transfer} event.
mstore(0x00, amount)
log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)
}
_afterTokenTransfer(from, address(0), amount);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL TRANSFER FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Moves `amount` of tokens from `from` to `to`.
function _transfer(address from, address to, uint256 amount) internal virtual {
_beforeTokenTransfer(from, to, amount);
/// @solidity memory-safe-assembly
assembly {
let from_ := shl(96, from)
// Compute the balance slot and load its value.
mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
let fromBalanceSlot := keccak256(0x0c, 0x20)
let fromBalance := sload(fromBalanceSlot)
// Revert if insufficient balance.
if gt(amount, fromBalance) {
mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
revert(0x1c, 0x04)
}
// Subtract and store the updated balance.
sstore(fromBalanceSlot, sub(fromBalance, amount))
// Compute the balance slot of `to`.
mstore(0x00, to)
let toBalanceSlot := keccak256(0x0c, 0x20)
// Add and store the updated balance of `to`.
// Will not overflow because the sum of all user balances
// cannot exceed the maximum uint256 value.
sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
// Emit the {Transfer} event.
mstore(0x20, amount)
log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
}
_afterTokenTransfer(from, to, amount);
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* INTERNAL ALLOWANCE FUNCTIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
/// @solidity memory-safe-assembly
assembly {
// Compute the allowance slot and load its value.
mstore(0x20, spender)
mstore(0x0c, _ALLOWANCE_SLOT_SEED)
mstore(0x00, owner)
let allowanceSlot := keccak256(0x0c, 0x34)
let allowance_ := sload(allowanceSlot)
// If the allowance is not the maximum uint256 value.
if add(allowance_, 1) {
// Revert if the amount to be transferred exceeds the allowance.
if gt(amount, allowance_) {
mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
revert(0x1c, 0x04)
}
// Subtract and store the updated allowance.
sstore(allowanceSlot, sub(allowance_, amount))
}
}
}
/// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.
///
/// Emits a {Approval} event.
function _approve(address owner, address spender, uint256 amount) internal virtual {
/// @solidity memory-safe-assembly
assembly {
let owner_ := shl(96, owner)
// Compute the allowance slot and store the amount.
mstore(0x20, spender)
mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))
sstore(keccak256(0x0c, 0x34), amount)
// Emit the {Approval} event.
mstore(0x00, amount)
log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* HOOKS TO OVERRIDE */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Hook that is called before any transfer of tokens.
/// This includes minting and burning.
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
/// @dev Hook that is called after any transfer of tokens.
/// This includes minting and burning.
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @notice Gas optimized verification of proof of inclusion for a leaf in a Merkle tree.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/MerkleProofLib.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/MerkleProofLib.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol)
library MerkleProofLib {
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* MERKLE PROOF VERIFICATION OPERATIONS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf)
internal
pure
returns (bool isValid)
{
/// @solidity memory-safe-assembly
assembly {
if mload(proof) {
// Initialize `offset` to the offset of `proof` elements in memory.
let offset := add(proof, 0x20)
// Left shift by 5 is equivalent to multiplying by 0x20.
let end := add(offset, shl(5, mload(proof)))
// Iterate over proof elements to compute root hash.
for {} 1 {} {
// Slot of `leaf` in scratch space.
// If the condition is true: 0x20, otherwise: 0x00.
let scratch := shl(5, gt(leaf, mload(offset)))
// Store elements to hash contiguously in scratch space.
// Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.
mstore(scratch, leaf)
mstore(xor(scratch, 0x20), mload(offset))
// Reuse `leaf` to store the hash to reduce stack operations.
leaf := keccak256(0x00, 0x40)
offset := add(offset, 0x20)
if iszero(lt(offset, end)) { break }
}
}
isValid := eq(leaf, root)
}
}
/// @dev Returns whether `leaf` exists in the Merkle tree with `root`, given `proof`.
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf)
internal
pure
returns (bool isValid)
{
/// @solidity memory-safe-assembly
assembly {
if proof.length {
// Left shift by 5 is equivalent to multiplying by 0x20.
let end := add(proof.offset, shl(5, proof.length))
// Initialize `offset` to the offset of `proof` in the calldata.
let offset := proof.offset
// Iterate over proof elements to compute root hash.
for {} 1 {} {
// Slot of `leaf` in scratch space.
// If the condition is true: 0x20, otherwise: 0x00.
let scratch := shl(5, gt(leaf, calldataload(offset)))
// Store elements to hash contiguously in scratch space.
// Scratch space is 64 bytes (0x00 - 0x3f) and both elements are 32 bytes.
mstore(scratch, leaf)
mstore(xor(scratch, 0x20), calldataload(offset))
// Reuse `leaf` to store the hash to reduce stack operations.
leaf := keccak256(0x00, 0x40)
offset := add(offset, 0x20)
if iszero(lt(offset, end)) { break }
}
}
isValid := eq(leaf, root)
}
}
/// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,
/// given `proof` and `flags`.
///
/// Note:
/// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`
/// will always return false.
/// - The sum of the lengths of `proof` and `leaves` must never overflow.
/// - Any non-zero word in the `flags` array is treated as true.
/// - The memory offset of `proof` must be non-zero
/// (i.e. `proof` is not pointing to the scratch space).
function verifyMultiProof(
bytes32[] memory proof,
bytes32 root,
bytes32[] memory leaves,
bool[] memory flags
) internal pure returns (bool isValid) {
// Rebuilds the root by consuming and producing values on a queue.
// The queue starts with the `leaves` array, and goes into a `hashes` array.
// After the process, the last element on the queue is verified
// to be equal to the `root`.
//
// The `flags` array denotes whether the sibling
// should be popped from the queue (`flag == true`), or
// should be popped from the `proof` (`flag == false`).
/// @solidity memory-safe-assembly
assembly {
// Cache the lengths of the arrays.
let leavesLength := mload(leaves)
let proofLength := mload(proof)
let flagsLength := mload(flags)
// Advance the pointers of the arrays to point to the data.
leaves := add(0x20, leaves)
proof := add(0x20, proof)
flags := add(0x20, flags)
// If the number of flags is correct.
for {} eq(add(leavesLength, proofLength), add(flagsLength, 1)) {} {
// For the case where `proof.length + leaves.length == 1`.
if iszero(flagsLength) {
// `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.
isValid := eq(mload(xor(leaves, mul(xor(proof, leaves), proofLength))), root)
break
}
// The required final proof offset if `flagsLength` is not zero, otherwise zero.
let proofEnd := add(proof, shl(5, proofLength))
// We can use the free memory space for the queue.
// We don't need to allocate, since the queue is temporary.
let hashesFront := mload(0x40)
// Copy the leaves into the hashes.
// Sometimes, a little memory expansion costs less than branching.
// Should cost less, even with a high free memory offset of 0x7d00.
leavesLength := shl(5, leavesLength)
for { let i := 0 } iszero(eq(i, leavesLength)) { i := add(i, 0x20) } {
mstore(add(hashesFront, i), mload(add(leaves, i)))
}
// Compute the back of the hashes.
let hashesBack := add(hashesFront, leavesLength)
// This is the end of the memory for the queue.
// We recycle `flagsLength` to save on stack variables (sometimes save gas).
flagsLength := add(hashesBack, shl(5, flagsLength))
for {} 1 {} {
// Pop from `hashes`.
let a := mload(hashesFront)
// Pop from `hashes`.
let b := mload(add(hashesFront, 0x20))
hashesFront := add(hashesFront, 0x40)
// If the flag is false, load the next proof,
// else, pops from the queue.
if iszero(mload(flags)) {
// Loads the next proof.
b := mload(proof)
proof := add(proof, 0x20)
// Unpop from `hashes`.
hashesFront := sub(hashesFront, 0x20)
}
// Advance to the next flag.
flags := add(flags, 0x20)
// Slot of `a` in scratch space.
// If the condition is true: 0x20, otherwise: 0x00.
let scratch := shl(5, gt(a, b))
// Hash the scratch space and push the result onto the queue.
mstore(scratch, a)
mstore(xor(scratch, 0x20), b)
mstore(hashesBack, keccak256(0x00, 0x40))
hashesBack := add(hashesBack, 0x20)
if iszero(lt(hashesBack, flagsLength)) { break }
}
isValid :=
and(
// Checks if the last value in the queue is same as the root.
eq(mload(sub(hashesBack, 0x20)), root),
// And whether all the proofs are used, if required.
eq(proofEnd, proof)
)
break
}
}
}
/// @dev Returns whether all `leaves` exist in the Merkle tree with `root`,
/// given `proof` and `flags`.
///
/// Note:
/// - Breaking the invariant `flags.length == (leaves.length - 1) + proof.length`
/// will always return false.
/// - Any non-zero word in the `flags` array is treated as true.
/// - The calldata offset of `proof` must be non-zero
/// (i.e. `proof` is from a regular Solidity function with a 4-byte selector).
function verifyMultiProofCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32[] calldata leaves,
bool[] calldata flags
) internal pure returns (bool isValid) {
// Rebuilds the root by consuming and producing values on a queue.
// The queue starts with the `leaves` array, and goes into a `hashes` array.
// After the process, the last element on the queue is verified
// to be equal to the `root`.
//
// The `flags` array denotes whether the sibling
// should be popped from the queue (`flag == true`), or
// should be popped from the `proof` (`flag == false`).
/// @solidity memory-safe-assembly
assembly {
// If the number of flags is correct.
for {} eq(add(leaves.length, proof.length), add(flags.length, 1)) {} {
// For the case where `proof.length + leaves.length == 1`.
if iszero(flags.length) {
// `isValid = (proof.length == 1 ? proof[0] : leaves[0]) == root`.
// forgefmt: disable-next-item
isValid := eq(
calldataload(
xor(leaves.offset, mul(xor(proof.offset, leaves.offset), proof.length))
),
root
)
break
}
// The required final proof offset if `flagsLength` is not zero, otherwise zero.
let proofEnd := add(proof.offset, shl(5, proof.length))
// We can use the free memory space for the queue.
// We don't need to allocate, since the queue is temporary.
let hashesFront := mload(0x40)
// Copy the leaves into the hashes.
// Sometimes, a little memory expansion costs less than branching.
// Should cost less, even with a high free memory offset of 0x7d00.
calldatacopy(hashesFront, leaves.offset, shl(5, leaves.length))
// Compute the back of the hashes.
let hashesBack := add(hashesFront, shl(5, leaves.length))
// This is the end of the memory for the queue.
// We recycle `flagsLength` to save on stack variables (sometimes save gas).
flags.length := add(hashesBack, shl(5, flags.length))
// We don't need to make a copy of `proof.offset` or `flags.offset`,
// as they are pass-by-value (this trick may not always save gas).
for {} 1 {} {
// Pop from `hashes`.
let a := mload(hashesFront)
// Pop from `hashes`.
let b := mload(add(hashesFront, 0x20))
hashesFront := add(hashesFront, 0x40)
// If the flag is false, load the next proof,
// else, pops from the queue.
if iszero(calldataload(flags.offset)) {
// Loads the next proof.
b := calldataload(proof.offset)
proof.offset := add(proof.offset, 0x20)
// Unpop from `hashes`.
hashesFront := sub(hashesFront, 0x20)
}
// Advance to the next flag offset.
flags.offset := add(flags.offset, 0x20)
// Slot of `a` in scratch space.
// If the condition is true: 0x20, otherwise: 0x00.
let scratch := shl(5, gt(a, b))
// Hash the scratch space and push the result onto the queue.
mstore(scratch, a)
mstore(xor(scratch, 0x20), b)
mstore(hashesBack, keccak256(0x00, 0x40))
hashesBack := add(hashesBack, 0x20)
if iszero(lt(hashesBack, flags.length)) { break }
}
isValid :=
and(
// Checks if the last value in the queue is same as the root.
eq(mload(sub(hashesBack, 0x20)), root),
// And whether all the proofs are used, if required.
eq(proofEnd, proof.offset)
)
break
}
}
}
/*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
/* EMPTY CALLDATA HELPERS */
/*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
/// @dev Returns an empty calldata bytes32 array.
function emptyProof() internal pure returns (bytes32[] calldata proof) {
/// @solidity memory-safe-assembly
assembly {
proof.length := 0
}
}
/// @dev Returns an empty calldata bytes32 array.
function emptyLeaves() internal pure returns (bytes32[] calldata leaves) {
/// @solidity memory-safe-assembly
assembly {
leaves.length := 0
}
}
/// @dev Returns an empty calldata bool array.
function emptyFlags() internal pure returns (bool[] calldata flags) {
/// @solidity memory-safe-assembly
assembly {
flags.length := 0
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.25;
/// @title Token
/// @dev A library of structures to represent a token and its state
library Token {
enum TargetDex {
UniswapV2, // 0 value, cause it's the default value
UniswapV4,
UniswapV3
}
struct MintableData {
string id;
uint256 amount;
}
struct ClaimableReward {
string id;
uint256 amount;
bool minted;
}
/// @dev Represents the parameters for creating a token
struct CreationParameters {
uint256 initialVirtualReserveEth; // The initial virtual reserve of ETH
uint256 initialVirtualReserveToken; // The initial virtual reserve of the token
uint256 amountToAddLiquidityEth; // The amount of ETH to add as liquidity
uint256 amountToAddLiquidityToken; // The amount of the token to add as liquidity
uint256 realReserveToken;
MintableData[] airdropWaves;
uint256 ____UNUSED_SLOT;
}
/// @dev Represents the parameters for creating a token with a rewards merkle root
/// and the amount to distribute as claimable rewards
struct CreationParametersV1Upgrade {
bytes32 rewardsMerkleRoot;
uint256 amountToDistributeClaimableRewards;
}
/// @dev Represents the parameters for creating tokens with restriction on max total
/// buy per address and antisnipe configuration
struct CreationParametersV2Upgrade {
bool enableSniping;
uint256 maxAmountTotalBuyToken;
}
/// @dev Represents the parameters for creating tokens to be used in the UniswapV4
struct CreationParametersV3Upgrade {
TargetDex targetDex;
address uniswapV4Hook;
}
/// @dev Represents the state of a token
struct State {
uint256 virtualReserveEth; // The virtual reserve of ETH
uint256 virtualReserveToken; // The virtual reserve of the token
uint256 realReserveEth; // The real reserve of ETH
uint256 realReserveToken; // The real reserve of the token
bool locked; // Whether the token is locked
address poolAddress; // The address of the uniswap V2 pool or the address(1) contract for Uniswap V4
}
/// @dev Represents the parameters for token creation added via an upgrades
struct PostUpgradeCreationParameters {
CreationParametersV1Upgrade v1;
CreationParametersV2Upgrade v2;
CreationParametersV3Upgrade v3;
}
/// @dev Represents the data of a token
struct Data {
CreationParameters creationParameters; // The creation parameters of the token
State state; // The state of the token
PostUpgradeCreationParameters postUpgradeCreationParameters;
}
struct AirdropWave {
string id;
bytes32 merkleRoot;
uint256 amount;
}
}{
"remappings": [
"forge-std/=node_modules/forge-std/",
"solady/=node_modules/solady/",
"@uniswap/v2-periphery/=node_modules/@uniswap/v2-periphery/",
"@uniswap/v2-core/=node_modules/@uniswap/v2-core/",
"@uniswap/lib/=node_modules/@uniswap/lib/",
"@prb/math/=node_modules/@prb/math/",
"@uniswap/v4-core/=lib/v4-core/",
"@uniswap/v4-periphery/=lib/v4-periphery/",
"@uniswap/permit2/=lib/permit2/",
"@uniswap/universal-router/=node_modules/@uniswap/universal-router/",
"@uniswap/v3-core/=node_modules/@uniswap/v3-core/",
"@uniswap/v3-periphery/=node_modules/@uniswap/v3-periphery/",
"@uncx-network/liquidity-locker-univ3-contracts/=node_modules/@uncx-network/liquidity-locker-univ3-contracts/",
"@ensdomains/=lib/v4-core/node_modules/@ensdomains/",
"@openzeppelin/=lib/v4-core/lib/openzeppelin-contracts/",
"@openzeppelin/contracts/=lib/v4-core/lib/openzeppelin-contracts/contracts/",
"ds-test/=lib/v4-core/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-gas-snapshot/=lib/v4-core/lib/forge-gas-snapshot/src/",
"hardhat/=lib/v4-core/node_modules/hardhat/",
"openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/",
"permit2/=lib/permit2/",
"solmate/=lib/v4-core/lib/solmate/",
"v4-core/=lib/v4-core/src/",
"v4-periphery/=lib/v4-periphery/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"creator_","type":"address"},{"internalType":"address","name":"protocol_","type":"address"},{"components":[{"internalType":"string","name":"id","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Token.AirdropWave[]","name":"airdropWaves_","type":"tuple[]"},{"internalType":"bytes32","name":"rewardsMerkleRoot_","type":"bytes32"},{"internalType":"uint256","name":"amountToDistributeClaimableRewards","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[],"name":"BeliefToken_AirdropNotEligible","type":"error"},{"inputs":[],"name":"BeliefToken_AirdropWaveNotEnabled","type":"error"},{"inputs":[],"name":"BeliefToken_AlreadyClaimed","type":"error"},{"inputs":[],"name":"BeliefToken_MaxSupplyOverflow","type":"error"},{"inputs":[],"name":"BeliefToken_Unauthorized","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidPermit","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"waveId","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"BeliefToken_ClaimAirdropWave","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BeliefToken_ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"waveId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"BeliefToken_EnableAirdropWave","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"waveId","type":"string"}],"name":"airdropWaves","outputs":[{"internalType":"string","name":"id","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"waveId","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimAirdropWave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"waveId","type":"string"},{"internalType":"address","name":"holder","type":"address"}],"name":"claimedAirdropWaveStatusOf","outputs":[{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"userId","type":"string"}],"name":"claimedRewardStatusOf","outputs":[{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"waveId","type":"string"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"enableAirdropWave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"protocol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c080604052346105a757611c07803803809161001c8285610725565b833981019060e0818303126105a75780516001600160401b0381116105a75782610047918301610748565b60208201516001600160401b0381116105a75783610066918401610748565b6100726040840161079d565b61007e6060850161079d565b60808501519092906001600160401b0381116105a75785019580601f880112156105a7578651966001600160401b0388116103af578760051b91604051986100c9602085018b610725565b89526020808a0193830101918183116105a75760208101935b8385106106a357505050505060c060a08601519501519380519060018060401b0382116103af575f5490600182811c92168015610699575b60208310146103915781601f84931161062c575b50602090601f83116001146105c9575f926105be575b50508160011b915f199060031b1c1916175f555b604051634f6a7d2d60e11b81523060048201526020816024816001600160a01b0388165afa9081156105b3575f91610574575b50156105655760a08390528051906001600160401b0382116103af5760015490600182811c9216801561055b575b60208310146103915781601f8493116104ed575b50602090601f8311600114610487575f9261047c575b50508160011b915f199060031b1c1916176001555b6080525f91825b85518410156103c35761021284876107b1565b51602080610220878a6107b1565b5151604051928184925191829101835e8101600381520301902090805180519060018060401b0382116103af578354600181811c911680156103a5575b602082101461039157601f811161034c575b50602090601f83116001146102de5760019593836102cb96946002946040945f926102d3575b50505f19600383901b1c191690881b1784555b602081015187850155015191015560406102c2878a6107b1565b510151906107d9565b9301926101ff565b015190505f80610295565b90601f19831691855f52815f20925f5b81811061033457508460029460409460019a98946102cb9a988c951061031c575b505050811b0184556102a8565b01515f1960f88460031b161c191690555f808061030f565b929360206001819287860151815501950193016102ee565b845f5260205f20601f840160051c81019160208510610387575b601f0160051c01905b81811061037c575061026f565b5f815560010161036f565b9091508190610366565b634e487b7160e01b5f52602260045260245ffd5b90607f169061025d565b634e487b7160e01b5f52604160045260245ffd5b84600555806b033b2e3c9fd0803ce800000003916b033b2e3c9fd0803ce80000008311610468578082016b033b2e3c9fd0803ce800000003928311610468576104126104179361041d956107e6565b6107d9565b306107e6565b60405161132990816108de823960805181610ebd015260a051818181610323015281816105b2015281816107da01528181610bc901528181610d6c01528181610f3e01526111c00152f35b634e487b7160e01b5f52601160045260245ffd5b015190505f806101e3565b60015f9081528281209350601f198516905b8181106104d557509084600195949392106104bd575b505050811b016001556101f8565b01515f1960f88460031b161c191690555f80806104af565b92936020600181928786015181550195019301610499565b60015f529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610551575b90601f859493920160051c01905b81811061054357506101cd565b5f8155849350600101610536565b9091508190610528565b91607f16916101b9565b631f9831d360e11b5f5260045ffd5b90506020813d6020116105ab575b8161058f60209383610725565b810103126105a7575180151581036105a7575f61018b565b5f80fd5b3d9150610582565b6040513d5f823e3d90fd5b015190505f80610144565b5f8080528281209350601f198516905b81811061061457509084600195949392106105fc575b505050811b015f55610158565b01515f1960f88460031b161c191690555f80806105ef565b929360206001819287860151815501950193016105d9565b5f80529091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f840160051c8101916020851061068f575b90601f859493920160051c01905b818110610681575061012e565b5f8155849350600101610674565b9091508190610666565b91607f169161011a565b84516001600160401b0381116105a75782016060818503601f1901126105a75760405191606083016001600160401b038111848210176103af576040526020820151926001600160401b0384116105a757606083610708886020809881980101610748565b8352604081015185840152015160408201528152019401936100e2565b601f909101601f19168101906001600160401b038211908210176103af57604052565b81601f820112156105a7578051906001600160401b0382116103af576040519261077c601f8401601f191660200185610725565b828452602083830101116105a757815f9260208093018386015e8301015290565b51906001600160a01b03821682036105a757565b80518210156107c55760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b9190820180921161046857565b60a0516001600160a01b039081169082168114806108c1575b610878575b506805345cdf77eb68f44c5482810190811061086b576805345cdf77eb68f44c556387a211a2600c525f526020600c20818154019055602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3565b63e5cfe9575f526004601cfd5b602052637f5e9f20600c525f196034600c20555f195f52602c5160601c5f7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602082a35f610804565b5080602052637f5e9f20600c525f80526034600c2054156107ff56fe60806040526004361015610011575f80fd5b5f3560e01c8063028e248514610eec57806302d05d3f14610ea857806306fdde0314610e8d578063095ea7b314610e35578063174e31c414610d3157806318160ddd14610d0c57806323b872dd14610ba2578063313ce56714610b8757806332cb6b0c14610b615780633644e51514610ad95780633b785468146108bc57806342966c68146107c457806370a08231146107925780637ecebe001461076057806384920bbd146107055780638c674c03146105e15780638ce744261461059d57806390d2f54e1461052657806395d89b411461041a578063a9059cbb14610304578063b5890a13146102e7578063d505accf1461015e5763dd62ed3e14610116575f80fd5b3461015a57604036600319011261015a5760206101526101346110ad565b61013c6110c3565b602052637f5e9f20600c525f526034600c205490565b604051908152f35b5f80fd5b3461015a5760e036600319011261015a576101776110ad565b61017f6110c3565b6084359160643560443560ff8516850361015a5761019b6110d9565b60208151910120908242116102da576040519360018060a01b03169460018060a01b03169565383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d51036102cd575f805160206112d483398151915294602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b3461015a575f36600319011261015a576020600554604051908152f35b3461015a57604036600319011261015a5761031d6110ad565b602435907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0380831690821614806103f7575b6103bc575b506387a211a2600c52335f526020600c2080548084116103af5783900390555f526020600c20818154019055602052600c5160601c335f805160206112b4833981519152602080a3602060405160018152f35b63f4d678b85f526004601cfd5b602052637f5e9f203360601b17600c525f196034600c20555f195f52602c5160601c335f805160206112d483398151915260205fa38261035c565b50610414813390602052637f5e9f20600c525f526034600c205490565b15610357565b3461015a575f36600319011261015a576040515f6001548060011c9060018116801561051c575b602083108114610508578285529081156104e45750600114610486575b6104828361046e81850382610ffd565b604051918291602083526020830190611089565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106104ca5750909150810160200161046e61045e565b9192600181602092548385880101520191019092916104b2565b60ff191660208086019190915291151560051b8401909101915061046e905061045e565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610441565b3461015a57604036600319011261015a5760043567ffffffffffffffff811161015a57610557903690600401611033565b6020806105626110c3565b92604051928184925191829101835e810160028152030190209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015a575f36600319011261015a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461015a57602036600319011261015a5760043567ffffffffffffffff811161015a57602061061581923690600401611033565b604051928184925191829101835e810160038152030190206040515f9180548060011c906001811680156106fb575b602083108114610508578285529081156106d7575060011461069e575b506106718261068f940383610ffd565b60026001820154910154604051938493606085526060850190611089565b91602084015260408301520390f35b9250805f5260205f205f905b8482106106c1575082016020019250610671610661565b60018160209254838588010152019101906106aa565b60ff191660208086019190915291151560051b840190910193506106719050610661565b91607f1691610644565b3461015a57602036600319011261015a5760043567ffffffffffffffff811161015a5760ff60208061073c81943690600401611033565b604051928184925191829101835e8101600481520301902054166040519015158152f35b3461015a57602036600319011261015a576107796110ad565b6338377508600c525f52602080600c2054604051908152f35b3461015a57602036600319011261015a576107ab6110ad565b6387a211a2600c525f52602080600c2054604051908152f35b3461015a57602036600319011261015a576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0381161580610899575b61085e575b506387a211a2600c52335f526020600c2080548083116103af578290039055806805345cdf77eb68f44c54036805345cdf77eb68f44c555f525f335f805160206112b4833981519152602083a3005b602052637f5e9f203360601b17600c525f196034600c20555f195f52602c5160601c335f805160206112d483398151915260205fa38161080f565b506108b6813390602052637f5e9f20600c525f526034600c205490565b1561080a565b3461015a57606036600319011261015a5760043567ffffffffffffffff811161015a576108ed903690600401611033565b6044359060243567ffffffffffffffff831161015a573660238401121561015a57826004013567ffffffffffffffff811161015a57602484019060248160051b8096010136811161015a57604051855190602081818901938085835e8101600281520301902060018060a01b0333165f5260205260ff60405f205416610aca57600160405160208189518086835e81016003815203019020015415610abb57600183916040516020818a518085835e81016002815203019020828060a01b0333165f5260205260405f208260ff19825416179055602060405180928a518091835e8101600381520301902001549160405160208101903360601b8252876034820152603481526109fe605482610ffd565b51902091610a8f575b5003610a8057610a188333306111bc565b610a2d60405194606086526060860190611089565b602085019390935283830360408501528083526001600160fb1b031061015a5783827f26065fb4d131171e2476eb17b938a9e211cf521be70d22c52c83244ce1c54d8a95859360208096013701030190a1005b635b64090160e11b5f5260045ffd5b84915b602083359182811160051b9081521852602060405f20920191818310610a925791505087610a07565b63fb5f54ef60e01b5f5260045ffd5b6306dfe52560e31b5f5260045ffd5b3461015a575f36600319011261015a57602060a0610af56110d9565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b3461015a575f36600319011261015a5760206040516b033b2e3c9fd0803ce80000008152f35b3461015a575f36600319011261015a57602060405160128152f35b3461015a57606036600319011261015a57610bbb6110ad565b610bc36110c3565b604435907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038083169082161480610ce9575b610ca6575b508260601b33602052637f5e9f208117600c526034600c209081549160018301610c82575b506387a211a2915017600c526020600c2080548084116103af5783900390555f526020600c20818154019055602052600c5160601c9060018060a01b03165f805160206112b4833981519152602080a3602060405160018152f35b828511610c9957846387a211a29303905585610c27565b6313be252b5f526004601cfd5b602052637f5e9f208360601b17600c525f196034600c20555f195f52602c5160601c60018060a01b0384165f805160206112d483398151915260205fa383610c02565b50610d06818590602052637f5e9f20600c525f526034600c205490565b15610bfd565b3461015a575f36600319011261015a5760206805345cdf77eb68f44c54604051908152f35b3461015a57604036600319011261015a57610d4a6110ad565b6040516302abd8c960e11b8152336004820152602480359291906020908290817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610e2a575f91610dfb575b5015610dec57602081610dd9847fa7e0801466cad990c2143c2c40a4924862c5503ee26b103582962c5e61e69a1494306111bc565b6040519384526001600160a01b031692a2005b631f9831d360e11b5f5260045ffd5b610e1d915060203d602011610e23575b610e158183610ffd565b8101906111a4565b83610da4565b503d610e0b565b6040513d5f823e3d90fd5b3461015a57604036600319011261015a57610e4e6110ad565b60243590602052637f5e9f20600c52335f52806034600c20555f52602c5160601c335f805160206112d483398151915260205fa3602060405160018152f35b3461015a575f36600319011261015a5761048261046e6110d9565b3461015a575f36600319011261015a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461015a57604036600319011261015a5760043567ffffffffffffffff811161015a57610f1d903690600401611033565b604051630bda7b5560e21b81523360048201526024803591906020908290817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610e2a575f91610fde575b5015610dec577f08f9536f4dbd4a3a46a8531d13a42875526412cad47ce602b0b77d30667b861f9181610fd3926001604051602081865180838901835e810160038152030190200155604051928392604084526040840190611089565b9060208301520390a1005b610ff7915060203d602011610e2357610e158183610ffd565b83610f76565b90601f8019910116810190811067ffffffffffffffff82111761101f57604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561015a5780359067ffffffffffffffff821161101f5760405192611068601f8401601f191660200185610ffd565b8284526020838301011161015a57815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015a57565b602435906001600160a01b038216820361015a57565b604051905f80548060011c916001821691821561119a575b60208410831461050857838652859290811561117b575060011461111e575b61111c92500383610ffd565b565b505f80805290917f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b81831061115f57505090602061111c92820101611110565b6020919350806001915483858901015201910190918492611147565b6020925061111c94915060ff191682840152151560051b820101611110565b92607f16926110f1565b9081602091031261015a5751801515810361015a5790565b91907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038083169082161480611290575b61124d575b506387a211a28360601b17600c526020600c2080548084116103af5783900390555f526020600c20818154019055602052600c5160601c9060018060a01b03165f805160206112b4833981519152602080a3565b602052637f5e9f208360601b17600c525f196034600c20555f195f52602c5160601c60018060a01b0384165f805160206112d483398151915260205fa35f6111f9565b506112ad818590602052637f5e9f20600c525f526034600c205490565b156111f456feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212208858e58f6a733aa3c3a3beb1b0993fb86a2f49fe889ceb8cad258447c1345a1e64736f6c634300081a003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000abe9ec17f50c1d4aa3c081cfce41bf82bac1f8dc0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f400000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000000000000000000000000f426c6570205375706572204d656d6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004424c4550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108b2a2c28029094000000000000000000000000000000000000000000000000000000000000000000002464643566373938612d613139322d346162662d626234662d64656664636530333630366500000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361015610011575f80fd5b5f3560e01c8063028e248514610eec57806302d05d3f14610ea857806306fdde0314610e8d578063095ea7b314610e35578063174e31c414610d3157806318160ddd14610d0c57806323b872dd14610ba2578063313ce56714610b8757806332cb6b0c14610b615780633644e51514610ad95780633b785468146108bc57806342966c68146107c457806370a08231146107925780637ecebe001461076057806384920bbd146107055780638c674c03146105e15780638ce744261461059d57806390d2f54e1461052657806395d89b411461041a578063a9059cbb14610304578063b5890a13146102e7578063d505accf1461015e5763dd62ed3e14610116575f80fd5b3461015a57604036600319011261015a5760206101526101346110ad565b61013c6110c3565b602052637f5e9f20600c525f526034600c205490565b604051908152f35b5f80fd5b3461015a5760e036600319011261015a576101776110ad565b61017f6110c3565b6084359160643560443560ff8516850361015a5761019b6110d9565b60208151910120908242116102da576040519360018060a01b03169460018060a01b03169565383775081901600e52855f5260c06020600c20958654957f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252602082019586528660408301967fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc688528b6060850198468a528c608087019330855260a08820602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9885252528688525260a082015220604e526042602c205f5260ff1660205260a43560405260c43560605260208060805f60015afa93853d51036102cd575f805160206112d483398151915294602094019055856303faf4f960a51b176040526034602c2055a3005b63ddafbaef5f526004601cfd5b631a15a3cc5f526004601cfd5b3461015a575f36600319011261015a576020600554604051908152f35b3461015a57604036600319011261015a5761031d6110ad565b602435907f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b0380831690821614806103f7575b6103bc575b506387a211a2600c52335f526020600c2080548084116103af5783900390555f526020600c20818154019055602052600c5160601c335f805160206112b4833981519152602080a3602060405160018152f35b63f4d678b85f526004601cfd5b602052637f5e9f203360601b17600c525f196034600c20555f195f52602c5160601c335f805160206112d483398151915260205fa38261035c565b50610414813390602052637f5e9f20600c525f526034600c205490565b15610357565b3461015a575f36600319011261015a576040515f6001548060011c9060018116801561051c575b602083108114610508578285529081156104e45750600114610486575b6104828361046e81850382610ffd565b604051918291602083526020830190611089565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106104ca5750909150810160200161046e61045e565b9192600181602092548385880101520191019092916104b2565b60ff191660208086019190915291151560051b8401909101915061046e905061045e565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610441565b3461015a57604036600319011261015a5760043567ffffffffffffffff811161015a57610557903690600401611033565b6020806105626110c3565b92604051928184925191829101835e810160028152030190209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461015a575f36600319011261015a576040517f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b03168152602090f35b3461015a57602036600319011261015a5760043567ffffffffffffffff811161015a57602061061581923690600401611033565b604051928184925191829101835e810160038152030190206040515f9180548060011c906001811680156106fb575b602083108114610508578285529081156106d7575060011461069e575b506106718261068f940383610ffd565b60026001820154910154604051938493606085526060850190611089565b91602084015260408301520390f35b9250805f5260205f205f905b8482106106c1575082016020019250610671610661565b60018160209254838588010152019101906106aa565b60ff191660208086019190915291151560051b840190910193506106719050610661565b91607f1691610644565b3461015a57602036600319011261015a5760043567ffffffffffffffff811161015a5760ff60208061073c81943690600401611033565b604051928184925191829101835e8101600481520301902054166040519015158152f35b3461015a57602036600319011261015a576107796110ad565b6338377508600c525f52602080600c2054604051908152f35b3461015a57602036600319011261015a576107ab6110ad565b6387a211a2600c525f52602080600c2054604051908152f35b3461015a57602036600319011261015a576004357f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b0381161580610899575b61085e575b506387a211a2600c52335f526020600c2080548083116103af578290039055806805345cdf77eb68f44c54036805345cdf77eb68f44c555f525f335f805160206112b4833981519152602083a3005b602052637f5e9f203360601b17600c525f196034600c20555f195f52602c5160601c335f805160206112d483398151915260205fa38161080f565b506108b6813390602052637f5e9f20600c525f526034600c205490565b1561080a565b3461015a57606036600319011261015a5760043567ffffffffffffffff811161015a576108ed903690600401611033565b6044359060243567ffffffffffffffff831161015a573660238401121561015a57826004013567ffffffffffffffff811161015a57602484019060248160051b8096010136811161015a57604051855190602081818901938085835e8101600281520301902060018060a01b0333165f5260205260ff60405f205416610aca57600160405160208189518086835e81016003815203019020015415610abb57600183916040516020818a518085835e81016002815203019020828060a01b0333165f5260205260405f208260ff19825416179055602060405180928a518091835e8101600381520301902001549160405160208101903360601b8252876034820152603481526109fe605482610ffd565b51902091610a8f575b5003610a8057610a188333306111bc565b610a2d60405194606086526060860190611089565b602085019390935283830360408501528083526001600160fb1b031061015a5783827f26065fb4d131171e2476eb17b938a9e211cf521be70d22c52c83244ce1c54d8a95859360208096013701030190a1005b635b64090160e11b5f5260045ffd5b84915b602083359182811160051b9081521852602060405f20920191818310610a925791505087610a07565b63fb5f54ef60e01b5f5260045ffd5b6306dfe52560e31b5f5260045ffd5b3461015a575f36600319011261015a57602060a0610af56110d9565b828151910120604051907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8252838201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015220604051908152f35b3461015a575f36600319011261015a5760206040516b033b2e3c9fd0803ce80000008152f35b3461015a575f36600319011261015a57602060405160128152f35b3461015a57606036600319011261015a57610bbb6110ad565b610bc36110c3565b604435907f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b038083169082161480610ce9575b610ca6575b508260601b33602052637f5e9f208117600c526034600c209081549160018301610c82575b506387a211a2915017600c526020600c2080548084116103af5783900390555f526020600c20818154019055602052600c5160601c9060018060a01b03165f805160206112b4833981519152602080a3602060405160018152f35b828511610c9957846387a211a29303905585610c27565b6313be252b5f526004601cfd5b602052637f5e9f208360601b17600c525f196034600c20555f195f52602c5160601c60018060a01b0384165f805160206112d483398151915260205fa383610c02565b50610d06818590602052637f5e9f20600c525f526034600c205490565b15610bfd565b3461015a575f36600319011261015a5760206805345cdf77eb68f44c54604051908152f35b3461015a57604036600319011261015a57610d4a6110ad565b6040516302abd8c960e11b8152336004820152602480359291906020908290817f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b03165afa908115610e2a575f91610dfb575b5015610dec57602081610dd9847fa7e0801466cad990c2143c2c40a4924862c5503ee26b103582962c5e61e69a1494306111bc565b6040519384526001600160a01b031692a2005b631f9831d360e11b5f5260045ffd5b610e1d915060203d602011610e23575b610e158183610ffd565b8101906111a4565b83610da4565b503d610e0b565b6040513d5f823e3d90fd5b3461015a57604036600319011261015a57610e4e6110ad565b60243590602052637f5e9f20600c52335f52806034600c20555f52602c5160601c335f805160206112d483398151915260205fa3602060405160018152f35b3461015a575f36600319011261015a5761048261046e6110d9565b3461015a575f36600319011261015a576040517f000000000000000000000000abe9ec17f50c1d4aa3c081cfce41bf82bac1f8dc6001600160a01b03168152602090f35b3461015a57604036600319011261015a5760043567ffffffffffffffff811161015a57610f1d903690600401611033565b604051630bda7b5560e21b81523360048201526024803591906020908290817f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b03165afa908115610e2a575f91610fde575b5015610dec577f08f9536f4dbd4a3a46a8531d13a42875526412cad47ce602b0b77d30667b861f9181610fd3926001604051602081865180838901835e810160038152030190200155604051928392604084526040840190611089565b9060208301520390a1005b610ff7915060203d602011610e2357610e158183610ffd565b83610f76565b90601f8019910116810190811067ffffffffffffffff82111761101f57604052565b634e487b7160e01b5f52604160045260245ffd5b81601f8201121561015a5780359067ffffffffffffffff821161101f5760405192611068601f8401601f191660200185610ffd565b8284526020838301011161015a57815f926020809301838601378301015290565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361015a57565b602435906001600160a01b038216820361015a57565b604051905f80548060011c916001821691821561119a575b60208410831461050857838652859290811561117b575060011461111e575b61111c92500383610ffd565b565b505f80805290917f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b81831061115f57505090602061111c92820101611110565b6020919350806001915483858901015201910190918492611147565b6020925061111c94915060ff191682840152151560051b820101611110565b92607f16926110f1565b9081602091031261015a5751801515810361015a5790565b91907f0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f46001600160a01b038083169082161480611290575b61124d575b506387a211a28360601b17600c526020600c2080548084116103af5783900390555f526020600c20818154019055602052600c5160601c9060018060a01b03165f805160206112b4833981519152602080a3565b602052637f5e9f208360601b17600c525f196034600c20555f195f52602c5160601c60018060a01b0384165f805160206112d483398151915260205fa35f6111f9565b506112ad818590602052637f5e9f20600c525f526034600c205490565b156111f456feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212208858e58f6a733aa3c3a3beb1b0993fb86a2f49fe889ceb8cad258447c1345a1e64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000abe9ec17f50c1d4aa3c081cfce41bf82bac1f8dc0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f400000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000000000000000000000000f426c6570205375706572204d656d6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004424c4550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000108b2a2c28029094000000000000000000000000000000000000000000000000000000000000000000002464643566373938612d613139322d346162662d626234662d64656664636530333630366500000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Blep Super Meme
Arg [1] : symbol_ (string): BLEP
Arg [2] : creator_ (address): 0xabE9ec17f50C1D4AA3C081cFcE41Bf82bAc1F8dC
Arg [3] : protocol_ (address): 0x7a306c63a1Ccc180CBf60FA2A92FBB31E16904F4
Arg [4] : airdropWaves_ (tuple[]):
Arg [1] : id (string): dd5f798a-a192-4abf-bb4f-defdce03606e
Arg [2] : merkleRoot (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : amount (uint256): 20000000000000000000000000
Arg [5] : rewardsMerkleRoot_ (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : amountToDistributeClaimableRewards (uint256): 10000000000000000000000000
-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 000000000000000000000000abe9ec17f50c1d4aa3c081cfce41bf82bac1f8dc
Arg [3] : 0000000000000000000000007a306c63a1ccc180cbf60fa2a92fbb31e16904f4
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [8] : 426c6570205375706572204d656d650000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 424c455000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 000000000000000000000000000000000000000000108b2a2c28029094000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [17] : 64643566373938612d613139322d346162662d626234662d6465666463653033
Arg [18] : 3630366500000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)