More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 71,312 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Deposit... | 22294568 | 11 hrs ago | IN | 0 ETH | 0.00010099 | ||||
Withdraw Deposit... | 22285673 | 41 hrs ago | IN | 0 ETH | 0.00082672 | ||||
Withdraw Deposit... | 22282299 | 2 days ago | IN | 0 ETH | 0.0009078 | ||||
Withdraw Deposit... | 22281928 | 2 days ago | IN | 0 ETH | 0.00008715 | ||||
Withdraw Deposit... | 22277737 | 2 days ago | IN | 0 ETH | 0.00004516 | ||||
Withdraw Deposit... | 22270904 | 3 days ago | IN | 0 ETH | 0.00001955 | ||||
Withdraw Deposit... | 22266796 | 4 days ago | IN | 0 ETH | 0.00012134 | ||||
Withdraw Deposit... | 22265787 | 4 days ago | IN | 0 ETH | 0.00003316 | ||||
Withdraw Deposit... | 22258287 | 5 days ago | IN | 0 ETH | 0.00014515 | ||||
Withdraw Deposit... | 22255493 | 5 days ago | IN | 0 ETH | 0.00005766 | ||||
Withdraw Deposit... | 22249866 | 6 days ago | IN | 0 ETH | 0.00092854 | ||||
Withdraw Deposit... | 22247718 | 7 days ago | IN | 0 ETH | 0.00003797 | ||||
Withdraw Deposit... | 22246839 | 7 days ago | IN | 0 ETH | 0.00026123 | ||||
Withdraw Deposit... | 22235908 | 8 days ago | IN | 0 ETH | 0.00027046 | ||||
Withdraw Deposit... | 22234859 | 8 days ago | IN | 0 ETH | 0.00038928 | ||||
Withdraw Deposit... | 22208390 | 12 days ago | IN | 0 ETH | 0.00003408 | ||||
Withdraw Deposit... | 22203109 | 13 days ago | IN | 0 ETH | 0.00006269 | ||||
Withdraw Deposit... | 22202170 | 13 days ago | IN | 0 ETH | 0.00003563 | ||||
Withdraw Deposit... | 22197353 | 14 days ago | IN | 0 ETH | 0.0000664 | ||||
Withdraw Deposit... | 22191269 | 14 days ago | IN | 0 ETH | 0.00031235 | ||||
Withdraw Deposit... | 22189387 | 15 days ago | IN | 0 ETH | 0.00116811 | ||||
Withdraw Deposit... | 22188440 | 15 days ago | IN | 0 ETH | 0.00011407 | ||||
Withdraw Deposit... | 22187352 | 15 days ago | IN | 0 ETH | 0.00006563 | ||||
Withdraw Deposit... | 22186849 | 15 days ago | IN | 0 ETH | 0.00007425 | ||||
Withdraw Deposit... | 22173885 | 17 days ago | IN | 0 ETH | 0.00005195 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Deposit ETH To | 22285673 | 41 hrs ago | 0.01 ETH | ||||
Deposit ETH To | 22282299 | 2 days ago | 0.062 ETH | ||||
Transfer | 22270904 | 3 days ago | 0.04524196 ETH | ||||
Transfer | 22265787 | 4 days ago | 0.01 ETH | ||||
Deposit ETH To | 22249866 | 6 days ago | 0.003 ETH | ||||
Transfer | 22247718 | 7 days ago | 0.032 ETH | ||||
Deposit ETH To | 22234859 | 8 days ago | 0.001 ETH | ||||
Transfer | 22208390 | 12 days ago | 0.041 ETH | ||||
Transfer | 22202170 | 13 days ago | 0.003 ETH | ||||
Deposit ETH To | 22189387 | 15 days ago | 0.1 ETH | ||||
Transfer | 22187352 | 15 days ago | 0.01 ETH | ||||
Transfer | 22172746 | 17 days ago | 0.12 ETH | ||||
Deposit ETH To | 22160123 | 19 days ago | 0.023 ETH | ||||
Deposit ETH To | 22160122 | 19 days ago | 0.04 ETH | ||||
Deposit ETH To | 22160120 | 19 days ago | 0.05 ETH | ||||
Deposit ETH To | 22160120 | 19 days ago | 0.017 ETH | ||||
Deposit ETH To | 22160118 | 19 days ago | 0.02 ETH | ||||
Deposit ETH To | 22160117 | 19 days ago | 0.028 ETH | ||||
Deposit ETH To | 22159988 | 19 days ago | 0.025 ETH | ||||
Transfer | 22159111 | 19 days ago | 0.011 ETH | ||||
Deposit ETH To | 22150026 | 20 days ago | 0.003 ETH | ||||
Transfer | 22146471 | 21 days ago | 0.001 ETH | ||||
Transfer | 22126910 | 23 days ago | 0.045 ETH | ||||
Deposit ETH To | 22121770 | 24 days ago | 0.025 ETH | ||||
Deposit ETH To | 22103119 | 27 days ago | 0.005 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FusionLock
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 30000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.24; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import {Address} from "@openzeppelin/contracts/utils/Address.sol"; interface BridgeInterface { /** * @dev reference: https://github.com/ethereum-optimism/optimism/blob/65ec61dde94ffa93342728d324fecf474d228e1f/packages/contracts-bedrock/contracts/L1/L1StandardBridge.sol#L188 */ function depositERC20To( address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes calldata _extraData ) external; /** * @dev reference: https://github.com/ethereum-optimism/optimism/blob/65ec61dde94ffa93342728d324fecf474d228e1f/packages/contracts-bedrock/contracts/L1/L1StandardBridge.sol#L137 */ function depositETHTo(address _to, uint32 _minGasLimit, bytes calldata _extraData) external payable; } /** * @title FusionLock Contract * @dev This contract allows users to deposit ERC20 tokens or Ether within a specified time time. * It provides functionalities for bridging tokens between Layer 1 (L1) and Layer 2 (L2) networks. * Users can also withdraw their deposited tokens after the max lock time ends. */ contract FusionLock is Ownable, Pausable { using SafeERC20 for IERC20; using Address for address payable; // Events event TokenAllowed(address token, TokenInfo info); event TokenDataChange(address l1Token, address l2Token, address l1Bridge); event BridgeAddress(address bridgeAddress); event WithdrawalTimeUpdated(uint256 endTime); event Deposit(address indexed depositOwner, address indexed token, uint256 amount, uint256 depositTime); event WithdrawToL1(address indexed owner, address indexed token, uint256 amount); event WithdrawToL2( address indexed owner, address indexed receiver, address indexed l1Token, address l2Token, uint256 amount ); event SavedToken(address indexed user, address indexed token, uint256 amount); // Struct to hold token information. struct TokenInfo { bool isAllowed; // Flag indicating whether the token is allowed for deposit. address l2TokenAddress; // Address of the corresponding token on Layer 2. address l1BridgeAddressOverride; // Optional address to use for bridging to L2. } // Struct to hold L1 and L2 token addresses. struct TokenBridgingData { address l1TokenAddress; address l2TokenAddress; address l1BridgeAddressOverride; } // Struct to hold token information. struct SaveTokenData { address user; // user to send the funds to address token; // token to send uint256 amount; // amount to send } // State variables mapping(address => TokenInfo) public allowedTokens; // Mapping to track allowed ERC20 tokens and their corresponding L2 addresses. mapping(address => mapping(address => uint256)) public deposits; // Mapping to store deposit data: user address => token address => deposit amount. mapping(address => uint256) public totalDeposits; // Mapping to track total deposit amount per token address. Used for refunds in case of bridging failure. uint256 public withdrawalStartTime; // Start time for withdrawal address public bridgeProxyAddress; // Address of the bridge contract for L1-L2 token transfers // Constant representing the Ethereum token address. address public constant ETH_TOKEN_ADDRESS = address(0x00); /** * @dev Constructor * @param setWithdrawalStartTime Withdrawal start time * @param allowTokens Array of addresses representing ERC20 tokens to be allowed for deposit * @param initialOwner Address of the initial owner of the contract. */ constructor(uint256 setWithdrawalStartTime, address[] memory allowTokens, address initialOwner) Ownable(initialOwner) { require(setWithdrawalStartTime > block.timestamp, "Withdrawal start time can't be historical"); withdrawalStartTime = setWithdrawalStartTime; for (uint256 tokenId = 0; tokenId < allowTokens.length; tokenId++) { _allow(allowTokens[tokenId], address(0x00), address(0x00)); } // allow eth by default _allow(ETH_TOKEN_ADDRESS, address(0x00), address(0x00)); } /** * @dev Modifier to check if deposit is allowed. * @param amount Amount of tokens being deposited. */ modifier isDepositAllowed(uint256 amount) { require(!isWithdrawalTimeStarted(), "Deposit time already ended"); require(amount > 0, "Amount Should Be Greater Than Zero"); _; } /** * @dev Deposit ERC20 tokens. * @param token Address of the ERC20 token. * @param amount Amount of tokens to deposit. */ function depositERC20(address token, uint256 amount) external isDepositAllowed(amount) whenNotPaused { require(allowedTokens[token].isAllowed, "Deposit token not allowed"); deposits[msg.sender][token] += amount; totalDeposits[token] += amount; // Transfer tokens to contract IERC20(token).safeTransferFrom(msg.sender, address(this), amount); // Emit Deposit event emit Deposit(msg.sender, token, amount, block.timestamp); } /** * @dev Deposit Ether * Allows users to deposit Ether into the contract. */ function depositEth() external payable isDepositAllowed(msg.value) whenNotPaused { // Increase the deposited Ether amount for the sender. deposits[msg.sender][ETH_TOKEN_ADDRESS] += msg.value; totalDeposits[ETH_TOKEN_ADDRESS] += msg.value; // Emit Deposit Event emit Deposit(msg.sender, ETH_TOKEN_ADDRESS, msg.value, block.timestamp); } /** * @dev Function to withdraw ERC20 tokens or Ether for a given deposit. * @param token Address of the token to withdraw. */ function withdrawSingleDepositToL1(address token) internal { uint256 transferAmount = deposits[msg.sender][token]; require(transferAmount != 0, "Withdrawal completed or token never deposited"); deposits[msg.sender][token] = 0; totalDeposits[token] -= transferAmount; if (token == ETH_TOKEN_ADDRESS) { // Note: we use openzeppelin's `sendValue` rather than `transfer` because // `transfer` forwards a fixed amount of gas (2300), which may not be enough // if msg.sender is a smart contract. We should be OK against reentrancy // attacks since we follow the checks-effects-interactions pattern payable(msg.sender).sendValue(transferAmount); } else { // Transfer ERC20 tokens to the sender. IERC20(token).safeTransfer(msg.sender, transferAmount); } emit WithdrawToL1(msg.sender, token, transferAmount); } /** * @dev Internal function to withdraw tokens to Layer 2. * @param token Address of the token to withdraw. * @param minGasLimit Minimum gas limit for each individual withdrawal transaction. * @param receiver The receiver of the funds on L2. */ function withdrawSingleDepositToL2(address token, uint32 minGasLimit, address receiver) internal { uint256 transferAmount = deposits[msg.sender][token]; require(transferAmount != 0, "Withdrawal completed or token never deposited"); // Retrieve token information. TokenInfo memory tokenInfo = allowedTokens[token]; // check l2 token address set. require(token == ETH_TOKEN_ADDRESS || tokenInfo.l2TokenAddress != address(0x00), "L2 token address not set"); address bridgeAddress = bridgeProxyAddress; if (tokenInfo.l1BridgeAddressOverride != address(0x00)) { bridgeAddress = tokenInfo.l1BridgeAddressOverride; } deposits[msg.sender][token] = 0; totalDeposits[token] -= transferAmount; if (token == ETH_TOKEN_ADDRESS) { // Bridge Ether to Layer 2. BridgeInterface(bridgeAddress).depositETHTo{value: transferAmount}(receiver, minGasLimit, hex""); } else { // Approve tokens for transfer to the bridge. IERC20(token).approve(bridgeAddress, transferAmount); // Bridge ERC20 tokens to Layer 2. BridgeInterface(bridgeAddress).depositERC20To( token, tokenInfo.l2TokenAddress, receiver, transferAmount, minGasLimit, hex"" ); } emit WithdrawToL2(msg.sender, receiver, token, tokenInfo.l2TokenAddress, transferAmount); } /** * @dev Function to withdraw all deposits to Layer 2 for multiple tokens. * @param tokens Array of token addresses to withdraw. * @param minGasLimit Minimum gas limit for the withdrawal transactions. * @param receiver The receiver of the funds on L2. */ function withdrawDepositsToL2(address[] memory tokens, uint32 minGasLimit, address receiver) external whenNotPaused { require(isWithdrawalTimeStarted(), "Withdrawal not started"); // check if bridge address set require(bridgeProxyAddress != address(0x00), "Bridge address not set"); // Loop through each token and withdraw to Layer 2. for (uint256 i = 0; i < tokens.length; i++) { withdrawSingleDepositToL2(tokens[i], minGasLimit, receiver); } } /** * @dev Function to withdraw all deposits to Layer 1 for multiple tokens. * @param tokens Array of token addresses to withdraw. */ function withdrawDepositsToL1(address[] memory tokens) external { require(isWithdrawalTimeStarted(), "Withdrawal not started"); // Loop through each token and withdraw to Layer 1. for (uint256 i = 0; i < tokens.length; i++) { withdrawSingleDepositToL1(tokens[i]); } } /** * @dev Function to allow ERC20 tokens for deposit. * This function allows the contract owner to allow specific ERC20 tokens for deposit. * @param l1TokenAddress Address of the ERC20 token to allow on Layer 1. * @param l2TokenAddress Address of the corresponding token on Layer 2. * @param l1BridgeAddressOverride Address of the corresponding bridge to use for this token. * Can be 0 to use the default. This should be used for tokens * that cannot use the L1StandardBridge contract. Note that the * override is expected to implement the same BridgeInterface. */ function allow(address l1TokenAddress, address l2TokenAddress, address l1BridgeAddressOverride) external onlyOwner { require(!isWithdrawalTimeStarted(), "Withdrawal has started, token allowance cannot be modified"); _allow(l1TokenAddress, l2TokenAddress, l1BridgeAddressOverride); } /** * @dev Internal function to allow ERC20 tokens for deposit. * This function updates the allowedTokens mapping with the provided token information. * @param l1TokenAddress Address of the ERC20 token to allow. * @param l2TokenAddress Address of the corresponding token on Layer 2. * @param l1BridgeAddressOverride Address of the corresponding bridge to use for this token. * Can be 0 to use the default. */ function _allow(address l1TokenAddress, address l2TokenAddress, address l1BridgeAddressOverride) internal { TokenInfo memory tokenInfo = TokenInfo(true, l2TokenAddress, l1BridgeAddressOverride); allowedTokens[l1TokenAddress] = tokenInfo; emit TokenAllowed(l1TokenAddress, tokenInfo); } /** * @dev Function to change L2 address and the bridge address of tokens that were allowed for deposit. * This function allows the contract owner to change the L2 address and the L1 bridge address for tokens * that were previously allowed for deposit. * @param tokenData An array of structs, each containing the Layer 1 (L1) token address, its (L1) bridge * address, and its Layer 2 (L2) token address. */ function changeMultipleL2TokenData(TokenBridgingData[] memory tokenData) external onlyOwner { for (uint256 i = 0; i < tokenData.length; i++) { TokenBridgingData memory token = tokenData[i]; // Ensure the token is allowed for deposit before changing its L2 address require(allowedTokens[token.l1TokenAddress].isAllowed, "Need to allow token before changing token data"); // Update the L2 address of the token allowedTokens[token.l1TokenAddress].l2TokenAddress = token.l2TokenAddress; allowedTokens[token.l1TokenAddress].l1BridgeAddressOverride = token.l1BridgeAddressOverride; emit TokenDataChange(token.l1TokenAddress, token.l2TokenAddress, token.l1BridgeAddressOverride); } } /** * @dev Function to change the withdrawal time. * This function allows the contract owner to change the withdrawal time. * @param newWithdrawalStartTime New withdrawal start time. */ function changeWithdrawalTime(uint256 newWithdrawalStartTime) external onlyOwner { require(block.timestamp < newWithdrawalStartTime, "New timestamp can't be historical"); require( withdrawalStartTime > newWithdrawalStartTime, "Withdrawal start time can only be decreased, not increased" ); withdrawalStartTime = newWithdrawalStartTime; emit WithdrawalTimeUpdated(newWithdrawalStartTime); } /** * @dev Function to set the address of the bridge proxy. * This function allows the contract owner to set the address of the bridge proxy for token transfers between Layer 1 and Layer 2. * @param l2BridgeProxyAddress Address of the bridge proxy contract. */ function setBridgeProxyAddress(address l2BridgeProxyAddress) external onlyOwner { bridgeProxyAddress = l2BridgeProxyAddress; emit BridgeAddress(l2BridgeProxyAddress); } /** * @dev This function allows the contract owner to recover ERC20 tokens that would * otherwise stay locked in the contract forever. * @param tokenData An array of structs containing information about the tokens to be saved. */ function saveTokens(SaveTokenData[] calldata tokenData) external onlyOwner { for (uint256 i = 0; i < tokenData.length; i++) { saveToken(tokenData[i].user, tokenData[i].token, tokenData[i].amount); } } /** * @dev Internal function to recover an ERC20 token that would otherwise stay locked in * the contract forever. This function transfers the specified amount of ERC20 token * from the contract's balance to the specified user's address. * @param user Address of the user to send the tokens to. * @param token Address of the ERC20 token to be saved. * @param amount Amount of tokens to be saved. */ function saveToken(address user, address token, uint256 amount) internal { require( token != ETH_TOKEN_ADDRESS, "Only ERC20 tokens can be recovered, since eth bridging is supposed to be infallible" ); uint256 tokenBalance = IERC20(token).balanceOf(address(this)); require(tokenBalance >= totalDeposits[token] + amount, "Insufficient balance to save token"); IERC20(token).safeTransfer(user, amount); emit SavedToken(user, token, amount); } /** * @dev Function to pause contract. This calls the Pausable contract. */ function pause() external onlyOwner { super._pause(); } /** * @dev Function to unpause contract. This calls the Pausable contract. */ function unpause() external onlyOwner { super._unpause(); } /** * @dev Function to check if the withdrawal time has started. * @return bool true if the withdrawal time has started, false otherwise. */ function isWithdrawalTimeStarted() public view returns (bool) { // Check if the withdrawal time has started. return block.timestamp >= withdrawalStartTime; } /** * @dev Get the Ether balance of the contract * @return uint256 Ether balance of the contract */ function getEthBalance() public view returns (uint256) { return address(this).balance; } /** * @dev Function to retrieve information about a token's allowance for deposit. * @param token Address of the token to retrieve information for. */ function getTokenInfo(address token) public view returns (TokenInfo memory) { return allowedTokens[token]; } /** * @dev Get the deposited amount of a token for a given user * @param depositOwner Address of the user * @param token Address of the token * @return uint256 Amount of tokens deposited */ function getDepositAmount(address depositOwner, address token) public view returns (uint256) { return deposits[depositOwner][token]; } fallback() external payable { revert("fallback not allowed"); } receive() external payable { revert("receive not allowed"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; import {IERC20Permit} from "../extensions/IERC20Permit.sol"; import {Address} from "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
{ "remappings": [ "@openzeppelin/=lib/openzeppelin-contracts/", "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/" ], "optimizer": { "enabled": true, "runs": 30000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"setWithdrawalStartTime","type":"uint256"},{"internalType":"address[]","name":"allowTokens","type":"address[]"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bridgeAddress","type":"address"}],"name":"BridgeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositOwner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SavedToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"components":[{"internalType":"bool","name":"isAllowed","type":"bool"},{"internalType":"address","name":"l2TokenAddress","type":"address"},{"internalType":"address","name":"l1BridgeAddressOverride","type":"address"}],"indexed":false,"internalType":"struct FusionLock.TokenInfo","name":"info","type":"tuple"}],"name":"TokenAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"l1Token","type":"address"},{"indexed":false,"internalType":"address","name":"l2Token","type":"address"},{"indexed":false,"internalType":"address","name":"l1Bridge","type":"address"}],"name":"TokenDataChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawToL1","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"l1Token","type":"address"},{"indexed":false,"internalType":"address","name":"l2Token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawToL2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"WithdrawalTimeUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ETH_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"l1TokenAddress","type":"address"},{"internalType":"address","name":"l2TokenAddress","type":"address"},{"internalType":"address","name":"l1BridgeAddressOverride","type":"address"}],"name":"allow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTokens","outputs":[{"internalType":"bool","name":"isAllowed","type":"bool"},{"internalType":"address","name":"l2TokenAddress","type":"address"},{"internalType":"address","name":"l1BridgeAddressOverride","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeProxyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"l1TokenAddress","type":"address"},{"internalType":"address","name":"l2TokenAddress","type":"address"},{"internalType":"address","name":"l1BridgeAddressOverride","type":"address"}],"internalType":"struct FusionLock.TokenBridgingData[]","name":"tokenData","type":"tuple[]"}],"name":"changeMultipleL2TokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWithdrawalStartTime","type":"uint256"}],"name":"changeWithdrawalTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"depositOwner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenInfo","outputs":[{"components":[{"internalType":"bool","name":"isAllowed","type":"bool"},{"internalType":"address","name":"l2TokenAddress","type":"address"},{"internalType":"address","name":"l1BridgeAddressOverride","type":"address"}],"internalType":"struct FusionLock.TokenInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWithdrawalTimeStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct FusionLock.SaveTokenData[]","name":"tokenData","type":"tuple[]"}],"name":"saveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"l2BridgeProxyAddress","type":"address"}],"name":"setBridgeProxyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"withdrawDepositsToL1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint32","name":"minGasLimit","type":"uint32"},{"internalType":"address","name":"receiver","type":"address"}],"name":"withdrawDepositsToL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002c6338038062002c638339810160408190526200003491620002a2565b806001600160a01b0381166200006557604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000708162000144565b506000805460ff60a01b19169055428311620000e15760405162461bcd60e51b815260206004820152602960248201527f5769746864726177616c2073746172742074696d652063616e277420626520686044820152681a5cdd1bdc9a58d85b60ba1b60648201526084016200005c565b600483905560005b82518110156200012c57620001238382815181106200010c576200010c62000394565b60200260200101516000806200019460201b60201c565b600101620000e9565b506200013b6000808062000194565b505050620003aa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516060808201835260018083526001600160a01b0386811660208086019182528783168688019081528a84166000818152868452899020885181548651881661010002610100600160a81b0319921515929092166001600160a81b0319909116171781558251960180549686166001600160a01b031990971696909617909555875194855286511515918501919091529051821695830195909552935190931690830152907f6617ad000cbb28c222d0e2bba4c0e10c3390afba5e7cabfdb5fdf0596f4a9b259060800160405180910390a150505050565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200029d57600080fd5b919050565b600080600060608486031215620002b857600080fd5b8351602080860151919450906001600160401b0380821115620002da57600080fd5b818701915087601f830112620002ef57600080fd5b8151818111156200030457620003046200026f565b8060051b604051601f19603f830116810181811085821117156200032c576200032c6200026f565b60405291825284820192508381018501918a8311156200034b57600080fd5b938501935b828510156200037457620003648562000285565b8452938501939285019262000350565b8097505050505050506200038b6040850162000285565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b6128a980620003ba6000396000f3fe60806040526004361061019a5760003560e01c80638f601f66116100e1578063e744092e1161008a578063eef565f011610064578063eef565f014610617578063f2fde38b14610637578063f45b1b3a14610657578063fb263fa41461067757610206565b8063e744092e1461053e578063e9403256146105ca578063eb6cb23c146105f757610206565b8063ad26b43d116100bb578063ad26b43d146104e8578063b62b265614610508578063dfc00b3a1461051e57610206565b80638f601f661461047057806397feb926146104a8578063a3bc64f2146104c857610206565b8063581c5fa011610143578063715018a61161011d578063715018a61461041b5780638456cb59146104305780638da5cb5b1461044557610206565b8063581c5fa0146103ae5780635c975abb146103ce57806370ed0ada146103fe57610206565b80632cd26d45116101745780632cd26d45146103625780633f4ba83a1461038f578063439370b1146103a657610206565b80631444464d146102685780631878d1f1146102915780631f69565f146102cb57610206565b36610206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f72656365697665206e6f7420616c6c6f7765640000000000000000000000000060448201526064015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f66616c6c6261636b206e6f7420616c6c6f77656400000000000000000000000060448201526064016101fd565b34801561027457600080fd5b506004544210155b60405190151581526020015b60405180910390f35b34801561029d57600080fd5b506102a6600081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610288565b3480156102d757600080fd5b506103556102e6366004612312565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff948516815260018084529084902084519283018552805460ff811615158452610100900486169383019390935291909101549092169082015290565b604051610288919061232d565b34801561036e57600080fd5b506005546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039b57600080fd5b506103a4610697565b005b6103a46106a9565b3480156103ba57600080fd5b506103a46103c93660046124ae565b610864565b3480156103da57600080fd5b5060005474010000000000000000000000000000000000000000900460ff1661027c565b34801561040a57600080fd5b50475b604051908152602001610288565b34801561042757600080fd5b506103a4610995565b34801561043c57600080fd5b506103a46109a7565b34801561045157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102a6565b34801561047c57600080fd5b5061040d61048b366004612517565b600260209081526000928352604080842090915290825290205481565b3480156104b457600080fd5b506103a46104c336600461254a565b6109b7565b3480156104d457600080fd5b506103a46104e3366004612312565b610c4b565b3480156104f457600080fd5b506103a4610503366004612574565b610ccd565b34801561051457600080fd5b5061040d60045481565b34801561052a57600080fd5b506103a46105393660046125e9565b610d63565b34801561054a57600080fd5b50610596610559366004612312565b6001602081905260009182526040909120805491015460ff82169173ffffffffffffffffffffffffffffffffffffffff6101009091048116911683565b60408051931515845273ffffffffffffffffffffffffffffffffffffffff9283166020850152911690820152606001610288565b3480156105d657600080fd5b5061040d6105e5366004612312565b60036020526000908152604090205481565b34801561060357600080fd5b506103a46106123660046126bc565b610f6b565b34801561062357600080fd5b506103a46106323660046126e8565b61100f565b34801561064357600080fd5b506103a4610652366004612312565b6110b1565b34801561066357600080fd5b5061040d610672366004612517565b611115565b34801561068357600080fd5b506103a4610692366004612725565b61114f565b61069f6112ac565b6106a76112ff565b565b346106b660045442101590565b1561071d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4465706f7369742074696d6520616c726561647920656e64656400000000000060448201526064016101fd565b600081116107ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f416d6f756e742053686f756c642042652047726561746572205468616e205a6560448201527f726f00000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b6107b561137c565b336000908152600260209081526040808320838052909152812080543492906107df90849061276d565b9091555050600080805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff805434929061081f90849061276d565b90915550506040805134815242602082015260009133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350565b61086c61137c565b6004544210156108d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5769746864726177616c206e6f7420737461727465640000000000000000000060448201526064016101fd565b60055473ffffffffffffffffffffffffffffffffffffffff16610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4272696467652061646472657373206e6f74207365740000000000000000000060448201526064016101fd565b60005b835181101561098f5761098784828151811061097857610978612780565b602002602001015184846113d1565b60010161095a565b50505050565b61099d6112ac565b6106a76000611866565b6109af6112ac565b6106a76118db565b806109c460045442101590565b15610a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4465706f7369742074696d6520616c726561647920656e64656400000000000060448201526064016101fd565b60008111610abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f416d6f756e742053686f756c642042652047726561746572205468616e205a6560448201527f726f00000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b610ac361137c565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205460ff16610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706f73697420746f6b656e206e6f7420616c6c6f7765640000000000000060448201526064016101fd565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281208054849290610b9290849061276d565b909155505073ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054849290610bcc90849061276d565b90915550610bf4905073ffffffffffffffffffffffffffffffffffffffff841633308561194a565b6040805183815242602082015273ffffffffffffffffffffffffffffffffffffffff85169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a3505050565b610c536112ac565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f08933ac4f098959713865496c4e445b0c6ba29a34285996b13c447fb90644392906020015b60405180910390a150565b610cd56112ac565b60005b81811015610d5e57610d56838383818110610cf557610cf5612780565b610d0b9260206060909202019081019150612312565b848484818110610d1d57610d1d612780565b9050606002016020016020810190610d359190612312565b858585818110610d4757610d47612780565b905060600201604001356119d3565b600101610cd8565b505050565b610d6b6112ac565b60005b8151811015610f67576000828281518110610d8b57610d8b612780565b602090810291909101810151805173ffffffffffffffffffffffffffffffffffffffff166000908152600190925260409091205490915060ff16610e51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4e65656420746f20616c6c6f7720746f6b656e206265666f7265206368616e6760448201527f696e6720746f6b656e206461746100000000000000000000000000000000000060648201526084016101fd565b60208082018051835173ffffffffffffffffffffffffffffffffffffffff908116600090815260019485905260408082208054948416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909516949094179093558286018051875184168352918490209095018054919092167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905583519151925190517f4b4bcef8ddf2e932a5f17ea2188f1849a4d9e898bed75cc65cb92c4c39bc0d8793610f569392909173ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b60405180910390a150600101610d6e565b5050565b610f736112ac565b6004544210611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5769746864726177616c2068617320737461727465642c20746f6b656e20616c60448201527f6c6f77616e63652063616e6e6f74206265206d6f64696669656400000000000060648201526084016101fd565b610d5e838383611c7e565b60045442101561107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5769746864726177616c206e6f7420737461727465640000000000000000000060448201526064016101fd565b60005b8151811015610f67576110a982828151811061109c5761109c612780565b6020026020010151611d96565b60010161107e565b6110b96112ac565b73ffffffffffffffffffffffffffffffffffffffff8116611109576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024016101fd565b61111281611866565b50565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600260209081526040808320938516835292905220545b92915050565b6111576112ac565b8042106111e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4e65772074696d657374616d702063616e277420626520686973746f7269636160448201527f6c0000000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b8060045411611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5769746864726177616c2073746172742074696d652063616e206f6e6c79206260448201527f65206465637265617365642c206e6f7420696e6372656173656400000000000060648201526084016101fd565b60048190556040518181527feb7702280d0493cc7d11fb2b0c05e72a6ae32000f47d2ba6222a2734c0762d8690602001610cc2565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106a7576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016101fd565b611307611f42565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60005474010000000000000000000000000000000000000000900460ff16156106a7576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490819003611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5769746864726177616c20636f6d706c65746564206f7220746f6b656e206e6560448201527f766572206465706f73697465640000000000000000000000000000000000000060648201526084016101fd565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600160208181526040928390208351606081018552815460ff81161515825261010090048716928101929092529091015490931690830152158061150c5750602081015173ffffffffffffffffffffffffffffffffffffffff1615155b611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c3220746f6b656e2061646472657373206e6f7420736574000000000000000060448201526064016101fd565b600554604082015173ffffffffffffffffffffffffffffffffffffffff9182169116156115a0575060408101515b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845282528083208390556003909152812080548592906115ea9084906127af565b909155505073ffffffffffffffffffffffffffffffffffffffff86166116ac576040517f9a2ac6d500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015263ffffffff871660248301526060604483015260006064830152821690639a2ac6d59085906084016000604051808303818588803b15801561168e57600080fd5b505af11580156116a2573d6000803e3d6000fd5b50505050506117ff565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820185905287169063095ea7b3906044016020604051808303816000875af1158015611721573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174591906127c2565b5060208201516040517f838b252000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152918216602482015285821660448201526064810185905263ffffffff8716608482015260c060a4820152600060c48201529082169063838b25209060e401600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b505050505b6020808301516040805173ffffffffffffffffffffffffffffffffffffffff9283168152928301869052818916929187169133917fd4bd20951024f7da99f57263e10e6cb1b32ad543c260fdaed1cd065f5ecb9eff910160405180910390a4505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6118e361137c565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113523390565b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905261098f9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f96565b73ffffffffffffffffffffffffffffffffffffffff8216611a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f4f6e6c7920455243323020746f6b656e732063616e206265207265636f76657260448201527f65642c2073696e636520657468206272696467696e6720697320737570706f7360648201527f656420746f20626520696e66616c6c69626c6500000000000000000000000000608482015260a4016101fd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906127e4565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150611b6190839061276d565b811015611bf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e73756666696369656e742062616c616e636520746f207361766520746f6b60448201527f656e00000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b611c1173ffffffffffffffffffffffffffffffffffffffff8416858461202c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f13562ac21b025a02a8776d32f872903b5fc611fbac303f7b5552456b28d9e24884604051611c7091815260200190565b60405180910390a350505050565b60408051606081018252600180825273ffffffffffffffffffffffffffffffffffffffff8581166020808501918252868316858701908152898416600090815291859052908690208551815493517fffffffffffffffffffffff0000000000000000000000000000000000000000009094169015157fffffffffffffffffffffff0000000000000000000000000000000000000000ff16176101009385169390930292909217825551920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290911691909117905590517f6617ad000cbb28c222d0e2bba4c0e10c3390afba5e7cabfdb5fdf0596f4a9b2590611d8890869084906127fd565b60405180910390a150505050565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205490819003611e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5769746864726177616c20636f6d706c65746564206f7220746f6b656e206e6560448201527f766572206465706f73697465640000000000000000000000000000000000000060648201526084016101fd565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320839055600390915281208054839290611ea19084906127af565b909155505073ffffffffffffffffffffffffffffffffffffffff8216611ed057611ecb338261206a565b611ef1565b611ef173ffffffffffffffffffffffffffffffffffffffff8316338361202c565b60405181815273ffffffffffffffffffffffffffffffffffffffff83169033907f2b2d1da1eb09c4a6c31947579af969936c0b9c57dbed218ae0b0426af86533de9060200160405180910390a35050565b60005474010000000000000000000000000000000000000000900460ff166106a7576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fb873ffffffffffffffffffffffffffffffffffffffff841683612140565b90508051600014158015611fdd575080806020019051810190611fdb91906127c2565b155b15610d5e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016101fd565b60405173ffffffffffffffffffffffffffffffffffffffff838116602483015260448201839052610d5e91859182169063a9059cbb9060640161198c565b804710156120a6576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016101fd565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612100576040519150601f19603f3d011682016040523d82523d6000602084013e612105565b606091505b5050905080610d5e576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606061214e83836000612155565b9392505050565b606081471015612193576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016101fd565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516121bc9190612844565b60006040518083038185875af1925050503d80600081146121f9576040519150601f19603f3d011682016040523d82523d6000602084013e6121fe565b606091505b509150915061220e868383612218565b9695505050505050565b60608261222d57612228826122a7565b61214e565b8151158015612251575073ffffffffffffffffffffffffffffffffffffffff84163b155b156122a0576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016101fd565b508061214e565b8051156122b75780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461230d57600080fd5b919050565b60006020828403121561232457600080fd5b61214e826122e9565b60608101611149828480511515825260208082015173ffffffffffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156123bf576123bf61236d565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561240c5761240c61236d565b604052919050565b600067ffffffffffffffff82111561242e5761242e61236d565b5060051b60200190565b600082601f83011261244957600080fd5b8135602061245e61245983612414565b6123c5565b8083825260208201915060208460051b87010193508684111561248057600080fd5b602086015b848110156124a357612496816122e9565b8352918301918301612485565b509695505050505050565b6000806000606084860312156124c357600080fd5b833567ffffffffffffffff8111156124da57600080fd5b6124e686828701612438565b935050602084013563ffffffff8116811461250057600080fd5b915061250e604085016122e9565b90509250925092565b6000806040838503121561252a57600080fd5b612533836122e9565b9150612541602084016122e9565b90509250929050565b6000806040838503121561255d57600080fd5b612566836122e9565b946020939093013593505050565b6000806020838503121561258757600080fd5b823567ffffffffffffffff8082111561259f57600080fd5b818501915085601f8301126125b357600080fd5b8135818111156125c257600080fd5b8660206060830285010111156125d757600080fd5b60209290920196919550909350505050565b600060208083850312156125fc57600080fd5b823567ffffffffffffffff81111561261357600080fd5b8301601f8101851361262457600080fd5b803561263261245982612414565b8181526060918202830184019184820191908884111561265157600080fd5b938501935b838510156126b05780858a03121561266e5760008081fd5b61267661239c565b61267f866122e9565b815261268c8787016122e9565b87820152604061269d8188016122e9565b9082015283529384019391850191612656565b50979650505050505050565b6000806000606084860312156126d157600080fd5b6126da846122e9565b9250612500602085016122e9565b6000602082840312156126fa57600080fd5b813567ffffffffffffffff81111561271157600080fd5b61271d84828501612438565b949350505050565b60006020828403121561273757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156111495761114961273e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b818103818111156111495761114961273e565b6000602082840312156127d457600080fd5b8151801515811461214e57600080fd5b6000602082840312156127f657600080fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff83811682528251151560208084019190915283015181166040808401919091528301511660608201526080810161214e565b6000825160005b81811015612865576020818601810151858301520161284b565b50600092019182525091905056fea2646970667358221220173d5e3fda68a9d92b5fed13949eb46126ce9b996fb20386d18ce2966b2dc46064736f6c6343000818003300000000000000000000000000000000000000000000000000000000664479900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000641c372173fed4c53ac3eb7992f09f94c4fa2ff7000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000ae78736cd615f374d3085123a210448e74fc639300000000000000000000000018084fba666a33d37592fa2633fd49a74dd93a880000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000bdbb63f938c8961af31ead3deba5c96e6a323dd1000000000000000000000000bdab72602e9ad40fc6a6852caf43258113b8f7a50000000000000000000000007122985656e38bdc0302db86685bb972b145bd3c000000000000000000000000e7c3755482d0da522678af05945062d4427e0923
Deployed Bytecode
0x60806040526004361061019a5760003560e01c80638f601f66116100e1578063e744092e1161008a578063eef565f011610064578063eef565f014610617578063f2fde38b14610637578063f45b1b3a14610657578063fb263fa41461067757610206565b8063e744092e1461053e578063e9403256146105ca578063eb6cb23c146105f757610206565b8063ad26b43d116100bb578063ad26b43d146104e8578063b62b265614610508578063dfc00b3a1461051e57610206565b80638f601f661461047057806397feb926146104a8578063a3bc64f2146104c857610206565b8063581c5fa011610143578063715018a61161011d578063715018a61461041b5780638456cb59146104305780638da5cb5b1461044557610206565b8063581c5fa0146103ae5780635c975abb146103ce57806370ed0ada146103fe57610206565b80632cd26d45116101745780632cd26d45146103625780633f4ba83a1461038f578063439370b1146103a657610206565b80631444464d146102685780631878d1f1146102915780631f69565f146102cb57610206565b36610206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f72656365697665206e6f7420616c6c6f7765640000000000000000000000000060448201526064015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f66616c6c6261636b206e6f7420616c6c6f77656400000000000000000000000060448201526064016101fd565b34801561027457600080fd5b506004544210155b60405190151581526020015b60405180910390f35b34801561029d57600080fd5b506102a6600081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610288565b3480156102d757600080fd5b506103556102e6366004612312565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff948516815260018084529084902084519283018552805460ff811615158452610100900486169383019390935291909101549092169082015290565b604051610288919061232d565b34801561036e57600080fd5b506005546102a69073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039b57600080fd5b506103a4610697565b005b6103a46106a9565b3480156103ba57600080fd5b506103a46103c93660046124ae565b610864565b3480156103da57600080fd5b5060005474010000000000000000000000000000000000000000900460ff1661027c565b34801561040a57600080fd5b50475b604051908152602001610288565b34801561042757600080fd5b506103a4610995565b34801561043c57600080fd5b506103a46109a7565b34801561045157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102a6565b34801561047c57600080fd5b5061040d61048b366004612517565b600260209081526000928352604080842090915290825290205481565b3480156104b457600080fd5b506103a46104c336600461254a565b6109b7565b3480156104d457600080fd5b506103a46104e3366004612312565b610c4b565b3480156104f457600080fd5b506103a4610503366004612574565b610ccd565b34801561051457600080fd5b5061040d60045481565b34801561052a57600080fd5b506103a46105393660046125e9565b610d63565b34801561054a57600080fd5b50610596610559366004612312565b6001602081905260009182526040909120805491015460ff82169173ffffffffffffffffffffffffffffffffffffffff6101009091048116911683565b60408051931515845273ffffffffffffffffffffffffffffffffffffffff9283166020850152911690820152606001610288565b3480156105d657600080fd5b5061040d6105e5366004612312565b60036020526000908152604090205481565b34801561060357600080fd5b506103a46106123660046126bc565b610f6b565b34801561062357600080fd5b506103a46106323660046126e8565b61100f565b34801561064357600080fd5b506103a4610652366004612312565b6110b1565b34801561066357600080fd5b5061040d610672366004612517565b611115565b34801561068357600080fd5b506103a4610692366004612725565b61114f565b61069f6112ac565b6106a76112ff565b565b346106b660045442101590565b1561071d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4465706f7369742074696d6520616c726561647920656e64656400000000000060448201526064016101fd565b600081116107ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f416d6f756e742053686f756c642042652047726561746572205468616e205a6560448201527f726f00000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b6107b561137c565b336000908152600260209081526040808320838052909152812080543492906107df90849061276d565b9091555050600080805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff805434929061081f90849061276d565b90915550506040805134815242602082015260009133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350565b61086c61137c565b6004544210156108d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5769746864726177616c206e6f7420737461727465640000000000000000000060448201526064016101fd565b60055473ffffffffffffffffffffffffffffffffffffffff16610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4272696467652061646472657373206e6f74207365740000000000000000000060448201526064016101fd565b60005b835181101561098f5761098784828151811061097857610978612780565b602002602001015184846113d1565b60010161095a565b50505050565b61099d6112ac565b6106a76000611866565b6109af6112ac565b6106a76118db565b806109c460045442101590565b15610a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4465706f7369742074696d6520616c726561647920656e64656400000000000060448201526064016101fd565b60008111610abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f416d6f756e742053686f756c642042652047726561746572205468616e205a6560448201527f726f00000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b610ac361137c565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604090205460ff16610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4465706f73697420746f6b656e206e6f7420616c6c6f7765640000000000000060448201526064016101fd565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281208054849290610b9290849061276d565b909155505073ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054849290610bcc90849061276d565b90915550610bf4905073ffffffffffffffffffffffffffffffffffffffff841633308561194a565b6040805183815242602082015273ffffffffffffffffffffffffffffffffffffffff85169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a3505050565b610c536112ac565b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f08933ac4f098959713865496c4e445b0c6ba29a34285996b13c447fb90644392906020015b60405180910390a150565b610cd56112ac565b60005b81811015610d5e57610d56838383818110610cf557610cf5612780565b610d0b9260206060909202019081019150612312565b848484818110610d1d57610d1d612780565b9050606002016020016020810190610d359190612312565b858585818110610d4757610d47612780565b905060600201604001356119d3565b600101610cd8565b505050565b610d6b6112ac565b60005b8151811015610f67576000828281518110610d8b57610d8b612780565b602090810291909101810151805173ffffffffffffffffffffffffffffffffffffffff166000908152600190925260409091205490915060ff16610e51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4e65656420746f20616c6c6f7720746f6b656e206265666f7265206368616e6760448201527f696e6720746f6b656e206461746100000000000000000000000000000000000060648201526084016101fd565b60208082018051835173ffffffffffffffffffffffffffffffffffffffff908116600090815260019485905260408082208054948416610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909516949094179093558286018051875184168352918490209095018054919092167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617905583519151925190517f4b4bcef8ddf2e932a5f17ea2188f1849a4d9e898bed75cc65cb92c4c39bc0d8793610f569392909173ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b60405180910390a150600101610d6e565b5050565b610f736112ac565b6004544210611004576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5769746864726177616c2068617320737461727465642c20746f6b656e20616c60448201527f6c6f77616e63652063616e6e6f74206265206d6f64696669656400000000000060648201526084016101fd565b610d5e838383611c7e565b60045442101561107b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5769746864726177616c206e6f7420737461727465640000000000000000000060448201526064016101fd565b60005b8151811015610f67576110a982828151811061109c5761109c612780565b6020026020010151611d96565b60010161107e565b6110b96112ac565b73ffffffffffffffffffffffffffffffffffffffff8116611109576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024016101fd565b61111281611866565b50565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600260209081526040808320938516835292905220545b92915050565b6111576112ac565b8042106111e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4e65772074696d657374616d702063616e277420626520686973746f7269636160448201527f6c0000000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b8060045411611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5769746864726177616c2073746172742074696d652063616e206f6e6c79206260448201527f65206465637265617365642c206e6f7420696e6372656173656400000000000060648201526084016101fd565b60048190556040518181527feb7702280d0493cc7d11fb2b0c05e72a6ae32000f47d2ba6222a2734c0762d8690602001610cc2565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106a7576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016101fd565b611307611f42565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b60005474010000000000000000000000000000000000000000900460ff16156106a7576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490819003611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5769746864726177616c20636f6d706c65746564206f7220746f6b656e206e6560448201527f766572206465706f73697465640000000000000000000000000000000000000060648201526084016101fd565b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600160208181526040928390208351606081018552815460ff81161515825261010090048716928101929092529091015490931690830152158061150c5750602081015173ffffffffffffffffffffffffffffffffffffffff1615155b611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c3220746f6b656e2061646472657373206e6f7420736574000000000000000060448201526064016101fd565b600554604082015173ffffffffffffffffffffffffffffffffffffffff9182169116156115a0575060408101515b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8a16845282528083208390556003909152812080548592906115ea9084906127af565b909155505073ffffffffffffffffffffffffffffffffffffffff86166116ac576040517f9a2ac6d500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015263ffffffff871660248301526060604483015260006064830152821690639a2ac6d59085906084016000604051808303818588803b15801561168e57600080fd5b505af11580156116a2573d6000803e3d6000fd5b50505050506117ff565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820185905287169063095ea7b3906044016020604051808303816000875af1158015611721573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174591906127c2565b5060208201516040517f838b252000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152918216602482015285821660448201526064810185905263ffffffff8716608482015260c060a4820152600060c48201529082169063838b25209060e401600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b505050505b6020808301516040805173ffffffffffffffffffffffffffffffffffffffff9283168152928301869052818916929187169133917fd4bd20951024f7da99f57263e10e6cb1b32ad543c260fdaed1cd065f5ecb9eff910160405180910390a4505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6118e361137c565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113523390565b60405173ffffffffffffffffffffffffffffffffffffffff848116602483015283811660448301526064820183905261098f9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f96565b73ffffffffffffffffffffffffffffffffffffffff8216611a9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f4f6e6c7920455243323020746f6b656e732063616e206265207265636f76657260448201527f65642c2073696e636520657468206272696467696e6720697320737570706f7360648201527f656420746f20626520696e66616c6c69626c6500000000000000000000000000608482015260a4016101fd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906127e4565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020526040902054909150611b6190839061276d565b811015611bf0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e73756666696369656e742062616c616e636520746f207361766520746f6b60448201527f656e00000000000000000000000000000000000000000000000000000000000060648201526084016101fd565b611c1173ffffffffffffffffffffffffffffffffffffffff8416858461202c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f13562ac21b025a02a8776d32f872903b5fc611fbac303f7b5552456b28d9e24884604051611c7091815260200190565b60405180910390a350505050565b60408051606081018252600180825273ffffffffffffffffffffffffffffffffffffffff8581166020808501918252868316858701908152898416600090815291859052908690208551815493517fffffffffffffffffffffff0000000000000000000000000000000000000000009094169015157fffffffffffffffffffffff0000000000000000000000000000000000000000ff16176101009385169390930292909217825551920180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169290911691909117905590517f6617ad000cbb28c222d0e2bba4c0e10c3390afba5e7cabfdb5fdf0596f4a9b2590611d8890869084906127fd565b60405180910390a150505050565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205490819003611e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5769746864726177616c20636f6d706c65746564206f7220746f6b656e206e6560448201527f766572206465706f73697465640000000000000000000000000000000000000060648201526084016101fd565b33600090815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684528252808320839055600390915281208054839290611ea19084906127af565b909155505073ffffffffffffffffffffffffffffffffffffffff8216611ed057611ecb338261206a565b611ef1565b611ef173ffffffffffffffffffffffffffffffffffffffff8316338361202c565b60405181815273ffffffffffffffffffffffffffffffffffffffff83169033907f2b2d1da1eb09c4a6c31947579af969936c0b9c57dbed218ae0b0426af86533de9060200160405180910390a35050565b60005474010000000000000000000000000000000000000000900460ff166106a7576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611fb873ffffffffffffffffffffffffffffffffffffffff841683612140565b90508051600014158015611fdd575080806020019051810190611fdb91906127c2565b155b15610d5e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016101fd565b60405173ffffffffffffffffffffffffffffffffffffffff838116602483015260448201839052610d5e91859182169063a9059cbb9060640161198c565b804710156120a6576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016101fd565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612100576040519150601f19603f3d011682016040523d82523d6000602084013e612105565b606091505b5050905080610d5e576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606061214e83836000612155565b9392505050565b606081471015612193576040517fcd7860590000000000000000000000000000000000000000000000000000000081523060048201526024016101fd565b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516121bc9190612844565b60006040518083038185875af1925050503d80600081146121f9576040519150601f19603f3d011682016040523d82523d6000602084013e6121fe565b606091505b509150915061220e868383612218565b9695505050505050565b60608261222d57612228826122a7565b61214e565b8151158015612251575073ffffffffffffffffffffffffffffffffffffffff84163b155b156122a0576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016101fd565b508061214e565b8051156122b75780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461230d57600080fd5b919050565b60006020828403121561232457600080fd5b61214e826122e9565b60608101611149828480511515825260208082015173ffffffffffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156123bf576123bf61236d565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561240c5761240c61236d565b604052919050565b600067ffffffffffffffff82111561242e5761242e61236d565b5060051b60200190565b600082601f83011261244957600080fd5b8135602061245e61245983612414565b6123c5565b8083825260208201915060208460051b87010193508684111561248057600080fd5b602086015b848110156124a357612496816122e9565b8352918301918301612485565b509695505050505050565b6000806000606084860312156124c357600080fd5b833567ffffffffffffffff8111156124da57600080fd5b6124e686828701612438565b935050602084013563ffffffff8116811461250057600080fd5b915061250e604085016122e9565b90509250925092565b6000806040838503121561252a57600080fd5b612533836122e9565b9150612541602084016122e9565b90509250929050565b6000806040838503121561255d57600080fd5b612566836122e9565b946020939093013593505050565b6000806020838503121561258757600080fd5b823567ffffffffffffffff8082111561259f57600080fd5b818501915085601f8301126125b357600080fd5b8135818111156125c257600080fd5b8660206060830285010111156125d757600080fd5b60209290920196919550909350505050565b600060208083850312156125fc57600080fd5b823567ffffffffffffffff81111561261357600080fd5b8301601f8101851361262457600080fd5b803561263261245982612414565b8181526060918202830184019184820191908884111561265157600080fd5b938501935b838510156126b05780858a03121561266e5760008081fd5b61267661239c565b61267f866122e9565b815261268c8787016122e9565b87820152604061269d8188016122e9565b9082015283529384019391850191612656565b50979650505050505050565b6000806000606084860312156126d157600080fd5b6126da846122e9565b9250612500602085016122e9565b6000602082840312156126fa57600080fd5b813567ffffffffffffffff81111561271157600080fd5b61271d84828501612438565b949350505050565b60006020828403121561273757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156111495761114961273e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b818103818111156111495761114961273e565b6000602082840312156127d457600080fd5b8151801515811461214e57600080fd5b6000602082840312156127f657600080fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff83811682528251151560208084019190915283015181166040808401919091528301511660608201526080810161214e565b6000825160005b81811015612865576020818601810151858301520161284b565b50600092019182525091905056fea2646970667358221220173d5e3fda68a9d92b5fed13949eb46126ce9b996fb20386d18ce2966b2dc46064736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000664479900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000641c372173fed4c53ac3eb7992f09f94c4fa2ff7000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000ae78736cd615f374d3085123a210448e74fc639300000000000000000000000018084fba666a33d37592fa2633fd49a74dd93a880000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000bdbb63f938c8961af31ead3deba5c96e6a323dd1000000000000000000000000bdab72602e9ad40fc6a6852caf43258113b8f7a50000000000000000000000007122985656e38bdc0302db86685bb972b145bd3c000000000000000000000000e7c3755482d0da522678af05945062d4427e0923
-----Decoded View---------------
Arg [0] : setWithdrawalStartTime (uint256): 1715763600
Arg [1] : allowTokens (address[]): 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0,0xae78736Cd615f374D3085123A210448E74Fc6393,0x18084fbA666a33d37592fA2633fD49a74DD93a88,0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,0xdAC17F958D2ee523a2206206994597C13D831ec7,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x6B175474E89094C44Da98b954EedeAC495271d0F,0xbdBb63F938c8961AF31eaD3deBa5C96e6A323DD1,0xbdab72602e9AD40FC6a6852CAf43258113B8F7a5,0x7122985656e38BDC0302Db86685bb972b145bD3C,0xe7c3755482d0dA522678Af05945062d4427e0923
Arg [2] : initialOwner (address): 0x641c372173fED4C53aC3eb7992f09F94C4fA2ff7
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000066447990
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 000000000000000000000000641c372173fed4c53ac3eb7992f09f94c4fa2ff7
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0
Arg [5] : 000000000000000000000000ae78736cd615f374d3085123a210448e74fc6393
Arg [6] : 00000000000000000000000018084fba666a33d37592fa2633fd49a74dd93a88
Arg [7] : 0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599
Arg [8] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [9] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [10] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [11] : 000000000000000000000000bdbb63f938c8961af31ead3deba5c96e6a323dd1
Arg [12] : 000000000000000000000000bdab72602e9ad40fc6a6852caf43258113b8f7a5
Arg [13] : 0000000000000000000000007122985656e38bdc0302db86685bb972b145bd3c
Arg [14] : 000000000000000000000000e7c3755482d0da522678af05945062d4427e0923
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 47.48% | $84,528 | 3.8976 | $329,458.65 | |
ETH | 25.35% | $1,592.23 | 110.5019 | $175,944.68 | |
ETH | 6.62% | $0.999928 | 45,930.958 | $45,927.65 | |
ETH | 6.20% | $0.99986 | 43,025.7631 | $43,019.74 | |
ETH | 4.11% | $1,909.83 | 14.9208 | $28,496.2 | |
ETH | 3.71% | $1 | 25,726.4618 | $25,726.46 | |
ETH | 2.18% | $84,330 | 0.1793 | $15,124.1 | |
ETH | 1.18% | $1,656.47 | 4.9267 | $8,160.91 | |
ETH | 0.57% | $0.169255 | 23,442.9129 | $3,967.83 | |
ETH | 0.53% | $1,794.75 | 2.0452 | $3,670.54 | |
BSC | 2.08% | $1.86 | 7,733.4148 | $14,415.51 | |
ARB | <0.01% | $1,592.1 | 0.0103 | $16.43 | |
BASE | <0.01% | $0.000009 | 15,000 | $0.1319 |
Loading...
Loading
Loading...
Loading
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.