ETH Price: $3,177.37 (+1.40%)
Gas: 5 Gwei

Contract

0x9b37180d847B27ADC13C2277299045C1237Ae281
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Exchange ...202986342024-07-13 16:00:238 hrs ago1720886423IN
0x9b37180d...1237Ae281
0 ETH0.000139442.04784803
Update Exchange ...202914792024-07-12 16:00:2332 hrs ago1720800023IN
0x9b37180d...1237Ae281
0 ETH0.000354435.20504059
Update Exchange ...202843222024-07-11 16:00:232 days ago1720713623IN
0x9b37180d...1237Ae281
0 ETH0.0008374912.29915175
Update Exchange ...202771722024-07-10 16:04:113 days ago1720627451IN
0x9b37180d...1237Ae281
0 ETH0.0016591524.36564693
Update Exchange ...202699902024-07-09 16:00:354 days ago1720540835IN
0x9b37180d...1237Ae281
0 ETH0.000619489.09753591
Update Exchange ...202628462024-07-08 16:00:355 days ago1720454435IN
0x9b37180d...1237Ae281
0 ETH0.000385085.65514445
Update Exchange ...202556902024-07-07 16:00:476 days ago1720368047IN
0x9b37180d...1237Ae281
0 ETH0.000147672.16862373
Update Exchange ...202485242024-07-06 16:00:357 days ago1720281635IN
0x9b37180d...1237Ae281
0 ETH0.000353955.19803306
Update Exchange ...202413612024-07-05 16:00:358 days ago1720195235IN
0x9b37180d...1237Ae281
0 ETH0.000548088.0489979
Update Exchange ...202342032024-07-04 16:00:359 days ago1720108835IN
0x9b37180d...1237Ae281
0 ETH0.0007791911.44291142
Update Exchange ...202270532024-07-03 16:03:5910 days ago1720022639IN
0x9b37180d...1237Ae281
0 ETH0.0013707420.13011525
Update Exchange ...202199012024-07-02 16:04:1111 days ago1719936251IN
0x9b37180d...1237Ae281
0 ETH0.000560748.2348367
Update Exchange ...202127412024-07-01 16:04:1112 days ago1719849851IN
0x9b37180d...1237Ae281
0 ETH0.0009497913.9483352
Update Exchange ...202055592024-06-30 16:00:4713 days ago1719763247IN
0x9b37180d...1237Ae281
0 ETH0.000275854.05104124
Update Exchange ...201983942024-06-29 16:00:2314 days ago1719676823IN
0x9b37180d...1237Ae281
0 ETH0.000180122.64525332
Update Exchange ...201912422024-06-28 16:00:3515 days ago1719590435IN
0x9b37180d...1237Ae281
0 ETH0.0007528211.05562632
Update Exchange ...201841002024-06-27 16:04:3516 days ago1719504275IN
0x9b37180d...1237Ae281
0 ETH0.0012445318.27673773
Update Exchange ...201769202024-06-26 16:00:3517 days ago1719417635IN
0x9b37180d...1237Ae281
0 ETH0.0007570111.11715892
Update Exchange ...201697542024-06-25 16:00:4718 days ago1719331247IN
0x9b37180d...1237Ae281
0 ETH0.0006869810.08872452
Update Exchange ...201625982024-06-24 16:00:3519 days ago1719244835IN
0x9b37180d...1237Ae281
0 ETH0.000576188.46165258
Update Exchange ...201554452024-06-23 16:00:3520 days ago1719158435IN
0x9b37180d...1237Ae281
0 ETH0.000296684.35692162
Update Exchange ...201482972024-06-22 16:00:4721 days ago1719072047IN
0x9b37180d...1237Ae281
0 ETH0.000273054.00998267
Update Exchange ...201411552024-06-21 16:00:5922 days ago1718985659IN
0x9b37180d...1237Ae281
0 ETH0.000552638.11583674
Update Exchange ...201339942024-06-20 16:00:3523 days ago1718899235IN
0x9b37180d...1237Ae281
0 ETH0.0009162413.45552713
Update Exchange ...201268402024-06-19 16:00:3524 days ago1718812835IN
0x9b37180d...1237Ae281
0 ETH0.0007008310.29214672
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:
ExchangeRateUpdater

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 6 : ExchangeRateUpdater.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 { ExchangeRateUtil } from "./ExchangeRateUtil.sol";

/**
 * @title ExchangeRateUpdater
 * @notice Updating contract for ERC20 tokens with an exchange rate
 */
contract ExchangeRateUpdater is RateLimit {
    /**
     * @dev Returns the address of the token contract
     * @return The address of the token contract with an exchange rate
     */
    address public tokenContract;

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

    /**
     * @notice Emitted when exchange rate is updated
     * @param caller The address initiating the exchange rate update
     * @param amount The new exchange rate
     */
    event ExchangeRateUpdated(address indexed caller, 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 exchange rate updater contract, can either be an EOA or a contract
     * @param newTokenContract The address of the token contract whose exchange rate is updated
     */
    function initialize(address newOwner, address newTokenContract)
        external
        onlyOwner
    {
        require(
            !initialized,
            "ExchangeRateUpdater: contract is already initialized"
        );
        require(
            newOwner != address(0),
            "ExchangeRateUpdater: owner is the zero address"
        );
        require(
            newTokenContract != address(0),
            "ExchangeRateUpdater: tokenContract is the zero address"
        );
        transferOwnership(newOwner);
        tokenContract = newTokenContract;
        initialized = true;
    }

    /**
     * @dev Rate limited function to update token's exchange rate
     * @param _newExchangeRate The new exchange rate. Must be less than or equal
     * to the allowance of the caller.
     */
    function updateExchangeRate(uint256 _newExchangeRate)
        public
        virtual
        onlyCallers
    {
        require(
            _newExchangeRate > 0,
            "ExchangeRateUpdater: new exchange rate must be greater than 0"
        );

        _replenishAllowance(msg.sender);

        uint256 currentExchangeRate = ExchangeRateUtil.safeGetExchangeRate(
            tokenContract
        );

        require(
            _newExchangeRate != currentExchangeRate,
            "ExchangeRateUpdater: exchange rate isn't new"
        );

        uint256 exchangeRateChange;
        if (_newExchangeRate > currentExchangeRate) {
            exchangeRateChange = _newExchangeRate - currentExchangeRate;
        } else {
            exchangeRateChange = currentExchangeRate - _newExchangeRate;
        }

        require(
            exchangeRateChange <= allowances[msg.sender],
            "ExchangeRateUpdater: exchange rate update exceeds allowance"
        );

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

        ExchangeRateUtil.safeUpdateExchangeRate(
            _newExchangeRate,
            tokenContract
        );
        emit ExchangeRateUpdated(msg.sender, _newExchangeRate);
    }
}

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 : ExchangeRateUtil.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 ExchangeRateUtil
 * @dev Used for safe exchange rate updating
 */
library ExchangeRateUtil {
    using Address for address;

    bytes4 private constant _EXCHANGE_RATE_GETTER_SELECTOR = bytes4(
        keccak256("exchangeRate()")
    );
    bytes4 private constant _EXCHANGE_RATE_UPDATER_SELECTOR = bytes4(
        keccak256("updateExchangeRate(uint256)")
    );

    /**
     * @dev Updates the given token contract's exchange rate
     * @param newExchangeRate New exchange rate
     * @param tokenContract Token contract address
     */
    function safeUpdateExchangeRate(
        uint256 newExchangeRate,
        address tokenContract
    ) internal {
        bytes memory data = abi.encodeWithSelector(
            _EXCHANGE_RATE_UPDATER_SELECTOR,
            newExchangeRate
        );
        tokenContract.functionCall(
            data,
            "ExchangeRateUtil: update exchange rate failed"
        );
    }

    /**
     * @dev Gets the given token contract's exchange rate
     * @param tokenContract Token contract address
     * @return The exchange rate read from the given token contract
     */
    function safeGetExchangeRate(address tokenContract)
        internal
        view
        returns (uint256)
    {
        bytes memory data = abi.encodePacked(_EXCHANGE_RATE_GETTER_SELECTOR);
        bytes memory returnData = tokenContract.functionStaticCall(
            data,
            "ExchangeRateUtil: get exchange rate failed"
        );
        return abi.decode(returnData, (uint256));
    }
}

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":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExchangeRateUpdated","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":[],"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"},{"inputs":[{"internalType":"uint256","name":"_newExchangeRate","type":"uint256"}],"name":"updateExchangeRate","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61189d8061007e6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063b215a13011610066578063b215a13014610259578063b9e205ae14610279578063eef21cd21461028c578063f2fde38b1461029f57600080fd5b8063715018a6146101ed5780637bbf4a3f146101f557806388ead3b8146102285780638da5cb5b1461023b57600080fd5b8063485cc955116100d3578063485cc9551461015357806349c0f07f1461016857806355a373d61461018857806365e61fc3146101cd57600080fd5b806302ab4e9d146100fa578063073a56e1146101205780632b603c7114610133575b600080fd5b61010d6101083660046115ee565b6102b2565b6040519081526020015b60405180910390f35b61010d61012e3660046115ee565b6102e6565b61010d6101413660046115ee565b60056020526000908152604090205481565b610166610161366004611609565b610327565b005b61010d6101763660046115ee565b60036020526000908152604090205481565b6006546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b61010d6101db3660046115ee565b60046020526000908152604090205481565b610166610605565b6102186102033660046115ee565b60016020526000908152604090205460ff1681565b6040519015158152602001610117565b61016661023636600461163c565b610692565b60005473ffffffffffffffffffffffffffffffffffffffff166101a8565b61010d6102673660046115ee565b60026020526000908152604090205481565b61016661028736600461166f565b610941565b61016661029a3660046115ee565b610c77565b6101666102ad3660046115ee565b610d97565b60006102bd82610ec7565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60006102f182610fc0565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260056020526040902054610321919061170e565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60065474010000000000000000000000000000000000000000900460ff1615610458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f45786368616e676552617465557064617465723a20636f6e747261637420697360448201527f20616c726561647920696e697469616c697a656400000000000000000000000060648201526084016103a4565b73ffffffffffffffffffffffffffffffffffffffff82166104fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f45786368616e676552617465557064617465723a206f776e657220697320746860448201527f65207a65726f206164647265737300000000000000000000000000000000000060648201526084016103a4565b73ffffffffffffffffffffffffffffffffffffffff811661059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f45786368616e676552617465557064617465723a20746f6b656e436f6e74726160448201527f637420697320746865207a65726f20616464726573730000000000000000000060648201526084016103a4565b6105a782610d97565b600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091177401000000000000000000000000000000000000000017905550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b61069060006110e8565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff83166107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f526174654c696d69743a2063616c6c657220697320746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103a4565b60008211610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f526174654c696d69743a20616d6f756e74206973207a65726f0000000000000060448201526064016103a4565b6000811161088a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526174654c696d69743a20696e74657276616c206973207a65726f000000000060448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255600581528183208690556004815281832086905560038152818320429055600281529181902084905580518581529182018490527fd471a172f23699e5022a18bcbb4025d085f6ca049fa7411510eac07e9a15251291015b60405180910390a2505050565b3360009081526001602052604090205460ff166109df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526174654c696d69743a2063616c6c6572206973206e6f742077686974656c6960448201527f737465640000000000000000000000000000000000000000000000000000000060648201526084016103a4565b60008111610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f45786368616e676552617465557064617465723a206e65772065786368616e6760448201527f652072617465206d7573742062652067726561746572207468616e203000000060648201526084016103a4565b610a7833610ec7565b600654600090610a9d9073ffffffffffffffffffffffffffffffffffffffff1661115d565b905080821415610b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786368616e676552617465557064617465723a2065786368616e676520726160448201527f74652069736e2774206e6577000000000000000000000000000000000000000060648201526084016103a4565b600081831115610b4a57610b43828461179e565b9050610b57565b610b54838361179e565b90505b33600090815260056020526040902054811115610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f45786368616e676552617465557064617465723a2065786368616e676520726160448201527f746520757064617465206578636565647320616c6c6f77616e6365000000000060648201526084016103a4565b33600090815260056020526040902054610c1190829061179e565b33600090815260056020526040902055600654610c4590849073ffffffffffffffffffffffffffffffffffffffff166111fa565b60405183815233907f0b4e9390054347e2a16d95fd8376311b0d2deedecba526e9742bcaa40b059f0b90602001610934565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556002825280832083905560038252808320839055600482528083208390556005909152808220829055517f50c35a67b454d38c20800d5b55e320f58f4c9c86a28d8ab20f03045d1a38d99a9190a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff8116610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a4565b610ec4816110e8565b50565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460209081526040808320546005909252909120541415610f025750565b6000610f0d82610fc0565b905080610f18575050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610f4990829061170e565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260056020818152604080842095865560038252928390204290559081529254815190815292830184905290917f37c856889da73e6bbe7d58cd39546fc6619ef62cbad51f4acbad45d6b7247fa0910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120548190610ff2904261179e565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832054600490925282205492935090916110329084611761565b61103c9190611726565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600560205260408120549192509061107190839061170e565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020549091508111156110e05773ffffffffffffffffffffffffffffffffffffffff85166000908152600560209081526040808320546004909252909120546110dd919061179e565b91505b509392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f3ba0b9a90000000000000000000000000000000000000000000000000000000060208201526000908190602401604051602081830303815290604052905060006111dc826040518060600160405280602a8152602001611811602a913973ffffffffffffffffffffffffffffffffffffffff871691906112d0565b9050808060200190518101906111f29190611688565b949350505050565b60007fb9e205ae47e80b2d2348e51f011ebc2aadd5523e05bb2a04f0daf374863a495e8360405160240161123091815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506112ca816040518060600160405280602d815260200161183b602d913973ffffffffffffffffffffffffffffffffffffffff851691906113e3565b50505050565b6060833b61135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f416464726573733a207374617469632063616c6c20746f206e6f6e2d636f6e7460448201527f726163740000000000000000000000000000000000000000000000000000000060648201526084016103a4565b6000808573ffffffffffffffffffffffffffffffffffffffff168560405161138791906116a1565b600060405180830381855afa9150503d80600081146113c2576040519150601f19603f3d011682016040523d82523d6000602084013e6113c7565b606091505b50915091506113d78282866113f2565b925050505b9392505050565b60606111f28484600085611445565b606083156114015750816113dc565b8251156114115782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a491906116bd565b6060824710156114d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016103a4565b843b61153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a4565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161156891906116a1565b60006040518083038185875af1925050503d80600081146115a5576040519150601f19603f3d011682016040523d82523d6000602084013e6115aa565b606091505b50915091506115ba8282866113f2565b979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115e957600080fd5b919050565b60006020828403121561160057600080fd5b6113dc826115c5565b6000806040838503121561161c57600080fd5b611625836115c5565b9150611633602084016115c5565b90509250929050565b60008060006060848603121561165157600080fd5b61165a846115c5565b95602085013595506040909401359392505050565b60006020828403121561168157600080fd5b5035919050565b60006020828403121561169a57600080fd5b5051919050565b600082516116b38184602087016117b5565b9190910192915050565b60208152600082518060208401526116dc8160408501602087016117b5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115611721576117216117e1565b500190565b60008261175c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611799576117996117e1565b500290565b6000828210156117b0576117b06117e1565b500390565b60005b838110156117d05781810151838201526020016117b8565b838111156112ca5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfe45786368616e6765526174655574696c3a206765742065786368616e67652072617465206661696c656445786368616e6765526174655574696c3a207570646174652065786368616e67652072617465206661696c6564a2646970667358221220072061323e7e614b9ac9d6c658b4b515f761a1cb2b12d47cd797e279f392d83264736f6c63430008060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100f55760003560e01c8063715018a611610097578063b215a13011610066578063b215a13014610259578063b9e205ae14610279578063eef21cd21461028c578063f2fde38b1461029f57600080fd5b8063715018a6146101ed5780637bbf4a3f146101f557806388ead3b8146102285780638da5cb5b1461023b57600080fd5b8063485cc955116100d3578063485cc9551461015357806349c0f07f1461016857806355a373d61461018857806365e61fc3146101cd57600080fd5b806302ab4e9d146100fa578063073a56e1146101205780632b603c7114610133575b600080fd5b61010d6101083660046115ee565b6102b2565b6040519081526020015b60405180910390f35b61010d61012e3660046115ee565b6102e6565b61010d6101413660046115ee565b60056020526000908152604090205481565b610166610161366004611609565b610327565b005b61010d6101763660046115ee565b60036020526000908152604090205481565b6006546101a89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610117565b61010d6101db3660046115ee565b60046020526000908152604090205481565b610166610605565b6102186102033660046115ee565b60016020526000908152604090205460ff1681565b6040519015158152602001610117565b61016661023636600461163c565b610692565b60005473ffffffffffffffffffffffffffffffffffffffff166101a8565b61010d6102673660046115ee565b60026020526000908152604090205481565b61016661028736600461166f565b610941565b61016661029a3660046115ee565b610c77565b6101666102ad3660046115ee565b610d97565b60006102bd82610ec7565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60006102f182610fc0565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260056020526040902054610321919061170e565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60065474010000000000000000000000000000000000000000900460ff1615610458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f45786368616e676552617465557064617465723a20636f6e747261637420697360448201527f20616c726561647920696e697469616c697a656400000000000000000000000060648201526084016103a4565b73ffffffffffffffffffffffffffffffffffffffff82166104fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f45786368616e676552617465557064617465723a206f776e657220697320746860448201527f65207a65726f206164647265737300000000000000000000000000000000000060648201526084016103a4565b73ffffffffffffffffffffffffffffffffffffffff811661059e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f45786368616e676552617465557064617465723a20746f6b656e436f6e74726160448201527f637420697320746865207a65726f20616464726573730000000000000000000060648201526084016103a4565b6105a782610d97565b600680547fffffffffffffffffffffff0000000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091177401000000000000000000000000000000000000000017905550565b60005473ffffffffffffffffffffffffffffffffffffffff163314610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b61069060006110e8565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff83166107b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f526174654c696d69743a2063616c6c657220697320746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016103a4565b60008211610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f526174654c696d69743a20616d6f756e74206973207a65726f0000000000000060448201526064016103a4565b6000811161088a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526174654c696d69743a20696e74657276616c206973207a65726f000000000060448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255600581528183208690556004815281832086905560038152818320429055600281529181902084905580518581529182018490527fd471a172f23699e5022a18bcbb4025d085f6ca049fa7411510eac07e9a15251291015b60405180910390a2505050565b3360009081526001602052604090205460ff166109df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526174654c696d69743a2063616c6c6572206973206e6f742077686974656c6960448201527f737465640000000000000000000000000000000000000000000000000000000060648201526084016103a4565b60008111610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f45786368616e676552617465557064617465723a206e65772065786368616e6760448201527f652072617465206d7573742062652067726561746572207468616e203000000060648201526084016103a4565b610a7833610ec7565b600654600090610a9d9073ffffffffffffffffffffffffffffffffffffffff1661115d565b905080821415610b2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f45786368616e676552617465557064617465723a2065786368616e676520726160448201527f74652069736e2774206e6577000000000000000000000000000000000000000060648201526084016103a4565b600081831115610b4a57610b43828461179e565b9050610b57565b610b54838361179e565b90505b33600090815260056020526040902054811115610bf6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f45786368616e676552617465557064617465723a2065786368616e676520726160448201527f746520757064617465206578636565647320616c6c6f77616e6365000000000060648201526084016103a4565b33600090815260056020526040902054610c1190829061179e565b33600090815260056020526040902055600654610c4590849073ffffffffffffffffffffffffffffffffffffffff166111fa565b60405183815233907f0b4e9390054347e2a16d95fd8376311b0d2deedecba526e9742bcaa40b059f0b90602001610934565b60005473ffffffffffffffffffffffffffffffffffffffff163314610cf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556002825280832083905560038252808320839055600482528083208390556005909152808220829055517f50c35a67b454d38c20800d5b55e320f58f4c9c86a28d8ab20f03045d1a38d99a9190a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a4565b73ffffffffffffffffffffffffffffffffffffffff8116610ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103a4565b610ec4816110e8565b50565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460209081526040808320546005909252909120541415610f025750565b6000610f0d82610fc0565b905080610f18575050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610f4990829061170e565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260056020818152604080842095865560038252928390204290559081529254815190815292830184905290917f37c856889da73e6bbe7d58cd39546fc6619ef62cbad51f4acbad45d6b7247fa0910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600360205260408120548190610ff2904261179e565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260026020908152604080832054600490925282205492935090916110329084611761565b61103c9190611726565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600560205260408120549192509061107190839061170e565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020549091508111156110e05773ffffffffffffffffffffffffffffffffffffffff85166000908152600560209081526040808320546004909252909120546110dd919061179e565b91505b509392505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f3ba0b9a90000000000000000000000000000000000000000000000000000000060208201526000908190602401604051602081830303815290604052905060006111dc826040518060600160405280602a8152602001611811602a913973ffffffffffffffffffffffffffffffffffffffff871691906112d0565b9050808060200190518101906111f29190611688565b949350505050565b60007fb9e205ae47e80b2d2348e51f011ebc2aadd5523e05bb2a04f0daf374863a495e8360405160240161123091815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506112ca816040518060600160405280602d815260200161183b602d913973ffffffffffffffffffffffffffffffffffffffff851691906113e3565b50505050565b6060833b61135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f416464726573733a207374617469632063616c6c20746f206e6f6e2d636f6e7460448201527f726163740000000000000000000000000000000000000000000000000000000060648201526084016103a4565b6000808573ffffffffffffffffffffffffffffffffffffffff168560405161138791906116a1565b600060405180830381855afa9150503d80600081146113c2576040519150601f19603f3d011682016040523d82523d6000602084013e6113c7565b606091505b50915091506113d78282866113f2565b925050505b9392505050565b60606111f28484600085611445565b606083156114015750816113dc565b8251156114115782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a491906116bd565b6060824710156114d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016103a4565b843b61153f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a4565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161156891906116a1565b60006040518083038185875af1925050503d80600081146115a5576040519150601f19603f3d011682016040523d82523d6000602084013e6115aa565b606091505b50915091506115ba8282866113f2565b979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115e957600080fd5b919050565b60006020828403121561160057600080fd5b6113dc826115c5565b6000806040838503121561161c57600080fd5b611625836115c5565b9150611633602084016115c5565b90509250929050565b60008060006060848603121561165157600080fd5b61165a846115c5565b95602085013595506040909401359392505050565b60006020828403121561168157600080fd5b5035919050565b60006020828403121561169a57600080fd5b5051919050565b600082516116b38184602087016117b5565b9190910192915050565b60208152600082518060208401526116dc8160408501602087016117b5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008219821115611721576117216117e1565b500190565b60008261175c577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611799576117996117e1565b500290565b6000828210156117b0576117b06117e1565b500390565b60005b838110156117d05781810151838201526020016117b8565b838111156112ca5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfe45786368616e6765526174655574696c3a206765742065786368616e67652072617465206661696c656445786368616e6765526174655574696c3a207570646174652065786368616e67652072617465206661696c6564a2646970667358221220072061323e7e614b9ac9d6c658b4b515f761a1cb2b12d47cd797e279f392d83264736f6c63430008060033

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.