Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,983 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unlock | 21467757 | 4 days ago | IN | 0 ETH | 0.00146171 | ||||
Unlock | 20372389 | 157 days ago | IN | 0 ETH | 0.00027897 | ||||
Unlock | 20368984 | 157 days ago | IN | 0 ETH | 0.00023583 | ||||
Unlock | 20305163 | 166 days ago | IN | 0 ETH | 0.00020092 | ||||
Unlock | 19925298 | 219 days ago | IN | 0 ETH | 0.00071539 | ||||
Unlock | 19849396 | 230 days ago | IN | 0 ETH | 0.00016376 | ||||
Unlock | 19703520 | 250 days ago | IN | 0 ETH | 0.00050161 | ||||
Unlock | 18996658 | 349 days ago | IN | 0 ETH | 0.00128288 | ||||
Unlock | 18940306 | 357 days ago | IN | 0 ETH | 0.00107466 | ||||
Unlock | 18924892 | 360 days ago | IN | 0 ETH | 0.00070158 | ||||
Unlock | 18866625 | 368 days ago | IN | 0 ETH | 0.00092682 | ||||
Unlock | 18751483 | 384 days ago | IN | 0 ETH | 0.00214201 | ||||
Unlock | 18716592 | 389 days ago | IN | 0 ETH | 0.00375546 | ||||
Unlock | 18695270 | 392 days ago | IN | 0 ETH | 0.00217377 | ||||
Unlock | 18533851 | 414 days ago | IN | 0 ETH | 0.00232331 | ||||
Unlock | 18527426 | 415 days ago | IN | 0 ETH | 0.00105692 | ||||
Unlock | 18493716 | 420 days ago | IN | 0 ETH | 0.0016109 | ||||
Unlock | 18493709 | 420 days ago | IN | 0 ETH | 0.00143561 | ||||
Unlock | 18435907 | 428 days ago | IN | 0 ETH | 0.00249723 | ||||
Unlock | 18419546 | 430 days ago | IN | 0 ETH | 0.00105941 | ||||
Unlock | 18376967 | 436 days ago | IN | 0 ETH | 0.00058729 | ||||
Unlock | 18081265 | 478 days ago | IN | 0 ETH | 0.00093281 | ||||
Unlock | 17770990 | 521 days ago | IN | 0 ETH | 0.00237545 | ||||
Unlock | 17753422 | 524 days ago | IN | 0 ETH | 0.00089327 | ||||
Unlock | 17690805 | 532 days ago | IN | 0 ETH | 0.00116291 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Lockdrop
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.11; import {ERC20} from "solmate/tokens/ERC20.sol"; import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol"; import {IERC20Droppable} from "./interfaces/IERC20Droppable.sol"; /// @title Lockdrop /// @author zefram.eth /// @notice Used for locking one token to receive another token contract Lockdrop { /// ----------------------------------------------------------------------- /// Library usage /// ----------------------------------------------------------------------- using SafeTransferLib for ERC20; /// ----------------------------------------------------------------------- /// Errors /// ----------------------------------------------------------------------- error Error_BeforeUnlockTimestamp(); error Error_AfterUnlockTimestamp(); /// ----------------------------------------------------------------------- /// Storage variables /// ----------------------------------------------------------------------- /// @notice Records the amount of old tokens locked by a user during migration /// @dev Only used if unlockTimestamp() is non-zero mapping(address => uint256) public lockedOldTokenBalance; /// ----------------------------------------------------------------------- /// Immutable parameters /// ----------------------------------------------------------------------- /// @notice The old token that's being locked ERC20 public immutable oldToken; /// @notice The new token that's being distributed IERC20Droppable public immutable newToken; /// @notice The timestamp after which the locked old tokens /// can be redeemed. uint64 public immutable unlockTimestamp; /// ----------------------------------------------------------------------- /// Constructor /// ----------------------------------------------------------------------- constructor(ERC20 oldToken_, IERC20Droppable newToken_, uint64 unlockTimestamp_) { oldToken = oldToken_; newToken = newToken_; unlockTimestamp = unlockTimestamp_; } /// ----------------------------------------------------------------------- /// User actions /// ----------------------------------------------------------------------- /// @notice Locks old tokens and distributes new tokens /// @param oldTokenAmount The amount of old tokens to lock /// @param recipient The address that will receive the new tokens /// (as well as the right to unlock the old tokens) /// @return newTokenAmount The amount of new tokens received function lock(uint256 oldTokenAmount, address recipient) external returns (uint256 newTokenAmount) { /// ----------------------------------------------------------------------- /// Validation /// ----------------------------------------------------------------------- // if locking 0, just do nothing if (oldTokenAmount == 0) { return 0; } /// ----------------------------------------------------------------------- /// State updates /// ----------------------------------------------------------------------- // can't lock after unlock since that enables infinite migration loops if (block.timestamp >= unlockTimestamp) { revert Error_AfterUnlockTimestamp(); } // don't check for overflow cause nobody cares // also because an ERC20 token's total supply can't exceed 256 bits unchecked { lockedOldTokenBalance[recipient] += oldTokenAmount; } /// ----------------------------------------------------------------------- /// Effects /// ----------------------------------------------------------------------- // transfer old tokens from sender and lock oldToken.safeTransferFrom(msg.sender, address(this), oldTokenAmount); // transfer new tokens to recipient newTokenAmount = newToken.drop(oldTokenAmount, recipient); } /// @notice Unlocks old tokens. Only callable if the current time is >= unlockTimestamp. /// @param recipient The address that will receive the old tokens /// @return oldTokenAmount The amount of old tokens unlocked function unlock(address recipient) external returns (uint256 oldTokenAmount) { /// ----------------------------------------------------------------------- /// Validation /// ----------------------------------------------------------------------- // must be after unlock timestamp if (block.timestamp < unlockTimestamp) { revert Error_BeforeUnlockTimestamp(); } /// ----------------------------------------------------------------------- /// State updates /// ----------------------------------------------------------------------- oldTokenAmount = lockedOldTokenBalance[msg.sender]; if (oldTokenAmount == 0) return 0; delete lockedOldTokenBalance[msg.sender]; /// ----------------------------------------------------------------------- /// Effects /// ----------------------------------------------------------------------- oldToken.safeTransfer(recipient, oldTokenAmount); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. /// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument. mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) ) } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "APPROVE_FAILED"); } }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity >=0.5.0; interface IERC20Droppable { /// @notice When called, the token must mint some amount of new tokens /// to `recipient` based on `oldTokenAmount`, and return the amount of /// new tokens minted as `newTokenAmount`. /// It does not need to make checks about whether old tokens have been locked. /// It MUST check that the caller is indeed the Lockdrop contract. function drop(uint256 oldTokenAmount, address recipient) external returns (uint256 newTokenAmount); }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ERC20","name":"oldToken_","type":"address"},{"internalType":"contract IERC20Droppable","name":"newToken_","type":"address"},{"internalType":"uint64","name":"unlockTimestamp_","type":"uint64"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Error_AfterUnlockTimestamp","type":"error"},{"inputs":[],"name":"Error_BeforeUnlockTimestamp","type":"error"},{"inputs":[{"internalType":"uint256","name":"oldTokenAmount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"lock","outputs":[{"internalType":"uint256","name":"newTokenAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockedOldTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newToken","outputs":[{"internalType":"contract IERC20Droppable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"unlock","outputs":[{"internalType":"uint256","name":"oldTokenAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTimestamp","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60e060405234801561001057600080fd5b5060405161074938038061074983398101604081905261002f9161006b565b6001600160a01b03928316608052911660a0526001600160401b031660c0526100c4565b6001600160a01b038116811461006857600080fd5b50565b60008060006060848603121561008057600080fd5b835161008b81610053565b602085015190935061009c81610053565b60408501519092506001600160401b03811681146100b957600080fd5b809150509250925092565b60805160a05160c0516106356101146000396000818160b5015281816101870152610274015260008181610141015261037b01526000818160f50152818161021f015261030701526106356000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063b31c710a11610050578063b31c710a146100f0578063c42bd05a1461013c578063c4a9acd61461016357600080fd5b80632f6c493c1461007757806366dfbfb41461009d578063aa082a9d146100b0575b600080fd5b61008a61008536600461059f565b610183565b6040519081526020015b60405180910390f35b61008a6100ab3660046105ba565b610260565b6100d77f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610094565b6101177f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b6101177f000000000000000000000000000000000000000000000000000000000000000081565b61008a61017136600461059f565b60006020819052908152604090205481565b60007f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff164210156101e9576040517f1a2e1caa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50336000908152602081905260408120549081900361020a57506000919050565b3360009081526020819052604081205561025b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1683836103f1565b919050565b600082600003610272575060006103eb565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1642106102d5576040517fc687dfae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808316600090815260208190526040902080548501905561032f907f0000000000000000000000000000000000000000000000000000000000000000163330866104b5565b6040517f87e96a240000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301527f000000000000000000000000000000000000000000000000000000000000000016906387e96a24906044016020604051808303816000875af11580156103c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e891906105e6565b90505b92915050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064015b60405180910390fd5b50505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016104a6565b5050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461025b57600080fd5b6000602082840312156105b157600080fd5b6103e88261057b565b600080604083850312156105cd57600080fd5b823591506105dd6020840161057b565b90509250929050565b6000602082840312156105f857600080fd5b505191905056fea26469706673582212205d66bbf8530024d104113891d6b4e66d872ca6c87b9c219bd8594477fe47674964736f6c634300080e00330000000000000000000000003aada3e213abf8529606924d8d1c55cbdc70bf740000000000000000000000003446dd70b2d52a6bf4a5a192d9b0a161295ab7f90000000000000000000000000000000000000000000000000000000064001226
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100725760003560e01c8063b31c710a11610050578063b31c710a146100f0578063c42bd05a1461013c578063c4a9acd61461016357600080fd5b80632f6c493c1461007757806366dfbfb41461009d578063aa082a9d146100b0575b600080fd5b61008a61008536600461059f565b610183565b6040519081526020015b60405180910390f35b61008a6100ab3660046105ba565b610260565b6100d77f000000000000000000000000000000000000000000000000000000006400122681565b60405167ffffffffffffffff9091168152602001610094565b6101177f0000000000000000000000003aada3e213abf8529606924d8d1c55cbdc70bf7481565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b6101177f0000000000000000000000003446dd70b2d52a6bf4a5a192d9b0a161295ab7f981565b61008a61017136600461059f565b60006020819052908152604090205481565b60007f000000000000000000000000000000000000000000000000000000006400122667ffffffffffffffff164210156101e9576040517f1a2e1caa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50336000908152602081905260408120549081900361020a57506000919050565b3360009081526020819052604081205561025b7f0000000000000000000000003aada3e213abf8529606924d8d1c55cbdc70bf7473ffffffffffffffffffffffffffffffffffffffff1683836103f1565b919050565b600082600003610272575060006103eb565b7f000000000000000000000000000000000000000000000000000000006400122667ffffffffffffffff1642106102d5576040517fc687dfae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808316600090815260208190526040902080548501905561032f907f0000000000000000000000003aada3e213abf8529606924d8d1c55cbdc70bf74163330866104b5565b6040517f87e96a240000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff83811660248301527f0000000000000000000000003446dd70b2d52a6bf4a5a192d9b0a161295ab7f916906387e96a24906044016020604051808303816000875af11580156103c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e891906105e6565b90505b92915050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064015b60405180910390fd5b50505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016104a6565b5050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461025b57600080fd5b6000602082840312156105b157600080fd5b6103e88261057b565b600080604083850312156105cd57600080fd5b823591506105dd6020840161057b565b90509250929050565b6000602082840312156105f857600080fd5b505191905056fea26469706673582212205d66bbf8530024d104113891d6b4e66d872ca6c87b9c219bd8594477fe47674964736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003aada3e213abf8529606924d8d1c55cbdc70bf740000000000000000000000003446dd70b2d52a6bf4a5a192d9b0a161295ab7f90000000000000000000000000000000000000000000000000000000064001226
-----Decoded View---------------
Arg [0] : oldToken_ (address): 0x3aaDA3e213aBf8529606924d8D1c55CbDc70Bf74
Arg [1] : newToken_ (address): 0x3446Dd70B2D52A6Bf4a5a192D9b0A161295aB7F9
Arg [2] : unlockTimestamp_ (uint64): 1677726246
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003aada3e213abf8529606924d8d1c55cbdc70bf74
Arg [1] : 0000000000000000000000003446dd70b2d52a6bf4a5a192d9b0a161295ab7f9
Arg [2] : 0000000000000000000000000000000000000000000000000000000064001226
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $651.84 | 118.8917 | $77,498.38 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.