Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16485618 | 736 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
Drippie
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.16; import { AssetReceiver } from "../AssetReceiver.sol"; import { IDripCheck } from "./IDripCheck.sol"; /** * @title Drippie * @notice Drippie is a system for managing automated contract interactions. A specific interaction * is called a "drip" and can be executed according to some condition (called a dripcheck) * and an execution interval. Drips cannot be executed faster than the execution interval. * Drips can trigger arbitrary contract calls where the calling contract is this contract * address. Drips can also send ETH value, which makes them ideal for keeping addresses * sufficiently funded with ETH. Drippie is designed to be connected with smart contract * automation services so that drips can be executed automatically. However, Drippie is * specifically designed to be separated from these services so that trust assumptions are * better compartmentalized. */ contract Drippie is AssetReceiver { /** * @notice Enum representing different status options for a given drip. * * @custom:value NONE Drip does not exist. * @custom:value PAUSED Drip is paused and cannot be executed until reactivated. * @custom:value ACTIVE Drip is active and can be executed. * @custom:value ARCHIVED Drip is archived and can no longer be executed or reactivated. */ enum DripStatus { NONE, PAUSED, ACTIVE, ARCHIVED } /** * @notice Represents a drip action. */ struct DripAction { address payable target; bytes data; uint256 value; } /** * @notice Represents the configuration for a given drip. */ struct DripConfig { bool reentrant; uint256 interval; IDripCheck dripcheck; bytes checkparams; DripAction[] actions; } /** * @notice Represents the state of an active drip. */ struct DripState { DripStatus status; DripConfig config; uint256 last; uint256 count; } /** * @notice Emitted when a new drip is created. * * @param nameref Indexed name parameter (hashed). * @param name Unindexed name parameter (unhashed). * @param config Config for the created drip. */ event DripCreated( // Emit name twice because indexed version is hashed. string indexed nameref, string name, DripConfig config ); /** * @notice Emitted when a drip status is updated. * * @param nameref Indexed name parameter (hashed). * @param name Unindexed name parameter (unhashed). * @param status New drip status. */ event DripStatusUpdated( // Emit name twice because indexed version is hashed. string indexed nameref, string name, DripStatus status ); /** * @notice Emitted when a drip is executed. * * @param nameref Indexed name parameter (hashed). * @param name Unindexed name parameter (unhashed). * @param executor Address that executed the drip. * @param timestamp Time when the drip was executed. */ event DripExecuted( // Emit name twice because indexed version is hashed. string indexed nameref, string name, address executor, uint256 timestamp ); /** * @notice Maps from drip names to drip states. */ mapping(string => DripState) public drips; /** * @param _owner Initial contract owner. */ constructor(address _owner) AssetReceiver(_owner) {} /** * @notice Creates a new drip with the given name and configuration. Once created, drips cannot * be modified in any way (this is a security measure). If you want to update a drip, * simply pause (and potentially archive) the existing drip and create a new one. * * @param _name Name of the drip. * @param _config Configuration for the drip. */ function create(string calldata _name, DripConfig calldata _config) external onlyOwner { // Make sure this drip doesn't already exist. We *must* guarantee that no other function // will ever set the status of a drip back to NONE after it's been created. This is why // archival is a separate status. require( drips[_name].status == DripStatus.NONE, "Drippie: drip with that name already exists" ); // Validate the drip interval, only allowing an interval of zero if the drip has explicitly // been marked as reentrant. Prevents client-side bugs making a drip infinitely executable // within the same block (of course, restricted by gas limits). if (_config.reentrant) { require( _config.interval == 0, "Drippie: if allowing reentrant drip, must set interval to zero" ); } else { require( _config.interval > 0, "Drippie: interval must be greater than zero if drip is not reentrant" ); } // We initialize this way because Solidity won't let us copy arrays into storage yet. DripState storage state = drips[_name]; state.status = DripStatus.PAUSED; state.config.reentrant = _config.reentrant; state.config.interval = _config.interval; state.config.dripcheck = _config.dripcheck; state.config.checkparams = _config.checkparams; // Solidity doesn't let us copy arrays into storage, so we push each array one by one. for (uint256 i = 0; i < _config.actions.length; i++) { state.config.actions.push(_config.actions[i]); } // Tell the world! emit DripCreated(_name, _name, _config); } /** * @notice Sets the status for a given drip. The behavior of this function depends on the * status that the user is trying to set. A drip can always move between ACTIVE and * PAUSED, but it can never move back to NONE and once ARCHIVED, it can never move back * to ACTIVE or PAUSED. * * @param _name Name of the drip to update. * @param _status New drip status. */ function status(string calldata _name, DripStatus _status) external onlyOwner { // Make sure we can never set drip status back to NONE. A simple security measure to // prevent accidental overwrites if this code is ever updated down the line. require( _status != DripStatus.NONE, "Drippie: drip status can never be set back to NONE after creation" ); // Load the drip status once to avoid unnecessary SLOADs. DripStatus curr = drips[_name].status; // Make sure the drip in question actually exists. Not strictly necessary but there doesn't // seem to be any clear reason why you would want to do this, and it may save some gas in // the case of a front-end bug. require( curr != DripStatus.NONE, "Drippie: drip with that name does not exist and cannot be updated" ); // Once a drip has been archived, it cannot be un-archived. This is, after all, the entire // point of archiving a drip. require( curr != DripStatus.ARCHIVED, "Drippie: drip with that name has been archived and cannot be updated" ); // Although not strictly necessary, we make sure that the status here is actually changing. // This may save the client some gas if there's a front-end bug and the user accidentally // tries to "change" the status to the same value as before. require( curr != _status, "Drippie: cannot set drip status to the same status as its current status" ); // If the user is trying to archive this drip, make sure the drip has been paused. We do // not allow users to archive active drips so that the effects of this action are more // abundantly clear. if (_status == DripStatus.ARCHIVED) { require( curr == DripStatus.PAUSED, "Drippie: drip must first be paused before being archived" ); } // If we made it here then we can safely update the status. drips[_name].status = _status; emit DripStatusUpdated(_name, _name, _status); } /** * @notice Checks if a given drip is executable. * * @param _name Drip to check. * * @return True if the drip is executable, reverts otherwise. */ function executable(string calldata _name) public view returns (bool) { DripState storage state = drips[_name]; // Only allow active drips to be executed, an obvious security measure. require( state.status == DripStatus.ACTIVE, "Drippie: selected drip does not exist or is not currently active" ); // Don't drip if the drip interval has not yet elapsed since the last time we dripped. This // is a safety measure that prevents a malicious recipient from, e.g., spending all of // their funds and repeatedly requesting new drips. Limits the potential impact of a // compromised recipient to just a single drip interval, after which the drip can be paused // by the owner address. require( state.last + state.config.interval <= block.timestamp, "Drippie: drip interval has not elapsed since last drip" ); // Make sure we're allowed to execute this drip. require( state.config.dripcheck.check(state.config.checkparams), "Drippie: dripcheck failed so drip is not yet ready to be triggered" ); // Alright, we're good to execute. return true; } /** * @notice Triggers a drip. This function is deliberately left as a public function because the * assumption being made here is that setting the drip to ACTIVE is an affirmative * signal that the drip should be executable according to the drip parameters, drip * check, and drip interval. Note that drip parameters are read entirely from the state * and are not supplied as user input, so there should not be any way for a * non-authorized user to influence the behavior of the drip. Note that the drip check * is executed only **once** at the beginning of the call to the drip function and will * not be executed again between the drip actions within this call. * * @param _name Name of the drip to trigger. */ function drip(string calldata _name) external { DripState storage state = drips[_name]; // Make sure the drip can be executed. Since executable reverts if the drip is not ready to // be executed, we don't need to do an assertion that the returned value is true. executable(_name); // Update the last execution time for this drip before the call. Note that it's entirely // possible for a drip to be executed multiple times per block or even multiple times // within the same transaction (via re-entrancy) if the drip interval is set to zero. Users // should set a drip interval of 1 if they'd like the drip to be executed only once per // block (since this will then prevent re-entrancy). state.last = block.timestamp; // Update the number of times this drip has been executed. Although this increases the cost // of using Drippie, it slightly simplifies the client-side by not having to worry about // counting drips via events. Useful for monitoring the rate of drip execution. state.count++; // Execute each action in the drip. We allow drips to have multiple actions because there // are scenarios in which a contract must do multiple things atomically. For example, the // contract may need to withdraw ETH from one account and then deposit that ETH into // another account within the same transaction. uint256 len = state.config.actions.length; for (uint256 i = 0; i < len; i++) { // Must be marked as "storage" because copying structs into memory is not yet supported // by Solidity. Won't significantly reduce gas costs but at least makes it easier to // read what the rest of this section is doing. DripAction storage action = state.config.actions[i]; // Actually execute the action. We could use ExcessivelySafeCall here but not strictly // necessary (worst case, a drip gets bricked IFF the target is malicious, doubt this // will ever happen in practice). Could save a marginal amount of gas to ignore the // returndata. // slither-disable-next-line calls-loop (bool success, ) = action.target.call{ value: action.value }(action.data); // Generally should not happen, but could if there's a misconfiguration (e.g., passing // the wrong data to the target contract), the recipient is not payable, or // insufficient gas was supplied to this transaction. We revert so the drip can be // fixed and triggered again later. Means we cannot emit an event to alert of the // failure, but can reasonably be detected by off-chain services even without an event. // Note that this forces the drip executor to supply sufficient gas to the call // (assuming there is some sufficient gas limit that exists, otherwise the drip will // not execute). require( success, "Drippie: drip was unsuccessful, please check your configuration for mistakes" ); } emit DripExecuted(_name, _name, msg.sender, block.timestamp); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Simple single owner authorization mixin. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol) abstract contract Owned { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnerUpdated(address indexed user, address indexed newOwner); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; modifier onlyOwner() virtual { require(msg.sender == owner, "UNAUTHORIZED"); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(address _owner) { owner = _owner; emit OwnerUpdated(address(0), _owner); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function setOwner(address newOwner) public virtual onlyOwner { owner = newOwner; emit OwnerUpdated(msg.sender, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); if (to.code.length != 0) require( ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { ERC20 } from "@rari-capital/solmate/src/tokens/ERC20.sol"; import { ERC721 } from "@rari-capital/solmate/src/tokens/ERC721.sol"; import { Transactor } from "./Transactor.sol"; /** * @title AssetReceiver * @notice AssetReceiver is a minimal contract for receiving funds assets in the form of either * ETH, ERC20 tokens, or ERC721 tokens. Only the contract owner may withdraw the assets. */ contract AssetReceiver is Transactor { /** * @notice Emitted when ETH is received by this address. * * @param from Address that sent ETH to this contract. * @param amount Amount of ETH received. */ event ReceivedETH(address indexed from, uint256 amount); /** * @notice Emitted when ETH is withdrawn from this address. * * @param withdrawer Address that triggered the withdrawal. * @param recipient Address that received the withdrawal. * @param amount ETH amount withdrawn. */ event WithdrewETH(address indexed withdrawer, address indexed recipient, uint256 amount); /** * @notice Emitted when ERC20 tokens are withdrawn from this address. * * @param withdrawer Address that triggered the withdrawal. * @param recipient Address that received the withdrawal. * @param asset Address of the token being withdrawn. * @param amount ERC20 amount withdrawn. */ event WithdrewERC20( address indexed withdrawer, address indexed recipient, address indexed asset, uint256 amount ); /** * @notice Emitted when ERC20 tokens are withdrawn from this address. * * @param withdrawer Address that triggered the withdrawal. * @param recipient Address that received the withdrawal. * @param asset Address of the token being withdrawn. * @param id Token ID being withdrawn. */ event WithdrewERC721( address indexed withdrawer, address indexed recipient, address indexed asset, uint256 id ); /** * @param _owner Initial contract owner. */ constructor(address _owner) Transactor(_owner) {} /** * @notice Make sure we can receive ETH. */ receive() external payable { emit ReceivedETH(msg.sender, msg.value); } /** * @notice Withdraws full ETH balance to the recipient. * * @param _to Address to receive the ETH balance. */ function withdrawETH(address payable _to) external onlyOwner { withdrawETH(_to, address(this).balance); } /** * @notice Withdraws partial ETH balance to the recipient. * * @param _to Address to receive the ETH balance. * @param _amount Amount of ETH to withdraw. */ function withdrawETH(address payable _to, uint256 _amount) public onlyOwner { // slither-disable-next-line reentrancy-unlimited-gas (bool success, ) = _to.call{ value: _amount }(""); emit WithdrewETH(msg.sender, _to, _amount); } /** * @notice Withdraws full ERC20 balance to the recipient. * * @param _asset ERC20 token to withdraw. * @param _to Address to receive the ERC20 balance. */ function withdrawERC20(ERC20 _asset, address _to) external onlyOwner { withdrawERC20(_asset, _to, _asset.balanceOf(address(this))); } /** * @notice Withdraws partial ERC20 balance to the recipient. * * @param _asset ERC20 token to withdraw. * @param _to Address to receive the ERC20 balance. * @param _amount Amount of ERC20 to withdraw. */ function withdrawERC20( ERC20 _asset, address _to, uint256 _amount ) public onlyOwner { // slither-disable-next-line unchecked-transfer _asset.transfer(_to, _amount); // slither-disable-next-line reentrancy-events emit WithdrewERC20(msg.sender, _to, address(_asset), _amount); } /** * @notice Withdraws ERC721 token to the recipient. * * @param _asset ERC721 token to withdraw. * @param _to Address to receive the ERC721 token. * @param _id Token ID of the ERC721 token to withdraw. */ function withdrawERC721( ERC721 _asset, address _to, uint256 _id ) external onlyOwner { _asset.transferFrom(address(this), _to, _id); // slither-disable-next-line reentrancy-events emit WithdrewERC721(msg.sender, _to, address(_asset), _id); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { Owned } from "@rari-capital/solmate/src/auth/Owned.sol"; /** * @title Transactor * @notice Transactor is a minimal contract that can send transactions. */ contract Transactor is Owned { /** * @param _owner Initial contract owner. */ constructor(address _owner) Owned(_owner) {} /** * Sends a CALL to a target address. * * @param _target Address to call. * @param _data Data to send with the call. * @param _value ETH value to send with the call. * * @return Boolean success value. * @return Bytes data returned by the call. */ function CALL( address _target, bytes memory _data, uint256 _value ) external payable onlyOwner returns (bool, bytes memory) { return _target.call{ value: _value }(_data); } /** * Sends a DELEGATECALL to a target address. * * @param _target Address to call. * @param _data Data to send with the call. * * @return Boolean success value. * @return Bytes data returned by the call. */ function DELEGATECALL(address _target, bytes memory _data) external payable onlyOwner returns (bool, bytes memory) { // slither-disable-next-line controlled-delegatecall return _target.delegatecall(_data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IDripCheck { // DripCheck contracts that want to take parameters as inputs MUST expose a struct called // Params and an event _EventForExposingParamsStructInABI(Params params). This makes it // possible to easily encode parameters on the client side. Solidity does not support generics // so it's not possible to do this with explicit typing. /** * @notice Checks whether a drip should be executable. * * @param _params Encoded parameters for the drip check. * * @return Whether the drip should be executed. */ function check(bytes memory _params) external view returns (bool); }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 10000 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"nameref","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"components":[{"internalType":"bool","name":"reentrant","type":"bool"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"contract IDripCheck","name":"dripcheck","type":"address"},{"internalType":"bytes","name":"checkparams","type":"bytes"},{"components":[{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Drippie.DripAction[]","name":"actions","type":"tuple[]"}],"indexed":false,"internalType":"struct Drippie.DripConfig","name":"config","type":"tuple"}],"name":"DripCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"nameref","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DripExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"nameref","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"enum Drippie.DripStatus","name":"status","type":"uint8"}],"name":"DripStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReceivedETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrewERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"WithdrewERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrewETH","type":"event"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"CALL","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"DELEGATECALL","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"components":[{"internalType":"bool","name":"reentrant","type":"bool"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"contract IDripCheck","name":"dripcheck","type":"address"},{"internalType":"bytes","name":"checkparams","type":"bytes"},{"components":[{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Drippie.DripAction[]","name":"actions","type":"tuple[]"}],"internalType":"struct Drippie.DripConfig","name":"_config","type":"tuple"}],"name":"create","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"drip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"drips","outputs":[{"internalType":"enum Drippie.DripStatus","name":"status","type":"uint8"},{"components":[{"internalType":"bool","name":"reentrant","type":"bool"},{"internalType":"uint256","name":"interval","type":"uint256"},{"internalType":"contract IDripCheck","name":"dripcheck","type":"address"},{"internalType":"bytes","name":"checkparams","type":"bytes"},{"components":[{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Drippie.DripAction[]","name":"actions","type":"tuple[]"}],"internalType":"struct Drippie.DripConfig","name":"config","type":"tuple"},{"internalType":"uint256","name":"last","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"executable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"enum Drippie.DripStatus","name":"_status","type":"uint8"}],"name":"status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"_asset","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"_asset","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ERC721","name":"_asset","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002b3138038062002b3183398101604081905262000034916200008c565b600080546001600160a01b0319166001600160a01b03831690811782556040518392839283929091907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350505050620000be565b6000602082840312156200009f57600080fd5b81516001600160a01b0381168114620000b757600080fd5b9392505050565b612a6380620000ce6000396000f3fe6080604052600436106100e15760003560e01c80636e2d44ae1161007f5780639bc94d01116100595780639bc94d01146102b0578063e551cdaa146102d0578063edee6239146102f0578063fc3e3eba1461030357600080fd5b80636e2d44ae1461021d5780638da5cb5b1461023e5780639456fbcc1461029057600080fd5b80634782f779116100bb5780634782f779146101845780634d7fba6e146101a457806367148cd2146101dd578063690d8320146101fd57600080fd5b806313af4035146101225780634025feb21461014457806344004cc11461016457600080fd5b3661011d5760405134815233907f4103257eaac983ca79a70d28f90dfc4fa16b619bb0c17ee7cab0d4034c2796249060200160405180910390a2005b600080fd5b34801561012e57600080fd5b5061014261013d366004611af9565b610333565b005b34801561015057600080fd5b5061014261015f366004611b1d565b61040f565b34801561017057600080fd5b5061014261017f366004611b1d565b610587565b34801561019057600080fd5b5061014261019f366004611b5e565b6106fe565b3480156101b057600080fd5b506101c46101bf366004611c2f565b610834565b6040516101d49493929190611d3a565b60405180910390f35b3480156101e957600080fd5b506101426101f8366004611e94565b610a66565b34801561020957600080fd5b50610142610218366004611af9565b610c6f565b61023061022b366004611ef6565b610ce3565b6040516101d4929190611f4f565b34801561024a57600080fd5b5060005461026b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d4565b34801561029c57600080fd5b506101426102ab366004611f6a565b610dc3565b3480156102bc57600080fd5b506101426102cb366004611fa3565b610ec4565b3480156102dc57600080fd5b506101426102eb366004611ffe565b611363565b6102306102fe366004612063565b61177f565b34801561030f57600080fd5b5061032361031e366004611e94565b61185c565b60405190151581526020016101d4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461039f5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104765760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906323b872dd90606401600060405180830381600087803b1580156104ec57600080fd5b505af1158015610500573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f30b478a5e196e55886228aa87ba74a7dfeba655e0a4d7ba275eabfc22aabb7a88460405161057a91815260200190565b60405180910390a4505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ee5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610663573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068791906120c1565b508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6b00f1c7883f053ba83e907fd1965b22fffe3c4111383e725f04638a566cdbfa8460405161057a91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107655760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146107bf576040519150601f19603f3d011682016040523d82523d6000602084013e6107c4565b606091505b505090508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f1f12aa8b6d492dd9b98e2b00b0b20830c2a7ded65afac13b60d169a034ae90bc8460405161082791815260200190565b60405180910390a3505050565b805160208183018101805160018083529383019483019490942093905282546040805160a081018252938501805460ff90811615158652600287015494860194909452600386015473ffffffffffffffffffffffffffffffffffffffff169185019190915260048501805493909216949392909160608401916108b6906120de565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906120de565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a4e576000848152602090819020604080516060810190915260038502909101805473ffffffffffffffffffffffffffffffffffffffff16825260018101805492939192918401916109b3906120de565b80601f01602080910402602001604051908101604052809291908181526020018280546109df906120de565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b505050505081526020016002820154815250508152602001906001019061095d565b50505091525050600682015460079092015490919084565b600060018383604051610a7a929190612131565b90815260200160405180910390209050610a94838361185c565b50426006820155600781018054906000610aad83612170565b9091555050600581015460005b81811015610c13576000836001016004018281548110610adc57610adc6121a8565b6000918252602082206003909102018054600282015460405192945073ffffffffffffffffffffffffffffffffffffffff90911691610b1f9060018601906121d7565b60006040518083038185875af1925050503d8060008114610b5c576040519150601f19603f3d011682016040523d82523d6000602084013e610b61565b606091505b5050905080610bfe5760405162461bcd60e51b815260206004820152604c60248201527f447269707069653a20647269702077617320756e7375636365737366756c2c2060448201527f706c6561736520636865636b20796f757220636f6e66696775726174696f6e2060648201527f666f72206d697374616b65730000000000000000000000000000000000000000608482015260a401610396565b50508080610c0b90612170565b915050610aba565b508383604051610c24929190612131565b60405180910390207fea21435419aad9c54a9d90e2522b6f60bd566401f36fcef661f5f5a28cc0d2c685853342604051610c619493929190612296565b60405180910390a250505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cd65760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b610ce081476106fe565b50565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314610d4e5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b8473ffffffffffffffffffffffffffffffffffffffff168385604051610d7491906122d3565b60006040518083038185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5091509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e2a5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610ec0908390839073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017f91906122ef565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f2b5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6000816003811115610f3f57610f3f611c80565b03610fd85760405162461bcd60e51b815260206004820152604160248201527f447269707069653a2064726970207374617475732063616e206e65766572206260448201527f6520736574206261636b20746f204e4f4e45206166746572206372656174696f60648201527f6e00000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b600060018484604051610fec929190612131565b9081526040519081900360200190205460ff169050600081600381111561101557611015611c80565b036110ae5760405162461bcd60e51b815260206004820152604160248201527f447269707069653a206472697020776974682074686174206e616d6520646f6560448201527f73206e6f7420657869737420616e642063616e6e6f742062652075706461746560648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b60038160038111156110c2576110c2611c80565b0361115c5760405162461bcd60e51b8152602060048201526044602482018190527f447269707069653a206472697020776974682074686174206e616d6520686173908201527f206265656e20617263686976656420616e642063616e6e6f742062652075706460648201527f6174656400000000000000000000000000000000000000000000000000000000608482015260a401610396565b81600381111561116e5761116e611c80565b81600381111561118057611180611c80565b036112195760405162461bcd60e51b815260206004820152604860248201527f447269707069653a2063616e6e6f74207365742064726970207374617475732060448201527f746f207468652073616d6520737461747573206173206974732063757272656e60648201527f7420737461747573000000000000000000000000000000000000000000000000608482015260a401610396565b600382600381111561122d5761122d611c80565b036112b957600181600381111561124657611246611c80565b146112b95760405162461bcd60e51b815260206004820152603860248201527f447269707069653a2064726970206d757374206669727374206265207061757360448201527f6564206265666f7265206265696e6720617263686976656400000000000000006064820152608401610396565b81600185856040516112cc929190612131565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561131357611313611c80565b02179055508383604051611328929190612131565b60405180910390207f407cb3ad05e60ec498fb39417c7a4f6b82d5ba80f82fe512a37b02c93181a2a1858585604051610c6193929190612308565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ca5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6000600184846040516113de929190612131565b9081526040519081900360200190205460ff16600381111561140257611402611c80565b146114755760405162461bcd60e51b815260206004820152602b60248201527f447269707069653a206472697020776974682074686174206e616d6520616c7260448201527f65616479206578697374730000000000000000000000000000000000000000006064820152608401610396565b611482602082018261232b565b15611504576020810135156114ff5760405162461bcd60e51b815260206004820152603e60248201527f447269707069653a20696620616c6c6f77696e67207265656e7472616e74206460448201527f7269702c206d7573742073657420696e74657276616c20746f207a65726f00006064820152608401610396565b6115a5565b60008160200135116115a55760405162461bcd60e51b8152602060048201526044602482018190527f447269707069653a20696e74657276616c206d75737420626520677265617465908201527f72207468616e207a65726f2069662064726970206973206e6f74207265656e7460648201527f72616e7400000000000000000000000000000000000000000000000000000000608482015260a401610396565b6000600184846040516115b9929190612131565b9081526040516020918190038201902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815591506116009083018361232b565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556020820135600282015561164b6060830160408401611af9565b6003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561169f6060830183612348565b60048301916116af9190836123fc565b5060005b6116c060808401846124f9565b905081101561173357600582016116da60808501856124f9565b838181106116ea576116ea6121a8565b90506020028101906116fc9190612561565b81546001810183556000928352602090922090916003020161171e8282612595565b5050808061172b90612170565b9150506116b3565b508383604051611744929190612131565b60405180910390207fe38d8d98e6cc66f6f520d483c6c5a89289681f897799c4c29d767cf57e76d9a6858585604051610c619392919061286a565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146117ea5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b8373ffffffffffffffffffffffffffffffffffffffff168360405161180f91906122d3565b600060405180830381855af49150503d806000811461184a576040519150601f19603f3d011682016040523d82523d6000602084013e61184f565b606091505b50915091505b9250929050565b60008060018484604051611871929190612131565b90815260405190819003602001902090506002815460ff16600381111561189a5761189a611c80565b1461190f576040805162461bcd60e51b81526020600482015260248101919091527f447269707069653a2073656c6563746564206472697020646f6573206e6f742060448201527f6578697374206f72206973206e6f742063757272656e746c79206163746976656064820152608401610396565b60028101546006820154429161192491612971565b11156119985760405162461bcd60e51b815260206004820152603660248201527f447269707069653a206472697020696e74657276616c20686173206e6f74206560448201527f6c61707365642073696e6365206c6173742064726970000000000000000000006064820152608401610396565b60038101546040517fc64b3bb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c64b3bb5906119f29060048086019101612984565b602060405180830381865afa158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906120c1565b611acb5760405162461bcd60e51b815260206004820152604260248201527f447269707069653a2064726970636865636b206661696c656420736f2064726960448201527f70206973206e6f742079657420726561647920746f206265207472696767657260648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b60019150505b92915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce057600080fd5b600060208284031215611b0b57600080fd5b8135611b1681611ad7565b9392505050565b600080600060608486031215611b3257600080fd5b8335611b3d81611ad7565b92506020840135611b4d81611ad7565b929592945050506040919091013590565b60008060408385031215611b7157600080fd5b8235611b7c81611ad7565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611bd457611bd4611b8a565b604051601f8501601f19908116603f01168101908282118183101715611bfc57611bfc611b8a565b81604052809350858152868686011115611c1557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611c4157600080fd5b813567ffffffffffffffff811115611c5857600080fd5b8201601f81018413611c6957600080fd5b611c7884823560208401611bb9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60005b83811015611d05578181015183820152602001611ced565b50506000910152565b60008151808452611d26816020860160208601611cea565b601f01601f19169290920160200192915050565b611d448186611caf565b600060206080818401528551151560808401528086015160a084015260408087015173ffffffffffffffffffffffffffffffffffffffff80821660c0870152606091508189015160a060e0880152611da0610120880182611d0e565b60808b01518882037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80016101008a0152805180835291925086019086830190600581901b8401880160005b82811015611e3657601f1986830301845284518781511683528a810151898c850152611e198a850182611d0e565b918b0151938b0193909352948a0194938a01939150600101611deb565b50968a019b909b52505050509093019390935250949350505050565b60008083601f840112611e6457600080fd5b50813567ffffffffffffffff811115611e7c57600080fd5b60208301915083602082850101111561185557600080fd5b60008060208385031215611ea757600080fd5b823567ffffffffffffffff811115611ebe57600080fd5b611eca85828601611e52565b90969095509350505050565b600082601f830112611ee757600080fd5b611b1683833560208501611bb9565b600080600060608486031215611f0b57600080fd5b8335611f1681611ad7565b9250602084013567ffffffffffffffff811115611f3257600080fd5b611f3e86828701611ed6565b925050604084013590509250925092565b8215158152604060208201526000611c786040830184611d0e565b60008060408385031215611f7d57600080fd5b8235611f8881611ad7565b91506020830135611f9881611ad7565b809150509250929050565b600080600060408486031215611fb857600080fd5b833567ffffffffffffffff811115611fcf57600080fd5b611fdb86828701611e52565b909450925050602084013560048110611ff357600080fd5b809150509250925092565b60008060006040848603121561201357600080fd5b833567ffffffffffffffff8082111561202b57600080fd5b61203787838801611e52565b9095509350602086013591508082111561205057600080fd5b50840160a08187031215611ff357600080fd5b6000806040838503121561207657600080fd5b823561208181611ad7565b9150602083013567ffffffffffffffff81111561209d57600080fd5b6120a985828601611ed6565b9150509250929050565b8015158114610ce057600080fd5b6000602082840312156120d357600080fd5b8151611b16816120b3565b600181811c908216806120f257607f821691505b60208210810361212b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121a1576121a1612141565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083546121e5816120de565b600182811680156121fd57600181146122305761225f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061225f565b8760005260208060002060005b858110156122565781548a82015290840190820161223d565b50505082870194505b50929695505050505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815260006122aa60608301868861226b565b73ffffffffffffffffffffffffffffffffffffffff949094166020830152506040015292915050565b600082516122e5818460208701611cea565b9190910192915050565b60006020828403121561230157600080fd5b5051919050565b60408152600061231c60408301858761226b565b9050611c786020830184611caf565b60006020828403121561233d57600080fd5b8135611b16816120b3565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261237d57600080fd5b83018035915067ffffffffffffffff82111561239857600080fd5b60200191503681900382131561185557600080fd5b601f8211156123f757600081815260208120601f850160051c810160208610156123d45750805b601f850160051c820191505b818110156123f3578281556001016123e0565b5050505b505050565b67ffffffffffffffff83111561241457612414611b8a565b6124288361242283546120de565b836123ad565b6000601f84116001811461247a57600085156124445750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556124f2565b600083815260209020601f19861690835b828110156124ab578685013582556020948501946001909201910161248b565b50868210156124e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261252e57600080fd5b83018035915067ffffffffffffffff82111561254957600080fd5b6020019150600581901b360382131561185557600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126122e557600080fd5b81356125a081611ad7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555060018082016020808501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261261a57600080fd5b8501803567ffffffffffffffff81111561263357600080fd5b803603838301131561264457600080fd5b6126588161265286546120de565b866123ad565b6000601f8211600181146126ac576000831561267657508382018501355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178655612723565b600086815260209020601f19841690835b828110156126dc578685018801358255938701939089019087016126bd565b5084821015612719577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198785880101351681555b50508683881b0186555b50505050505050604082013560028201555050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261276d57600080fd5b830160208101925035905067ffffffffffffffff81111561278d57600080fd5b80360382131561185557600080fd5b81835260006020808501808196508560051b81019150846000805b8881101561285c578385038a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18936030181126127f5578283fd5b88016060813561280481611ad7565b73ffffffffffffffffffffffffffffffffffffffff16875261282882890183612738565b828a8a015261283a838a01828461226b565b60409485013599909401989098525050998601999450918501916001016127b7565b509298975050505050505050565b60408152600061287e60408301858761226b565b82810360208401528335612891816120b3565b151581526020848101359082015260408401356128ad81611ad7565b73ffffffffffffffffffffffffffffffffffffffff1660408201526128d56060850185612738565b60a060608401526128ea60a08401828461226b565b91505060808501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261292257600080fd5b850160208101903567ffffffffffffffff81111561293f57600080fd5b8060051b360382131561295157600080fd5b838303608085015261296483828461279c565b9998505050505050505050565b80820180821115611ad157611ad1612141565b6000602080835260008454612998816120de565b808487015260406001808416600081146129b957600181146129f157612a1f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550612a1f565b896000528660002060005b85811015612a175781548b82018601529083019088016129fc565b8a0184019650505b50939897505050505050505056fea26469706673582212208d60ccb026b0dcc2e3511887db1b30dfd98f123af2a2a96714cbeca8ed21494464736f6c634300081000330000000000000000000000009c6373de60c2d3297b18a8f964618ac46e011b58
Deployed Bytecode
0x6080604052600436106100e15760003560e01c80636e2d44ae1161007f5780639bc94d01116100595780639bc94d01146102b0578063e551cdaa146102d0578063edee6239146102f0578063fc3e3eba1461030357600080fd5b80636e2d44ae1461021d5780638da5cb5b1461023e5780639456fbcc1461029057600080fd5b80634782f779116100bb5780634782f779146101845780634d7fba6e146101a457806367148cd2146101dd578063690d8320146101fd57600080fd5b806313af4035146101225780634025feb21461014457806344004cc11461016457600080fd5b3661011d5760405134815233907f4103257eaac983ca79a70d28f90dfc4fa16b619bb0c17ee7cab0d4034c2796249060200160405180910390a2005b600080fd5b34801561012e57600080fd5b5061014261013d366004611af9565b610333565b005b34801561015057600080fd5b5061014261015f366004611b1d565b61040f565b34801561017057600080fd5b5061014261017f366004611b1d565b610587565b34801561019057600080fd5b5061014261019f366004611b5e565b6106fe565b3480156101b057600080fd5b506101c46101bf366004611c2f565b610834565b6040516101d49493929190611d3a565b60405180910390f35b3480156101e957600080fd5b506101426101f8366004611e94565b610a66565b34801561020957600080fd5b50610142610218366004611af9565b610c6f565b61023061022b366004611ef6565b610ce3565b6040516101d4929190611f4f565b34801561024a57600080fd5b5060005461026b9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d4565b34801561029c57600080fd5b506101426102ab366004611f6a565b610dc3565b3480156102bc57600080fd5b506101426102cb366004611fa3565b610ec4565b3480156102dc57600080fd5b506101426102eb366004611ffe565b611363565b6102306102fe366004612063565b61177f565b34801561030f57600080fd5b5061032361031e366004611e94565b61185c565b60405190151581526020016101d4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461039f5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104765760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390528416906323b872dd90606401600060405180830381600087803b1580156104ec57600080fd5b505af1158015610500573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f30b478a5e196e55886228aa87ba74a7dfeba655e0a4d7ba275eabfc22aabb7a88460405161057a91815260200190565b60405180910390a4505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105ee5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610663573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068791906120c1565b508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6b00f1c7883f053ba83e907fd1965b22fffe3c4111383e725f04638a566cdbfa8460405161057a91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107655760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146107bf576040519150601f19603f3d011682016040523d82523d6000602084013e6107c4565b606091505b505090508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f1f12aa8b6d492dd9b98e2b00b0b20830c2a7ded65afac13b60d169a034ae90bc8460405161082791815260200190565b60405180910390a3505050565b805160208183018101805160018083529383019483019490942093905282546040805160a081018252938501805460ff90811615158652600287015494860194909452600386015473ffffffffffffffffffffffffffffffffffffffff169185019190915260048501805493909216949392909160608401916108b6906120de565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906120de565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015610a4e576000848152602090819020604080516060810190915260038502909101805473ffffffffffffffffffffffffffffffffffffffff16825260018101805492939192918401916109b3906120de565b80601f01602080910402602001604051908101604052809291908181526020018280546109df906120de565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b505050505081526020016002820154815250508152602001906001019061095d565b50505091525050600682015460079092015490919084565b600060018383604051610a7a929190612131565b90815260200160405180910390209050610a94838361185c565b50426006820155600781018054906000610aad83612170565b9091555050600581015460005b81811015610c13576000836001016004018281548110610adc57610adc6121a8565b6000918252602082206003909102018054600282015460405192945073ffffffffffffffffffffffffffffffffffffffff90911691610b1f9060018601906121d7565b60006040518083038185875af1925050503d8060008114610b5c576040519150601f19603f3d011682016040523d82523d6000602084013e610b61565b606091505b5050905080610bfe5760405162461bcd60e51b815260206004820152604c60248201527f447269707069653a20647269702077617320756e7375636365737366756c2c2060448201527f706c6561736520636865636b20796f757220636f6e66696775726174696f6e2060648201527f666f72206d697374616b65730000000000000000000000000000000000000000608482015260a401610396565b50508080610c0b90612170565b915050610aba565b508383604051610c24929190612131565b60405180910390207fea21435419aad9c54a9d90e2522b6f60bd566401f36fcef661f5f5a28cc0d2c685853342604051610c619493929190612296565b60405180910390a250505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cd65760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b610ce081476106fe565b50565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314610d4e5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b8473ffffffffffffffffffffffffffffffffffffffff168385604051610d7491906122d3565b60006040518083038185875af1925050503d8060008114610db1576040519150601f19603f3d011682016040523d82523d6000602084013e610db6565b606091505b5091509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e2a5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610ec0908390839073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610e9c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061017f91906122ef565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f2b5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6000816003811115610f3f57610f3f611c80565b03610fd85760405162461bcd60e51b815260206004820152604160248201527f447269707069653a2064726970207374617475732063616e206e65766572206260448201527f6520736574206261636b20746f204e4f4e45206166746572206372656174696f60648201527f6e00000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b600060018484604051610fec929190612131565b9081526040519081900360200190205460ff169050600081600381111561101557611015611c80565b036110ae5760405162461bcd60e51b815260206004820152604160248201527f447269707069653a206472697020776974682074686174206e616d6520646f6560448201527f73206e6f7420657869737420616e642063616e6e6f742062652075706461746560648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b60038160038111156110c2576110c2611c80565b0361115c5760405162461bcd60e51b8152602060048201526044602482018190527f447269707069653a206472697020776974682074686174206e616d6520686173908201527f206265656e20617263686976656420616e642063616e6e6f742062652075706460648201527f6174656400000000000000000000000000000000000000000000000000000000608482015260a401610396565b81600381111561116e5761116e611c80565b81600381111561118057611180611c80565b036112195760405162461bcd60e51b815260206004820152604860248201527f447269707069653a2063616e6e6f74207365742064726970207374617475732060448201527f746f207468652073616d6520737461747573206173206974732063757272656e60648201527f7420737461747573000000000000000000000000000000000000000000000000608482015260a401610396565b600382600381111561122d5761122d611c80565b036112b957600181600381111561124657611246611c80565b146112b95760405162461bcd60e51b815260206004820152603860248201527f447269707069653a2064726970206d757374206669727374206265207061757360448201527f6564206265666f7265206265696e6720617263686976656400000000000000006064820152608401610396565b81600185856040516112cc929190612131565b90815260405190819003602001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561131357611313611c80565b02179055508383604051611328929190612131565b60405180910390207f407cb3ad05e60ec498fb39417c7a4f6b82d5ba80f82fe512a37b02c93181a2a1858585604051610c6193929190612308565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113ca5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b6000600184846040516113de929190612131565b9081526040519081900360200190205460ff16600381111561140257611402611c80565b146114755760405162461bcd60e51b815260206004820152602b60248201527f447269707069653a206472697020776974682074686174206e616d6520616c7260448201527f65616479206578697374730000000000000000000000000000000000000000006064820152608401610396565b611482602082018261232b565b15611504576020810135156114ff5760405162461bcd60e51b815260206004820152603e60248201527f447269707069653a20696620616c6c6f77696e67207265656e7472616e74206460448201527f7269702c206d7573742073657420696e74657276616c20746f207a65726f00006064820152608401610396565b6115a5565b60008160200135116115a55760405162461bcd60e51b8152602060048201526044602482018190527f447269707069653a20696e74657276616c206d75737420626520677265617465908201527f72207468616e207a65726f2069662064726970206973206e6f74207265656e7460648201527f72616e7400000000000000000000000000000000000000000000000000000000608482015260a401610396565b6000600184846040516115b9929190612131565b9081526040516020918190038201902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815591506116009083018361232b565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556020820135600282015561164b6060830160408401611af9565b6003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561169f6060830183612348565b60048301916116af9190836123fc565b5060005b6116c060808401846124f9565b905081101561173357600582016116da60808501856124f9565b838181106116ea576116ea6121a8565b90506020028101906116fc9190612561565b81546001810183556000928352602090922090916003020161171e8282612595565b5050808061172b90612170565b9150506116b3565b508383604051611744929190612131565b60405180910390207fe38d8d98e6cc66f6f520d483c6c5a89289681f897799c4c29d767cf57e76d9a6858585604051610c619392919061286a565b6000805460609073ffffffffffffffffffffffffffffffffffffffff1633146117ea5760405162461bcd60e51b815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610396565b8373ffffffffffffffffffffffffffffffffffffffff168360405161180f91906122d3565b600060405180830381855af49150503d806000811461184a576040519150601f19603f3d011682016040523d82523d6000602084013e61184f565b606091505b50915091505b9250929050565b60008060018484604051611871929190612131565b90815260405190819003602001902090506002815460ff16600381111561189a5761189a611c80565b1461190f576040805162461bcd60e51b81526020600482015260248101919091527f447269707069653a2073656c6563746564206472697020646f6573206e6f742060448201527f6578697374206f72206973206e6f742063757272656e746c79206163746976656064820152608401610396565b60028101546006820154429161192491612971565b11156119985760405162461bcd60e51b815260206004820152603660248201527f447269707069653a206472697020696e74657276616c20686173206e6f74206560448201527f6c61707365642073696e6365206c6173742064726970000000000000000000006064820152608401610396565b60038101546040517fc64b3bb500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c64b3bb5906119f29060048086019101612984565b602060405180830381865afa158015611a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3391906120c1565b611acb5760405162461bcd60e51b815260206004820152604260248201527f447269707069653a2064726970636865636b206661696c656420736f2064726960448201527f70206973206e6f742079657420726561647920746f206265207472696767657260648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610396565b60019150505b92915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ce057600080fd5b600060208284031215611b0b57600080fd5b8135611b1681611ad7565b9392505050565b600080600060608486031215611b3257600080fd5b8335611b3d81611ad7565b92506020840135611b4d81611ad7565b929592945050506040919091013590565b60008060408385031215611b7157600080fd5b8235611b7c81611ad7565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611bd457611bd4611b8a565b604051601f8501601f19908116603f01168101908282118183101715611bfc57611bfc611b8a565b81604052809350858152868686011115611c1557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611c4157600080fd5b813567ffffffffffffffff811115611c5857600080fd5b8201601f81018413611c6957600080fd5b611c7884823560208401611bb9565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611ce6577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60005b83811015611d05578181015183820152602001611ced565b50506000910152565b60008151808452611d26816020860160208601611cea565b601f01601f19169290920160200192915050565b611d448186611caf565b600060206080818401528551151560808401528086015160a084015260408087015173ffffffffffffffffffffffffffffffffffffffff80821660c0870152606091508189015160a060e0880152611da0610120880182611d0e565b60808b01518882037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80016101008a0152805180835291925086019086830190600581901b8401880160005b82811015611e3657601f1986830301845284518781511683528a810151898c850152611e198a850182611d0e565b918b0151938b0193909352948a0194938a01939150600101611deb565b50968a019b909b52505050509093019390935250949350505050565b60008083601f840112611e6457600080fd5b50813567ffffffffffffffff811115611e7c57600080fd5b60208301915083602082850101111561185557600080fd5b60008060208385031215611ea757600080fd5b823567ffffffffffffffff811115611ebe57600080fd5b611eca85828601611e52565b90969095509350505050565b600082601f830112611ee757600080fd5b611b1683833560208501611bb9565b600080600060608486031215611f0b57600080fd5b8335611f1681611ad7565b9250602084013567ffffffffffffffff811115611f3257600080fd5b611f3e86828701611ed6565b925050604084013590509250925092565b8215158152604060208201526000611c786040830184611d0e565b60008060408385031215611f7d57600080fd5b8235611f8881611ad7565b91506020830135611f9881611ad7565b809150509250929050565b600080600060408486031215611fb857600080fd5b833567ffffffffffffffff811115611fcf57600080fd5b611fdb86828701611e52565b909450925050602084013560048110611ff357600080fd5b809150509250925092565b60008060006040848603121561201357600080fd5b833567ffffffffffffffff8082111561202b57600080fd5b61203787838801611e52565b9095509350602086013591508082111561205057600080fd5b50840160a08187031215611ff357600080fd5b6000806040838503121561207657600080fd5b823561208181611ad7565b9150602083013567ffffffffffffffff81111561209d57600080fd5b6120a985828601611ed6565b9150509250929050565b8015158114610ce057600080fd5b6000602082840312156120d357600080fd5b8151611b16816120b3565b600181811c908216806120f257607f821691505b60208210810361212b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036121a1576121a1612141565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083546121e5816120de565b600182811680156121fd57600181146122305761225f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008416875282151583028701945061225f565b8760005260208060002060005b858110156122565781548a82015290840190820161223d565b50505082870194505b50929695505050505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6060815260006122aa60608301868861226b565b73ffffffffffffffffffffffffffffffffffffffff949094166020830152506040015292915050565b600082516122e5818460208701611cea565b9190910192915050565b60006020828403121561230157600080fd5b5051919050565b60408152600061231c60408301858761226b565b9050611c786020830184611caf565b60006020828403121561233d57600080fd5b8135611b16816120b3565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261237d57600080fd5b83018035915067ffffffffffffffff82111561239857600080fd5b60200191503681900382131561185557600080fd5b601f8211156123f757600081815260208120601f850160051c810160208610156123d45750805b601f850160051c820191505b818110156123f3578281556001016123e0565b5050505b505050565b67ffffffffffffffff83111561241457612414611b8a565b6124288361242283546120de565b836123ad565b6000601f84116001811461247a57600085156124445750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556124f2565b600083815260209020601f19861690835b828110156124ab578685013582556020948501946001909201910161248b565b50868210156124e6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261252e57600080fd5b83018035915067ffffffffffffffff82111561254957600080fd5b6020019150600581901b360382131561185557600080fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126122e557600080fd5b81356125a081611ad7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555060018082016020808501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261261a57600080fd5b8501803567ffffffffffffffff81111561263357600080fd5b803603838301131561264457600080fd5b6126588161265286546120de565b866123ad565b6000601f8211600181146126ac576000831561267657508382018501355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178655612723565b600086815260209020601f19841690835b828110156126dc578685018801358255938701939089019087016126bd565b5084821015612719577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198785880101351681555b50508683881b0186555b50505050505050604082013560028201555050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261276d57600080fd5b830160208101925035905067ffffffffffffffff81111561278d57600080fd5b80360382131561185557600080fd5b81835260006020808501808196508560051b81019150846000805b8881101561285c578385038a5282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18936030181126127f5578283fd5b88016060813561280481611ad7565b73ffffffffffffffffffffffffffffffffffffffff16875261282882890183612738565b828a8a015261283a838a01828461226b565b60409485013599909401989098525050998601999450918501916001016127b7565b509298975050505050505050565b60408152600061287e60408301858761226b565b82810360208401528335612891816120b3565b151581526020848101359082015260408401356128ad81611ad7565b73ffffffffffffffffffffffffffffffffffffffff1660408201526128d56060850185612738565b60a060608401526128ea60a08401828461226b565b91505060808501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261292257600080fd5b850160208101903567ffffffffffffffff81111561293f57600080fd5b8060051b360382131561295157600080fd5b838303608085015261296483828461279c565b9998505050505050505050565b80820180821115611ad157611ad1612141565b6000602080835260008454612998816120de565b808487015260406001808416600081146129b957600181146129f157612a1f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550612a1f565b896000528660002060005b85811015612a175781548b82018601529083019088016129fc565b8a0184019650505b50939897505050505050505056fea26469706673582212208d60ccb026b0dcc2e3511887db1b30dfd98f123af2a2a96714cbeca8ed21494464736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009c6373de60c2d3297b18a8f964618ac46e011b58
-----Decoded View---------------
Arg [0] : _owner (address): 0x9C6373dE60c2D3297b18A8f964618ac46E011B58
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000009c6373de60c2d3297b18a8f964618ac46e011b58
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.