ETH Price: $2,622.59 (+1.07%)

Contract

0x6D44bfB8432d17882bB6e84652f5C3B36fcC8280
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Mint201791532024-06-26 23:30:3556 days ago1719444635IN
Coinbase: Mint Forwarder
0 ETH0.000398963.96386657
Mint201788532024-06-26 22:30:2356 days ago1719441023IN
Coinbase: Mint Forwarder
0 ETH0.000477084.7400133
Mint201785552024-06-26 21:30:3556 days ago1719437435IN
Coinbase: Mint Forwarder
0 ETH0.000666666.62353783
Mint201782582024-06-26 20:30:5956 days ago1719433859IN
Coinbase: Mint Forwarder
0 ETH0.000667917.73490333
Mint201716942024-06-25 22:30:4757 days ago1719354647IN
Coinbase: Mint Forwarder
0 ETH0.000317843.07277527
Mint200843392024-06-13 17:18:1169 days ago1718299091IN
Coinbase: Mint Forwarder
0 ETH0.0017708217.11747702
Mint200819122024-06-13 9:08:5970 days ago1718269739IN
Coinbase: Mint Forwarder
0 ETH0.0012731312.3066624
Mint200807232024-06-13 5:09:1170 days ago1718255351IN
Coinbase: Mint Forwarder
0 ETH0.0011558111.17261801
Mint200795382024-06-13 1:11:3570 days ago1718241095IN
Coinbase: Mint Forwarder
0 ETH0.0011275810.89971216
Mint200782922024-06-12 20:59:5970 days ago1718225999IN
Coinbase: Mint Forwarder
0 ETH0.0016668916.11287144
Mint200771532024-06-12 17:10:5970 days ago1718212259IN
Coinbase: Mint Forwarder
0 ETH0.0018767718.14172688
Mint200759502024-06-12 13:09:1171 days ago1718197751IN
Coinbase: Mint Forwarder
0 ETH0.0039031937.72993768
Mint200747412024-06-12 9:05:5971 days ago1718183159IN
Coinbase: Mint Forwarder
0 ETH0.0011655311.26651761
Mint200735682024-06-12 5:09:4771 days ago1718168987IN
Coinbase: Mint Forwarder
0 ETH0.000737537.12927488
Mint200724052024-06-12 1:15:5971 days ago1718154959IN
Coinbase: Mint Forwarder
0 ETH0.000565195.46342839
Mint200711962024-06-11 21:13:1171 days ago1718140391IN
Coinbase: Mint Forwarder
0 ETH0.0013211812.7711589
Mint200700112024-06-11 17:14:5971 days ago1718126099IN
Coinbase: Mint Forwarder
0 ETH0.0019312618.66836638
Mint200687922024-06-11 13:10:1172 days ago1718111411IN
Coinbase: Mint Forwarder
0 ETH0.0019314918.67062357
Mint200676092024-06-11 9:11:4772 days ago1718097107IN
Coinbase: Mint Forwarder
0 ETH0.000989099.56095326
Mint200664172024-06-11 5:12:1172 days ago1718082731IN
Coinbase: Mint Forwarder
0 ETH0.000557495.38898434
Mint200651982024-06-11 1:06:4772 days ago1718068007IN
Coinbase: Mint Forwarder
0 ETH0.000460134.44789566
Mint200640302024-06-10 21:10:5972 days ago1718053859IN
Coinbase: Mint Forwarder
0 ETH0.0018559117.94000867
Mint200628392024-06-10 17:11:4772 days ago1718039507IN
Coinbase: Mint Forwarder
0 ETH0.0017338916.76054905
Mint200616442024-06-10 13:11:1173 days ago1718025071IN
Coinbase: Mint Forwarder
0 ETH0.0011518411.13419876
Mint200604862024-06-10 9:17:5973 days ago1718011079IN
Coinbase: Mint Forwarder
0 ETH0.000515284.98099336
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MintForwarder

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 6 : MintForwarder.sol
/**
 * SPDX-License-Identifier: MIT
 *
 * Copyright (c) 2022 Coinbase, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

pragma solidity 0.8.6;

import { RateLimit } from "./RateLimit.sol";
import { MintUtil } from "./MintUtil.sol";

/**
 * @title MintForwarder
 * @notice Forwarding contract to ERC20 tokens with mint functionality
 */
contract MintForwarder is RateLimit {
    /**
     * @dev Gets the mintable token contract address
     * @return The address of the mintable token contract
     */
    address public tokenContract;

    /**
     * @dev Indicates that the contract has been initialized
     */
    bool internal initialized;

    /**
     * @notice Emitted on mints
     * @param minter The address initiating the mint
     * @param to The address the tokens are minted to
     * @param amount The amount of tokens minted
     */
    event Mint(address indexed minter, address indexed to, uint256 amount);

    /**
     * @dev Function to initialize the contract
     * @dev Can an only be called once by the deployer of the contract
     * @dev The caller is responsible for ensuring that both the new owner and the token contract are configured correctly
     * @param newOwner The address of the new owner of the mint contract, can either be an EOA or a contract
     * @param newTokenContract The address of the token contract that is minted
     */
    function initialize(address newOwner, address newTokenContract)
        external
        onlyOwner
    {
        require(!initialized, "MintForwarder: contract is already initialized");
        require(
            newOwner != address(0),
            "MintForwarder: owner is the zero address"
        );
        require(
            newTokenContract != address(0),
            "MintForwarder: tokenContract is the zero address"
        );
        transferOwnership(newOwner);
        tokenContract = newTokenContract;
        initialized = true;
    }

    /**
     * @dev Rate limited function to mint tokens
     * @dev The _amount must be less than or equal to the allowance of the caller
     * @param _to The address that will receive the minted tokens
     * @param _amount The amount of tokens to mint
     */
    function mint(address _to, uint256 _amount) external onlyCallers {
        require(
            _to != address(0),
            "MintForwarder: cannot mint to the zero address"
        );
        require(_amount > 0, "MintForwarder: mint amount not greater than 0");

        _replenishAllowance(msg.sender);

        require(
            _amount <= allowances[msg.sender],
            "MintForwarder: mint amount exceeds caller allowance"
        );

        allowances[msg.sender] = allowances[msg.sender] - _amount;

        MintUtil.safeMint(_to, _amount, tokenContract);
        emit Mint(msg.sender, _to, _amount);
    }
}

File 2 of 6 : RateLimit.sol
/**
 * SPDX-License-Identifier: MIT
 *
 * Copyright (c) 2022 Coinbase, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

pragma solidity 0.8.6;

import { Ownable } from "@openzeppelin4.2.0/contracts/access/Ownable.sol";

/**
 * @title RateLimit
 * @dev Rate limiting contract for function calls
 */
contract RateLimit is Ownable {
    /**
     * @dev Mapping denoting caller addresses
     * @return Boolean denoting whether the given address is a caller
     */
    mapping(address => bool) public callers;

    /**
     * @dev Mapping denoting caller address rate limit intervals
     * @return A time in seconds representing the duration of the given callers interval
     */
    mapping(address => uint256) public intervals;

    /**
     * @dev Mapping denoting when a given caller's allowance was last updated
     * @return The time in seconds since a given caller's allowance was last updated
     */
    mapping(address => uint256) public allowancesLastSet;

    /**
     * @dev Mapping denoting a given caller's maximum allowance
     * @return The maximum allowance of a given caller
     */
    mapping(address => uint256) public maxAllowances;

    /**
     * @dev Mapping denoting a given caller's stored allowance
     * @return The stored allowance of a given caller
     */
    mapping(address => uint256) public allowances;

    /**
     * @notice Emitted on caller configuration
     * @param caller The address configured to make rate limited calls
     * @param amount The maximum allowance for the given caller
     * @param interval The amount of time in seconds before a caller's allowance is replenished
     */
    event CallerConfigured(
        address indexed caller,
        uint256 amount,
        uint256 interval
    );

    /**
     * @notice Emitted on caller removal
     * @param caller The address of the caller being removed
     */
    event CallerRemoved(address indexed caller);

    /**
     * @notice Emitted on caller allowance replenishment
     * @param caller The address of the caller whose allowance is being replenished
     * @param allowance The current allowance for the given caller post replenishment
     * @param amountReplenished The allowance amount that was replenished for the given caller
     */
    event AllowanceReplenished(
        address indexed caller,
        uint256 allowance,
        uint256 amountReplenished
    );

    /**
     * @dev Throws if called by any account other than a caller
     * @dev Rate limited functionality in inheriting contracts must have the only caller modifier
     */
    modifier onlyCallers() {
        require(callers[msg.sender], "RateLimit: caller is not whitelisted");
        _;
    }

    /**
     * @dev Function to add/update a new caller. Also updates allowancesLastSet for that caller.
     * @param caller The address of the caller
     * @param amount The call amount allowed for the caller for a given interval
     * @param interval The interval for a given caller
     */
    function configureCaller(
        address caller,
        uint256 amount,
        uint256 interval
    ) external onlyOwner {
        require(caller != address(0), "RateLimit: caller is the zero address");
        require(amount > 0, "RateLimit: amount is zero");
        require(interval > 0, "RateLimit: interval is zero");
        callers[caller] = true;
        maxAllowances[caller] = allowances[caller] = amount;
        allowancesLastSet[caller] = block.timestamp;
        intervals[caller] = interval;
        emit CallerConfigured(caller, amount, interval);
    }

    /**
     * @dev Function to remove a caller.
     * @param caller The address of the caller
     */
    function removeCaller(address caller) external onlyOwner {
        delete callers[caller];
        delete intervals[caller];
        delete allowancesLastSet[caller];
        delete maxAllowances[caller];
        delete allowances[caller];
        emit CallerRemoved(caller);
    }

    /**
     * @dev Helper function to calculate the estimated allowance given caller address
     * @param caller The address whose call allowance is being estimated
     * @return The allowance of the given caller if their allowance were to be replenished
     */
    function estimatedAllowance(address caller)
        external
        view
        returns (uint256)
    {
        return allowances[caller] + _getReplenishAmount(caller);
    }

    /**
     * @dev Get the current caller allowance for an account
     * @param caller The address of the caller
     * @return The allowance of the given caller post replenishment
     */
    function currentAllowance(address caller) public returns (uint256) {
        _replenishAllowance(caller);
        return allowances[caller];
    }

    /**
     * @dev Helper function to replenish a caller's allowance over the interval in proportion to time elapsed, up to their maximum allowance
     * @param caller The address whose allowance is being updated
     */
    function _replenishAllowance(address caller) internal {
        if (allowances[caller] == maxAllowances[caller]) {
            return;
        }
        uint256 amountToReplenish = _getReplenishAmount(caller);
        if (amountToReplenish == 0) {
            return;
        }

        allowances[caller] = allowances[caller] + amountToReplenish;
        allowancesLastSet[caller] = block.timestamp;
        emit AllowanceReplenished(
            caller,
            allowances[caller],
            amountToReplenish
        );
    }

    /**
     * @dev Helper function to calculate the replenishment amount
     * @param caller The address whose allowance is being estimated
     * @return The allowance amount to be replenished for the given caller
     */
    function _getReplenishAmount(address caller)
        internal
        view
        returns (uint256)
    {
        uint256 secondsSinceAllowanceSet = block.timestamp -
            allowancesLastSet[caller];

        uint256 amountToReplenish = (secondsSinceAllowanceSet *
            maxAllowances[caller]) / intervals[caller];
        uint256 allowanceAfterReplenish = allowances[caller] +
            amountToReplenish;

        if (allowanceAfterReplenish > maxAllowances[caller]) {
            amountToReplenish = maxAllowances[caller] - allowances[caller];
        }
        return amountToReplenish;
    }
}

File 3 of 6 : MintUtil.sol
/**
 * SPDX-License-Identifier: MIT
 *
 * Copyright (c) 2022 Coinbase, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

pragma solidity 0.8.6;

import { Address } from "@openzeppelin4.2.0/contracts/utils/Address.sol";

/**
 * @title MintUtil
 * @dev Used for safe minting
 */
library MintUtil {
    bytes4 private constant _MINT_SELECTOR = bytes4(
        keccak256("mint(address,uint256)")
    );

    /**
     * @dev Safely mints ERC20 token
     * @param to Recipient's address
     * @param value Amount to mint
     * @param tokenContract Token contract address
     */
    function safeMint(
        address to,
        uint256 value,
        address tokenContract
    ) internal {
        bytes memory data = abi.encodeWithSelector(_MINT_SELECTOR, to, value);
        Address.functionCall(tokenContract, data, "MinterUtil: mint failed");
    }
}

File 4 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../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.
 *
 * By default, the owner account will be the one that deploys the contract. 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;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 6 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @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;
    }
}

File 6 of 6 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @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://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @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, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * 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.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @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`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountReplenished","type":"uint256"}],"name":"AllowanceReplenished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"interval","type":"uint256"}],"name":"CallerConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"CallerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowancesLastSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"callers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"configureCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"currentAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"estimatedAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"address","name":"newTokenContract","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"intervals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"removeCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6116728061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806365e61fc3116100975780638da5cb5b116100665780638da5cb5b1461024e578063b215a1301461026c578063eef21cd21461028c578063f2fde38b1461029f57600080fd5b806365e61fc3146101e0578063715018a6146102005780637bbf4a3f1461020857806388ead3b81461023b57600080fd5b806340c10f19116100d357806340c10f1914610153578063485cc9551461016857806349c0f07f1461017b57806355a373d61461019b57600080fd5b806302ab4e9d146100fa578063073a56e1146101205780632b603c7114610133575b600080fd5b61010d61010836600461141e565b6102b2565b6040519081526020015b60405180910390f35b61010d61012e36600461141e565b6102e6565b61010d61014136600461141e565b60056020526000908152604090205481565b61016661016136600461146c565b610327565b005b610166610176366004611439565b610647565b61010d61018936600461141e565b60036020526000908152604090205481565b6006546101bb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b61010d6101ee36600461141e565b60046020526000908152604090205481565b610166610920565b61022b61021636600461141e565b60016020526000908152604090205460ff1681565b6040519015158152602001610117565b610166610249366004611496565b6109ad565b60005473ffffffffffffffffffffffffffffffffffffffff166101bb565b61010d61027a36600461141e565b60026020526000908152604090205481565b61016661029a36600461141e565b610c5b565b6101666102ad36600461141e565b610d7b565b60006102bd82610eab565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60006102f182610fa4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020546103219190611536565b92915050565b3360009081526001602052604090205460ff166103ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526174654c696d69743a2063616c6c6572206973206e6f742077686974656c6960448201527f737465640000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661046d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d696e74466f727761726465723a2063616e6e6f74206d696e7420746f20746860448201527f65207a65726f206164647265737300000000000000000000000000000000000060648201526084016103c1565b600081116104fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d696e74466f727761726465723a206d696e7420616d6f756e74206e6f74206760448201527f726561746572207468616e20300000000000000000000000000000000000000060648201526084016103c1565b61050633610eab565b336000908152600560205260409020548111156105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d696e74466f727761726465723a206d696e7420616d6f756e7420657863656560448201527f64732063616c6c657220616c6c6f77616e63650000000000000000000000000060648201526084016103c1565b336000908152600560205260409020546105c09082906115c6565b336000908152600560205260409020556006546105f6908390839073ffffffffffffffffffffffffffffffffffffffff166110cc565b60405181815273ffffffffffffffffffffffffffffffffffffffff83169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b60065474010000000000000000000000000000000000000000900460ff1615610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d696e74466f727761726465723a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103c1565b73ffffffffffffffffffffffffffffffffffffffff8216610816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d696e74466f727761726465723a206f776e657220697320746865207a65726f60448201527f206164647265737300000000000000000000000000000000000000000000000060648201526084016103c1565b73ffffffffffffffffffffffffffffffffffffffff81166108b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e74466f727761726465723a20746f6b656e436f6e74726163742069732060448201527f746865207a65726f20616464726573730000000000000000000000000000000060648201526084016103c1565b6108c282610d7b565b600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091177401000000000000000000000000000000000000000017905550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b6109ab6000611194565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8316610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f526174654c696d69743a2063616c6c657220697320746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103c1565b60008211610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f526174654c696d69743a20616d6f756e74206973207a65726f0000000000000060448201526064016103c1565b60008111610ba5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526174654c696d69743a20696e74657276616c206973207a65726f000000000060448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255600581528183208690556004815281832086905560038152818320429055600281529181902084905580518581529182018490527fd471a172f23699e5022a18bcbb4025d085f6ca049fa7411510eac07e9a152512910160405180910390a2505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556002825280832083905560038252808320839055600482528083208390556005909152808220829055517f50c35a67b454d38c20800d5b55e320f58f4c9c86a28d8ab20f03045d1a38d99a9190a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8116610e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103c1565b610ea881611194565b50565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460209081526040808320546005909252909120541415610ee65750565b6000610ef182610fa4565b905080610efc575050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610f2d908290611536565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260056020818152604080842095865560038252928390204290559081529254815190815292830184905290917f37c856889da73e6bbe7d58cd39546fc6619ef62cbad51f4acbad45d6b7247fa0910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120548190610fd690426115c6565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832054600490925282205492935090916110169084611589565b611020919061154e565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604081205491925090611055908390611536565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020549091508111156110c45773ffffffffffffffffffffffffffffffffffffffff85166000908152600560209081526040808320546004909252909120546110c191906115c6565b91505b509392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8516602482015260448082018590528251808303909101815260649091018252602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f40c10f19000000000000000000000000000000000000000000000000000000001790528251808401909352601783527f4d696e7465725574696c3a206d696e74206661696c6564000000000000000000908301529061118d9083908390611209565b5050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606112188484600085611222565b90505b9392505050565b6060824710156112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016103c1565b843b61131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c1565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161134591906114c9565b60006040518083038185875af1925050503d8060008114611382576040519150601f19603f3d011682016040523d82523d6000602084013e611387565b606091505b50915091506113978282866113a2565b979650505050505050565b606083156113b157508161121b565b8251156113c15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c191906114e5565b803573ffffffffffffffffffffffffffffffffffffffff8116811461141957600080fd5b919050565b60006020828403121561143057600080fd5b61121b826113f5565b6000806040838503121561144c57600080fd5b611455836113f5565b9150611463602084016113f5565b90509250929050565b6000806040838503121561147f57600080fd5b611488836113f5565b946020939093013593505050565b6000806000606084860312156114ab57600080fd5b6114b4846113f5565b95602085013595506040909401359392505050565b600082516114db8184602087016115dd565b9190910192915050565b60208152600082518060208401526115048160408501602087016115dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156115495761154961160d565b500190565b600082611584577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c1576115c161160d565b500290565b6000828210156115d8576115d861160d565b500390565b60005b838110156115f85781810151838201526020016115e0565b83811115611607576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220c5d82730e31b1bf6c3aa96a7729d83f62abc3b2f431e71d694d547b2e72ed54364736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806365e61fc3116100975780638da5cb5b116100665780638da5cb5b1461024e578063b215a1301461026c578063eef21cd21461028c578063f2fde38b1461029f57600080fd5b806365e61fc3146101e0578063715018a6146102005780637bbf4a3f1461020857806388ead3b81461023b57600080fd5b806340c10f19116100d357806340c10f1914610153578063485cc9551461016857806349c0f07f1461017b57806355a373d61461019b57600080fd5b806302ab4e9d146100fa578063073a56e1146101205780632b603c7114610133575b600080fd5b61010d61010836600461141e565b6102b2565b6040519081526020015b60405180910390f35b61010d61012e36600461141e565b6102e6565b61010d61014136600461141e565b60056020526000908152604090205481565b61016661016136600461146c565b610327565b005b610166610176366004611439565b610647565b61010d61018936600461141e565b60036020526000908152604090205481565b6006546101bb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b61010d6101ee36600461141e565b60046020526000908152604090205481565b610166610920565b61022b61021636600461141e565b60016020526000908152604090205460ff1681565b6040519015158152602001610117565b610166610249366004611496565b6109ad565b60005473ffffffffffffffffffffffffffffffffffffffff166101bb565b61010d61027a36600461141e565b60026020526000908152604090205481565b61016661029a36600461141e565b610c5b565b6101666102ad36600461141e565b610d7b565b60006102bd82610eab565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60006102f182610fa4565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600560205260409020546103219190611536565b92915050565b3360009081526001602052604090205460ff166103ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526174654c696d69743a2063616c6c6572206973206e6f742077686974656c6960448201527f737465640000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661046d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d696e74466f727761726465723a2063616e6e6f74206d696e7420746f20746860448201527f65207a65726f206164647265737300000000000000000000000000000000000060648201526084016103c1565b600081116104fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d696e74466f727761726465723a206d696e7420616d6f756e74206e6f74206760448201527f726561746572207468616e20300000000000000000000000000000000000000060648201526084016103c1565b61050633610eab565b336000908152600560205260409020548111156105a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f4d696e74466f727761726465723a206d696e7420616d6f756e7420657863656560448201527f64732063616c6c657220616c6c6f77616e63650000000000000000000000000060648201526084016103c1565b336000908152600560205260409020546105c09082906115c6565b336000908152600560205260409020556006546105f6908390839073ffffffffffffffffffffffffffffffffffffffff166110cc565b60405181815273ffffffffffffffffffffffffffffffffffffffff83169033907fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f89060200160405180910390a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b60065474010000000000000000000000000000000000000000900460ff1615610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d696e74466f727761726465723a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016103c1565b73ffffffffffffffffffffffffffffffffffffffff8216610816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d696e74466f727761726465723a206f776e657220697320746865207a65726f60448201527f206164647265737300000000000000000000000000000000000000000000000060648201526084016103c1565b73ffffffffffffffffffffffffffffffffffffffff81166108b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d696e74466f727761726465723a20746f6b656e436f6e74726163742069732060448201527f746865207a65726f20616464726573730000000000000000000000000000000060648201526084016103c1565b6108c282610d7b565b600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091177401000000000000000000000000000000000000000017905550565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b6109ab6000611194565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8316610ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f526174654c696d69743a2063616c6c657220697320746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103c1565b60008211610b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f526174654c696d69743a20616d6f756e74206973207a65726f0000000000000060448201526064016103c1565b60008111610ba5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526174654c696d69743a20696e74657276616c206973207a65726f000000000060448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255600581528183208690556004815281832086905560038152818320429055600281529181902084905580518581529182018490527fd471a172f23699e5022a18bcbb4025d085f6ca049fa7411510eac07e9a152512910160405180910390a2505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556002825280832083905560038252808320839055600482528083208390556005909152808220829055517f50c35a67b454d38c20800d5b55e320f58f4c9c86a28d8ab20f03045d1a38d99a9190a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610dfc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c1565b73ffffffffffffffffffffffffffffffffffffffff8116610e9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103c1565b610ea881611194565b50565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460209081526040808320546005909252909120541415610ee65750565b6000610ef182610fa4565b905080610efc575050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610f2d908290611536565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260056020818152604080842095865560038252928390204290559081529254815190815292830184905290917f37c856889da73e6bbe7d58cd39546fc6619ef62cbad51f4acbad45d6b7247fa0910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120548190610fd690426115c6565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832054600490925282205492935090916110169084611589565b611020919061154e565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602052604081205491925090611055908390611536565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020549091508111156110c45773ffffffffffffffffffffffffffffffffffffffff85166000908152600560209081526040808320546004909252909120546110c191906115c6565b91505b509392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8516602482015260448082018590528251808303909101815260649091018252602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f40c10f19000000000000000000000000000000000000000000000000000000001790528251808401909352601783527f4d696e7465725574696c3a206d696e74206661696c6564000000000000000000908301529061118d9083908390611209565b5050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606112188484600085611222565b90505b9392505050565b6060824710156112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016103c1565b843b61131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c1565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161134591906114c9565b60006040518083038185875af1925050503d8060008114611382576040519150601f19603f3d011682016040523d82523d6000602084013e611387565b606091505b50915091506113978282866113a2565b979650505050505050565b606083156113b157508161121b565b8251156113c15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c191906114e5565b803573ffffffffffffffffffffffffffffffffffffffff8116811461141957600080fd5b919050565b60006020828403121561143057600080fd5b61121b826113f5565b6000806040838503121561144c57600080fd5b611455836113f5565b9150611463602084016113f5565b90509250929050565b6000806040838503121561147f57600080fd5b611488836113f5565b946020939093013593505050565b6000806000606084860312156114ab57600080fd5b6114b4846113f5565b95602085013595506040909401359392505050565b600082516114db8184602087016115dd565b9190910192915050565b60208152600082518060208401526115048160408501602087016115dd565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600082198211156115495761154961160d565b500190565b600082611584577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156115c1576115c161160d565b500290565b6000828210156115d8576115d861160d565b500390565b60005b838110156115f85781810151838201526020016115e0565b83811115611607576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220c5d82730e31b1bf6c3aa96a7729d83f62abc3b2f431e71d694d547b2e72ed54364736f6c63430008060033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.