More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 324 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Tokens | 17810826 | 351 days ago | IN | 0 ETH | 0.000597 | ||||
Claim Tokens | 17801532 | 352 days ago | IN | 0 ETH | 0.00173932 | ||||
Claim Tokens | 17799615 | 352 days ago | IN | 0 ETH | 0.00177351 | ||||
Claim Tokens | 17799240 | 352 days ago | IN | 0 ETH | 0.00187555 | ||||
Claim Tokens | 17799238 | 352 days ago | IN | 0 ETH | 0.00134454 | ||||
Claim Tokens | 17798667 | 352 days ago | IN | 0 ETH | 0.00069687 | ||||
Claim Tokens | 17798092 | 352 days ago | IN | 0 ETH | 0.00097477 | ||||
Claim Tokens | 17797837 | 352 days ago | IN | 0 ETH | 0.00105938 | ||||
Claim Tokens | 17797569 | 353 days ago | IN | 0 ETH | 0.00102552 | ||||
Claim Tokens | 17797554 | 353 days ago | IN | 0 ETH | 0.00069444 | ||||
Claim Tokens | 17797126 | 353 days ago | IN | 0 ETH | 0.00070848 | ||||
Claim Tokens | 17796998 | 353 days ago | IN | 0 ETH | 0.00099373 | ||||
Claim Tokens | 17796922 | 353 days ago | IN | 0 ETH | 0.00105339 | ||||
Claim Tokens | 17796876 | 353 days ago | IN | 0 ETH | 0.00110115 | ||||
Claim Tokens | 17796692 | 353 days ago | IN | 0 ETH | 0.00104752 | ||||
Claim Tokens | 17796660 | 353 days ago | IN | 0 ETH | 0.00105046 | ||||
Claim Tokens | 17796505 | 353 days ago | IN | 0 ETH | 0.00066017 | ||||
Claim Tokens | 17796482 | 353 days ago | IN | 0 ETH | 0.0011094 | ||||
Claim Tokens | 17796472 | 353 days ago | IN | 0 ETH | 0.0011474 | ||||
Claim Tokens | 17796445 | 353 days ago | IN | 0 ETH | 0.00091696 | ||||
Claim Tokens | 17796399 | 353 days ago | IN | 0 ETH | 0.00067333 | ||||
Claim Tokens | 17796350 | 353 days ago | IN | 0 ETH | 0.00067403 | ||||
Claim Tokens | 17796347 | 353 days ago | IN | 0 ETH | 0.00105646 | ||||
Claim Tokens | 17796179 | 353 days ago | IN | 0 ETH | 0.00099488 | ||||
Claim Tokens | 17796148 | 353 days ago | IN | 0 ETH | 0.00112591 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17794333 | 353 days ago | 29.9999999 ETH |
Loading...
Loading
Contract Name:
Sale
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.8.13; import "./ERC20.sol"; import "./Owned.sol"; contract Sale is Owned { /*///////////////////////////////////////////////// EVENTS /////////////////////////////////////////////////*/ event SaleEntered(address indexed user, uint256 amount); event SaleClaimed(address indexed user, uint256 amount); event TokensSupplied(uint256 amount); event ProceedsWithdrawn(uint256 amount); /*///////////////////////////////////////////////// STATE /////////////////////////////////////////////////*/ /// @notice token being sold off ERC20 public immutable token; /// @notice if sale is live bool public saleLive; /// @notice max amount per address to mint uint256 public immutable MAX_SALE = 555 ether / 1000; /// @notice maximum amount of total ether accepted for sale uint256 public constant HARDCAP = 30 ether; /// @notice internal accounting of tokens supplied to sale, can be upped before sale ends uint256 public suppliedTokens; /// @notice internal accounting of total deposits /// @dev lp may be filled before everyone has claimed, so this maintains eth proceeds accounting uint256 public totalDeposits; /// @notice total eth deposits for each address, cannot exceed MAX_SALE mapping(address => uint256) public deposits; constructor( ERC20 token_, address owner_ ) Owned(owner_) { token = token_; saleLive = true; } receive() external payable { if (!saleLive) revert("sale ended"); if (deposits[msg.sender] + msg.value > MAX_SALE) revert("max sale amount"); if(HARDCAP < totalDeposits + msg.value) revert("max sale amount"); // The total supply of ether will never overflow unchecked { deposits[msg.sender] += msg.value; totalDeposits += msg.value; } emit SaleEntered(msg.sender, msg.value); } function claimTokens() external { if (saleLive) revert("sale live"); uint256 share = getCurrentShare(msg.sender); delete deposits[msg.sender]; token.transfer(msg.sender, share); emit SaleClaimed(msg.sender, share); } function getCurrentShare(address account) public view returns (uint256) { return (suppliedTokens * deposits[account]) / totalDeposits; } function supplyTokens() external onlyOwner { if (!saleLive) revert("sale ended"); suppliedTokens = token.balanceOf(address(this)); emit TokensSupplied(token.balanceOf(address(this))); } function endSale() external onlyOwner { saleLive = false; } function withdrawProceeds() external onlyOwner { emit ProceedsWithdrawn(address(this).balance); payable(owner).transfer(address(this).balance); } }
// 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) /// 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. 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; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* 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 Atomically increases the allowance granted to `spender` by the caller. /// /// Emits a {Approval} event. function increaseAllowance( address spender, uint256 difference ) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) let allowanceSlot := keccak256(0x0c, 0x34) let allowanceBefore := sload(allowanceSlot) // Add to the allowance. let allowanceAfter := add(allowanceBefore, difference) // Revert upon overflow. if lt(allowanceAfter, allowanceBefore) { mstore(0x00, 0xf9067066) // `AllowanceOverflow()`. revert(0x1c, 0x04) } // Store the updated allowance. sstore(allowanceSlot, allowanceAfter) // Emit the {Approval} event. mstore(0x00, allowanceAfter) log3( 0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)) ) } return true; } /// @dev Atomically decreases the allowance granted to `spender` by the caller. /// /// Emits a {Approval} event. function decreaseAllowance( address spender, uint256 difference ) public virtual returns (bool) { /// @solidity memory-safe-assembly assembly { // Compute the allowance slot and load its value. mstore(0x20, spender) mstore(0x0c, _ALLOWANCE_SLOT_SEED) mstore(0x00, caller()) let allowanceSlot := keccak256(0x0c, 0x34) let allowanceBefore := sload(allowanceSlot) // Revert if will underflow. if lt(allowanceBefore, difference) { mstore(0x00, 0x8301ab38) // `AllowanceUnderflow()`. revert(0x1c, 0x04) } // Subtract and store the updated allowance. let allowanceAfter := sub(allowanceBefore, difference) sstore(allowanceSlot, allowanceAfter) // Emit the {Approval} event. mstore(0x00, allowanceAfter) 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 iszero(eq(allowance_, not(0))) { // 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 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 domainSeparator = DOMAIN_SEPARATOR(); /// @solidity memory-safe-assembly assembly { // Grab the free memory pointer. let m := mload(0x40) // Revert if the block timestamp greater than `deadline`. if gt(timestamp(), deadline) { mstore(0x00, 0x1a15a3cc) // `PermitExpired()`. revert(0x1c, 0x04) } // 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(0x0c, _NONCES_SLOT_SEED) mstore(0x00, owner) let nonceSlot := keccak256(0x0c, 0x20) let nonceValue := sload(nonceSlot) // Increment and store the updated nonce. sstore(nonceSlot, add(nonceValue, 1)) // Prepare the inner hash. // `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`. // forgefmt: disable-next-item mstore( m, 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9 ) 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) // Prepare the outer hash. mstore(0, 0x1901) mstore(0x20, domainSeparator) mstore(0x40, keccak256(m, 0xc0)) // Prepare the ecrecover calldata. mstore(0, keccak256(0x1e, 0x42)) mstore(0x20, and(0xff, v)) mstore(0x40, r) mstore(0x60, s) pop(staticcall(gas(), 1, 0, 0x80, 0x20, 0x20)) // If the ecrecover fails, the returndatasize will be 0x00, // `owner` will be 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) } // 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-2612 domains separator. function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) { /// @solidity memory-safe-assembly assembly { result := mload(0x40) // Grab the free memory pointer. } // We simply calculate it on-the-fly to allow for cases where the `name` may change. bytes32 nameHash = keccak256(bytes(name())); /// @solidity memory-safe-assembly assembly { let m := result // `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`. // forgefmt: disable-next-item mstore( m, 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f ) mstore(add(m, 0x20), nameHash) // `keccak256("1")`. // forgefmt: disable-next-item mstore( add(m, 0x40), 0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6 ) 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 iszero(eq(allowance_, not(0))) { // 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: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnershipTransferred(address indexed user, address indexed newOwner); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; modifier onlyOwner() virtual { require(msg.sender == owner, "UNAUTHORIZED"); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner) { owner = _owner; emit OwnershipTransferred(address(0), _owner); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function transferOwnership(address newOwner) public virtual onlyOwner { owner = newOwner; emit OwnershipTransferred(msg.sender, newOwner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ERC20","name":"token_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProceedsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SaleEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensSupplied","type":"event"},{"inputs":[],"name":"HARDCAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"suppliedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawProceeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040526707b3c18f3a57800060a0908152503480156200002057600080fd5b50604051620014f4380380620014f48339818101604052810190620000469190620001e9565b80806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506001600060146101000a81548160ff021916908315150217905550505062000230565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200016c826200013f565b9050919050565b600062000180826200015f565b9050919050565b620001928162000173565b81146200019e57600080fd5b50565b600081519050620001b28162000187565b92915050565b620001c3816200015f565b8114620001cf57600080fd5b50565b600081519050620001e381620001b8565b92915050565b600080604083850312156200020357620002026200013a565b5b60006200021385828601620001a1565b92505060206200022685828601620001d2565b9150509250929050565b60805160a0516112826200027260003960008181610137015261051b015260008181610696015281816109ba01528181610a7b0152610cd301526112826000f3fe6080604052600436106100e15760003560e01c806392925c3b1161007f578063e8dda51a11610059578063e8dda51a1461045d578063f2fde38b14610488578063fc0c546a146104b1578063fc7e286d146104dc576102e8565b806392925c3b146103de578063b2cb3a9b146103f5578063e081b78114610432576102e8565b806348c54b9d116100bb57806348c54b9d1461035a5780637d882097146103715780638da5cb5b1461039c5780639038e693146103c7576102e8565b8063136f3cfc146102ed578063380d831b146103185780633bd748801461032f576102e8565b366102e857600060149054906101000a900460ff16610135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012c90610d6a565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000034600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546101a19190610dc3565b11156101e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d990610e43565b60405180910390fd5b346002546101f09190610dc3565b6801a055690d9db80000101561023b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023290610e43565b60405180910390fd5b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550346002600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f1167c754441e88a212955ede9c41605458e3bfcf355e0e7aab7b9a9adbdf55f3346040516102de9190610e72565b60405180910390a2005b600080fd5b3480156102f957600080fd5b50610302610519565b60405161030f9190610e72565b60405180910390f35b34801561032457600080fd5b5061032d61053d565b005b34801561033b57600080fd5b506103446105e7565b6040516103519190610e72565b60405180910390f35b34801561036657600080fd5b5061036f6105f4565b005b34801561037d57600080fd5b50610386610784565b6040516103939190610e72565b60405180910390f35b3480156103a857600080fd5b506103b161078a565b6040516103be9190610ece565b60405180910390f35b3480156103d357600080fd5b506103dc6107ae565b005b3480156103ea57600080fd5b506103f36108db565b005b34801561040157600080fd5b5061041c60048036038101906104179190610f1a565b610b2a565b6040516104299190610e72565b60405180910390f35b34801561043e57600080fd5b50610447610b8d565b6040516104549190610f62565b60405180910390f35b34801561046957600080fd5b50610472610ba0565b60405161047f9190610e72565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190610f1a565b610ba6565b005b3480156104bd57600080fd5b506104c6610cd1565b6040516104d39190610fdc565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190610f1a565b610cf5565b6040516105109190610e72565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c290611043565b60405180910390fd5b60008060146101000a81548160ff021916908315150217905550565b6801a055690d9db8000081565b600060149054906101000a900460ff1615610644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063b906110af565b60405180910390fd5b600061064f33610b2a565b9050600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090557f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016106ef9291906110cf565b6020604051808303816000875af115801561070e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107329190611124565b503373ffffffffffffffffffffffffffffffffffffffff167f4b8d188a88126c55c5715b63f23b66134d881f891d43cb4cbca332e0520c9a72826040516107799190610e72565b60405180910390a250565b60025481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461083c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083390611043565b60405180910390fd5b7e85f56592462784083e828817207817f9a8413860eb3c60e01ba90ce6f925d94760405161086a9190610e72565b60405180910390a160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156108d8573d6000803e3d6000fd5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096090611043565b60405180910390fd5b600060149054906101000a900460ff166109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90610d6a565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a119190610ece565b602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a52919061117d565b6001819055507fac3d9837a679b12a12c0a3b0d0c20e8bf132403b05d76f80de8f4aec36297ed37f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ad29190610ece565b602060405180830381865afa158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b13919061117d565b604051610b209190610e72565b60405180910390a1565b6000600254600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600154610b7c91906111aa565b610b86919061121b565b9050919050565b600060149054906101000a900460ff1681565b60015481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90611043565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020528060005260406000206000915090505481565b600082825260208201905092915050565b7f73616c6520656e64656400000000000000000000000000000000000000000000600082015250565b6000610d54600a83610d0d565b9150610d5f82610d1e565b602082019050919050565b60006020820190508181036000830152610d8381610d47565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610dce82610d8a565b9150610dd983610d8a565b9250828201905080821115610df157610df0610d94565b5b92915050565b7f6d61782073616c6520616d6f756e740000000000000000000000000000000000600082015250565b6000610e2d600f83610d0d565b9150610e3882610df7565b602082019050919050565b60006020820190508181036000830152610e5c81610e20565b9050919050565b610e6c81610d8a565b82525050565b6000602082019050610e876000830184610e63565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610eb882610e8d565b9050919050565b610ec881610ead565b82525050565b6000602082019050610ee36000830184610ebf565b92915050565b600080fd5b610ef781610ead565b8114610f0257600080fd5b50565b600081359050610f1481610eee565b92915050565b600060208284031215610f3057610f2f610ee9565b5b6000610f3e84828501610f05565b91505092915050565b60008115159050919050565b610f5c81610f47565b82525050565b6000602082019050610f776000830184610f53565b92915050565b6000819050919050565b6000610fa2610f9d610f9884610e8d565b610f7d565b610e8d565b9050919050565b6000610fb482610f87565b9050919050565b6000610fc682610fa9565b9050919050565b610fd681610fbb565b82525050565b6000602082019050610ff16000830184610fcd565b92915050565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b600061102d600c83610d0d565b915061103882610ff7565b602082019050919050565b6000602082019050818103600083015261105c81611020565b9050919050565b7f73616c65206c6976650000000000000000000000000000000000000000000000600082015250565b6000611099600983610d0d565b91506110a482611063565b602082019050919050565b600060208201905081810360008301526110c88161108c565b9050919050565b60006040820190506110e46000830185610ebf565b6110f16020830184610e63565b9392505050565b61110181610f47565b811461110c57600080fd5b50565b60008151905061111e816110f8565b92915050565b60006020828403121561113a57611139610ee9565b5b60006111488482850161110f565b91505092915050565b61115a81610d8a565b811461116557600080fd5b50565b60008151905061117781611151565b92915050565b60006020828403121561119357611192610ee9565b5b60006111a184828501611168565b91505092915050565b60006111b582610d8a565b91506111c083610d8a565b92508282026111ce81610d8a565b915082820484148315176111e5576111e4610d94565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061122682610d8a565b915061123183610d8a565b925082611241576112406111ec565b5b82820490509291505056fea264697066735822122074b5bcb66199f898247d3982df2a385603355dc710e2332f125d27381aae4e8064736f6c63430008120033000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc0000000000000000000000001ffac7c50f7a45c1cd8392e6a8b2a28e0509540c
Deployed Bytecode
0x6080604052600436106100e15760003560e01c806392925c3b1161007f578063e8dda51a11610059578063e8dda51a1461045d578063f2fde38b14610488578063fc0c546a146104b1578063fc7e286d146104dc576102e8565b806392925c3b146103de578063b2cb3a9b146103f5578063e081b78114610432576102e8565b806348c54b9d116100bb57806348c54b9d1461035a5780637d882097146103715780638da5cb5b1461039c5780639038e693146103c7576102e8565b8063136f3cfc146102ed578063380d831b146103185780633bd748801461032f576102e8565b366102e857600060149054906101000a900460ff16610135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161012c90610d6a565b60405180910390fd5b7f00000000000000000000000000000000000000000000000007b3c18f3a57800034600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546101a19190610dc3565b11156101e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101d990610e43565b60405180910390fd5b346002546101f09190610dc3565b6801a055690d9db80000101561023b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023290610e43565b60405180910390fd5b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550346002600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167f1167c754441e88a212955ede9c41605458e3bfcf355e0e7aab7b9a9adbdf55f3346040516102de9190610e72565b60405180910390a2005b600080fd5b3480156102f957600080fd5b50610302610519565b60405161030f9190610e72565b60405180910390f35b34801561032457600080fd5b5061032d61053d565b005b34801561033b57600080fd5b506103446105e7565b6040516103519190610e72565b60405180910390f35b34801561036657600080fd5b5061036f6105f4565b005b34801561037d57600080fd5b50610386610784565b6040516103939190610e72565b60405180910390f35b3480156103a857600080fd5b506103b161078a565b6040516103be9190610ece565b60405180910390f35b3480156103d357600080fd5b506103dc6107ae565b005b3480156103ea57600080fd5b506103f36108db565b005b34801561040157600080fd5b5061041c60048036038101906104179190610f1a565b610b2a565b6040516104299190610e72565b60405180910390f35b34801561043e57600080fd5b50610447610b8d565b6040516104549190610f62565b60405180910390f35b34801561046957600080fd5b50610472610ba0565b60405161047f9190610e72565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190610f1a565b610ba6565b005b3480156104bd57600080fd5b506104c6610cd1565b6040516104d39190610fdc565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190610f1a565b610cf5565b6040516105109190610e72565b60405180910390f35b7f00000000000000000000000000000000000000000000000007b3c18f3a57800081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c290611043565b60405180910390fd5b60008060146101000a81548160ff021916908315150217905550565b6801a055690d9db8000081565b600060149054906101000a900460ff1615610644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063b906110af565b60405180910390fd5b600061064f33610b2a565b9050600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090557f000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016106ef9291906110cf565b6020604051808303816000875af115801561070e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107329190611124565b503373ffffffffffffffffffffffffffffffffffffffff167f4b8d188a88126c55c5715b63f23b66134d881f891d43cb4cbca332e0520c9a72826040516107799190610e72565b60405180910390a250565b60025481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461083c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083390611043565b60405180910390fd5b7e85f56592462784083e828817207817f9a8413860eb3c60e01ba90ce6f925d94760405161086a9190610e72565b60405180910390a160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156108d8573d6000803e3d6000fd5b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096090611043565b60405180910390fd5b600060149054906101000a900460ff166109b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109af90610d6a565b60405180910390fd5b7f000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a119190610ece565b602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a52919061117d565b6001819055507fac3d9837a679b12a12c0a3b0d0c20e8bf132403b05d76f80de8f4aec36297ed37f000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ad29190610ece565b602060405180830381865afa158015610aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b13919061117d565b604051610b209190610e72565b60405180910390a1565b6000600254600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600154610b7c91906111aa565b610b86919061121b565b9050919050565b600060149054906101000a900460ff1681565b60015481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2b90611043565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b7f000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc81565b60036020528060005260406000206000915090505481565b600082825260208201905092915050565b7f73616c6520656e64656400000000000000000000000000000000000000000000600082015250565b6000610d54600a83610d0d565b9150610d5f82610d1e565b602082019050919050565b60006020820190508181036000830152610d8381610d47565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610dce82610d8a565b9150610dd983610d8a565b9250828201905080821115610df157610df0610d94565b5b92915050565b7f6d61782073616c6520616d6f756e740000000000000000000000000000000000600082015250565b6000610e2d600f83610d0d565b9150610e3882610df7565b602082019050919050565b60006020820190508181036000830152610e5c81610e20565b9050919050565b610e6c81610d8a565b82525050565b6000602082019050610e876000830184610e63565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610eb882610e8d565b9050919050565b610ec881610ead565b82525050565b6000602082019050610ee36000830184610ebf565b92915050565b600080fd5b610ef781610ead565b8114610f0257600080fd5b50565b600081359050610f1481610eee565b92915050565b600060208284031215610f3057610f2f610ee9565b5b6000610f3e84828501610f05565b91505092915050565b60008115159050919050565b610f5c81610f47565b82525050565b6000602082019050610f776000830184610f53565b92915050565b6000819050919050565b6000610fa2610f9d610f9884610e8d565b610f7d565b610e8d565b9050919050565b6000610fb482610f87565b9050919050565b6000610fc682610fa9565b9050919050565b610fd681610fbb565b82525050565b6000602082019050610ff16000830184610fcd565b92915050565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b600061102d600c83610d0d565b915061103882610ff7565b602082019050919050565b6000602082019050818103600083015261105c81611020565b9050919050565b7f73616c65206c6976650000000000000000000000000000000000000000000000600082015250565b6000611099600983610d0d565b91506110a482611063565b602082019050919050565b600060208201905081810360008301526110c88161108c565b9050919050565b60006040820190506110e46000830185610ebf565b6110f16020830184610e63565b9392505050565b61110181610f47565b811461110c57600080fd5b50565b60008151905061111e816110f8565b92915050565b60006020828403121561113a57611139610ee9565b5b60006111488482850161110f565b91505092915050565b61115a81610d8a565b811461116557600080fd5b50565b60008151905061117781611151565b92915050565b60006020828403121561119357611192610ee9565b5b60006111a184828501611168565b91505092915050565b60006111b582610d8a565b91506111c083610d8a565b92508282026111ce81610d8a565b915082820484148315176111e5576111e4610d94565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061122682610d8a565b915061123183610d8a565b925082611241576112406111ec565b5b82820490509291505056fea264697066735822122074b5bcb66199f898247d3982df2a385603355dc710e2332f125d27381aae4e8064736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc0000000000000000000000001ffac7c50f7a45c1cd8392e6a8b2a28e0509540c
-----Decoded View---------------
Arg [0] : token_ (address): 0xad15aF3451623F679AfC2c72ca4bd44B1Bfe69cc
Arg [1] : owner_ (address): 0x1fFAC7c50f7a45C1CD8392e6A8b2A28e0509540c
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ad15af3451623f679afc2c72ca4bd44b1bfe69cc
Arg [1] : 0000000000000000000000001ffac7c50f7a45c1cd8392e6a8b2a28e0509540c
Deployed Bytecode Sourcemap
71:2850:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1581:8;;;;;;;;;;;1576:35;;1591:20;;;;;;;;;;:::i;:::-;;;;;;;;1576:35;1661:8;1649:9;1626:8;:20;1635:10;1626:20;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:43;1622:86;;;1683:25;;;;;;;;;;:::i;:::-;;;;;;;;1622:86;1748:9;1732:13;;:25;;;;:::i;:::-;938:8;1722:35;1719:77;;;1771:25;;;;;;;;;;:::i;:::-;;;;;;;;1719:77;1912:9;1888:8;:20;1897:10;1888:20;;;;;;;;;;;;;;;;:33;;;;;;;;;;;1952:9;1935:13;;:26;;;;;;;;;;;1999:10;1987:34;;;2011:9;1987:34;;;;;;:::i;:::-;;;;;;;;71:2850;;;;;781:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2676:71;;;;;;;;;;;;;:::i;:::-;;904:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2034:262;;;;;;;;;;;;;:::i;:::-;;1238:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;690:20:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2753:165:2;;;;;;;;;;;;;:::i;:::-;;2456:214;;;;;;;;;;;;;:::i;:::-;;2302:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;707:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1047:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1312:161:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;640:28:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1349:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;781:52;;;:::o;2676:71::-;778:5:1;;;;;;;;;;764:19;;:10;:19;;;756:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;2735:5:2::1;2724:8:::0;::::1;:16;;;;;;;;;;;;;;;;;;2676:71::o:0;904:42::-;938:8;904:42;:::o;2034:262::-;2080:8;;;;;;;;;;;2076:33;;;2090:19;;;;;;;;;;:::i;:::-;;;;;;;;2076:33;2120:13;2136:27;2152:10;2136:15;:27::i;:::-;2120:43;;2180:8;:20;2189:10;2180:20;;;;;;;;;;;;;;;2173:27;;;2211:5;:14;;;2226:10;2238:5;2211:33;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2271:10;2259:30;;;2283:5;2259:30;;;;;;:::i;:::-;;;;;;;;2066:230;2034:262::o;1238:28::-;;;;:::o;690:20:1:-;;;;;;;;;;;;:::o;2753:165:2:-;778:5:1;;;;;;;;;;764:19;;:10;:19;;;756:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;2815:40:2::1;2833:21;2815:40;;;;;;:::i;:::-;;;;;;;;2873:5;::::0;::::1;;;;;;;;2865:23;;:46;2889:21;2865:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;2753:165::o:0;2456:214::-;778:5:1;;;;;;;;;;764:19;;:10;:19;;;756:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;2514:8:2::1;;;;;;;;;;;2509:35;;2524:20;;;;;;;;;;:::i;:::-;;;;;;;;2509:35;2571:5;:15;;;2595:4;2571:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2554:14;:47;;;;2617:46;2632:5;:15;;;2656:4;2632:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2617:46;;;;;;:::i;:::-;;;;;;;;2456:214::o:0;2302:148::-;2365:7;2430:13;;2409:8;:17;2418:7;2409:17;;;;;;;;;;;;;;;;2392:14;;:34;;;;:::i;:::-;2391:52;;;;:::i;:::-;2384:59;;2302:148;;;:::o;707:20::-;;;;;;;;;;;;;:::o;1047:29::-;;;;:::o;1312:161:1:-;778:5;;;;;;;;;;764:19;;:10;:19;;;756:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;1400:8:::1;1392:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;1457:8;1424:42;;1445:10;1424:42;;;;;;;;;;;;1312:161:::0;:::o;640:28:2:-;;;:::o;1349:43::-;;;;;;;;;;;;;;;;;:::o;7:169:3:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:160::-;322:12;318:1;310:6;306:14;299:36;182:160;:::o;348:366::-;490:3;511:67;575:2;570:3;511:67;:::i;:::-;504:74;;587:93;676:3;587:93;:::i;:::-;705:2;700:3;696:12;689:19;;348:366;;;:::o;720:419::-;886:4;924:2;913:9;909:18;901:26;;973:9;967:4;963:20;959:1;948:9;944:17;937:47;1001:131;1127:4;1001:131;:::i;:::-;993:139;;720:419;;;:::o;1145:77::-;1182:7;1211:5;1200:16;;1145:77;;;:::o;1228:180::-;1276:77;1273:1;1266:88;1373:4;1370:1;1363:15;1397:4;1394:1;1387:15;1414:191;1454:3;1473:20;1491:1;1473:20;:::i;:::-;1468:25;;1507:20;1525:1;1507:20;:::i;:::-;1502:25;;1550:1;1547;1543:9;1536:16;;1571:3;1568:1;1565:10;1562:36;;;1578:18;;:::i;:::-;1562:36;1414:191;;;;:::o;1611:165::-;1751:17;1747:1;1739:6;1735:14;1728:41;1611:165;:::o;1782:366::-;1924:3;1945:67;2009:2;2004:3;1945:67;:::i;:::-;1938:74;;2021:93;2110:3;2021:93;:::i;:::-;2139:2;2134:3;2130:12;2123:19;;1782:366;;;:::o;2154:419::-;2320:4;2358:2;2347:9;2343:18;2335:26;;2407:9;2401:4;2397:20;2393:1;2382:9;2378:17;2371:47;2435:131;2561:4;2435:131;:::i;:::-;2427:139;;2154:419;;;:::o;2579:118::-;2666:24;2684:5;2666:24;:::i;:::-;2661:3;2654:37;2579:118;;:::o;2703:222::-;2796:4;2834:2;2823:9;2819:18;2811:26;;2847:71;2915:1;2904:9;2900:17;2891:6;2847:71;:::i;:::-;2703:222;;;;:::o;2931:126::-;2968:7;3008:42;3001:5;2997:54;2986:65;;2931:126;;;:::o;3063:96::-;3100:7;3129:24;3147:5;3129:24;:::i;:::-;3118:35;;3063:96;;;:::o;3165:118::-;3252:24;3270:5;3252:24;:::i;:::-;3247:3;3240:37;3165:118;;:::o;3289:222::-;3382:4;3420:2;3409:9;3405:18;3397:26;;3433:71;3501:1;3490:9;3486:17;3477:6;3433:71;:::i;:::-;3289:222;;;;:::o;3598:117::-;3707:1;3704;3697:12;3844:122;3917:24;3935:5;3917:24;:::i;:::-;3910:5;3907:35;3897:63;;3956:1;3953;3946:12;3897:63;3844:122;:::o;3972:139::-;4018:5;4056:6;4043:20;4034:29;;4072:33;4099:5;4072:33;:::i;:::-;3972:139;;;;:::o;4117:329::-;4176:6;4225:2;4213:9;4204:7;4200:23;4196:32;4193:119;;;4231:79;;:::i;:::-;4193:119;4351:1;4376:53;4421:7;4412:6;4401:9;4397:22;4376:53;:::i;:::-;4366:63;;4322:117;4117:329;;;;:::o;4452:90::-;4486:7;4529:5;4522:13;4515:21;4504:32;;4452:90;;;:::o;4548:109::-;4629:21;4644:5;4629:21;:::i;:::-;4624:3;4617:34;4548:109;;:::o;4663:210::-;4750:4;4788:2;4777:9;4773:18;4765:26;;4801:65;4863:1;4852:9;4848:17;4839:6;4801:65;:::i;:::-;4663:210;;;;:::o;4879:60::-;4907:3;4928:5;4921:12;;4879:60;;;:::o;4945:142::-;4995:9;5028:53;5046:34;5055:24;5073:5;5055:24;:::i;:::-;5046:34;:::i;:::-;5028:53;:::i;:::-;5015:66;;4945:142;;;:::o;5093:126::-;5143:9;5176:37;5207:5;5176:37;:::i;:::-;5163:50;;5093:126;;;:::o;5225:139::-;5288:9;5321:37;5352:5;5321:37;:::i;:::-;5308:50;;5225:139;;;:::o;5370:157::-;5470:50;5514:5;5470:50;:::i;:::-;5465:3;5458:63;5370:157;;:::o;5533:248::-;5639:4;5677:2;5666:9;5662:18;5654:26;;5690:84;5771:1;5760:9;5756:17;5747:6;5690:84;:::i;:::-;5533:248;;;;:::o;5787:162::-;5927:14;5923:1;5915:6;5911:14;5904:38;5787:162;:::o;5955:366::-;6097:3;6118:67;6182:2;6177:3;6118:67;:::i;:::-;6111:74;;6194:93;6283:3;6194:93;:::i;:::-;6312:2;6307:3;6303:12;6296:19;;5955:366;;;:::o;6327:419::-;6493:4;6531:2;6520:9;6516:18;6508:26;;6580:9;6574:4;6570:20;6566:1;6555:9;6551:17;6544:47;6608:131;6734:4;6608:131;:::i;:::-;6600:139;;6327:419;;;:::o;6752:159::-;6892:11;6888:1;6880:6;6876:14;6869:35;6752:159;:::o;6917:365::-;7059:3;7080:66;7144:1;7139:3;7080:66;:::i;:::-;7073:73;;7155:93;7244:3;7155:93;:::i;:::-;7273:2;7268:3;7264:12;7257:19;;6917:365;;;:::o;7288:419::-;7454:4;7492:2;7481:9;7477:18;7469:26;;7541:9;7535:4;7531:20;7527:1;7516:9;7512:17;7505:47;7569:131;7695:4;7569:131;:::i;:::-;7561:139;;7288:419;;;:::o;7713:332::-;7834:4;7872:2;7861:9;7857:18;7849:26;;7885:71;7953:1;7942:9;7938:17;7929:6;7885:71;:::i;:::-;7966:72;8034:2;8023:9;8019:18;8010:6;7966:72;:::i;:::-;7713:332;;;;;:::o;8051:116::-;8121:21;8136:5;8121:21;:::i;:::-;8114:5;8111:32;8101:60;;8157:1;8154;8147:12;8101:60;8051:116;:::o;8173:137::-;8227:5;8258:6;8252:13;8243:22;;8274:30;8298:5;8274:30;:::i;:::-;8173:137;;;;:::o;8316:345::-;8383:6;8432:2;8420:9;8411:7;8407:23;8403:32;8400:119;;;8438:79;;:::i;:::-;8400:119;8558:1;8583:61;8636:7;8627:6;8616:9;8612:22;8583:61;:::i;:::-;8573:71;;8529:125;8316:345;;;;:::o;8667:122::-;8740:24;8758:5;8740:24;:::i;:::-;8733:5;8730:35;8720:63;;8779:1;8776;8769:12;8720:63;8667:122;:::o;8795:143::-;8852:5;8883:6;8877:13;8868:22;;8899:33;8926:5;8899:33;:::i;:::-;8795:143;;;;:::o;8944:351::-;9014:6;9063:2;9051:9;9042:7;9038:23;9034:32;9031:119;;;9069:79;;:::i;:::-;9031:119;9189:1;9214:64;9270:7;9261:6;9250:9;9246:22;9214:64;:::i;:::-;9204:74;;9160:128;8944:351;;;;:::o;9301:410::-;9341:7;9364:20;9382:1;9364:20;:::i;:::-;9359:25;;9398:20;9416:1;9398:20;:::i;:::-;9393:25;;9453:1;9450;9446:9;9475:30;9493:11;9475:30;:::i;:::-;9464:41;;9654:1;9645:7;9641:15;9638:1;9635:22;9615:1;9608:9;9588:83;9565:139;;9684:18;;:::i;:::-;9565:139;9349:362;9301:410;;;;:::o;9717:180::-;9765:77;9762:1;9755:88;9862:4;9859:1;9852:15;9886:4;9883:1;9876:15;9903:185;9943:1;9960:20;9978:1;9960:20;:::i;:::-;9955:25;;9994:20;10012:1;9994:20;:::i;:::-;9989:25;;10033:1;10023:35;;10038:18;;:::i;:::-;10023:35;10080:1;10077;10073:9;10068:14;;9903:185;;;;:::o
Swarm Source
ipfs://74b5bcb66199f898247d3982df2a385603355dc710e2332f125d27381aae4e80
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.