ETH Price: $3,040.19 (-4.10%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Transfer236136302025-10-19 19:00:5947 days ago1760900459IN
ETHCF: BETH Token
0.001 ETH0.000048220.710268
Deposit235844812025-10-15 17:08:5951 days ago1760548139IN
ETHCF: BETH Token
0.00111 ETH0.000165482.431157
Deposit235793212025-10-14 23:49:1152 days ago1760485751IN
ETHCF: BETH Token
0.00001 ETH0.000111261.6345853
Deposit235791422025-10-14 23:13:2352 days ago1760483603IN
ETHCF: BETH Token
0.001 ETH0.000110791.62769866
Deposit235683992025-10-13 11:09:2353 days ago1760353763IN
ETHCF: BETH Token
0.01 ETH0.000036050.52963734
Deposit235470082025-10-10 11:23:1156 days ago1760095391IN
ETHCF: BETH Token
0.005 ETH0.000110971.63044653
Deposit235462842025-10-10 8:57:1156 days ago1760086631IN
ETHCF: BETH Token
0.001 ETH0.000112421.6516819
Deposit235444812025-10-10 2:54:5957 days ago1760064899IN
ETHCF: BETH Token
0.004 ETH0.000109341.60637298
Deposit235431302025-10-09 22:22:2357 days ago1760048543IN
ETHCF: BETH Token
0.0033 ETH0.0001231.80714525
Deposit235431262025-10-09 22:21:3557 days ago1760048495IN
ETHCF: BETH Token
0.001 ETH0.000122941.80621114
Deposit235431022025-10-09 22:16:3557 days ago1760048195IN
ETHCF: BETH Token
0.0015 ETH0.000124171.82423876
Deposit235429982025-10-09 21:55:4757 days ago1760046947IN
ETHCF: BETH Token
0.0011 ETH0.000119611.75730297
Deposit235429952025-10-09 21:55:1157 days ago1760046911IN
ETHCF: BETH Token
0.0011 ETH0.000120681.77301352
Deposit235429922025-10-09 21:54:3557 days ago1760046875IN
ETHCF: BETH Token
0.0011 ETH0.000122671.80230358
Deposit235429882025-10-09 21:53:4757 days ago1760046827IN
ETHCF: BETH Token
0.0011 ETH0.000122361.79768971
Deposit235429852025-10-09 21:53:1157 days ago1760046791IN
ETHCF: BETH Token
0.0011 ETH0.000122911.80583373
Deposit235429742025-10-09 21:50:5957 days ago1760046659IN
ETHCF: BETH Token
0.0101 ETH0.000122951.80640572
Deposit235429652025-10-09 21:49:1157 days ago1760046551IN
ETHCF: BETH Token
0.002 ETH0.000120451.76970384
Deposit235429322025-10-09 21:42:3557 days ago1760046155IN
ETHCF: BETH Token
0.001 ETH0.000123151.80935955
Deposit235429232025-10-09 21:40:4757 days ago1760046047IN
ETHCF: BETH Token
0.00333367 ETH0.000127051.86665549
Deposit235428172025-10-09 21:18:4757 days ago1760044727IN
ETHCF: BETH Token
0.001 ETH0.000026260.38581454
Deposit235296722025-10-08 1:10:4759 days ago1759885847IN
ETHCF: BETH Token
0.00001 ETH0.000082791.62439382
Deposit235295222025-10-08 0:40:4759 days ago1759884047IN
ETHCF: BETH Token
0.00001 ETH0.00008261.62070168
Deposit235295142025-10-08 0:39:1159 days ago1759883951IN
ETHCF: BETH Token
0.0001 ETH0.000082621.62105757
Deposit235295052025-10-08 0:37:2359 days ago1759883843IN
ETHCF: BETH Token
0.00001 ETH0.000082531.61929469
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer236136302025-10-19 19:00:5947 days ago1760900459
ETHCF: BETH Token
0.001 ETH
Transfer235844812025-10-15 17:08:5951 days ago1760548139
ETHCF: BETH Token
0.00111 ETH
Transfer235793212025-10-14 23:49:1152 days ago1760485751
ETHCF: BETH Token
0.00001 ETH
Transfer235791422025-10-14 23:13:2352 days ago1760483603
ETHCF: BETH Token
0.001 ETH
Transfer235683992025-10-13 11:09:2353 days ago1760353763
ETHCF: BETH Token
0.01 ETH
Transfer235470082025-10-10 11:23:1156 days ago1760095391
ETHCF: BETH Token
0.005 ETH
Transfer235462842025-10-10 8:57:1156 days ago1760086631
ETHCF: BETH Token
0.001 ETH
Transfer235444812025-10-10 2:54:5957 days ago1760064899
ETHCF: BETH Token
0.004 ETH
Transfer235431302025-10-09 22:22:2357 days ago1760048543
ETHCF: BETH Token
0.0033 ETH
Transfer235431262025-10-09 22:21:3557 days ago1760048495
ETHCF: BETH Token
0.001 ETH
Transfer235431022025-10-09 22:16:3557 days ago1760048195
ETHCF: BETH Token
0.0015 ETH
Transfer235429982025-10-09 21:55:4757 days ago1760046947
ETHCF: BETH Token
0.0011 ETH
Transfer235429952025-10-09 21:55:1157 days ago1760046911
ETHCF: BETH Token
0.0011 ETH
Transfer235429922025-10-09 21:54:3557 days ago1760046875
ETHCF: BETH Token
0.0011 ETH
Transfer235429882025-10-09 21:53:4757 days ago1760046827
ETHCF: BETH Token
0.0011 ETH
Transfer235429852025-10-09 21:53:1157 days ago1760046791
ETHCF: BETH Token
0.0011 ETH
Transfer235429742025-10-09 21:50:5957 days ago1760046659
ETHCF: BETH Token
0.0101 ETH
Transfer235429652025-10-09 21:49:1157 days ago1760046551
ETHCF: BETH Token
0.002 ETH
Transfer235429322025-10-09 21:42:3557 days ago1760046155
ETHCF: BETH Token
0.001 ETH
Transfer235429232025-10-09 21:40:4757 days ago1760046047
ETHCF: BETH Token
0.00333367 ETH
Transfer235428172025-10-09 21:18:4757 days ago1760044727
ETHCF: BETH Token
0.001 ETH
Transfer235296722025-10-08 1:10:4759 days ago1759885847
ETHCF: BETH Token
0.00001 ETH
Transfer235295222025-10-08 0:40:4759 days ago1759884047
ETHCF: BETH Token
0.00001 ETH
Transfer235295142025-10-08 0:39:1159 days ago1759883951
ETHCF: BETH Token
0.0001 ETH
Transfer235295052025-10-08 0:37:2359 days ago1759883843
ETHCF: BETH Token
0.00001 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BETH

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import { ERC20 } from "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol";

/// @title BETH - Burned ETH
/// @notice Immutable ERC-20 token representing provably burnt ETH. Sending ETH mints 1:1 BETH and forwards
/// the ETH to the canonical burn address.
/// @author Built by Zak Cole (x.com/0xzak, github.com/zscole) at Number Group (numbergroup.xyz) for the Ethereum Community Foundation (ethcf.org).
/// @dev This contract is non-upgradeable and has no privileged roles. It relies on ETH forwarding via
/// low-level call; failures revert. Forced ETH (e.g., via selfdestruct) can be flushed without minting.
contract BETH is ERC20 {
    /// @notice Canonical Ethereum burn address used as the ETH sink
    /// @dev This is a constant well-known address to which ETH is forwarded
    address public constant ETH_BURN_ADDRESS = 0x0000000000000000000000000000000000000000;

    /// @notice Error for zero-value deposits
    /// @dev Thrown when msg.value == 0 in deposit paths
    error ZeroDeposit();
    /// @notice Error when forwarding ETH fails
    /// @dev Thrown if the low-level call to the burn address returns false
    error ForwardFailed();

    /// @notice Emitted when ETH is forwarded to the burn address
    /// @param from The address providing the ETH being forwarded
    /// @param amount The amount of ETH forwarded, in wei
    event Burned(address indexed from, uint256 amount);
    /// @notice Emitted when BETH is minted
    /// @param to The address receiving newly minted BETH
    /// @param amount The amount of BETH minted, in wei (1:1 with ETH)
    event Minted(address indexed to, uint256 amount);

    uint256 private _totalBurned;

    /// @notice Deploy the BETH token
    /// @dev Initializes the ERC-20 name and symbol
    constructor() ERC20("BETH", "BETH") { }

    /// @inheritdoc ERC20
    function decimals() public pure override returns (uint8) {
        return 18;
    }

    /// @notice Total ETH permanently destroyed through this contract
    /// @dev Tracks ETH forwarded via deposits/receive and via flush(); does not include unflushed forced ETH
    /// @return burned The cumulative ETH amount accounted as burned, in wei
    function totalBurned() external view returns (uint256 burned) {
        return _totalBurned;
    }

    /// @notice Deposit ETH and mint BETH to the sender 1:1
    /// @dev Reverts on zero-value; forwards ETH before minting
    function deposit() external payable {
        _depositTo(msg.sender);
    }

    /// @notice Deposit ETH and mint BETH to a specified recipient 1:1
    /// @dev Reverts on zero-value; forwards ETH before minting
    /// @param recipient The address to receive minted BETH
    function depositTo(address recipient) external payable {
        _depositTo(recipient);
    }

    /// @notice Accept direct ETH transfers and mint BETH to the sender
    /// @dev Forwards ETH before minting; identical accounting to deposit()
    receive() external payable {
        _depositTo(msg.sender);
    }

    /// @notice Forward any stray ETH balance to the burn address without minting
    /// @dev Handles ETH force-sent to the contract (e.g., via selfdestruct). Increases totalBurned only.
    function flush() external {
        uint256 amount = address(this).balance;
        if (amount == 0) return;
        // Effects first to satisfy static analyzers; revert will roll back on failure below
        _totalBurned += amount;
        emit Burned(address(this), amount);
        (bool success,) = payable(ETH_BURN_ADDRESS).call{ value: amount }("");
        if (!success) revert ForwardFailed();
    }

    /// @notice Internal helper to forward ETH then mint BETH 1:1
    /// @dev Forwards ETH to the burn address, then mints to `recipient` on success.
    /// @param recipient The address to receive newly minted BETH
    /// @return mintedAmount The amount of BETH minted, in wei
    function _depositTo(address recipient) private returns (uint256 mintedAmount) {
        uint256 amount = msg.value;
        if (amount == 0) revert ZeroDeposit();

        // Forward ETH to the burn address
        (bool success,) = payable(ETH_BURN_ADDRESS).call{ value: amount }("");
        if (!success) revert ForwardFailed();

        // Mint BETH after successful forwarding
        _mint(recipient, amount);
        _totalBurned += amount;

        emit Burned(msg.sender, amount);
        emit Minted(recipient, amount);

        return amount;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

Settings
{
  "remappings": [
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"ForwardFailed","type":"error"},{"inputs":[],"name":"ZeroDeposit","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ETH_BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"depositTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flush","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"burned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040805180820182526004808252630848aa8960e31b60208084018290528451808601909552918452908301529060036200004e83826200010d565b5060046200005d82826200010d565b505050620001d9565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200009157607f821691505b602082108103620000b257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000108576000816000526020600020601f850160051c81016020861015620000e35750805b601f850160051c820191505b818110156200010457828155600101620000ef565b5050505b505050565b81516001600160401b0381111562000129576200012962000066565b62000141816200013a84546200007c565b84620000b8565b602080601f831160018114620001795760008415620001605750858301515b600019600386901b1c1916600185901b17855562000104565b600085815260208120601f198616915b82811015620001aa5788860151825594840194600190910190840162000189565b5085821015620001c95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610a7680620001e96000396000f3fe6080604052600436106100e15760003560e01c806370a082311161007f578063b760faf911610059578063b760faf914610259578063d0e30db01461026c578063d89135cd14610274578063dd62ed3e1461028957600080fd5b806370a08231146101ee57806395d89b4114610224578063a9059cbb1461023957600080fd5b806323b872dd116100bb57806323b872dd14610170578063313ce567146101905780636a91d41a146101ac5780636b9f96ea146101d957600080fd5b806306fdde03146100f6578063095ea7b31461012157806318160ddd1461015157600080fd5b366100f1576100ef336102cf565b005b600080fd5b34801561010257600080fd5b5061010b6103fb565b60405161011891906108e8565b60405180910390f35b34801561012d57600080fd5b5061014161013c366004610953565b61048d565b6040519015158152602001610118565b34801561015d57600080fd5b506002545b604051908152602001610118565b34801561017c57600080fd5b5061014161018b36600461097d565b6104a7565b34801561019c57600080fd5b5060405160128152602001610118565b3480156101b857600080fd5b506101c1600081565b6040516001600160a01b039091168152602001610118565b3480156101e557600080fd5b506100ef6104cb565b3480156101fa57600080fd5b506101626102093660046109b9565b6001600160a01b031660009081526020819052604090205490565b34801561023057600080fd5b5061010b610591565b34801561024557600080fd5b50610141610254366004610953565b6105a0565b6100ef6102673660046109b9565b6105ae565b6100ef6105b7565b34801561028057600080fd5b50600554610162565b34801561029557600080fd5b506101626102a43660046109db565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000348082036102f2576040516356316e8760e01b815260040160405180910390fd5b604051600090819083908281818185825af1925050503d8060008114610334576040519150601f19603f3d011682016040523d82523d6000602084013e610339565b606091505b505090508061035b5760405163096dc0e160e01b815260040160405180910390fd5b61036584836105c3565b81600560008282546103779190610a0e565b909155505060405182815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2836001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe836040516103ec91815260200190565b60405180910390a25092915050565b60606003805461040a90610a2f565b80601f016020809104026020016040519081016040528092919081815260200182805461043690610a2f565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b60003361049b8185856105fe565b60019150505b92915050565b6000336104b5858285610610565b6104c085858561068e565b506001949350505050565b4760008190036104d85750565b80600560008282546104ea9190610a0e565b909155505060405181815230907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2604051600090819083908281818185825af1925050503d8060008114610566576040519150601f19603f3d011682016040523d82523d6000602084013e61056b565b606091505b505090508061058d5760405163096dc0e160e01b815260040160405180910390fd5b5050565b60606004805461040a90610a2f565b60003361049b81858561068e565b61058d816102cf565b6105c0336102cf565b50565b6001600160a01b0382166105f25760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b61058d600083836106e9565b61060b8383836001610813565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610688578181101561067957604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016105e9565b61068884848484036000610813565b50505050565b6001600160a01b0383166106b857604051634b637e8f60e11b8152600060048201526024016105e9565b6001600160a01b0382166106e25760405163ec442f0560e01b8152600060048201526024016105e9565b61060b8383835b6001600160a01b0383166107145780600260008282546107099190610a0e565b909155506107869050565b6001600160a01b038316600090815260208190526040902054818110156107675760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016105e9565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166107a2576002805482900390556107c1565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161080691815260200190565b60405180910390a3505050565b6001600160a01b03841661083d5760405163e602df0560e01b8152600060048201526024016105e9565b6001600160a01b03831661086757604051634a1406b160e11b8152600060048201526024016105e9565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561068857826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108da91815260200190565b60405180910390a350505050565b60006020808352835180602085015260005b81811015610916578581018301518582016040015282016108fa565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461094e57600080fd5b919050565b6000806040838503121561096657600080fd5b61096f83610937565b946020939093013593505050565b60008060006060848603121561099257600080fd5b61099b84610937565b92506109a960208501610937565b9150604084013590509250925092565b6000602082840312156109cb57600080fd5b6109d482610937565b9392505050565b600080604083850312156109ee57600080fd5b6109f783610937565b9150610a0560208401610937565b90509250929050565b808201808211156104a157634e487b7160e01b600052601160045260246000fd5b600181811c90821680610a4357607f821691505b602082108103610a6357634e487b7160e01b600052602260045260246000fd5b5091905056fea164736f6c6343000818000a

Deployed Bytecode

0x6080604052600436106100e15760003560e01c806370a082311161007f578063b760faf911610059578063b760faf914610259578063d0e30db01461026c578063d89135cd14610274578063dd62ed3e1461028957600080fd5b806370a08231146101ee57806395d89b4114610224578063a9059cbb1461023957600080fd5b806323b872dd116100bb57806323b872dd14610170578063313ce567146101905780636a91d41a146101ac5780636b9f96ea146101d957600080fd5b806306fdde03146100f6578063095ea7b31461012157806318160ddd1461015157600080fd5b366100f1576100ef336102cf565b005b600080fd5b34801561010257600080fd5b5061010b6103fb565b60405161011891906108e8565b60405180910390f35b34801561012d57600080fd5b5061014161013c366004610953565b61048d565b6040519015158152602001610118565b34801561015d57600080fd5b506002545b604051908152602001610118565b34801561017c57600080fd5b5061014161018b36600461097d565b6104a7565b34801561019c57600080fd5b5060405160128152602001610118565b3480156101b857600080fd5b506101c1600081565b6040516001600160a01b039091168152602001610118565b3480156101e557600080fd5b506100ef6104cb565b3480156101fa57600080fd5b506101626102093660046109b9565b6001600160a01b031660009081526020819052604090205490565b34801561023057600080fd5b5061010b610591565b34801561024557600080fd5b50610141610254366004610953565b6105a0565b6100ef6102673660046109b9565b6105ae565b6100ef6105b7565b34801561028057600080fd5b50600554610162565b34801561029557600080fd5b506101626102a43660046109db565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000348082036102f2576040516356316e8760e01b815260040160405180910390fd5b604051600090819083908281818185825af1925050503d8060008114610334576040519150601f19603f3d011682016040523d82523d6000602084013e610339565b606091505b505090508061035b5760405163096dc0e160e01b815260040160405180910390fd5b61036584836105c3565b81600560008282546103779190610a0e565b909155505060405182815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2836001600160a01b03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe836040516103ec91815260200190565b60405180910390a25092915050565b60606003805461040a90610a2f565b80601f016020809104026020016040519081016040528092919081815260200182805461043690610a2f565b80156104835780601f1061045857610100808354040283529160200191610483565b820191906000526020600020905b81548152906001019060200180831161046657829003601f168201915b5050505050905090565b60003361049b8185856105fe565b60019150505b92915050565b6000336104b5858285610610565b6104c085858561068e565b506001949350505050565b4760008190036104d85750565b80600560008282546104ea9190610a0e565b909155505060405181815230907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2604051600090819083908281818185825af1925050503d8060008114610566576040519150601f19603f3d011682016040523d82523d6000602084013e61056b565b606091505b505090508061058d5760405163096dc0e160e01b815260040160405180910390fd5b5050565b60606004805461040a90610a2f565b60003361049b81858561068e565b61058d816102cf565b6105c0336102cf565b50565b6001600160a01b0382166105f25760405163ec442f0560e01b8152600060048201526024015b60405180910390fd5b61058d600083836106e9565b61060b8383836001610813565b505050565b6001600160a01b038381166000908152600160209081526040808320938616835292905220546000198114610688578181101561067957604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016105e9565b61068884848484036000610813565b50505050565b6001600160a01b0383166106b857604051634b637e8f60e11b8152600060048201526024016105e9565b6001600160a01b0382166106e25760405163ec442f0560e01b8152600060048201526024016105e9565b61060b8383835b6001600160a01b0383166107145780600260008282546107099190610a0e565b909155506107869050565b6001600160a01b038316600090815260208190526040902054818110156107675760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016105e9565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166107a2576002805482900390556107c1565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161080691815260200190565b60405180910390a3505050565b6001600160a01b03841661083d5760405163e602df0560e01b8152600060048201526024016105e9565b6001600160a01b03831661086757604051634a1406b160e11b8152600060048201526024016105e9565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561068857826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108da91815260200190565b60405180910390a350505050565b60006020808352835180602085015260005b81811015610916578581018301518582016040015282016108fa565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461094e57600080fd5b919050565b6000806040838503121561096657600080fd5b61096f83610937565b946020939093013593505050565b60008060006060848603121561099257600080fd5b61099b84610937565b92506109a960208501610937565b9150604084013590509250925092565b6000602082840312156109cb57600080fd5b6109d482610937565b9392505050565b600080604083850312156109ee57600080fd5b6109f783610937565b9150610a0560208401610937565b90509250929050565b808201808211156104a157634e487b7160e01b600052601160045260246000fd5b600181811c90821680610a4357607f821691505b602082108103610a6357634e487b7160e01b600052602260045260246000fd5b5091905056fea164736f6c6343000818000a

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

OVERVIEW

BETH is designed to capture and formalize the concept of proof of burn. Every unit of BETH reflects ETH that has been verifiably removed from circulation, creating a transparent and auditable record of destruction.

Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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